我有一個限位開關連接到運動控制的Arduino Mega 2650上。限位開關的兩個常開觸點連接到一個Arduino引腳和地,這樣當限位開關接通時,Arduino引腳會短路接地。在Arduino ISR中剔除限制開關延遲
正如預期的那樣,我用這個設置反彈了一些問題。我在ISR中使用計數器進行了確認。最後,我寫了下面的代碼,它似乎可以可靠地確定我的限位開關是否在任何給定的時間點處於齧合或脫離狀態。
const int lsOuterLeftIn = 18; // lsOuterLeftIn is my Limit Switch
const int LED = 9;
volatile bool lsEngaged = false; // flag for limit switch engaged
void setup() {
pinMode(lsOuterLeftIn, INPUT_PULLUP);
pinMode(LED, OUTPUT);
attachInterrupt(digitalPinToInterrupt(lsOuterLeftIn), ISR1, FALLING);
attachInterrupt(digitalPinToInterrupt(lsOuterLeftIn), ISR2, RISING);
}
void loop() {
if (lsEngaged) digitalWrite(LED, HIGH);
else digitalWrite(LED, LOW);
}
void ISR1(){
delay(100);
lsEngaged = (digitalRead(lsOuterLeftIn));
}
void ISR2(){
delay(100);
lsEngaged = (digitalRead(lsOuterLeftIn));
}
但是,這是我的問題。我來到這個Arduino documentation page,和它說
「由於延遲()需要中斷工作,如果調用 在ISR內部,它不會工作。」
但是,我確實使用內部ISR中的delay()
,它似乎工作,發生了什麼?我目前是否有這種情況,但可能會輕易中斷,因爲文檔中提到的delay()
函數可能會對我造成故障?
[這裏有一個答案(HTTP:// stackoverflow.com/問題/ 32646071 /中斷返回輕微延遲/ 32647699#32647699)應該解決您的所有問題。 – Lundin
在中斷中使用忙等待循環是一個非常糟糕的主意 - 總是! – Olaf
您應該(也)提供反彈*硬件*(RC低通),因爲反彈可能太快而無法由μC處理。 – JimmyB