打印

如何快速简单的去判断旋转(按钮)编码器EC11的正反转情况?

[复制链接]
2465|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
medety|  楼主 | 2023-10-25 12:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
波形如图:
其中,查看规律是:
正转的时候,发现的规律就是当黄线在下降沿的时候,红线在电平状态;
反转的时候,当黄线在下降沿的时候,红线在电平状态。

能不能就简单 一点判断,就开启黄线通道的IO下降沿触发,然后检测红线IO在什么电平,若是电平,就是正转,若是电平,则是反转

这样可行?

EC11.png (121.56 KB )

正反转波形

正反转波形

使用特权

评论回复

相关帖子

沙发
ayb_ice| | 2023-10-25 13:52 | 只看该作者
红线低电平期间,黄线上升沿或下降沿分别表示不同方向

使用特权

评论回复
评论
cmyldd 2023-10-26 07:47 回复TA
是的 
板凳
zlf1208| | 2023-10-25 14:16 | 只看该作者
本帖最后由 zlf1208 于 2023-10-25 14:29 编辑

旋转编码器有二个信号,四个状态,你做一个真值表,用任一边沿的变化触发中断,然后根据上一个状态,用当前状与态真值表比对就能够判断旋转的方向。如下图:如果上一个状态是2,当前状态是1就是反转,当前状态是3就是正转





使用特权

评论回复
地板
medety|  楼主 | 2023-10-25 16:40 | 只看该作者
zlf1208 发表于 2023-10-25 14:16
旋转编码器有二个信号,四个状态,你做一个真值表,用任一边沿的变化触发中断,然后根据上一个状态,用当前 ...

用这种扫描方式的,感觉不怎么好用。

使用特权

评论回复
5
medety|  楼主 | 2023-10-25 16:54 | 只看该作者
能不能搞个这种状态来判断:
1.空闲的,也就是静止的时候,2个都为高电平,为0状态;
2.若黄线识别到下降沿,此时判断红线的电平,同时转入到状态1;
3.等待2个点都为高电平,再回到状态0.

使用特权

评论回复
6
zhuotuzi| | 2023-10-25 18:09 | 只看该作者
看手册就行了。

使用特权

评论回复
7
zhuotuzi| | 2023-10-25 18:09 | 只看该作者
不需要再看示波器,手册上已经给了时序和如何判断。

使用特权

评论回复
8
coody| | 2023-10-25 22:09 | 只看该作者
最简单的是用外中断,下降沿中断,再判断另一个的电平即是方向。

使用特权

评论回复
9
zlf1208| | 2023-10-26 08:14 | 只看该作者
本帖最后由 zlf1208 于 2023-10-26 08:33 编辑
medety 发表于 2023-10-25 16:54
能不能搞个这种状态来判断:
1.空闲的,也就是静止的时候,2个都为高电平,为0状态;
2.若黄线识别到下降沿 ...

1. 不管你用什么方式,万变不离其宗,只是使用这个状态表的方法不同而已,因为编码器就是按照这个原理设计的;
2. 编码器的安装位置是随机的,你不可能知道那个状态是起始状态,除非这个编码器分辨率很低,安装误差不会影响初始状态;3. 如果按10楼所说,芯片中有相应的硬件支持,那是最好的了,但是需要认真研读芯片的手册。

使用特权

评论回复
10
dalarang| | 2023-10-26 08:27 | 只看该作者
以前做过用中断方式根据4个状态值判断旋转方向,4个状态依序前进或后退,不允许突变,我当时还戏称这叫猴子爬树算法,就像猴子爬树一样只允许按1234或4321顺序进退。

不过不太好用,编码器转快了容易有丢步的情况。

其实最简单就是利用单片机TIM的编码器功能进行检测,稳定可靠。

使用特权

评论回复
评论
zlf1208 2023-10-26 08:33 回复TA
能得到硬件的支持当然是求之不得的 
11
QuakeGod| | 2023-10-26 08:30 | 只看该作者
这个就是最普通的 AB相编码器。
处理方法有很多,当然,网上的文章有正确的也有错误的。
最合适的方法就是楼上的楼上的那种 4状态 的 状态机,输出结果是4倍频,而且不会漏状态。

你上面说的,判断黄线的下降沿时候,红线的状态。这个有误判的可能。
最简单的例子就是黄线的上升沿或者下降沿产生了抖动,好几个下降沿,这时候你的方法就会产生误判。

使用特权

评论回复
12
medety|  楼主 | 2023-10-26 08:40 | 只看该作者
QuakeGod 发表于 2023-10-26 08:30
这个就是最普通的 AB相编码器。
处理方法有很多,当然,网上的文章有正确的也有错误的。
最合适的方法就是 ...

也就是 “zlf1208|高级工程师 | 2023-10-25 14:16 | “ 所发的这4个状态?
在大循环里面判断1->2->3->4->1是正转,4->3->2->1->4是反转,这样,对吗?

