基于LC 振荡的旋转编码器的研究与设计
发布时间:2009-04-20 作者:刘晨之 河海大学计算机及信息工程学院
1. 引言
旋转编码器按编码方式可分为增量式和全量式(或绝对式);按传感方式可分为开关式(接触式)和光电式(非接触式)[1]。增量式编码器只能产生记数脉冲和方向信号(增减信号),结构简单,价格低廉,但需要记数装置进行记数。当受到大的干扰而丢数时,编码器本身不能记住当前编码器的位置,因而可靠性略差。全量式编码器能够产生全量程的各个编码信号,不需要记数装置,当受到大的干扰而丢数时,编码器能够记住当前编码器的位置,因而可靠性高。但结构复杂,价格昂贵。这两种编码器既可以用开关进行传感,也可以用光电元件进行传感。开关传感式编码器的传感元件是无源器件,因而可以用于低功耗场合。但由于电刷开关的摩擦阻力或行程开关的凸轮阻力,开关传感式编码器一般不能用于灵敏编码的场合。光电传感式编码器的发光元件需要消耗一定的电流,因而一般不能用于低功耗场合。但由于光电元件没有接触阻力(轴与轴承的摩擦阻力忽略不计),光电传感式编码器可以用于灵敏编码的场合。综上所述,现有的旋转式编码器二者优点往往无法同时兼顾。目前尚无一种功耗低、灵敏度高的编码器可供选用。
2. 编码原理

图2.1 振荡衰减检测原理图
如图2.1 所示:当充满电的电容与电感并联便会产生自由振荡,如果振荡回路没有损耗振荡就会一直进行下去。但实际电路总会存在损耗,因此实际的自由振荡是(弱)衰减振荡。当有闭合金属靠近电感时,由于闭合回路的涡流感应消耗振荡回路的能量,使振荡衰减加速[2]。
通过检测一定延时时间的振荡幅值就可以知道是否有闭合金属靠近传感器线圈,如图所示。

图2.2 延时检测原理图
图2.2 中d t 是延时时间, g t 是检测时间。
振荡衰减检测型传感器的优点是,传感器线圈仅一个绕组,结构简单,外围电路元件少。缺点是需要特殊的控制电路,通常需要有专用的处理器来控制。这里采用的是TI 公司的MSP430FW42x 单片机,设计振荡衰减检测型传感器(以下简称LC 传感器)。
LC 传感器采用振荡检测电路作为传感器。振荡检测电路的传感元件是LC 振荡器,属于非接触式传感,它的阻力等同于光电编码器,工作阻力非常小(只有轴和轴承的摩擦阻力),工作平稳,结构简单(甚至比光电开关还简单),同时LC 型编码器的功耗极低(实测<10μA),因而它可以用于既要求灵敏编码、工作平稳,同时又要求低功耗的场合。
LC型编码器采用编码、记数相结合的方式进行旋转编码。LC振荡器如果采用2个,即可组成最小格雷码编码器,编码值为:00、01、11、10,共可以编码4个数,超过4个数的范围采用电子计数器记数(正、负记数),使编码器的量程扩大。
旋转码盘的基本结构是一片金属材料和一片非金属材料交替组成的栅格,根据码盘直径的大小可以分布不同数量栅格。由于LC振荡器在接近金属片和远离金属片时,振荡的衰减速度是不同的,根据需要可以将衰减快的位置定义为“1”,将衰减慢的位置定义为“0”,反过来定义也一样。
增量编码器的码盘如图:

图2.3 增量编码器的码盘示意图
增量码盘的编码顺序如图所示:

图2.4 对应编码示意图
从增量编码器的信号输出次序00, 01, 11, 10可以看出,信号符合循环码的排列次序。所以,增量编码器也是最小循环码编码器。通过检测A,B传感器,就完成了对旋转运动的编码过程
3. 计量及纠错
由前可知A、B 两个信号的状态转移共会,出现16 种结果:
1、递增转移:00→01,01→11,11→10,10→00;
2、递减转移:00→10,10→11,11→01,01→00;
3、“0“转移:00→00,01→01,11→11,10→10;
4、错误转移:00→11,01→10,11→00,10→01。
见状态图:

