徐 海,胡荣贵,张 东
(1.电子工程学院 研究生一队,安徽 合肥 230037;2.电子工程学院 602室,安徽 合肥 230037)
旋转编码器作为速度和位移的反馈传感器广泛应用于家电、无线电设备控制中,同时在电动机、电梯等需要对运动速度和位移信息反馈的自动化控制场合也起着重要作用。编码器通常有A相、B相两路输出信号,信号包含了被测对象的旋转方向以及旋转角度等信息,通常需要由硬件电路或单片机程序进行鉴相处理。本文根据旋转编码器以及单片机的特点,研究并总结了利用单片机进行鉴相的方法,同时给出了相应的鉴相算法。
根据结构和工作原理不同,编码器可以分为光电式编码器、电磁式编码器和机械接触式编码器。其中,光电式编码器由于具有较高的精度、抗干扰能力强、接口简单、使用方便等特点得到了广泛应用。
根据测量的参数不同,编码器又可分为旋转式和直线式编码器。旋转式编码器用于测量转角转速,直线式编码器用于直线位移、运动速度的精密测量。
旋转编码器又可分为增量式编码器和绝对式编码器。增量式编码器每转过1个单位,编码器就输出1个脉冲,故称为增量式。绝对式编码器是直接输出数字量的传感器,它的特点是不需要计数,在转轴的任何一个位置都可读出一个与位置对应的数字码。
大多数直线式和旋转式编码器都是光透过光电码盘和光栏板夹缝形成忽明忽暗的光信号,硅光敏器件把光信号转换成两组近似于正弦的电信号输送出去,然后根据需要把这些信号进行差值或数字化处理,两组正弦信号 A、B在相位上相差 90°。经放大整形后变成 A、B两组相位相差90°的方波。根据A、B之间的相位关系即通过鉴相可确定旋钮的正反转。当A超前于B时为正转,而当B超前于A时为反转,如图1所示。旋转编码器的输出脉冲宽度随着旋转速度而变化,即转速越高其脉冲宽度越窄。通常每圈的计数脉冲有360个、500个、1 000个等,用户可根据精度的需要进行选择。
在1个脉冲周期时间T内,单片机应该能准确判断出A点相对于B点的相位情况。根据开始采样检测的时刻不同,在T内可以将采样的波形分为如图2所示的4种不同的组合情况。若两点产生波形的组合不在下列4种情况中,则表明由于外部干扰或抖动产生了异常的波形,通常把这种波形称为“毛刺”。
图1 编码器输出脉冲示意图
图2 编码器周期内输出波形的4种组合
依据单片机工作方式通常有以下两种鉴相方法:
(1)查询法
单片机的I/O引脚直接连接A、B点,通过循环采样读取A、B点电平,来判断当前旋钮是否旋转以及旋转的方向。A点电平与B点电平有4种不同的组合:00、01、10、11,可以根据 4种组合状态之间的变化进行鉴相。若正旋转,则可得到对应的序列{00,10,11,01,00},反旋转则有对应的序列{00,01,11,10,00}。 如表 1 所示的判断表中,行表示当前A、B点电平值组合,列表示上一次变化前A、B点电平值组合,检测到发生1次电平变化即可进行鉴相。需要指出的是,若A、B两点电平相比上次均发生了变化,则无法进行判断,这说明检测时遗漏了脉冲或产生了“毛刺”。
表1 A、B相位判断表
为了保证采样A、B电平时没有脉冲遗漏,对采样频率要求比较高。通常需要保证在编码器以最快速度旋转时,在A、B任一点2次电平变化之间有2次以上的采样,以便可以比较最近2次的电平,去除因为其他外界条件变化产生的抖动。试验表明,对于常用的编码器,采样的时间间隔约为1 ms,即可以基本上避免抖动。
在1个时间周期 T内,A、B点电平会变化 4次,即单片机可以根据1个脉冲信号做出4次判断,具有倍频的效果。但是由于毛刺的存在,在不要求倍频的场合,通常采用多次检测判断来识别毛刺,以增强判断的可靠性。通过设立两个缓冲区用来分别存储A、B点的电平,当检测到A、B两点中任何一点电平发生变化时,把A、B两点的电平值分别存入各自缓冲区中。当检测到电平变化发生N次时,通过分别比对正、反旋转序列来进行判断。假设 N=4(即每1个周期 T进行 1次判断),检测到 4次变化后,A缓冲区内的值为 0、1、1、0,B缓冲区内的值为 0、0、1、1,则比对序列{00,10,11,01}可得为正旋转。假设N=3,检测 3次变化后,A缓冲区内的值为 0、0、0,B 缓冲区内的值为 0、1、0, 无法匹配序列{00、01、00},则判断为产生毛刺。如果只检测1次,会做出00->01反转、01->00正转的判断,导致误判。
该鉴相方法具体程序流程如图3所示。按此算法设计的程序,由于判断比较指令较多,运行时间较长,总体响应速度比较低。为了克服这一缺点,可以采用将电平状态组成地址的方法,去掉繁琐的判断与比较,使得运行时间大大缩短,从而提高响应速度。组成地址的方法是:设N次变化进行1次鉴相,第 n次变化前,A、B电平值分别记为 An、Bn(其中 0<n<N+1)。则可以组成地址A1B1A2B2……ANBN。每个地址在Flash程序存储区中都对应一个值用来鉴相,或者可以直接存放程序地址,用程序计数器直接加载跳转到鉴相完成后的处理程序。例如,设N=3,-1对应反向旋转,1对应正向旋转,0表示异常不处理或状态无变化。根据正、反旋转序列可以得到如表2所示的组合地址存放数据表。设1个字节长度的全局变量buf作为缓冲区用来存储电平状态值,同时作为Flash存储区的低字节地址。记录A、B点电平值时采用的是先将buf左移两位,然后同000000AnBn相“与”的方式。存储 3次后,得到buf为 00 A1B1A2B2 A3B3,将该值作为Flash寻址地址的低6位,取出数据即可得到鉴相结果。这种方法实际上是采取了用程序存储空间来换取时间的思路。
图3 鉴相算法流程
在单片机上实现循环检测一般有3种方法:
①直接在后台循环程序中添加任务。
表2 组合地址存放数据表
②采用定时中断,在中断处理程序中检测A、B点电平并进行处理。
③两种方式相结合。由于中断处理程序处理时间过长会增加中断冲突的概率,所以在定时中断处理程序中仅检测电平值,进入缓冲区后中断立即返回。缓冲区判断处理部分交由后台程序完成。
(2)外部中断法
编码器在连接单片机I/O引脚的同时也连接到外部中断引脚INTA、INTB上,如图4所示。
INTA、INTB为单片机外部中断接口。采用这种处理方式,要求单片机的外部中断能够支持中断嵌套和边沿触发。由图1可知,A点相位落后于B点,在A点方波下降沿B点均为低电平。B点的相位超前A点,在B点方波下降沿A点均为高电平。所以,下降沿触发外部中断时,根据采样另一个引脚的电平,可以判断出相位差别。同理,上升沿触发的情况与下降沿触发相类似。边沿触发方式相位判断如表3所示。
图4 编码器外部中断方式连接方法
表3 边沿触发方式相位判断表
也可以将外部中断触发条件设为双边沿触发,根据图1可以发现其规律为:在边沿触发时,若两个点电平相等,则边沿触发的点相位超前;若两点电平不等,则边沿触发的点相位落后。例如在T1时刻,A点上升沿触发,A点电位低,B点电位高,所以A的相位落后 B。在T2时刻,B点下降沿触发,A和B均为高电平,所以B点相位领先于A。
采用上升沿或下降沿触发,产生的是2倍频,而双边沿触发条件则是4倍频。对不特别要求倍频的场合可以采用只连接1个外部中断的方法,判断方法同连接2个外部中断的方法相同。采用1个引脚外部中断,采用上升沿或下降沿触发为单倍频,双边沿触发为2倍频。
在不特别要求倍频的场合,中断方式可以采用类似查询方法的序列比对来增强判断的可靠性:每次中断将A、B点电平放入缓冲区,设立一个全局变量记录中断次数,每中断 N次(N>1),将缓冲区值比对 1次,正反转序列进行1次判断,也可以采用组合地址的方法来缩短中断响应时间。
由于编码器工作的环境可能比较恶劣,输出脉冲较易受干扰,产生毛刺;在编码器快速旋转时,尤其是在倍频工作时,由于采样速率不够,可能导致采样的脉冲有遗漏。这些都会导致鉴相得出错误的结果,需要在单片机程序实现中对这些情况进行纠正。如前所述,可以在单片机处理程序中用比对序列的方法来避免误判。此外还有以下3种方法:
(1)辅助硬件
一般是将编码器的A、B相连接到施密特触发器或滤波电容,然后再同单片机相连,通过触发器来对输出脉冲进行整形,从而达到去除毛刺的效果。
(2)统计纠错
旋钮的匀速转动一般不会产生毛刺,快速转动情况下产生毛刺的情况比较突出。对于1次操作,旋转的方向应该是相同的。根据这个原理,将1次操作中每次旋转的方向记录下来,理论上每次判断的结果应该相同方向,实际上有个别反方向的判断,则可以视为毛刺。
(3)实验纠错
不同的编码器性能不同,产生的毛刺也不同。实验表明,相同的程序并不是都能适应所有的编码器。可以利用示波器观察旋转时A、B脉冲波形及将采样值通过单片机串口发送到PC机的方式,对编码器产生的脉冲波形进行统计分析,包括对匀速旋转、快速旋转、加速旋转、减速旋转等所有可能情况产生的值进行统计分析。
采用ATMEL公司的AVR1280单片机和E6C-CW25CF型旋转编码器分别对查询法和外部中断方法进行编程实验,将AVR1280单片机串口通过电平转换电路,同PC机串口连接。在单片机程序中,将每次采样的值转发到串口,则采样数据通过串口传送到PC机显示。
单片机程序采用定时中断的方式读取I/O引脚电平,程序采用查询法,分别设定时器中断为16 ms、2.5 ms、1 ms对采样的输出结果进行观察:16 ms时,匀速旋转旋钮也会产生脉冲的遗漏;2.5 ms匀速旋转时,脉冲遗漏的情况得到改善,但是加速旋转仍会有脉冲遗漏情况;1 ms时,脉冲无遗漏现象发生。
采用图4的方法连接编码器,将引脚分别连接到外部中断INT0、INT1上。同样在中断发生时,在中断处理程序中可以采样A、B电平通过串口发送到PC机显示观察。将外部中断都设置成双边沿触发,对旋钮进行旋转实验,发现编码器快速旋转时,程序容易产生反方向的误判。采用序列比对的方法,每中断4次进行1次鉴相,可以很好地纠正该问题。结果表明,若使用中断方式4倍频工作,很难依靠单片机软件得到可靠的鉴相结果,需要加强硬件电路。
本文提出的单片机鉴相方法,可以避免一些复杂多余的硬件设计,节约了成本。对采用编码器的嵌入式系统的软硬件开发有一定的参考价值。
[1]姜艳平.编码器发展与应用[J].新自动化,2006(10):61-63.
[2]李德兵.旋钮式键盘及其与AT89C52接口技术[J].单片机与嵌入式系统应用,2003(6):73-74.
[3]崔丽.2009年国内旋转编码器市场分析 [J].电气时代,2009(5):28-30.
[4]王子博.编码器四倍频的单片机高速算法设计[J].控制与检测,2007(11):73-74.
[5]余昌盛.旋转编码器抗抖动接口电路设计[J].计算机应用,2004(8):33-35.
[6]ATmel.ATmega1280/V user’s manual[R].2549K-01/07.2007.