大家好,新手求教。
想著arduino 紅外避障模塊識別白色貼紙,實作測速功能。
代碼如下:
int LED = 13; // Use the onboard Uno
volatile float n = 0;
float dt;
float Speed;
float begin_time;
const byte interruptPin = 2; //用2號引腳作為中斷觸發引腳
void setup() {
pinMode(LED, OUTPUT);
pinMode(interruptPin, INPUT);
/*
* 引數1
interrupt —— 中斷源。0對應2號引腳;1對應3號引腳,依次類推。這里我們寫的 0 ,即外部中斷接數字引腳2號引腳。
引數2
function —— 中斷處理函式。即發生中斷時,去做什么。這里我們讓它發生中斷時,做 n+=1。用來計數脈沖,電平變化的次數。
引數3
mode —— 觸發模式。觸發模式有四種型別:LOW(低電平觸發)、CHANGE(電平變化時觸發)、RISING(低電平變為高電平時觸發)、FALLING(高電平變為低電平時觸發)。
這里我們選擇CHANGE(電平變化時觸發),紅外傳感器敏感車輪上的白色反光條,車輪一圈均勻貼有6條反光條。車輪轉一圈,傳感器輸出會有6次電平變化
*/
attachInterrupt(digitalPinToInterrupt(interruptPin),count_pulse,FALLING);
begin_time=millis();
Serial.begin(9600);
}
void count_pulse(){
Serial.println("I am being called");
n += 1;
}
void loop() {
dt=millis()-begin_time;
/*每隔500ms輸出一次轉速,并重新開始計算下一個500ms的轉速 */
if(dt > 1000.0 ){
//每一圈有6個脈沖,下面回傳的值為rpm
//delayMicroseconds(50);
Serial.print("脈沖個數:");
Serial.println(n);
Serial.print("dt: ");
Serial.println(dt);
Serial.print("轉速:");
Speed = (n/6) / (dt/60000);
Serial.println(Speed);
n = 0;
begin_time = millis();
Serial.flush(); // 確定都已經列印出去
}
}
0:08:40.398 -> dt: 1001.00
10:08:40.398 -> 轉速:0.00
10:08:41.358 -> 脈沖個數:0.00
10:08:41.398 -> dt: 1001.00
10:08:41.398 -> 轉速:0.00
10:08:41.518 -> I am being called
10:08:41.518 -> I am being called
10:08:41.558 -> I am being called
10:08:41.558 -> I am being called
10:08:41.598 -> I am being called
10:08:41.638 -> I am being called
10:08:41.678 -> I am being called
10:08:41.678 -> I am being called
10:08:41.718 -> I am being called
10:08:41.718 -> I am being called
10:08:41.758 -> I am being called
10:08:41.758 -> I am being called
10:08:41.877 -> I am being called
10:08:41.917 -> I am being called
10:08:41.917 -> I am being called
10:08:41.957 -> I am being called
10:08:41.957 -> I am being called
10:08:42.198 -> I am being called
10:08:42.198 -> I am being called
10:08:42.198 -> I am being called
10:08:42.238 -> I am being called
10:08:42.238 -> I am being called
10:08:42.358 -> I am being called
10:08:42.398 -> I am being called
10:08:42.478 -> 脈沖個數:24.00
10:08:42.478 -> dt: 1001.00
10:08:42.518 -> 轉速:239.76
10:08:42.557 -> I am being called
10:08:42.557 -> I am being called
10:08:42.597 -> I am being called
10:08:42.597 -> I am being called
10:08:42.637 -> I am being called
10:08:42.637 -> I am being called
10:08:42.677 -> I am being called
10:08:42.677 -> I am being called
10:08:42.717 -> I am being called
10:08:43.118 -> I am being called
10:08:43.158 -> I am being called
10:08:43.158 -> I am being called
10:08:43.198 -> I am being called
10:08:43.198 -> I am being called
10:08:43.238 -> I am being called
10:08:43.238 -> I am being called
10:08:43.278 -> I am being called
10:08:43.358 -> I am being called
10:08:43.398 -> I am being called
10:08:43.398 -> I am being called
10:08:43.438 -> I am being called
10:08:43.438 -> I am being called
10:08:43.478 -> I am being called
10:08:43.478 -> I am being called
10:08:43.518 -> I am being called
10:08:43.598 -> 脈沖個數:25.00
10:08:43.638 -> dt: 1001.00
10:08:43.638 -> 轉速:249.75
10:08:43.678 -> I am being called
10:08:43.678 -> I am being called
10:08:43.718 -> I am being called
10:08:43.718 -> I am being called
10:08:43.758 -> I am being called
10:08:44.638 -> 脈沖個數:5.00
10:08:44.638 -> dt: 1001.00
10:08:44.678 -> 轉速:49.95
10:08:45.638 -> 脈沖個數:0.00
10:08:45.678 -> dt: 1001.00
10:08:45.678 -> 轉速:0.00
10:08:46.638 -> 脈沖個數:0.00
輸出的脈沖數明顯不對,且識別白色貼紙時,持續輸出脈沖。
但是通過資料采集卡查看的波形,在車輪旋轉一周識別的6個白色紙貼,正好輸出6個脈沖。而arduino輸出的脈沖個數如上所示,并不是高低電平變化而加1
請求大神指教,不勝感激!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/12340.html
標籤:智能硬件
