gaoyang9992006 发表于 2023-9-5 18:51

EC11编码器高效驱动方法

本帖最后由 gaoyang9992006 于 2023-9-15 16:41 编辑

#申请原创# @21小跑堂

旋转编码器是一种常用的旋转调整参数的元件,例如鼠标滚轮就是用的旋转编码器,今天给大家介绍一种旋转编码器,EC11,该元件外观与电位器很像,具备5个功能引脚,两个是开关,用于按键开关使用,另外三条引脚是用于旋转编码。外观如下图所示


引脚关系示意图如下所示


在应用中,我们将D和E作为一个按键开关(非自锁)使用,这个大家都会,不多说。
而作为编码器引脚的ACB三个引脚,中间的引脚通常接地,这样如果A和B通过上拉电阻拉高后,旋转旋钮,这个时候A和B会以相位差90度的方式交替且有重叠的去接触C。这个电路如下所示,为了提高抗干扰能力,可以在A和B引脚分别使用一个0.1uF电容接地。

而A和B上的信号在时间刻度上如下所示。

关键点:
当向着箭头方向旋转的时候我们发现:A在下降沿的时刻B是高电平,A在上升沿的时刻B是低电平,这可以表述为(A 下 B 1,A 上 B 0),记作表述1;
当方向取图中反向的时候,可以看出当A在下降沿的时刻B是低电平,A在上升沿的时刻B是高电平,这可以表述为(A 下 B 0,A 上 B 1),记作表述2。
因此我们可以锁定A作为跳变沿检测中断引脚,在中断中记录下同一方向两个不同组合的状态,当完成一个完整的表述后我们就改变一次用于确定最终是否旋转的全局变量。
例如,我们定义一个全局变量flag用于告诉主函数是否发生了旋钮旋转;定义一个全局变量val,当正向旋转编码器发生一次咔哒声后,我们将val++;当反向旋转编码器发生一次咔哒声后,我们将val--操作一次。
这样为了记录下完整的表述1和表述2,我们定义两个全局变量flag1和flag2,当没有进入中断的时候,默认我们将其初始化为0,当发生了属性为“下1”的中断后,我们将flag1=1;当发生了属性为“下0”的操作后我们记录flag2=1;这样下次再次进入中断后那结果只能是对应的“上0”或“上1”,这个时候我们将对val进行操作,同时将flag1和flag2清零,并标记flag为1,这样我们可以在主函数识别出刚才发生了旋转操作,并在主函数中对其清零。
好了,思路有了,上程序的环节到了。
**** Hidden Message *****
在写该程序之前,我阅读了网上大量的EC11的贴文和例子,并对部分进行了测试,有不少的代码无法准确识别出每一次旋动操作,或一次旋转导致了多次结果。另外一部分就是代码写的冗长复杂,因此我在认真观察了手册的时序图后,决定重写这个代码,并分享出来。实际测试电路

串口打印内容如下:
右旋


左旋

该代码无需使用所谓的软件消抖操作,易于理解,移植方便,支持IO边沿跳变中断的单片机都可以使用。
以上简单的示例是为了讲明白旋转编码器在旋转过程中发生了什么,根据发生的具体物理事件中的某个完整周期事件实现旋转检测。在实际的应用中,我们可以将其作为一个头文件使用,并优化相关的变量名称,增加代码的可读性,以下代码是我在ESP32上通过Arduino编写的相关代码,可供参靠,同时增加了旋转编码器上按键的示例,包含单击,长按,经过实际操作,发现编码器的按钮不适合双击和三连击。如果需要可自行参靠长按的检测实现双击检测。头文件名称:EC11.h
**** Hidden Message *****
实际电路可以这样处理,预留抗干扰小电容焊盘,不一定使用。

补在后面的话:有人认为我这又在主函数里通过循环来识别了,那么拜托,根据需要可以自行修改啊,我的观点是通过一次旋转产生的两次中断确定真的发生了旋转。你可以不在主函数里修改要调整的变量,比如如果只修改一个变量,你可以直接在中断里就完成对变量大小的调整。还有一个方法对多个变量调整的时候你可以通过指针的方式实现。
比如最后的补充示例代码,你可以通过EC11的按键调整Mode,在这个调整里你可以改成传递不同待调整变量的地址给旋转中断里的指针,通过指针指向被调整的变量,这样就实现了完全在中断里调整。又不担忧主函数太长,太费时间导致的漏帧。




YDCMAN 发表于 2023-9-5 19:00

{:smile:},好帖,分析透彻,谢谢楼主分享!

gaoyang9992006 发表于 2023-9-5 19:01

YDCMAN 发表于 2023-9-5 19:00
,好帖,分析透彻,谢谢楼主分享!

感谢支持。

wzjhuohua 发表于 2023-9-5 19:06

代码在哪里?

lzm2008 发表于 2023-9-5 19:08

look一下。

gaoyang9992006 发表于 2023-9-5 19:09

lzm2008 发表于 2023-9-5 19:08
look一下。

欢迎大佬前来围观。

fengrenjie 发表于 2023-9-5 19:12

看看

strang 发表于 2023-9-5 19:48

看看      

xinxianshi 发表于 2023-9-5 19:48

前排学习,困扰我多年的抖动有救了。

你也喜欢睡觉 发表于 2023-9-5 20:02

学习学习

日生光军 发表于 2023-9-5 20:17

wdvsdw 发表于 2023-9-6 08:03

学习一下

moticsoft 发表于 2023-9-6 08:28

学习一下

kepro 发表于 2023-9-6 09:19

学习了

daocaorenchao 发表于 2023-9-6 10:21

看看

香水城 发表于 2023-9-6 10:29

谢谢分享!

billy226 发表于 2023-9-6 11:54

值得研究下

xiaosun 发表于 2023-9-6 14:26

这个要找旧的开关测试

gaoyang9992006 发表于 2023-9-6 14:28

xiaosun 发表于 2023-9-6 14:26
这个要找旧的开关测试

找吧,我买的2块钱包邮的,刚开始用网上流传的几种方式驱动发现在旋转一圈后,有超过一半的位置存在多帧或缺帧问题。都不能很好的排除抖动干扰的影响。我这个方式完美的解决了那个问题。比如中断1和中断2,因为抖动它不是出现重复的121212,而是出现重复的1111122222类似这种噪声干扰。

dongnanxibei 发表于 2023-9-6 16:09

上程序的环节到了
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: EC11编码器高效驱动方法