4、绝对式编码器换相:SSI、BiSS、EnDat 协议与多圈绝对值技术

聊完了增量式编码器的找零烦恼,咱们来看看绝对式编码器。这东西,说白了就是「上电就知道自己在哪」。不需要你转一圈找 Z 信号,也不需要你记录圈数。我第一次用绝对式编码器的时候,心里就一个感觉:爽。

但爽归爽,它背后的通信协议和实现原理,还是得掰开揉碎了讲清楚。今天我们就来聊聊 SSI、BiSS、EnDat 这几个主流协议,以及多圈绝对值编码器到底是怎么做到「上电即知位置」的。

4.1 绝对式编码器的核心思想

绝对式编码器,每个位置都有唯一的编码。就像你家的门牌号,不用从街头数到街尾,看一眼就知道是几号。它内部有一个码盘,上面刻着格雷码或二进制码,通过光电或磁感应读取。

我遇到过不少刚入行的工程师,觉得绝对式编码器就是「高级货」,其实不然。它的核心就两点:

  • 单圈绝对值:一圈之内,每个角度都有唯一编码。上电就能知道当前角度。
  • 多圈绝对值:不仅知道当前角度,还知道转了多少圈。靠机械齿轮或电子计数器实现。

嗯,这里要注意:单圈绝对值编码器,如果你断电后电机被外力转动超过了 360°,那上电后位置就不准了。所以很多场合必须用多圈绝对值。

4.2 三大主流通信协议

绝对式编码器需要把位置数据传出来,这就涉及到通信协议。目前工业界最常用的就是 SSI、BiSS 和 EnDat。我个人的习惯是:

  • 简单场合用 SSI,便宜、够用。
  • 高速高精度场合用 BiSS,开源、灵活。
  • 西门子生态或高端伺服用 EnDat,稳定、但贵。

下面这张图,是我自己整理的协议对比框架,你看一眼就能明白它们的关系。

绝对式编码器通信协议对比框架 SSI BiSS EnDat 特性 • 同步串行 • 主从模式 • 时钟+数据线 • 速度较慢 特性 • 开源协议 • 全双工 • 高带宽 • 支持 CRC 特性 • 海德汉专利 • 双向通信 • 带诊断 • 高可靠性 应用场景 通用工业、低成本 应用场景 伺服、机器人、高速 应用场景 高端数控、西门子

4.2.1 SSI 协议(同步串行接口)

SSI 是最老牌的绝对式编码器协议。它的原理很简单:主设备(比如你的控制器)发送一串时钟脉冲,编码器在每一个时钟上升沿或下降沿,同步输出一位数据。

我记得第一次调 SSI 的时候,被时序折腾得够呛。时钟频率不能太高,否则线缆一长,数据就错位。后来我总结了一个经验:

我的经验: SSI 的时钟频率一般不要超过 1 MHz,线长超过 10 米时降到 500 kHz 以下。另外,数据位宽通常是 13 位、25 位或 32 位,记得在接收端做超时判断,防止编码器掉线后一直死等。

SSI 的典型时序是这样的:

// 伪代码:SSI 读取流程
uint32_t ReadSSI(void) {
    uint32_t data = 0;
    for (int i = 0; i < BITS; i++) {
        CLK_HIGH();
        delay_us(1);  // 根据时钟频率调整
        data <<= 1;
        if (DATA_PIN) data |= 1;
        CLK_LOW();
        delay_us(1);
    }
    return data;
}

嗯,这里要注意:SSI 的数据通常是格雷码,收到后要转成二进制。格雷码的好处是相邻位置只变一位,抗干扰强。

4.2.2 BiSS 协议(双向同步串行)

BiSS 是 iC-Haus 公司推出的开源协议。说白了,它比 SSI 快,而且支持双向通信。你可以通过它读取位置,也可以写入参数。

我个人非常喜欢 BiSS,因为它免费、灵活。很多国产伺服驱动器都开始支持 BiSS-C 模式。它的时序和 SSI 类似,但多了寄存器读写功能。

BiSS 的帧结构分为三部分:

  • CDS(通道数据):位置数据,通常 24-32 位。
  • NCD(非通道数据):状态、温度、报警等。
  • CRC:循环冗余校验,保证数据完整性。
