发新帖本帖赏金 80.00元(功能说明)我要提问
返回列表
打印
[RISC-V MCU 应用开发]

EC11编码器高效驱动方法

[复制链接]
31368|270
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
gaoyang9992006|  楼主 | 2023-9-5 18:51 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 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,这样我们可以在主函数识别出刚才发生了旋转操作,并在主函数中对其清零。
好了,思路有了,上程序的环节到了。
游客,如果您要查看本帖隐藏内容请回复

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

串口打印内容如下:
右旋


左旋

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

实际电路可以这样处理,预留抗干扰小电容焊盘,不一定使用。

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




使用特权

评论回复

打赏榜单

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

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

相关帖子

258
暖茶轻语| | 2025-4-11 22:28 | 只看该作者
非常详细的EC11编码器驱动方法介绍,感谢分享!

使用特权

评论回复
257
smartabc| | 2025-3-28 14:10 | 只看该作者
学习学习

使用特权

评论回复
256
shuaniaun| | 2025-3-21 13:14 | 只看该作者
好帖,分析透彻,谢谢楼主分享!

使用特权

评论回复
255
talenygc| | 2025-3-7 17:15 | 只看该作者
11111

使用特权

评论回复
254
haokeqwe| | 2025-2-28 22:56 | 只看该作者
感谢分享

使用特权

评论回复
253
EasonTvT| | 2025-2-26 09:46 | 只看该作者
good

使用特权

评论回复
252
DDDFDFF| | 2025-2-21 14:59 | 只看该作者

使用特权

评论回复
251
panxiaoyi| | 2025-2-9 21:05 | 只看该作者
参考一下

使用特权

评论回复
250
cooleaf| | 2025-2-9 09:46 | 只看该作者
这个思路新颖,充分利用编码器特点与MCU的工作特性,效果应当不错。

使用特权

评论回复
249
chengqiangcn| | 2025-1-17 14:52 | 只看该作者
谢谢楼主分享!!!

使用特权

评论回复
248
boy364100| | 2025-1-13 09:47 | 只看该作者
不错!!!

使用特权

评论回复
247
18890018503| | 2025-1-7 23:36 | 只看该作者
looklook

使用特权

评论回复
246
dadajoke| | 2025-1-6 17:40 | 只看该作者
学习一下

使用特权

评论回复
245
simon86| | 2024-12-24 15:49 | 只看该作者
checked

使用特权

评论回复
244
850174101| | 2024-12-23 16:20 | 只看该作者
好帖

使用特权

评论回复
243
tlhmcu| | 2024-12-21 14:05 | 只看该作者
这个思路真的非常好

使用特权

评论回复
242
zhimachenhzu| | 2024-12-17 16:56 | 只看该作者
拜读一下帖子大作,其他说得都没那么清楚

使用特权

评论回复
241
微机与危机| | 2024-12-5 23:46 | 只看该作者
牛,刚开始接触旋转按钮,感觉好迷茫,不知道怎么使用

使用特权

评论回复
240
物联万物互联| | 2024-12-5 15:57 | 只看该作者
EC11编码器高效驱动方法:优化算法,减少冗余计算;精准控制,提高响应速度;实时监控,调整性能参数;故障预测,确保稳定运行。

使用特权

评论回复
239
星闪动力| | 2024-12-3 10:15 | 只看该作者
我一直在用它,但是我不是很了解它

使用特权

评论回复
发新帖 本帖赏金 80.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

2014

主题

16182

帖子

216

粉丝