码盘参考设计
非 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 辅助创作。