4、绝对式编码器换相:SSI、BiSS、EnDat 协议与多圈绝对值技术
聊完了增量式编码器的找零烦恼,咱们来看看绝对式编码器。这东西,说白了就是「上电就知道自己在哪」。不需要你转一圈找 Z 信号,也不需要你记录圈数。我第一次用绝对式编码器的时候,心里就一个感觉:爽。
但爽归爽,它背后的通信协议和实现原理,还是得掰开揉碎了讲清楚。今天我们就来聊聊 SSI、BiSS、EnDat 这几个主流协议,以及多圈绝对值编码器到底是怎么做到「上电即知位置」的。
4.1 绝对式编码器的核心思想
绝对式编码器,每个位置都有唯一的编码。就像你家的门牌号,不用从街头数到街尾,看一眼就知道是几号。它内部有一个码盘,上面刻着格雷码或二进制码,通过光电或磁感应读取。
我遇到过不少刚入行的工程师,觉得绝对式编码器就是「高级货」,其实不然。它的核心就两点:
- 单圈绝对值:一圈之内,每个角度都有唯一编码。上电就能知道当前角度。
- 多圈绝对值:不仅知道当前角度,还知道转了多少圈。靠机械齿轮或电子计数器实现。
嗯,这里要注意:单圈绝对值编码器,如果你断电后电机被外力转动超过了 360°,那上电后位置就不准了。所以很多场合必须用多圈绝对值。
4.2 三大主流通信协议
绝对式编码器需要把位置数据传出来,这就涉及到通信协议。目前工业界最常用的就是 SSI、BiSS 和 EnDat。我个人的习惯是:
- 简单场合用 SSI,便宜、够用。
- 高速高精度场合用 BiSS,开源、灵活。
- 西门子生态或高端伺服用 EnDat,稳定、但贵。
下面这张图,是我自己整理的协议对比框架,你看一眼就能明白它们的关系。
4.2.1 SSI 协议(同步串行接口)
SSI 是最老牌的绝对式编码器协议。它的原理很简单:主设备(比如你的控制器)发送一串时钟脉冲,编码器在每一个时钟上升沿或下降沿,同步输出一位数据。
我记得第一次调 SSI 的时候,被时序折腾得够呛。时钟频率不能太高,否则线缆一长,数据就错位。后来我总结了一个经验:
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:循环冗余校验,保证数据完整性。
4.2.3 EnDat 协议
EnDat 是海德汉(Heidenhain)的专利协议。它也是双向的,但比 BiSS 更复杂,功能也更强大。支持在线诊断、参数读写、甚至固件升级。
EnDat 的时序要求很严格,通常需要专用的 ASIC 或 FPGA 来实现。如果你用普通 MCU 的 GPIO 模拟,时钟频率只能跑到 100-200 kHz,浪费了它的性能。
我建议:除非你用的是西门子或海德汉的成套方案,否则优先考虑 BiSS。EnDat 的授权费不低,而且芯片不好买。
4.3 多圈绝对值编码器:上电即知位置的秘密
多圈绝对值编码器,才是真正意义上的「上电即知位置」。它不仅能告诉你当前在圈内的角度,还能告诉你转了多少圈。这样即使断电后电机被外力转动了十几圈,上电后位置依然准确。
实现多圈记录,主要有两种方式:
| 方式 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 机械多圈 | 内部用齿轮组,每转一圈带动一个副码盘转一格 | 断电不丢失,绝对可靠 | 体积大、成本高、圈数有限(通常 12-16 圈) |
| 电子多圈 | 内部用 EEPROM 或 FRAM 记录圈数,断电前保存 | 体积小、圈数多(可达 65536 圈) | 需要电池或超级电容,有写入寿命限制 |
你想想看,机械多圈就像老式汽车的里程表,齿轮带动数字轮。电子多圈就像你手机里的计步器,断电前存一下数据。
我遇到过最坑的一次,是用了某品牌的电子多圈编码器,电池没电了,上电后位置乱跳。后来我学乖了,凡是电子多圈,一定在系统里加一个「圈数校验」逻辑:
4.4 如何选择协议和编码器类型
说了这么多,到底怎么选?我个人的决策流程是这样的:
- 先看成本:预算紧张,用 SSI + 单圈绝对值。上电后如果位置丢了,做个简单的上电找零(比如转到一个限位开关)。
- 再看精度:需要高精度、高动态响应,用 BiSS + 多圈绝对值。伺服驱动基本都支持 BiSS。
- 最后看生态:如果控制器是西门子,或者系统要求极高可靠性,上 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,一定要校验。不要偷懒,否则数据错一位,电机可能飞车。