就常用的EC11旋转编码器为例来分析
一开始我只是在示波器和数控电源上见到过旋转编码器,那时候我听人说这叫数字电位器,就觉得很神奇,是什么结构竟然可以让一个“电位器”无限的转下去。后来才知道汽车的车机上用的也是旋转编码器。
一、旋转编码器作为人机交互的输入设备,最常用的是EC11(类似的还有EC12、EC16等)
具体电路分析如下
EC11测试电路原理图.无外部上拉电阻.几乎所有单片机IO口都可以设置为输入上拉模式,也可以省略EC11的外部上拉电阻,但是我没有这样做。
在研究EC11的时序之前首先要了解一点,EC11按旋转的输出动作可以分为两种。一种是转两格,A、B对C端输出一个完整脉冲(转一格就只是由低电平->高电平或由高电平->低电平);另一种就是转一格,A、B对C端输出一个完整脉冲。
二、具体原理分析一下,如何让输出脉冲的
两定位一脉冲的EC11稍微复杂一些,转动一格只会输出半个脉冲。静止时,AB触点开关可以是断开的也可以是闭合的。
若初始状态时AB都是高电平,转动一格就输出从高电平到低电平的下降沿,随后一直输出低电平。对应于EC11内部AB两个触电开关的动作为断开-->闭合。若初始状态时AB都是低电平,转动一格就输出从低电平到高电平的上升沿,随后一直输出低电平。对应于EC11内部AB两个触点开关的动作为闭合-->断开。由于两脉冲一定位的EC11会有两种初始状态,写驱动程序就需要考虑多一些情况。再者,这类EC11在转动到内部AB触点一直闭合的时候,就相当于把上拉电阻的另一端接地,无形中加大了系统的功耗(若外接10K上拉电阻到5V电源就是500uA的电流),这对于低功耗应用来说是非常不利的。因此对于无特殊要求的人机输入应用来说,我都推荐使用一定位一脉冲的EC11。
当然了,有一些质量比较差的EC11会有一些额外的问题要考虑,例如开关的抖动问题,例如转动定位不清晰,静止时AB两个触点都要闭合或者都要断开才对,但是定位点不清晰,转动的角度不到位导致一个触点已经闭合(断开)了,另一个触点却还保持在断开(闭合)。
这样就输出了高低电平的脉冲了
三、stc15单片机程序分析
//----------------IO口定义----------------//
#define EC11_A_Now P36 //EC11的A引脚,视为时钟线
#define EC11_B_Now P35 //EC11的B引脚,视为信号线
#define EC11_Key P37 //EC11的按键
文件内需要的静态局部变量
//----------------局部文件内变量列表----------------//
static char EC11_A_Last = 0; //EC11的A引脚上一次的状态
static char EC11_B_Last = 0; //EC11的B引脚上一次的状态
static char EC11_Type = 1; //定义变量暂存EC11的类型---->>>>---- 0:一定位对应一脉冲; 1:两定位对应一脉冲
//所谓一定位对应一脉冲,是指EC11旋转编码器每转动一格,A和B都会输出一个完整的方波。
//而 两定位对应一脉冲,是指EC11旋转编码器每转动两格,A和B才会输出一个完整的方波,只转动一格只输出A和B
编码器扫描程序
按键检测部分
我们自己用EC11,大多数时候都是选择带按键的,这就可以把按键检测加入到EC11的动作扫描程序中,实现单独的检测按键以及按下按键时转动转轴。
扫描到EC11的动作后,可以在此函数内做出对应的动作处理。函数内包含了按键的单击,双击,长按和长按松手检测。
大家可以参考下程序