如何解决如何读取带有 ESP32 中断和全局标志的旋转编码器
使用中断时,任何类型的 digitalRead 都应该过时,或者我认为。让我解释一下我对此的理解以表明我的问题:
比如说,一个正交增量旋转编码器 (RE) 在两个信号引脚上都被拉高,因此处于空闲高电平。如果我在两个引脚的下降沿上配置一个中断服务程序 (ISR) 并让引脚 B 的 ISR 只将标志“flag_B”设置为 false(表示引脚的逻辑状态)和引脚的 ISR A 根据 A 的 ISR 期间 flag_B 的状态设置或重置标志“flag_clock”,那么我应该为每个转弯步骤获得正确的方向,对吗?我唯一的任务是在 ISR 之后再次将引脚 B 的状态设置为高电平,并且我的代码应该准备好迎接下一个中断。但这不起作用,在旋转步骤的前半部分显示错误方向或显示逆时针方向的许多随机情况,当您在转动旋钮时会感到有点“颠簸”,然后在后半部分顺时针转动时,当转轴完成单步后,基本上只转动一步就进行两个相反的动作。我的逻辑有问题吗? 所有信号都在硬件中去抖动,在示波器上看起来像预期的那样。
ISR:
//re-CLK signal
void IRAM_ATTR reCLK_ISR(void){
if(myFlags->pinBstate){
//this means the first interrupt of a turning step comes from the clock,not data
myFlags->direction = CCW;
}
else{
//this means the interrupt of a turning step occured from data first
myFlags->direction = CW;
}
}
//re-DATA signal
void IRAM_ATTR reDATA_ISR(void){
myFlags->pinDATAstate = false;
}
进一步处理:
//some function
//scroll = CW / CCW
if((myFlags->direction) != STOP){
if(myFlags->direction == CW){
//DEBUG
digitalWrite(PIN_LED_DEBUG,LOW);
}
}
if(myFlags->direction == CCW){
//DEBUG
digitalWrite(PIN_LED_DEBUG,HIGH);
}
myFlags->pinDATAstate = true;
myFlags->direction = STOP; //direction has 3 states: CW,CCW and STOP
}
最后 2 条语句应该将所有受影响的标志恢复到触摸编码器之前的状态,这意味着为下一轮做好准备。 LED 只是替代了不同的计算,应该根据转动方向进行。
解决方法
即使引脚被分配为中断,您仍然可以使用digitalRead()
来确定方向。例如:
const uint8_t pinA = 25;
const uint8_t pinB = 26;
volatile int counter;
void IRAM_ATTR isr(){
if(digitalRead(pinA) == digitalRead(pinB)) {
//Clockwise
counter++;
} else {
//Counter Clockwise
counter--;
}
}
您甚至不需要另一个 ISR 来确定方向。我用这个方法来确定速度和方向;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。