使用特权

评论回复
评论
zlf1208 2023-10-26 09:45 回复TA
是的 
13
维修超人| | 2023-10-26 09:44 | 只看该作者
楼主的思路是对的,但是要改进一下,要两个信号线都要开启外部中断,而且是上下沿两个中断。
黄线下降沿时读红线是高电平 逆时针转开始 标志置一(黄线进中断后改为上升沿触发),然后红线下降沿时读黄线是低电平 则逆时针转一格结束(红线进中断后改为上升沿触发)。有以上两次中断加电平判断则转一格有效,其他情况认为是干扰过滤掉。我用红外光电编码器不停的测试,转几个小时都不会漏掉一个。

使用特权

评论回复
14
xch| | 2023-10-26 10:39 | 只看该作者
需要消除毛刺。

一般是启用A和B两通道的上下沿中断。
A通道中断后,禁止A 通道中断,启动B通道中断。 正转 A^B
B通道中断后,禁止B 通道中断,启动A通道中断。 正转 ~A^B

使用特权

评论回复
15
medety|  楼主 | 2023-10-26 10:42 | 只看该作者
xch 发表于 2023-10-26 10:39
需要消除毛刺。

一般是启用A和B两通道的上下沿中断。

感觉你这个思路比较清晰呢。

使用特权

评论回复
16
medety|  楼主 | 2023-10-26 10:45 | 只看该作者
维修超人 发表于 2023-10-26 09:44
楼主的思路是对的,但是要改进一下,要两个信号线都要开启外部中断,而且是上下沿两个中断。
黄线下降沿时 ...

这种方法有什么缺陷么?

A通道中断后,禁止A 通道中断,启动B通道中断。 正转 A^B
B通道中断后,禁止B 通道中断,启动A通道中断。 正转 ~A^B


这样似乎很简单,思路非常清晰。

使用特权

评论回复
17
xch| | 2023-10-26 10:52 | 只看该作者
medety 发表于 2023-10-26 10:45
这种方法有什么缺陷么?

A通道中断后,禁止A 通道中断,启动B通道中断。 正转 A^B

缺点是代码太短,干完活,打字员就失业了

使用特权

评论回复
18
medety|  楼主 | 2023-10-26 11:13 | 只看该作者
本帖最后由 medety 于 2023-10-26 11:27 编辑


总结一下就是:
定义黄线为A,红线为B。
0.启动A、B同时为下降沿触发,等待其中一个触发。
a:
        1.若A下降沿触发,关闭A中断,等待B下降沿触发。
        2.若B下降沿触发,关闭B中断,打开A上升沿触发,等待A上上升沿触发。
        3.若A上升沿触发,关闭A中断,打开B上升沿触发,等待B上上升沿触发。
        4.若B上升沿触发,确定为正转。启动A、B同时为下降沿触发,等待其中一个触发.
b:
        1.若B下降沿触发,关闭B中断,等待A下降沿触发。
        2.若A下降沿触发,关闭A中断,打开B上升沿触发,等待B上上升沿触发。
        3.若B上升沿触发,关闭B中断,打开A上升沿触发,等待A上上升沿触发。
        4.若A上升沿触发,确定为反转。启动A、B同时为下降沿触发,等待其中一个触发

是不是这样就靠谱了?
以上4个状态中添加个时间进去?
会不会在某个异常的时候,卡死了,出不来?

使用特权

评论回复
19
zlf1208| | 2023-10-26 11:27 | 只看该作者
本帖最后由 zlf1208 于 2023-10-26 11:45 编辑
medety 发表于 2023-10-26 11:13
总结一下就是:
定义黄线为A,红线为B。
0.启动A、B同时为下降沿触发,等待其中一个触发。

不需要a和b这样的程序的

1. 在使能中断前先读取AB的状态,保存起来作为初始状态(即上一次状态);
2. 设置AB端口为边沿中断模式,就是不论A还是B只要有变化就中断,不要单用上升沿或者下降沿;
3. 开启中断
4. 中断程序中将AB上一次的状态作为switch语句的变量,用板凳楼的状态转换表确定旋转方向,然后用当前状态覆盖上一次状态

其它细节参考楼上各位即可,硬件上在AB端口各加一个RC滤波

使用特权

评论回复
20
medety|  楼主 | 2023-10-26 11:31 | 只看该作者
zlf1208 发表于 2023-10-26 11:27
不需要a和b这样的程序的

1. 在使能中断前先读取AB的状态,保存起来作为初始状态(即上一次状态);

能不能麻烦上段代码,给理解一下?

使用特权

评论回复
评论
zlf1208 2023-10-26 12:14 回复TA
不好意思,我有10年没有自己写代码了,生疏了 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

69

帖子

0

粉丝