避坑指南: 我曾经在一个项目中,BiSS 通信偶尔丢帧,查了三天发现是 CRC 计算方式不对。BiSS 的 CRC 多项式是 x^6 + x^1 + x^0,初始值 0x00,不是常见的 0xFF。一定要看芯片手册,别想当然。

4.2.3 EnDat 协议

EnDat 是海德汉(Heidenhain)的专利协议。它也是双向的,但比 BiSS 更复杂,功能也更强大。支持在线诊断、参数读写、甚至固件升级。

EnDat 的时序要求很严格,通常需要专用的 ASIC 或 FPGA 来实现。如果你用普通 MCU 的 GPIO 模拟,时钟频率只能跑到 100-200 kHz,浪费了它的性能。

我建议:除非你用的是西门子或海德汉的成套方案,否则优先考虑 BiSS。EnDat 的授权费不低,而且芯片不好买。

4.3 多圈绝对值编码器:上电即知位置的秘密

多圈绝对值编码器,才是真正意义上的「上电即知位置」。它不仅能告诉你当前在圈内的角度,还能告诉你转了多少圈。这样即使断电后电机被外力转动了十几圈,上电后位置依然准确。

实现多圈记录,主要有两种方式:

方式 原理 优点 缺点
机械多圈 内部用齿轮组,每转一圈带动一个副码盘转一格 断电不丢失,绝对可靠 体积大、成本高、圈数有限(通常 12-16 圈)
电子多圈 内部用 EEPROM 或 FRAM 记录圈数,断电前保存 体积小、圈数多(可达 65536 圈) 需要电池或超级电容,有写入寿命限制

你想想看,机械多圈就像老式汽车的里程表,齿轮带动数字轮。电子多圈就像你手机里的计步器,断电前存一下数据。

我遇到过最坑的一次,是用了某品牌的电子多圈编码器,电池没电了,上电后位置乱跳。后来我学乖了,凡是电子多圈,一定在系统里加一个「圈数校验」逻辑:

我的做法: 上电后先读取圈数值,再读取单圈位置。如果圈数值和上次断电前记录的差值超过一个阈值(比如 5 圈),就认为编码器数据不可信,强制进入找零流程。虽然多圈绝对值理论上不需要找零,但硬件总会出意外,留一手总是对的。

4.4 如何选择协议和编码器类型

说了这么多,到底怎么选?我个人的决策流程是这样的:

  1. 先看成本:预算紧张,用 SSI + 单圈绝对值。上电后如果位置丢了,做个简单的上电找零(比如转到一个限位开关)。
  2. 再看精度:需要高精度、高动态响应,用 BiSS + 多圈绝对值。伺服驱动基本都支持 BiSS。
  3. 最后看生态:如果控制器是西门子,或者系统要求极高可靠性,上 EnDat。

下面这张表,是我自己整理的选型参考:

场景 推荐协议 推荐类型 理由
普通电机、泵、风机 SSI 单圈绝对值 便宜、够用、简单
伺服电机、机器人关节 BiSS 多圈绝对值 高速、开源、灵活
数控机床、高端自动化 EnDat 多圈绝对值 稳定、诊断强、生态好
电池供电、便携设备 SSI 或 BiSS 电子多圈(低功耗) 体积小、功耗低

4.5 实战中的几个坑

最后,分享几个我踩过的坑,希望能帮你省点时间:

  • 格雷码转二进制:别自己写转换函数,用查表法。256 位的表才 256 字节,速度比循环快 10 倍。
  • 线缆长度:SSI 和 BiSS 的时钟频率和线长成反比。10 米以上建议加差分驱动(RS-422)。
  • 上电初始化:绝对式编码器上电后,不要立刻读取。等 50-100 ms,让内部电路稳定。我见过有人上电 1 ms 就读,读回来的全是 0xFF。
  • CRC 校验:BiSS 和 EnDat 都有 CRC,一定要校验。不要偷懒,否则数据错一位,电机可能飞车。
一个小技巧: 调试时,用逻辑分析仪抓一下时钟和数据线。看一眼波形,比看半天代码管用多了。我每次调编码器,第一件事就是抓波形,确认时序对不对。