3、绝对式编码器原理:单圈/多圈、通讯协议(SSI/BiSS/EnDat)、格雷码与二进制码
绝对式编码器,说白了就是「一上电就知道位置」的传感器。增量式编码器你得先找零位,它不用。我最早接触绝对式编码器是在一个伺服项目里,电机一通电就报错,查了半天发现是编码器电池没电了——嗯,多圈绝对式编码器是需要电池的,这个坑我后面会细说。
3.1 单圈 vs 多圈:你到底需要多少圈?
绝对式编码器分两种:单圈和多圈。单圈的,只能记录一圈内的位置。多圈的,能记录转了多少圈。
你想想看,一个单圈绝对式编码器,分辨率是 17 位,那就是 2^17 = 131072 个位置。电机转一圈,位置值从 0 走到 131071。再转一圈,又回到 0。它不知道这是第几圈。
多圈就不一样了。它内部有个机械齿轮箱或者电子计数器,能记住圈数。比如 17 位单圈 + 12 位多圈,总共 29 位,能记录 2^12 = 4096 圈。
核心区别:
- 单圈:适合旋转角度不超过 360° 的应用,比如机械臂关节、云台。
- 多圈:适合需要记录多圈旋转的应用,比如数控机床主轴、AGV 车轮。
我在项目中遇到过一个问题:客户用单圈编码器做卷扬机的位置反馈。结果卷扬机钢丝绳收放超过一圈,位置就乱了。后来换成多圈编码器,问题解决。所以选型时一定要想清楚:你的设备会不会转超过一圈?
3.2 格雷码 vs 二进制码:为什么不用二进制?
绝对式编码器的码盘上刻着码道。每个位置对应一个唯一的码字。这个码字可以用二进制表示,也可以用格雷码表示。
二进制码有什么问题?举个例子:从 7(0111)变到 8(1000),四个位同时变化。如果码盘制造有误差,或者读取时刻不对,可能读到 1111 或者 0000,那位置就飞了。
格雷码就不一样。相邻两个码字只有一位不同。从 7 到 8,格雷码是 0100 变到 1100,只变了一位。就算读取时机不准,最多错一个 LSB 的位置。
| 十进制 | 二进制码 | 格雷码 |
|---|---|---|
| 0 | 0000 | 0000 |
| 1 | 0001 | 0001 |
| 2 | 0010 | 0011 |
| 3 | 0011 | 0010 |
| 4 | 0100 | 0110 |
| 5 | 0101 | 0111 |
| 6 | 0110 | 0101 |
| 7 | 0111 | 0100 |
| 8 | 1000 | 1100 |
格雷码转二进制,有固定公式。我一般用查表法,或者用异或运算。给你一个 C 代码片段:
// 格雷码转二进制
uint16_t gray_to_binary(uint16_t gray) {
uint16_t binary = gray;
while (gray >>= 1) {
binary ^= gray;
}
return binary;
}
// 二进制转格雷码
uint16_t binary_to_gray(uint16_t binary) {
return binary ^ (binary >> 1);
}
我的习惯:在 MCU 里处理编码器数据时,我通常先把格雷码转成二进制,再做位置计算。虽然格雷码可以直接用于查表,但二进制更符合人的直觉,调试也方便。
3.3 通讯协议:SSI、BiSS、EnDat
绝对式编码器把位置数据传出来,需要通讯协议。主流的三种:SSI、BiSS、EnDat。我一个个说。
3.3.1 SSI(同步串行接口)
SSI 是最老的,也是最简单的。它用时钟线和数据线。主设备发时钟脉冲,编码器在时钟的上升沿或下降沿输出数据位。
SSI 的帧格式:
- 起始位(通常是 0)
- 位置数据(比如 25 位)
- 状态位(比如 1 位,表示编码器是否正常)
- 校验位(可选)
- 停止位(时钟停止一段时间)
SSI 的缺点很明显:速度慢,而且没有 CRC 校验。我早期用 SSI 编码器时,遇到过数据跳变的问题,后来加了软件滤波才解决。
3.3.2 BiSS(双向同步串行接口)
BiSS 是 SSI 的升级版。它也是时钟+数据,但支持双向通讯。主设备可以往编码器写数据,比如修改参数、触发自检。
BiSS 的帧格式更复杂:
- 起始位
- 位置数据
- 状态位
- CRC 校验(6 位或 8 位)
- 停止位
BiSS 的速度比 SSI 快很多,时钟频率可以到 10 MHz 以上。而且有 CRC,数据可靠性高。
BiSS 的优势:
- 支持 CRC 校验,数据更可靠
- 支持双向通讯,可以配置编码器
- 速度快,适合高速伺服系统
3.3.3 EnDat(海德汉的协议)
EnDat 是海德汉(Heidenhain)的专利协议。它也是同步串行,但帧结构更灵活。EnDat 支持多种传输模式:位置传输、参数传输、诊断传输。
EnDat 的帧格式:
- 模式选择(4 位)
- 位置数据
- 附加信息(比如温度、速度)
- CRC 校验
EnDat 的优点是功能丰富,但缺点是专利限制,只能用海德汉的编码器。我在一个高端数控项目里用过 EnDat,确实稳定,但价格也感人。
| 协议 | 速度 | CRC | 双向通讯 | 专利 |
|---|---|---|---|---|
| SSI | 慢(~1 MHz) | 无 | 否 | 无 |
| BiSS | 快(~10 MHz) | 有 | 是 | 无(开源) |
| EnDat | 快(~8 MHz) | 有 | 是 | 海德汉 |
3.4 知识体系结构图
下面这张图,把绝对式编码器的核心知识点串起来了。你可以看到单圈/多圈、格雷码/二进制码、三种通讯协议之间的关系。
3.5 避坑指南
我曾经踩过的坑:
- 多圈编码器电池没电:多圈编码器断电后靠电池保持圈数计数。电池没电,上电后圈数就丢了。我建议在系统里加电池电压检测,低电量时报警。
- SSI 数据线太长:SSI 的时钟频率不高,但线长超过 10 米,信号就容易变形。我一般用差分 RS-422 传输,或者加中继器。
- 格雷码转二进制溢出:如果编码器位数超过 MCU 的 int 位数,转换时要注意数据类型。我吃过 uint16_t 存 17 位数据的亏。
3.6 小结
绝对式编码器的核心就三件事:单圈还是多圈、格雷码还是二进制码、用哪种通讯协议。选型时,先想清楚应用场景,再定参数。通讯协议方面,我个人推荐 BiSS,开源、可靠、速度快。当然,如果你用海德汉的编码器,EnDat 也是好选择。
嗯,这一章就到这里。记住:编码器是伺服系统的眼睛,选对了,系统就稳了一半。