首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arduino中断“改变”不像“上升”那么敏感

Arduino中断“改变”不像“上升”那么敏感
EN

Stack Overflow用户
提问于 2021-05-05 19:21:12
回答 1查看 35关注 0票数 0

我想在光障(连接到wsensP引脚)检测到某些东西时立即停止电机(“脉冲”功能)。

我用“上升中断”做了第一个测试:

代码语言:javascript
复制
void setup() { attachInterrupt(digitalPinToInterrupt(wsensP), dropped, RISING);}
void dropped(){ wsensor = 1;}
void drop{
      wsensor = 0;
      while (!wsensor){
        pulse();
      }
}

而且它工作得很完美:一旦水滴落入光障,“脉冲”函数就不再被调用。

但我想要有更详细的检测,于是我切换到“更改”中断:

代码语言:javascript
复制
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条件被测试之前,王量可以有时间循环1和0……

我真的不明白我的代码出了什么问题。ISR是最小的(设置2个变量),其余的也非常简单……

EN

回答 1

Stack Overflow用户

发布于 2021-05-05 23:54:19

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

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

代码语言:javascript
复制
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();
      }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67400293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档