图2.5 状态转移图
其中递增转移和递减转移都是正常转移。“0”转移其实是没有转移,2 种情况可能“0”转移:
第一种情况是抖动,如00→01→00。抖动时,单片机侦测到状态变化产生中断,进行中断处理时状态又恢复到抖动前,因此单片机侦测到中断产生却没有状态变化。
第二种情况是检测错误,如00→01,但检测却是00→00。状态变化时,单片机侦测到状态变化产生中断,进行中断处理时检测状态发生错误,如将01 检测成00,因此单片机侦测到中断产生却没有检测到状态变化。错误转移是逻辑的不可能,如00→11,但实际检测却发生的状态。2 种情况可能产生错误转移:
第一种情况是当前检测错误,如00→01,但01 状态检测成了11,产生逻辑不可能错误。第二种情况是前一次检测错误,本次检测正确,如00→01→11,但01 状态检测成了00,所以实际检测就成了00→00→11,也产生逻辑不可能错误。
处理LC 传感器,MSP430FW427 单片机内部状态机和一个增减计数器,对2 个传感器的递增状态和递减状态进行增减计数器处理。对“0”转移状态不做处理,对错误转移状态仅给出错误标记,并未对计数器进行处理[3]。为了对错误转移状态作处理,必须自己设计处理算法。下面将对处理算法进行介绍:
状态预估纠错
LC 编码器的编码规律符合循环码的,即相邻2 个数之间只有1 个码位发生变化。对于只有2 个传感器的编码器来说,产生错误必然是2 个传感器同时发生变化。而2 个传感器同时发生变化的情况又一定是在相隔的2 个数之间。如:
递增编码00→01→11→10→00;
递减编码00→10→11→01→00。
相隔的2 个数之间的状态变化是:00→11、01→10、11→00、10→01。
当发生1 个码位变化时进行正常处理,即递增或递减记数。如00→01、01→11、11→10、10→00 情况+1;00→10、10→11、11→01、01→00 情况-1。
当发生2 个码位变化时,应该进行+2 或-2 处理。但究竟是+2 还是-2 要进行判断。如00→11:可能的情况是00→11(00→01→11)+2,或者00→11(00→10→11)-2。由于00→11状态转变时丢失了中间状态01 或10,因此单凭00→11 本身无法判断应该是+2 还是-2。如果知道编码器目前的旋转的方向,就可以知道应该+2 还是-2。也就是如果编码器正向旋转00→11(00→01→11)+2,反向旋转00→11(00→10→11)-2。正向旋转或反向旋转可以从其次状态变化知道。如:
00→01、01→11、11→10、10→00 正向旋转;
00→10、10→11、11→01、01→00 反向旋转。
因此,只有保留3 次传感器状态就可以判断2 个码位同时变化应该是+2 还是-2。如果3次状态的排列是:前2 次→前1 次→当前,编码器记数可以用下列表格表示:
表2.1 编码及状态处理表

