摘要:编码电位器全解析,附带完整源代码
近期有个项目用到了数字矩阵键盘来输入,但板子面积受限,于是改用编码电位器,花了点时间研究下可360º旋转的编码电位器。
从原理出发,按照自己的思路写了一段代码,用起来不错,分享一下。
引言
编码器这个东西最早我还是从伺服电机上看到的,不过那一个编码器就够买好几斤的单片机了,不过和这里讨论的编码电位器有点类似,都有AB相,也是通过相位差判断正反转。更早之前在51单片机上我就写了一个这样的程序,但那个仅仅能实现基本的加减,现在又重新拿出来优化一下。
这个两个东西长这样
分析
硬件
先从原理说起,这种编码器说白了就是把角位移转换成数字量,这就会像ADC一样,有个分辨率的参数。电机上的通常分辨率都在256以上,编码电位器好像我看到的都是15,也就是把360º分成15份,然后转一个(360/15)º就会输出一组电平。我做实验的这个规格书这样描述的:
从图上可以看到,根据分辨率不一样,输出的波形也不一样。分辨率15的转一格每相电平只变化一次,而分辨率20的会变化两次。我这个是只会变化一次的,理论上用这个程序只要除2就可以用于变化两次的编码器。
找到一张网上的原理简图,不太看得明白,具体里面长啥样应该要拆开才看得到了,但是我只有一个,拆了就没了,这东西拆了基本就别想装回去。
对于电路连接来说好像大部分都一样的,这样一接就行了:
代码思路
从电路上看,程序主要就是检测AB两根线的电平,按键就当普通的按键一样处理就行了。为了方便程序处理,把AB两线编码到一个字节的最低两位。硬件直接这样接最舒服了,但是多半的情况没有这样美好,就得额外的处理一下(下面的代码有注释)。
下面从规格书的输出波形图分析关键的两步:
- 识别转动一格,就是检测两线的电平发生了一组[相同—>一些变化—>又相同]这样的变化。第二次相同时即是转动了一格完成。
- 识别转动方向,才两线电平由相同到再次相同这个过程中哪根线先发生变化,就可以认为这根线的相位相比另一根超前一些,认为是正转(当然也可以认为是反转)。
程序流程图是这样的:
代码上手
说了这么多还是代码最实在(下面的代码我已经整理好了,复制就能用)
程序说明
运行MCU:MKL26单片机 CORTEX-M0内核
编译器:MDK_V5 IDE
移植:要提供一个1ms精度的时间戳SysTime(根据需要也可以低一点精度)
程序特点:
- 非阻塞式运行
- 易移植性
- 支持多级可变速度的加减
- 支持旋扭消息队列
源码:
1 | define _PORT _gpio //硬件端口,如果是在同一GPIO下可以使用GPIO寄存器 |
顺带头文件也贴出来吧
1 | ifndef _ENCODER__H_ |
使用方法
- 1.先调用encoder_init()进行初始化,然后在定时器里定时调用encoder_scan()进行扫描
- 2.使用encoder_config()配置计数变量、计数范围等参数
- 3.(可选)使用encoder_register_active_callback()注册回调函数
- 4.(可选)使用encoder_dirget()读取消息,返回的不是计数值,而是往哪个方向拧了一下
使用效果
goooood!
总结
芝士就是力量
本文作者: TDA2030
本文链接: https://tda-2030.github.io/2019/10/20/application-of-encoder/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!