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 知识体系结构图

下面这张图,把绝对式编码器的核心知识点串起来了。你可以看到单圈/多圈、格雷码/二进制码、三种通讯协议之间的关系。

绝对式编码器知识体系 绝对式编码器知识体系 绝对式编码器 单圈 vs 多圈 格雷码 vs 二进制码 通讯协议 单圈(360°) 多圈(4096圈) 二进制码 格雷码 SSI BiSS EnDat 关键选择建议 • 单圈编码器:适合旋转角度不超过 360° 的应用(机械臂关节、云台) • 多圈编码器:适合需要记录多圈旋转的应用(数控机床主轴、AGV 车轮) • 格雷码:抗干扰能力强,适合高速读取;二进制码:人眼易读,适合调试 • 通讯协议:SSI 便宜但无 CRC;BiSS 开源且可靠;EnDat 功能丰富但专利限制

3.5 避坑指南

我曾经踩过的坑:

  • 多圈编码器电池没电:多圈编码器断电后靠电池保持圈数计数。电池没电,上电后圈数就丢了。我建议在系统里加电池电压检测,低电量时报警。
  • SSI 数据线太长:SSI 的时钟频率不高,但线长超过 10 米,信号就容易变形。我一般用差分 RS-422 传输,或者加中继器。
  • 格雷码转二进制溢出:如果编码器位数超过 MCU 的 int 位数,转换时要注意数据类型。我吃过 uint16_t 存 17 位数据的亏。

3.6 小结

绝对式编码器的核心就三件事:单圈还是多圈、格雷码还是二进制码、用哪种通讯协议。选型时,先想清楚应用场景,再定参数。通讯协议方面,我个人推荐 BiSS,开源、可靠、速度快。当然,如果你用海德汉的编码器,EnDat 也是好选择。

嗯,这一章就到这里。记住:编码器是伺服系统的眼睛,选对了,系统就稳了一半。