2 个编码器的3 次状态共有64 个组合。其中:
32 个组合是当前与前1 次只有1 个码位变化,可按正常+1 或-1 处理;
16 个组合是当前与前1 次没有码位变化,可做+0 处理;
8 个组合是本次与前1 次有2 个码位变化,但前1 次与前2 次只有1 个码位变化,可以根据前1 次与前2 次的码位变化判断,做+2 或-2 处理;
8 个组合是本次与前1 次有2 个码位变化,同时无法判断编码器的旋转反向,只能做+0处理。
总结64 个组合,有32 个组合是正常递增或递减变化;16 个组合是0 变化,可能的原因是抖动或干扰;8 个组合是2 个码位同时变化,但可以判断方向,作做+2 或-2 处理;8 个组合是2 个码位同时变化,同时无法判断方向,只能放弃作做+0 处理。出现8 个无法处理的组合的原因是连续出现2 次2 个码位变化,同时又无法判断方向。因此在处理时,前1次和前2 次的传感器状态应该保留可以判断方向的状态,从而避免无法处理的情况。
从表2.1 可以看出,软件编程时,可以将状态排序编码(表格中的HEX 码)作为指针,处理的增减值作为内容,直接采用查表方式对编码器值进行增减处理[4]。
编程举例:
// 定义表格和变量
static const signed char Cadd[]={ // 3 次状态对应的编码器记数表
0, 1,-1, 0,-1, 0, 2, 1,-1,-2, 0,-1, 0,-1, 1, 0,
0, 1,-1,-2,-1, 0, 0, 1,-1, 0, 0,-1, 2,-1, 1, 0,
0, 1,-1, 2,-1, 0, 0, 1,-1, 0, 0,-1,-2,-1, 1, 0,
0, 1,-1, 0,-1, 0,-2, 1,-1, 2, 0,-1, 0,-1, 1, 0};
signed int CodeData; // 编码器增减计数器
char State; // 状态排序存储器,也是查表指针
// 状态变化时中断处理程序
State &= 0x3C; // 00XXXX00,保留前1 次和前2 次状态
State |= SIFCTL3 & 3; // 00XXXXXX,读取当前状态形成查表指针
CodeData += Cadd[State]; // 查表获得编码器记数值
if((!State^(State >> 2)) & 3 != 0) // 如果当前状态与前1 次状态只有
// 一个码位变化
State <<= 2; // XXXXXX00,状态排序左移2 位,做为方向
return; // 中断返回
采用状态预估法可以对单个错误进行纠错,不能纠正2 个连续的错误。对单个错误进行纠错时,需要借助前2 次的正确状态。这就是说,在一个状态周期内,状态预估纠错法只能纠正一次错误。
我们还可以增加传感器来增加编码个数,由于编码信息量增加,纠错的手段也可以增多,纠错的效果也可以大大提高。当然完成复杂的纠错其编程工作也会相对复杂。由于多了传感器,编码速度也会相应的降低,但能够换来编码的高可靠性,相对降低编码速度也是值得的。具体方法就不再累述。
4. 硬件设计

图4.1 LC 编码器实验电路
从图4.1可以看出,水位变化的信息可以通过两个LC传感器进行检测。检测产生的信号由主控制器MSP430FW427 来处理。MSP430FW427 单片机是TI公司(德州仪器TexasInstruments)针对电子式流量与旋转运动检测开发的专用MCU芯片,它将超低功耗MCU、旋转扫描接口(Scan IF)和液晶显示LCD驱动模块结合为一体,该器件的超低功耗结构和检测模块不仅延长了电池的寿命,同时还提高了仪表的精度与性能[5]。通过前文提到的算法对ScanIF模块的PSM状态表进行设计,对其相应的寄存器进行操作,就能够对LC电路产生的振荡波衰减幅度的几种状态进行分析,从而计算出相应的数据,达到测量的目的。
5. 结论
本文研究的旋转编码器具有灵敏度高、功耗小的优点,是传统理论解决实际问题的新探索。它的传感元件是LC 振荡器,属于非接触式传感,所以它的阻力等同于光电编码器,同时其功耗极低,因而可以用于既要求灵敏编码同时又要求低功耗的场合。同时它具有结构简单,成本低的优点,运用范围十分广泛。当然振荡检测型旋转编码器并不能取代现有的各种类型编码器,它是编码器类型的一种补充。
参考文献
[1] 上海倍加福,《旋转编码器》,2001 年。
[2] 刘宝玲,《通信电子线路》,北京邮电大学出版社,2005 年:5~10。
[3] MSP430FW42x Scan IF peripheral,Texas Instruments,2003。
[4] 魏小龙,MSP430 系列单片机接口技术及系统设计实例,北京:北京航空航天大学出版社,2002。
[5] MSp430x4xx Family User’s Guide,Texas Instruments Incorporated,2005。