优雅的对旋转编码器消抖(EC11,正交)

发布时间 2023-08-28 11:40:50作者: 花无缺Andyi

环境:STM32

SDK: Arduino (烧录了Arduino的bootloader)

旋转编码器:EC11

此处只处理正交编码器的A,B。

在网上随意找的一个截图事宜,观看此图后,默认各位了解EC11的工作逻辑。

 

 

消抖的核心思路:

A脚设置为上升下降沿均会进中断,下降上升一个变换周期,判断这个周期的A脚,B脚的始末状态,来判断正反转一次。

优点:只需要一个管脚的外部触发,另一脚单纯获取电平状态即可。

以下为提供中断触发内容

 1 #define Aio PA3
 2 #define Bio PA4
 3 int flag = 0;  //标志位
 4 boolean CW_1 = 0;
 5 boolean CW_2 = 0;
 6 void Aio_inter() {
 7   // 只要处理一个脚的外部中断--上升沿&下降沿
 8   int alv = digitalRead(Aio);
 9   int blv = digitalRead(Bio);
10   if (flag == 0 && alv == LOW) {
11     CW_1 = blv;
12     flag = 1;
13   }
14   if (flag && alv) {
15     CW_2 = !blv;  //取反是因为 alv,blv必然异步,一高一低。
16     if (CW_1 && CW_2) {
17       dir++;
18     }
19     if (CW_1 == false && CW_2 == false) {
20       dir--;
21     }
22     flag = 0;
23   }
24 }
25 void setup(){
26   Serial.begin(115200);
27   pinMode(Aio, INPUT);
28   pinMode(Bio, INPUT);
29 //只要消耗一个外部中断资源
30   attachInterrupt(Aio, Aio_inter, CHANGE);
31 }
32 //变量dir在中断里处理,loop中随时调用
33 void loop(){
34   Serial.printf("dir : %d",dir);
35   delay(1000); 
36 }
37 // 觉得满意麻烦点个赞呗

以上及时完好的消除了跳帧的效果,还是要建议给AB脚各加上1颗103电容最好,避免频繁进入中断消耗资源。

筋膜枪上使用到的旋钮,非常适用。我们开发筋膜枪 都是用这种做法。