式光電編碼器基本構造及特點
用增量式光電編碼器有可能由于外界的干擾產生計數錯誤,并且在停電或故障停車后無
法找到事故前執行部件的正確位置。采用式光電編碼器可以避免上述缺點。式光電
編碼器的基本原理及組成部件與增量式光電編碼器基本相同,也是由光源、碼盤、檢測光柵、
光電檢測器件和轉換電路組成。與增量式光電編碼器不同的是,式光電編碼器用不同的
數碼來分別指示每個不同的增量位置,它是一種直接輸出數字量的傳感器。在它的圓形碼盤
上沿徑向有若干同心碼道,每條上由透光和不透光的扇形區相間組成,相鄰碼道的扇區數目
是雙倍關系,碼盤上的碼道數就是它的二進制數碼的位數,在碼盤的一側是光源,另一側對
應每一碼道有一光敏元件;當碼盤處于不同位置時,各光敏元件根據受光照與否轉換出相應
的電平信號,形成二進制數。這種編碼器的特點是不要計數器,在轉軸的任意位置都可讀出
一個固定的與位置相對應的數字碼。顯然,碼道越多,分辨率就越高,對于一個具有 N 位
二進制分辨率的編碼器,其碼盤須有N 條碼道。式光電編碼器原理如圖1-8 所示。
式光電編碼器是利用自然二進制、循環二進制(格雷碼)、二-十進制等方式進行光
電轉換的。式光電編碼器與增量式光電編碼器不同之處在于圓盤上透光、不透光的線條
圖形,光電編碼器可有若干編碼,根據讀出碼盤上的編碼,檢測位置。它的特點是:
可以直接讀出角度坐標的值;沒有累積誤差;電源切除后位置信息不會丟失;編碼器的
取決于位數;運轉速度比增量式光電編碼器高。
圖1-8 式光電編碼器原理
1.3.2 碼制與碼盤
式光電編碼器的碼盤按照其所用的碼制可以分為:二進制碼、循環碼(格雷碼)、
十進制碼、六十進制碼(度、分、秒進制)碼盤等。四位二元碼盤(二進制、格雷碼)如圖
1-9 所示。圖中黑、白色分別表示透光、不透光區域。
圖 1-9 四位二元碼盤
圖 1-9(a)是一個四位二進制碼盤,它的里圈碼道為碼道,半圈透光半圈不透光,
對應于位C1,外圈為第n 碼道,共分成2n 個亮暗間隔,對應于位Cn,n 位二元
碼盤小分辨率為:
二進制馬盤的缺點是:每個碼道的黑白分界線半與相鄰內圈碼道的黑白分界線是
對齊的,這樣就會因黑白分界線刻畫不造成粗誤差。采用其他的有權編碼時也存在類似
的問題。圖1-10 是一個四位二進制碼盤展開圖,圖中aa 為位碼道黑白分界線的理想位
置,它與其他三位碼道的黑白分界線正好對齊,當碼盤轉動,光束掃過這一區域時,輸出數
碼從0111 變為1000 不會出現錯誤。如果C1 道黑白分界線刻偏到a’a’,當碼盤轉動時,輸
出數碼就會從0111 變為1111 再變到1000,中途出現了錯誤數碼1111。反之C1 道黑白分界
線刻偏到a’’a’’,當碼盤轉動時,輸出數碼就會從0111 變為0000 再變到1000,中途出現了
錯誤數碼0000。為了消除這種粗誤差,可以采用循環碼盤(格雷碼盤)。
圖 1-9(b)是一個四位循環碼盤,它與二進制碼盤相同的是,碼道數也等于數碼位數,
因此小分辨率也是式(1-2)求得,內圈也是半圈透光半圈不透光,對應R1 位,外圈
是第n 碼道對于Rn 位。與二進制碼盤不同的是:第二碼道也是一半透光一半不透光,第i
碼道分為2i-1個黑白間隔,第i 碼道的黑白分界線與第i-1 碼道的黑白分界線錯開360° / 2i。
循環碼盤轉到相鄰區域時,編碼中只有一位發生變化。只要適當限制各碼道的制作誤差和安
裝誤差,就不會產生粗誤差。由于這一原理,使得循環碼盤獲得廣泛的應用。
1.3.3 二進制碼與循環碼的轉換
式光電編碼器是利用自然二進制或循環二進制(格雷碼)方式進行光電轉換的,編
碼的設計一般是采用自然二進制碼、循環二進制碼、二進制補碼等。特點是不要計數器,在
轉軸的任意位置都可讀出一個固定的與位置相對應的數字碼;干擾能力強,沒用累積誤差;
電源切斷后位置信息不會丟失,但分辨率是由二進制的位數決定的,根據不同的要求,
可以選擇不同的分辨率即位數。目前有10 位、11 位、12 位、13 位、14 位或更高位等多種。
其中采用循環二進制編碼的式編碼器,其輸出信號是一種數字排序,不是權重碼,
每一位沒有確定的大小,不能直接進行比較大小和算運算,也不能直接轉換成其他信號,
要經過碼變換,變成自然二進制碼,再由機讀取以實現相應的控制。而在碼制變換
中有不同的處理方式,本文著重介紹二進制格雷碼與自然二進制碼的互換。
(1)格雷碼(又叫循環二進制碼或反射二進制碼)介紹
在數字系統中只能識別 0 和1,各種數據要轉換為二進制代碼才能進行處理,格雷碼是
一種無權碼,采用編碼方式,典型格雷碼是一種具有反射特性和循環特性的單步自補碼,
它的循環、單步特性消除了隨機取數時出現重大誤差的可能,它的反射、自補特性使得求反
方便。格雷碼屬于性編碼,是一種錯誤小化的編碼方式,因為,自然二進制碼可
以直接由數/模轉換器轉換成模擬信號,但某些情況,例如從十進制的3 轉換成4 時二進制
碼的每一位都要變,使數字電路產生很大的電流脈沖。而格雷碼則沒有這一缺點,它是
一種數字排序系統,其中的相鄰整數在它們的數字表示中只有一個數字不同。它在任意
兩個相鄰的數之間轉換時,只有一個數位發生變化。它大大地減少了由一個狀態到下一個狀
態時邏輯的混淆。另外由于數與小數之間也一個數不同,故通常又叫葛萊反射碼或
循環碼。表1-1 為幾種自然二進制碼與格雷碼的對照表:
表 1-1 幾種自然二進制碼與格雷碼的對照表
從表 1-1 種可以得出,十進制數N 與n 位二進制碼滿下關系:
可見,二進制碼由于是有權碼,滿足(1-4)的關系,而格雷碼是無權碼,不滿足(1-4)
的關系。它與所對應的角度不存在類似(1-3)的關系,因此須找出循環碼和二進制碼之
間的對應關系和相互轉換規則。
(2)二進制碼轉換成制格雷碼
二進制碼轉換成制格雷碼,其法則是保留二進制碼的位作為格雷碼的位,而次
高位格雷碼為二進制碼的高位與次高位相異或,而格雷碼其余各位與次高位的求法相類似。
圖1-11 所示為二進制碼轉換成格雷碼。
圖 1-11 自然二進制碼轉換成二進制格雷碼
圖 1-12 為將二進制碼轉換為格雷碼的電路圖,其中圖(a)為并行轉換電路,圖(b)
為串行轉換電路。當采用串行電路時,工作之前先將D 觸發器D1 置0,Q=0,在Ci 端送入
C1,異或門D2 輸出R1=C1○+ 0=C1,隨后加CP 脈沖,使Q=C1;在Ci 端加入C2,D 輸出R2=C2○+
C1,以后重復上述過程,可以依次獲得R1,R2,……,Rn。
(3)格雷碼轉換為二進制碼
格雷碼轉換成二進制碼,則是保留格雷碼的位作為二進制碼的位,而次高位二
進制碼為高位二進制碼與次高位格雷碼相異或,而二進制碼的其余各位與次高位二進制碼的
求法相類似。圖1-13 為將格雷碼轉換為二進制碼的電路,其中圖(a)為并行轉換電路,圖
(b)為串行轉換電路。當采用串行電路時,工作之前先將JK 觸發器D 置0,Q=0,將R1
同時加到J、K 端,再加入CP 脈沖后,Q=C1= R1。以后若Q 端為Ci-1 在J、K 端加入Ri。
根據JK觸發器的特性,若J、K為“1”則加入CP脈沖后, i 1 Q C − = ;若J、K 為“0”則
加入CP 脈沖后保持Q=Ci-1。這一邏輯關系可以寫成:
圖 1-13 格雷碼轉換為二進制碼的電路
格雷碼是無權碼,采用格雷碼盤獲得的格雷碼R1,R2,……,Rn 須按圖1-11 轉換為
對應的二進制碼C1,C2,……,Cn 后,才能代入(1-3)式確定與之對應的角度。
(4)格雷碼與二進制碼互換的軟件實現方法
(a)二進制碼轉換成格雷碼的軟件實現法
根據自然二進制轉換成格雷碼的法則,可以得到以下的代碼:
static unsigned int DecimaltoGray(unsigned int x)
{
return x^(x>>1);
}
//以上代碼實現了unsigned int 型數據到格雷碼的轉換,可轉換32 位自然二進
制碼,出32 位將溢出。
static int DecimaltoGray( int x)
{
return x^(x>>1);
}
//以上代碼實現了 int 型數據到格雷碼的轉換,可轉換31 位自然二進制碼,
出 31 位將溢出。
上述代碼即可用于 VC 控制程序中,也可以用于單片機控制程序中。在單片機程序設計
時,若采用匯編語言編程,可以按相同的原理設計程序;若采用C 語言編程,則可以直接
利用上述代碼,但建議用unsigned int 函數。
(b)軟件實現法(參見示例工程中的 Gray to Binary )
根據二進制格雷碼轉換成自然二進制碼的法則,可以得到以下的三種代碼方式:
static unsigned int GraytoDecimal(unsigned int x)
{
unsigned int y = x;
while(x>>=1)
y ^= x;
return y;
}
static unsigned int GraytoDecimal(unsigned int x){
x^=x>>16;
x^=x>>8;
x^=x>>4;
x^=X>>2;
x^=x^1;
return x;
}
static unsigned int GraytoDecimal(unsigned int x)
{
int i;
for(i=0;(1<<i)<sizeof(x)*8;i++)
{
x^=x>>(1<<i);
}
return x;
}
//以上代碼實現了unsigned int 型數據到自然二進制碼的轉換,可轉換32 位格雷碼,
出32 位將溢出。將數據類型改為int 型即可實現31 位格雷碼轉換。
上述代碼即可用于 VC 控制程序中,也可以用于單片機控制程序中。在單片機程序設計
時,若采用匯編語言編程,可以按相同的原理設計程序;若采用C 語言編程,則可以直接
利用上述代碼,但建議用unsigned int 函數。









