attachInterrupt 請參考 Arduino > Function > attachInterrupt。
/************************************************************************* 電機測速
* 使用millis()函數,紀錄時間,單位為毫秒
* 使用中斷函數,當引脚電壓改變時觸發,記數一次
* 以1:48减速電機、20孔的碼盤為例
* 將得到的值Val除以40,得到轉動圈數
* 除以當時的時間,因為時間單位為毫秒,除以60000轉換為分
* 這時候得到電機轉速Speed ,單位 轉/分
* 注意;測出来的值會有些誤差,比實際值大,是因為碼盤與電機軸有一定距離
* BY YFROBOT
************************************************************************/
//設置模塊引脚接到數字引脚2和3(程序用到中斷函數,MEGA2560中斷引脚為數字引脚2和3)
float ValL = 0; //設置變量ValL,計數
float ValR = 0; //設置變量ValR,計數
float time; //設置變量time,計時
float SpeedL; //設置變量SpeedL,存儲轉速
float SpeedR; //設置變量SpeedR,存儲轉速
float zero = 0;
const int lMotorP = 8;
const int lMotorL = 9;
const int rMotorP= 10;
const int rMotorL = 11;
unsigned long startTime;
unsigned long newTime;
void setup(){
Serial.begin(9600);
attachInterrupt(0,countL,CHANGE); //引脚電壓發生改變時觸發
attachInterrupt(1,countR,CHANGE); //引脚電壓發生改變時觸發
pinMode(lMotorP, OUTPUT);
pinMode(lMotorL, OUTPUT);
pinMode(rMotorP, OUTPUT);
pinMode(rMotorL, OUTPUT);
startTime = millis();
}
void loop(){
digitalWrite(lMotorP, HIGH);
digitalWrite(rMotorP, HIGH);
newTime = millis();
time=newTime - startTime;
if(time>10000){
SpeedL = (ValL/40)/(time/1000000) ;
SpeedR = (ValR/40)/(time/1000000) ;
Serial.print(time);
Serial.print("<==>");
Serial.print(SpeedL);
Serial.print("<==>");
Serial.println(SpeedR);
digitalWrite(lMotorP, LOW);
digitalWrite(rMotorP, LOW);
startTime=newTime;
ValL=0;
ValR=0;
}
}
void countL(){
ValL += 1;
}
void countR(){
ValR += 1;
}