首页 > 解决方案 > Arduino 中断“CHANGE”不如“RISING”敏感

问题描述

一旦挡光板(连接到 wsensP 引脚)检测到某些东西,我想停止电机(“脉冲”功能)。

我用“上升中断”进行了第一次测试:

void setup() { attachInterrupt(digitalPinToInterrupt(wsensP), dropped, RISING);}
void dropped(){ wsensor = 1;}
void drop{
      wsensor = 0;
      while (!wsensor){
        pulse();
      }
}

而且效果很好:一旦水滴落入光屏障,就不再调用“脉冲”功能。

但我想进行更详细的检测,于是我切换到“CHANGE”中断:

void setup() { attachInterrupt(digitalPinToInterrupt(wsensP), detected, CHANGE); }
void detected(){
  wsensor = !wsensor;
  if (wsensor){
    rising = 1;
  } else {
    rising = 0;
  }
}
void drop() {
      rising = 0;
      while (!rising){
        pulse();
      }
}

这不会在第一个上升沿停止!我尝试直接测试“wsensor”变量(在while条件下)。我添加了这个“上升”布尔值,因为我认为在测试 while 条件之前,wensor 可能有时间循环 1 和 0....

我真的不明白我的代码有什么问题。ISR 是最小的(设置 2 个变量),其余的也很简单......

标签: arduinointerrupt

解决方案


我明白了:问题是传感器可能有一个非常短的高电平,所以变量“上升”在 while 条件下测试之前设置为 0。

解决方案 ==> 删除“else {rising = 0 }”

void setup() { attachInterrupt(digitalPinToInterrupt(wsensP), detected, CHANGE); }
void detected(){
  wsensor = !wsensor;
  if (wsensor){
    rising = 1;
  }
// part of the code to delete : 
// else {
//    rising = 0;
//  }
}
void drop() {
      rising = 0;
      while (!rising){
        pulse();
      }
}

推荐阅读