编码器原理讲解
编码器是将信号或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。简单点说就是把机械位移转变成为电信号的传感器,按码盘的刻孔可分为增量型和绝对值型两种。
常用的正交编码器,便是增量型编码器的一种,其A、B两相信号相位差为90°,它是将位移转换成周期性的电信号,再把这个电信号按一定的解码方式,转变成计数脉冲,用脉冲的个数表示位移的大小。
而绝对值编码器的每一个位置对应一个确定的数字码,因此它的示值只与测量的起始和终止位置有关,而与测量的中间过程无关。这里不过多赘述。
常用的正交编码器是光电型编码器,其原理为:编码器内部有一个转动的码盘,有若干个透明和不透明的窗口,用光电接收器收集断续的光束,这样,就把光脉冲转换成了电脉冲,然后由电子输出线路进行处理并输出。

这是一个简略图,图中的方框可认为是光电接收器,设内环为A相,外环为B相,则通过透明和不透明的部分,就会形成一个如下的方波信号。这个A相和B相的相位差是90°,他们可以通过相位先后的关系来判断方向是正转还是反转。

如何判断编码器的速度大小和方向正反,是通过AB相的高低电平和相位关系来判断的,具体可以看下图:其中TI1FP1就是A相,TI2FP2就是B相,这里的TI1FP1指的是TI1经过滤波和极性控制后的信号,所以理想状态下,两个信号一样。一般的编码器是有三种计数模式,即仅在TI1计数、仅在TI2计数、和TI1,TI2都计数。
这里拿仅在TI1计数为例:
当TI1信号(A相)产生上升沿时,检测B相的电平:
- 若为低电平,则计数器向上计一个数;
- 若为高电平,则计数器向下计一个数。
当TI1信号(A相)产生下降沿时,检测B相的电平:
- 若为低电平,则计数器向下计一个数;
- 若为高电平,则计数器向上计一个数。
而此时B相的上升沿和下降沿对计数器无影响。
其余工作模式同理。

一般为了计数更加准确,都会用TI1、TI2都计数的工作模式。因为这样需要计数器向上计4个数,才算正确的转过指定角度。具体的图像可以看下面这张图。当产生AB相信号不准确时,计数器很难正确的计4个数,因此防干扰能力变强。

代码实现
明白了编码器的原理,但代码要实现还是比较困难,这里先暂且留白,因为我是用智能车学的编码器,逐飞库已经把编码器的底层代码封装完成,我只用调用函数完成我的需求即可,所以底层的代码还是不太会写,今后再学习。
那这里我把调用函数的思路说一下吧:
-
一定要先写一个编码器初始化函数,来确定哪个定时器通道来检测编码器的AB相
-
定义两个变量,把编码器收集到的数据提取出来
-
对收集的编码器速度数据进行简单的滤波,减少干扰
-
为了我们方便检查,我们可以另写一个编码器计数函数,来看编码器究竟转过多少圈,具体实现思路如下:
{//函数作用是,显示累积圈数和处理每圈余下的脉冲数//注意这里要查看准确,自己车上的编码器是否是转过一圈有100个脉冲信号(可能需要修改)//右轮处理:当右轮编码器计数脉冲+右轮脉冲余数(未转满一圈的脉冲数)>100时,此时相当于右轮有转过了一圈//所以右轮 gptR_Cir 圈数要+1 ,而 gptR_Rem 脉冲余数要取余if((abs(gpt[0])+gptR_Rem)>100){gptR_Cir+=(abs(gpt[0])+gptR_Rem)/100;gptR_Rem=(abs(gpt[0])+gptR_Rem)%100;}else{gptR_Rem=abs(gpt[0])+gptR_Rem;}//左轮同理if((abs(gpt[1])+gptL_Rem)>100){gptL_Cir+=(abs(gpt[1])+gptL_Rem)/100;gptL_Rem=(abs(gpt[1])+gptL_Rem)%100;}else{gptL_Rem=abs(gpt[1])+gptL_Rem;}} -
每调取一次这个函数(一般放在中断里,通过提取转圈次数和时间间隔作比,可以算出编码器转动速度,以此来确定当前小车速度),就要清除一次计数值,一是为了防止计数值超出,二是为了方便下一次转动速度的计算。
部分信息可能已经过时














