打印
[应用方案]

AB相旋转编码器解码

[复制链接]
795|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dzfansman|  楼主 | 2024-2-17 23:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AB相旋转编码器有两根信号脚,为A和B。当编码器旋转时,编码器内部两个开关交替通断,两个开关公共端接电源时,A、B脚输出方波;当A超前(或滞后)B时,为正转,反之为反转。以下是摘抄至小孩子的解码算法,简单高效。
假设函数IS_PIN_A_HIGH()和IS_PIN_B_HIGH()是读取A,B两个引脚的状态
假设有两个外中断INT0和INT1都已经配置为双边沿触发模式,则解码如下:
  • //! 编码计数器
  • static volatile uint32_t s_wQDCounter = 0;
  • ISR(INT0_vect)
  • {
  •     if (IS_PIN_A_HIGH() && IS_PIN_B_HIGH()) {
  •         s_wQDCounter++;
  •     } else {
  •         s_wQDCounter--;
  •     }
  • }
  • ISR(INT1_vect)
  • {
  •     if (IS_PIN_A_HIGH() && IS_PIN_B_HIGH()) {
  •         s_wQDCounter--;
  •     } else {
  •         s_wQDCounter++;
  •     }
  • }



读取全局变量s_wQDCounter的时候别忘记加入中断保护。如果要追求效率,可以将计数器类型修改为uint16_t。

--------------------------
以上就是中断法,可以用引脚电平变化中断来做。上面的代码是4倍频。如果要2倍频,去掉任何一个中断处理程序即可。
如果要单倍频,选择任意一个外中断,并选择只对某个边沿触发即可。

多年测试,稳定可靠~
记住一句口诀:

任意边沿触发模式下,A和B进行电平比较:
对A触发的中断:同加异减
对B触发的中断:同减异加
反之亦然

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

2023

帖子

0

粉丝