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触发的中断:同减异加
反之亦然
|