
格雷碼(Gray codes),又稱反射二進制碼(Reflected Binary Code,RBC),是一種設計巧妙的編碼方式,可有效降低數字信號在狀態轉換時的錯誤。通過確保每次只改變一位,它不僅簡化了硬件設計,也在從旋轉編碼器到錯誤糾錯等各種應用中減少了歧義與瞬態錯誤。
本文將回顧格雷碼的基本原理,并提供工程師在實際電路設計中可應用的實用技巧。
理解反射二進制(格雷)碼
反射二進制碼由于其發明者為Frank Gray而被稱為格雷碼,是一種系統化排列的二進制數序列。其設計核心在于每一個后續數值僅與前一個數值在單一位上不同。這一特性,使格雷碼與傳統二進制序列明顯不同,后者在狀態轉換時可能同時翻轉多個位,這增加了錯誤與歧義的風險。
以十進制數值1與2為例:在標準二進制表示中,它們分別為001與010,從一個數值遞增到另一個數值需翻轉兩個位。然而在格雷碼中,這兩個數值分別表示為001與011,確保每次遞增僅改變一個位。這看似微小的設計調整,對實際應用卻影響巨大:它能減少狀態變化中的歧義,降低誤判的風險。
長期以來,格雷碼在工程實踐中受到高度重視。它能抑制機電開關中因多位同時翻轉而產生的瞬態錯誤;在現代數字通信系統中,也可降低傳輸錯誤。通過簡化邏輯運算并限制每次轉換僅改變單個位,格雷碼為可靠的數字設計提供了堅實的基礎。
格雷碼與自然二進制代碼的比較
與標準二進制編碼不同,標準二進制編碼在數值遞增過程中可能改變多個位,而格雷碼確保連續兩個值之間只有一位發生翻轉。這種單個位轉換最大限度地減少了狀態變化時的歧義,并實現了簡單的錯誤檢測:如果多個位意外改變,系統可以將數據標記為無效。
這一特性對位置編碼器和數字控制系統尤為重要。多位同時改變可能引起瞬態錯誤,導致控制器誤判位置。下圖比較了自然二進制與格雷碼序列的遞增過程,凸顯了格雷碼如何保持單個位變化,確保穩定性。

圖1:表格比較格雷碼與自然二進制序列,突顯每次遞增的單個位轉換。
在絕對編碼器輸出可靠性方面,格雷碼為首選,因其可避免自然二進制在狀態轉換期間可能引發的數據錯誤。例如,從0011到0100的自然二進制轉換,如果多個位同時翻轉,可能短暫顯示為0111。格雷碼通過確保每次僅改變一個位來避免這個問題,從而使輸出流更加可靠,也更便于控制器在實際應用中進行驗證。
此外,將格雷碼轉回自然二進制簡單快速,即使在紙上也能完成。方法如下:
將格雷碼序列寫下,復制最左邊的位到下方。
將該復制位與右側下一格雷碼位進行XOR (忽略進位),將結果置于復制位旁。
依序進行,直至序列全部轉換完成,最終行即為自然二進制值。
舉例:格雷碼1011
復制最左邊位 → 二進制開始為1
1 XOR 0 = 1 → 二進制變為11
1 XOR 1 = 0 → 二進制變為110
0 XOR 1 = 1 → 二進制變為1101

圖2:表格展示格雷碼1011逐步轉換為自然二進制1101的過程。
格雷碼在旋轉編碼器中的輸出
格雷碼編碼器的核心差異在于輸出方式。與直接反映轉子位置的二進制數不同,格雷碼編碼器輸出非加權碼,確保每個相鄰狀態僅一位改變。
相比之下,自然二進制在遞增或遞減時,往往需多位同時翻轉,易造成歧義,甚至引起控制器誤判位置,導致系統響應錯誤。格雷碼通過單個位變化,降低了這類風險,確保了狀態檢測更可靠。
圖3展示了4位格雷碼輸出旋轉編碼器。它包含四個輸出端子(1、2、4、8)與一個公共端。1-2-4-8表示4位碼位位置,每個端子對應編碼器一條輸出線。隨轉子旋轉,每條線依格雷碼序列在高低電平切換,為每個位置生成獨特的4位模式。

圖3:數據片段展示25LB22-G-Z 4位格雷碼編碼器端子編號。(來源:Grayhill)
公共端子提供參考連接,通常為地或電源回路,用于測量四個輸出信號。這些端子共同生成完整格雷碼輸出,控制器或邏輯電路可據此判斷編碼器角度位置。
附注:十六進制輸出編碼器
部分旋轉編碼器設計為輸出十六進制信號,將4位二進制字直接映像為十六進制(0–F)。此方式方便與已使用十六進制處理數據的數字系統整合,如微控制器或診斷接口。
不同于格雷碼,十六進制輸出不保證單個位轉換,因此在機械切換期間更易產生歧義。但在追求緊湊表示與解碼簡單的應用中,即使犧牲部分轉換可靠性,仍具有實用價值。
控制器對格雷碼的解碼
格雷碼可通過多種方式解碼,但最常見方法是將輸出位送入微控制器,由軟件處理計數。程序通過I/O端口讀取旋轉編碼器信號,先將格雷碼轉換為二進制值,再轉換為二進制編碼十進制(BCD),方便驅動數字顯示器。
微控制器可據此更新七段數碼管、LCD或其他接口,清楚呈現轉子位置。軟件化方法不僅簡化了硬件設計,還具靈活性,可支持高分辨率編碼器或額外處理功能。
個人經驗分享:我最初對格雷碼編碼器的實驗,是以硬件邏輯電路而非軟件解碼。
本文旨在揭開格雷碼的神秘面紗,為工程師提供一些背景信息和清晰的解釋。未來仍有更多深入探討空間,歡迎讀者在評論區分享經驗、見解或問題,促進更深入的討論與技術交流。
