问题背景:
在客户定制板中,有一个PWM输出来控制步进电机的转动,由一个IO来控制电机的正反转,这时就有一个问题了,步进电机前进或者后退了多少呢?系统中无法获取实际电机前进了多少,这时就需要一个PWM捕获功能来实现。客户的电机上是自带一个编码器,如下图:

前面电机部分线是电机的驱动电源,后面黑帽部分线是编码器的电源线和数据线,数据线分A/B项。步进电机驱动这边就不过多介绍了,下面主要来介绍一些编码器的运行原理
电机编码器介绍:
按监测原理分类
光电编码器
光电编码器是应用于电机旋转角度检测的一种编码器,工作原理是利用发射器发出的光束被光电接收器接收,从而识别旋转的角度。光电编码器具有精度高、灵敏度高、反应速度快等优点,适用于矫正误差较小的电机和精度要求较高的电机。
![]()
霍尔编码器
霍尔编码器是应用于电机旋转角度检测的另一种编码器,利用霍尔元件和永磁体的作用原理来检测电机的角度。霍尔编码器具有体积小、功耗低、抗干扰能力强等优点,适用于要求灵活性高、转速较快的电机。
![]()
原理:
一个霍尔传感器:
![]()
两个霍尔传感器:
![]()
两个霍尔传感器正反转:
![]()
实际霍尔传感器原理:
![]()
磁性编码器
磁性编码器也是应用于电机旋转角度检测的一种编码器,其工作原理是利用磁性的变化来检测电机的角度。磁性编码器具有精度高、抗干扰能力强等优点,适用于转速较快、精度要求较高的电机。
![]()
按输出信号分类:
增量式编码器
增量式编码器是将设备运动时的位移信息变成连续的脉冲信号,脉冲个数表示位移量的大小。其特点如下:
只有当设备运动时才会输出信号。
一般会输出通道A和通道B 两组信号,并且有90° 的相位差(1/4个周期) ,同时采集这两组信号就可以计算设备的运动速度和方向。 如下图,通道A和通道B的信号的周期相同,且相位相差1/4个周期,结合两相的信号值:
当B相和A相先是都读到高电平(1 1),再B读到高电平,A读到低电平(1 0),则为顺时针转
当B相和A相先是都读到低电平(0 0),再B读到高电平,A读到低电平(1 0),则为逆时针转
除通道A、通道B 以外,还会设置一个额外的通道Z 信号,表示编码器特定的参考位置 如下图,传感器转一圈后Z 轴信号才会输出一个脉冲,在Z轴输出时,可以通过将AB通道的计数清零,实现对码盘绝对位置的计算。
增量式编码器只输出设备的位置变化和运动方向,不会输出设备的绝对位置。
![]()
绝对式编码器
绝对式编码器在总体结构上与增量式比较类似,都是由码盘、检测装置和放大整形电路构成,但是具体的码盘结构和输出信号含义不同。
它是将设备运动时的位移信息通过二进制编码的方式(特殊的码盘)变成数字量直接输出。其特点如下:
其码盘利用若干透光和不透光的线槽组成一套二进制编码,这些二进制码与编码器转轴的每一个不同角度是唯一对应的。
绝对式编码器的码盘上有很多圈线槽,被称为码道,每一条(圈)码道内部线槽数量和长度都不同。它们共同组成一套二进制编码,一条(圈)码道对应二进制数的其中一个位(通常是码盘最外侧的码道表示最低位,最内侧的码道表示最高位)。
码道的数量决定了二进制编码的位数,一个绝对式编码器有N 条码道,则它输出二进制数的总个数是2的N次方个。
读取这些二进制码就能知道设备的绝对位置,所以称之为绝对式编码器。
编码方式一般采用自然二进制、格雷码或者BCD 码等。
自然二进制的码盘易于理解,但当码盘的制造工艺有误差时,在两组信号的临界区域,所有码道的值可能不会同时变化,或因为所有传感器检测存在微小的时间差,导致读到错误的值。比如从000跨越到111,理论上应该读到111,但如果从内到外的3条码道没有完全对齐,可能会读到如001或其它异常值。
格雷码(相邻的两个2进制数只有1个位不同)码盘可以避免二进制码盘的数据读取异常,因为格雷码码盘的相邻两个信号组只会有1位的变化,就算制造工艺有误差导致信号读取有偏差,最多也只会产生1个偏差(相邻信号的偏差)。
![]()
编码器模式介绍:
本次使用的是增量式编码器,下面就详细介绍一下增量式编码器的工作模式。
首先来看一张图;

正转:
正转时A项比B项提前半个周期。
仅在A项计数时:
在1时刻,A上升沿触发,B为低电平
在3时刻,A下降沿触发,B为高电平
仅在B项计数时:
在2时刻,B上升沿触发,A为高电平
在4时刻,B下降沿触发,A为低电平
反转:
反转时A项比B项延后半个周期。
仅在B项计数时:
在5时刻,B上升沿触发,A为低电平
在7时刻,B下降沿触发,A为高电平
仅在A项计数时:
在6时刻,A上升沿触发,B为高电平
在8时刻,A下降沿触发,B为低电平
毛刺介绍:
在第一个毛刺时,A上升沿触发,B为低电平,为正转
+1;之后A为下降沿触发,B为低电平,为反转-1.所以就实现了去毛刺的功能,其他的波形就不一一介绍了,同理可证。
由上述触发模式,可以衍生出三种工作模式,分别为:1倍频、2倍频、4倍频

由于倍频越高,计数就越准,这次就直接采用4倍频的方式进行计数,这样计数可以有效的减小因为编码器的抖动导致的计数不准确。
下表为正反转的关系对照表:

知道上表之后就可以写驱动了。
驱动编写:
#include <linux/ini



被折叠的 条评论
为什么被折叠?



