[RISC-V MCU 应用开发] EC11编码器高效驱动方法

[复制链接]
 楼主| gaoyang9992006 发表于 2023-9-5 18:51 | 显示全部楼层 |阅读模式
<
本帖最后由 gaoyang9992006 于 2023-9-15 16:41 编辑

#申请原创# @21小跑堂

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

2344364f70174400df.png
在应用中,我们将D和E作为一个按键开关(非自锁)使用,这个大家都会,不多说。
而作为编码器引脚的ACB三个引脚,中间的引脚通常接地,这样如果A和B通过上拉电阻拉高后,旋转旋钮,这个时候A和B会以相位差90度的方式交替且有重叠的去接触C。这个电路如下所示,为了提高抗干扰能力,可以在A和B引脚分别使用一个0.1uF电容接地。
7196164f702397c04b.png
而A和B上的信号在时间刻度上如下所示。
5639964f6fc19c398a.png
关键点:
当向着箭头方向旋转的时候我们发现: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,这样我们可以在主函数识别出刚才发生了旋转操作,并在主函数中对其清零。
好了,思路有了,上程序的环节到了。
游客,如果您要查看本帖隐藏内容请回复

在写该程序之前,我阅读了网上大量的EC11的贴文和例子,并对部分进行了测试,有不少的代码无法准确识别出每一次旋动操作,或一次旋转导致了多次结果。另外一部分就是代码写的冗长复杂,因此我在认真观察了手册的时序图后,决定重写这个代码,并分享出来。实际测试电路
794664f71add2f6b9.png
串口打印内容如下:
右旋
144664f706b6c4d57.png

左旋
5889964f706f899073.png
该代码无需使用所谓的软件消抖操作,易于理解,移植方便,支持IO边沿跳变中断的单片机都可以使用。
以上简单的示例是为了讲明白旋转编码器在旋转过程中发生了什么,根据发生的具体物理事件中的某个完整周期事件实现旋转检测。在实际的应用中,我们可以将其作为一个头文件使用,并优化相关的变量名称,增加代码的可读性,以下代码是我在ESP32上通过Arduino编写的相关代码,可供参靠,同时增加了旋转编码器上按键的示例,包含单击,长按,经过实际操作,发现编码器的按钮不适合双击和三连击。如果需要可自行参靠长按的检测实现双击检测。头文件名称:EC11.h
游客,如果您要查看本帖隐藏内容请回复

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




打赏榜单

21小跑堂 打赏了 80.00 元 2023-09-08
理由:恭喜通过原创审核!期待您更多的原创作品~

评论

牛  发表于 2024-10-31 13:56
楼主,想了2天,现在明白了。 说简单一点,就是有2条线,A和B. 就是记录A跳变沿关注另B的情况,记为1; 等待下个相反的跳变沿的时候,这个状态判断,顺时针还是逆时针。  发表于 2023-10-26 13:58
如果定义下降沿触发中断事件为0,上升沿中断事件为1,那么机械抖动噪声引发的中断事件为000000111111,而不是010101,所以这种中断组合事件中出现了唯一的01,利用一个完整的事件01来识别是否发生了旋转,从而提高了抗干扰能力。至于为何这样,可以找一个单片机看看IO与IO中断相关的内部硬件电路是如何实现的。  发表于 2023-9-10 12:28
根据编码器方波信号对应关系,自主推导合适逻辑,完成EC11编码器的信号读取。  发表于 2023-9-8 18:13
大佬牛X  发表于 2023-9-8 09:12
牛啊牛啊,大佬牛X  发表于 2023-9-8 09:09

评分

参与人数 3威望 +25 收起 理由
捉虫天师 + 5 赞一个!
wanduzi + 5 很给力!
tyw + 15 喂里高得

查看全部评分

YDCMAN 发表于 2023-9-5 19:00 | 显示全部楼层
,好帖,分析透彻,谢谢楼主分享!
 楼主| gaoyang9992006 发表于 2023-9-5 19:01 | 显示全部楼层
YDCMAN 发表于 2023-9-5 19:00
,好帖,分析透彻,谢谢楼主分享!

感谢支持。
wzjhuohua 发表于 2023-9-5 19:06 来自手机 | 显示全部楼层
代码在哪里?

评论

逻辑分析过程可以直接看到,测试代码回复可见。  发表于 2023-9-5 19:07
lzm2008 发表于 2023-9-5 19:08 | 显示全部楼层
look一下。
 楼主| gaoyang9992006 发表于 2023-9-5 19:09 | 显示全部楼层

欢迎大佬前来围观。
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 | 显示全部楼层
上程序的环节到了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2045

主题

16350

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部