arduino - 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 个变量),其余的也很简单......
解决方案
我明白了:问题是传感器可能有一个非常短的高电平,所以变量“上升”在 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();
}
}
推荐阅读
- django - Django:按ID获取最后一条记录[多对一关系]
- django-rest-framework - Integration of Django Rest Framework with SSO and generating JWT token
- java - 使用java api在elasticserach中通过结果获取多个字段组
- typescript - 理解类型断言
- reactjs - React js - 状态如何等于数组的每个值?
- r - Created function works in R script but not in shiny app
- python - 系列的真值不明确 - Python-Docx
- java - 如何更新结果集而不从中删除以前的结果
- python - 如何从 Mysql 中以 Chunks 获取数据
- react-native - 反应原生 Firebase 推送通知不适用于 iOS