游标码光电角度编码器原理教育八讲(一)
一、从游标卡尺说起
游标卡尺有主尺和副尺,主尺的49mm分成副尺的50格,这样每格就是49/50=0.98mm,对于副尺来说,除了刚开始(0刻线)和最后结束(50刻线)的两根刻线是和主尺的刻线对齐之外,副尺的第1根刻线的尺寸是0.98mm,主尺的第1根刻线的尺寸是1mm,两者相差1/50=0.02mm,如果移动副尺让副尺的第一根刻线和主尺的第一根刻线对齐,这个时候副尺就移动了0.02mm,如果继续移动让第2刻线对齐那就是移动了0.04mm,第49根刻线对齐就是移动了0.98mm。
二、光电编码器的三件套
码盘、LED光源、光电池是光电编码器的三个核心元器件,码盘固定在转轴上,LED光源发出的光照射到码盘的光栅上,透射或反射的光照射在光电池上,转轴每转过码盘上一个光栅的角度,光电池就产生一个周期的正弦波和余弦波电压信号,如下图所示:
LED光源和光电池在码盘的两侧,光线透过码盘照射在光电池上称为透射式光电编码器。LED光源和光电池在码盘的同侧,光线照射在码盘上再反射回来照射在光电池上称为反射式光电编码器。
三、游标码原理
转轴每转过码盘的一个光栅,光电池就输出一个完整周期的正弦波和余弦波。通常码盘最外一圈轨道的光栅数量是512个,每转过一个光栅就是360/512=0.703125度。一个完整周期的正弦波和余弦波可以定义为360度(2π),可以通过Cordic算法(下一篇文章再详细讲解此算法)或是查表法得到当前位置。如果计算的最小单位是度,一个光栅就可以分成360份,理论上通过Cordic算法可以把一个光栅分成任意想要的份数(可以理解为在一光栅内均匀刻上等宽度的细线)。通过Cordic算法或是查表法得到当前光栅内的位置,还需要知道当前是第几个光栅才能计算出转轴的角度。
为了确定当前是第几个光栅,码盘上设置了3个轨道,每个轨道的光栅数量是不同的。通常游标码原理的码盘设置了3个轨道(从外往内定义为M、N、S码道):
常见的一款码盘,其最外面的码道是512个光栅(定义为M码道),里面一个码道是510个光栅(定义为N码道)。这些光栅分成左右两个半圆对齐,各是256个M光栅对齐255个N光栅。在同一个时刻(转轴同 个角度)对M光栅和N光栅的输出sin/cos信号进行采样,根据采样的sin/cos信号进行Cordic计算,将M光栅细分成255份,N光栅细分成256份,想像成在M光栅里均匀刻上255根细刻线,N光栅里均匀刻上256根细刻线。这样M码道和N码道每个半圆就都细分成了256*255=65280道细刻线(255*256=65280),这些细刻线都是对齐的:
由于M码道的光栅比较窄一些,所以同一个位置M码道Cordic计算出来的角度要大一些,N码道Cordic计算出来的角度要小一些,M码道的角度比N码道的角度大多少呢?
我们来计算一下:
M码道:360/255=1.4117647度,N码道:360/256=1.40625度;如果当前位置在第0个光栅,M码道和N码道的细刻度线是对齐的,假设是细刻度线是3, M码道和N码道的角度差=1.4117647*3-1.40625*3=3*(1.4117647-1.40625)=0.016544度
在第0个光栅内,细刻度线的最大数字是255,所以在第0个光栅内M码道和N码道的角度差可能是0~255*(1.4117647-1.40625)=0~1.40625(0~255)*(360/255-360/256)=(0~255)*360*(256-255)/255*256 =(0~255)*360*/255*256 = (0~1)*360/256
在第1个光栅内,M码道和N码道的角度差可能是(1~2)*360/256, 第i个光栅内,M码道和N码道的角度差可能是(i~i+1)*360/256,这样我们根据M码道和N码道的Cordic角度差就能知道当前所处M码道的光栅序号了。
这样看起来,似乎我们只需N和M码道就可以计算出来具体的角度了,那为什么还要再增加一个S码道呢?上面的说法是纯理论的,实际上做起来,很可能由于LED的光量不太稳定,每道光栅的刻度不太均匀,如果第i个光栅和第i-1以及i+1个光栅计算出来的相位差都是相同的i呢?那我们就分不清楚到底是不是第i-1个光栅还是i+1个光栅了,如果不做进一步的判断修正,硬要按i-1或是i+1光栅来计算,计算出来的角度就会产生一个光栅的角度误差,因此我们需要再增加一个S码道来做进一步的判断以修正此误差。
256个M码道对齐255个N码道再对齐240个S码道,所以对于M码道和S码道来说,是16个M码道对齐15个S码道(这里我们把每16个M码道称为1组,一共是16组),因此按照同样的角度差计算方法,使用M码道和S码道的角度差我们可以区分出来当前光栅是16个M码道中的第j个光栅,但是我们无法区分出来是第几组。但是结合M码道和N码道的角度差,我们可以得出当前M码道是第i个光栅,只是这个i偶尔有点误差,如果i/16取整数就等于把M码道按照16个光栅一组来进行分组,i/16取整数就能知道当前光栅是第几组,M码道和S码道的角度差又能知道是这组中的第几个光栅,那我们就能确切知道当前是第几个光栅了,然后再对光栅内的位置进行Cordic计算,我们就能得到当前位置的精确角度了。
MNS三个码道形成2把游标卡尺利用游标码原理经过计算就能知道当前位置,但是由于左右2个半圆是完全对等的,因此还需要区分转轴当前的位置是左半圆还是右半圆,需要使用另外的方法来判断是属于左半圆还是右半圆。一种方法是在码盘上增加MTA和MTB信号(下图的中间两个码道),理论上只要有一个MTA或是MTB信号就可以区分是左半圆还是右半圆了,使用2个信号MTA&MTB的原因:一是需要修正误差,二是进行多圈计数时需要区分是正转还是反转,这个在第三讲多圈计数里面再来做详细说明。
