碼盤參考設計
非 2ⁿ 解析度絕對碼盤:360、1000 位置的迴圈格雷碼

要 360 或 1000 個絕對位置且首尾只變一位,可擷取反射格雷碼中間的對稱段,兩端各去 (2ⁿ − M)/2 個碼。本文推導對稱性、擷取與解碼公式,說明奇數位置數為何做不到,給出 360、1000 位置的碼道數、碼元寬、解碼錶與版圖檢查項。
分度盤、閥門執行器、十進位制顯示的儀器常要每轉 360 個(每位置 1°)或 1000 個絕對位置。格雷碼的位數決定了一圈 2ⁿ 個碼,360 和 1000 都不是 2 的冪。最直接的做法是取 9 位格雷碼的前 360 個,可是首碼 G(0) = 000000000 與末碼 G(359) = 111010100 有 5 位不同,轉過接縫時各位翻轉的先後稍有偏差,就會讀出離真實位置很遠的中間碼。本文給出讓首尾也只差一位的構造方法、解碼公式和版圖要注意的地方。

反射格雷碼的對稱性
n 位反射格雷碼 G(i) = i XOR (i » 1),i = 0…2ⁿ − 1。把 i 換成它的映象 i′ = 2ⁿ − 1 − i,即 i 的 n 位按位取反:
i′ = i XOR (2ⁿ − 1),i′ » 1 = (i » 1) XOR (2^(n−1) − 1)
兩式異或得
G(2ⁿ − 1 − i) = G(i) XOR 2^(n−1)
也就是說,關於中點對稱的兩個碼只差最高位。這就是“反射”一詞的來源:低 n − 1 位在後半段是前半段的映象,最高位從 0 變成 1。
擷取條件與解碼
要得到 M 個位置的迴圈碼,保留中間序號 i = s … 2ⁿ − 1 − s,兩端各去掉
s = (2ⁿ − M) / 2
個碼。段首 G(s) 與段尾 G(2ⁿ − 1 − s) 正好是一對映象,只差最高位,首尾閉合處也滿足相鄰只變一位;段內本來就逐個只變一位。位數取 n = ⌈log₂M⌉,s 必須是整數,所以 M 必須是偶數。
解碼分兩步:先把格雷碼轉成二進位制,b(n−1) = g(n−1),b(k) = b(k+1) XOR g(k);再減去偏移 p = B − s。若 B < s 或 B > 2ⁿ − 1 − s,讀到的是被截掉的碼,可以直接判為讀碼錯誤。機械零位如需另定,再加一個常數取模 M 即可。
對稱擷取並非僅有的一種截法。我們對 9 位碼逐個起點搜尋,長度 360 且首尾只差一位的連續段有 4 個,起點為 76、204、332、460,後三個都跨過 511 → 0 的接縫,解碼要多一次取模。對稱段的二進位制值連續,解碼只需一次減法,最方便。
奇數位置數為什麼做不到
把 n 位碼看成 n 維立方體的頂點,“只變一位”就是沿一條稜走一步,每走一步碼字中 1 的個數的奇偶性翻轉一次。走一圈回到起點,奇偶性必須復原,所以步數,也就是位置數 M,必須是偶數。這個結論與構造方法無關,任何每步只變一位的迴圈碼都做不到奇數個位置。
需要奇數個位置(例如 125)時有兩種出路:一是做 2M 個位置的迴圈碼,輸出時除以 2,125 位置用 8 位碼的 250 段,s = 3;二是允許接縫處一次變兩位,靠與增量道同步來保證讀數,這要額外分析接縫處的讀數容差。
360 與 1000 位置的引數
| 專案 | 360 位置 | 1000 位置 |
|---|---|---|
| 碼道數 n | 9 | 10 |
| 偏移 s | 76 | 12 |
| 保留序號 | 76…435 | 12…1011 |
| 每位置角度 | 1° | 0.36°(21.6′) |
| 示例最低位半徑 | 15 mm | 18 mm |
| 碼元弧長 2πr/M | 261.8 μm | 113.1 μm |
| 最細條寬(2 個碼元) | 523.6 μm | 226.2 μm |
| 首碼 / 尾碼 | 001101010 / 101101010 | 0000001010 / 1000001010 |
| 無效碼佔比 | 152/512 = 29.7% | 24/1024 = 2.3% |
360 位置的解碼錶(節選):
| 位置 p | 序號 i | 碼字 b8…b0 | 二進位制 B | B − 76 |
|---|---|---|---|---|
| 0 | 76 | 001101010 | 76 | 0 |
| 1 | 77 | 001101011 | 77 | 1 |
| 179 | 255 | 010000000 | 255 | 179 |
| 180 | 256 | 110000000 | 256 | 180 |
| 359 | 435 | 101101010 | 435 | 359 |
碼道圖形見圖2。擷取後每道的跳變數相應減少:360 位置時 b0 為 180 次,b1 為 90 次,b8 仍是半圈明、半圈暗。

版圖要注意的兩處
**接縫處的非常規條寬。**擷取後,每道跨接縫的那一段由段首和段尾兩截拼成,寬度不再是該道的常規值。360 位置時 b4 的常規條寬為 32 個位置,跨接縫的透光段只有 8 個位置;b6、b7 也出現 232、104 個位置的非常規段。最細線寬仍由 b0 的 2 個碼元決定,不影響可製造性,但版圖核對和 AOI 規則不能按“每道條寬固定”來寫,要按整圈逐位置比對碼錶。
**無效碼的檢錯能力有限。**被截掉的碼不會在正常讀數中出現,讀到即可報錯。但單個位讀錯時,360 位置只有約 9.9% 的情況會落進無效碼,1000 位置只有約 1.4%;最高位讀錯則正好變成映象碼,永遠是合法碼,檢不出來。需要讀碼診斷時仍要另加校驗手段。
工程要點
- 擷取公式:n = ⌈log₂M⌉,s = (2ⁿ − M)/2,保留 i = s…2ⁿ − 1 − s;360 位置 s = 76,1000 位置 s = 12。
- 解碼只需格雷轉二進位制後減 s;二進位制值落在 s…2ⁿ − 1 − s 之外即判為讀碼錯誤。
- 不要直接取前 M 個碼:360 位置時首尾相差 5 位,接縫處可能讀出遠離真實位置的碼。
- 奇數位置數沒有單步迴圈碼,需改做 2M 位置再除以 2,或在接縫處與增量道同步。
- 版圖按整圈碼錶逐位置核對,不按“每道固定條寬”檢查:360 位置的 b4 在接縫處有一段只有 8 個位置寬。
- 截掉的碼只能兜住約 10% 以下的單個位錯誤,且最高位錯誤永遠檢不出,診斷要另加措施。
小結
反射格雷碼關於中點對稱的兩個碼只差最高位,擷取中間的對稱段就能得到任意偶數個位置的迴圈格雷碼,解碼只多一次減法。奇數個位置受奇偶性限制無法實現單步迴圈。360、1000 位置分別需要 9、10 條碼道,版圖上要特別核對接縫處的非常規條寬。
延伸閱讀:ENC7 編碼器碼盤生產廠家(中文首頁) · 碼盤技術文庫
關於我們:晶正光電專注編碼器碼盤研發製造,玻璃、金屬、PC 碼盤均可按圖客製。
官網:https://enc7.com
© 廊坊晶正光電技術有限公司 版權所有,未經書面許可不得轉載、摘編。本文藉助 AI 輔助創作。