• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

编码器的STC单片机实例分析

就常用的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的动作后,可以在此函数内做出对应的动作处理。函数内包含了按键的单击,双击,长按和长按松手检测。

大家可以参考下程序

EC11.zip

全部回复(17)
正序查看
倒序查看
2021-06-09 23:06

之前没用过旋转编码器,这个要判断位置,是不是得ABC都检测,比如EC11EH 是001,010,100这3个状态一个循环?谢谢

0
回复
#回复内容已被删除#
3
#回复内容已被删除#
4
k6666
LV.9
5
2021-06-10 12:36

感谢楼主分析程序,学习下。编码这块接触的少。

0
回复
2021-06-10 14:51
@天府大懒猫
之前没用过旋转编码器,这个要判断位置,是不是得ABC都检测,比如EC11EH是001,010,100这3个状态一个循环?谢谢

AB是脉冲,C是普通的按键,高低电平,

0
回复
飞翔2004
LV.10
7
2021-06-16 14:50

EC11编码器能识别正反旋转吗?如何识别?

0
回复
2021-06-18 09:31

长按检测的时间设置是多少啊,3S?

0
回复
2021-06-21 19:47
@飞翔2004
EC11编码器能识别正反旋转吗?如何识别?

主要是检测AB脉冲来确定那个方向旋转

0
回复
2021-06-21 19:59
@快乐的小天使
长按检测的时间设置是多少啊,3S?

可以的

0
回复
iszjt
LV.5
11
2021-06-22 09:05

STC单片机(具有PCA功能的),怎么实现可变频率的PWM输出?

0
回复
2021-06-26 10:08

旋转编码器是不是通过旋转来改它的阻值,来达到各个脉冲大小实现的呢?

0
回复
2021-06-28 23:21

如何保证编码器的精度如何呢

0
回复
鲁珀特
LV.4
14
2021-07-02 16:19

这种编码器听说过但没用过,有个疑问,会不会某一种角度,所有输出管脚都处在高电平(低电平)

0
回复
2021-07-08 09:41
@飞翔2004
EC11编码器能识别正反旋转吗?如何识别?

识别这个AB的相位

0
回复
2021-07-08 09:42
@iszjt
STC单片机(具有PCA功能的),怎么实现可变频率的PWM输出?

可以改变频率的,改变周期那个数值就可以

0
回复
2021-07-08 09:43
@13688922894a
旋转编码器是不是通过旋转来改它的阻值,来达到各个脉冲大小实现的呢?

ab脉冲的相位不一样

0
回复
2021-07-08 09:46
@鲁珀特
这种编码器听说过但没用过,有个疑问,会不会某一种角度,所有输出管脚都处在高电平(低电平)

默认状态都是高电平,只要转动的话既可以检测的

0
回复