优雅的对旋转编码器消抖(EC11,正交)
2023-08-28 11:35 花无缺Andyi 阅读(441) 评论(0) 编辑 收藏 举报环境:STM32
SDK: Arduino (烧录了Arduino的bootloader)
旋转编码器:EC11
此处只处理正交编码器的A,B。
在网上随意找的一个截图事宜,观看此图后,默认各位了解EC11的工作逻辑。
![](https://pic2.zhimg.com/80/v2-cf499e1cff84af1033dbbf3e217b65b1_1440w.webp)
消抖的核心思路:
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电容最好,避免频繁进入中断消耗资源。
筋膜枪上使用到的旋钮,非常适用。我们开发筋膜枪 都是用这种做法。