4. 通信协议解析:ABZ信号解码、SPI/SSI与BiSS协议
编码器跟控制器之间的对话,说白了就靠几种固定的“方言”。你搞懂了ABZ、SPI/SSI和BiSS这三种,市面上九成以上的编码器你都能搞定。我最早接触编码器时,总觉得协议很神秘,后来踩了几个坑才明白——其实核心就三件事:怎么读位置、怎么保证实时性、怎么校验数据对不对。
4.1 ABZ信号解码:正交解码与Z脉冲捕获
ABZ信号是增量式编码器的“母语”。A和B两路方波,相位差90度,用来判断方向和计数。Z脉冲每转一圈来一个,用来找零位。
4.1.1 正交解码原理
为什么叫“正交”?因为A和B的相位正好差90度。你想想看,如果A上升沿时B是高电平,那就是正转;如果A上升沿时B是低电平,那就是反转。这就是方向判断的基础。
解码方式一般有三种:
- 单倍频(1x):只检测A的上升沿。简单,但分辨率低。
- 双倍频(2x):检测A的上升沿和下降沿。分辨率翻倍。
- 四倍频(4x):检测A和B的上升沿和下降沿。分辨率最高,我项目里最常用。
关键点:四倍频下,编码器每转的脉冲数(PPR)要乘以4才是实际分辨率。比如一个2500线的编码器,四倍频后就是10000个计数/圈。
4.1.2 Z脉冲捕获与零位校准
Z脉冲是增量编码器的“回家信号”。但有个坑——Z脉冲宽度通常只有1个A/B周期,你如果没及时捕获,它就溜过去了。
我习惯的做法是:
- 用定时器的编码器模式(比如STM32的TIMx)自动处理A/B计数。
- 把Z脉冲接到一个外部中断引脚上。
- 在Z中断里,把当前计数值清零,并标记“零位已找到”。
我曾经遇到过:Z脉冲刚好落在A/B的边沿附近,导致中断触发时计数值还没稳定。后来我加了50ns的硬件滤波,问题就解决了。嗯,硬件滤波很重要。
零位校准的流程大致如下:
- 上电后,电机先低速转一圈,等待Z脉冲。
- 捕获到Z脉冲后,记录当前计数值作为零位偏移。
- 后续所有位置都减去这个偏移,得到绝对位置。
4.1.3 避坑指南
- 信号毛刺:AB信号在长线传输时容易有毛刺。我建议在硬件上加RC滤波,或者在软件里做去抖。
- Z脉冲丢失:如果电机转速太快,Z脉冲可能被漏掉。解决办法是提高中断优先级,或者用DMA捕获。
- 计数溢出:32位计数器一般够用,但如果你用16位定时器,记得在溢出中断里做软件扩展。
4.2 SPI/SSI协议时序
SPI和SSI都是同步串行协议,常用于绝对值编码器。SPI是标准接口,SSI是西门子推的变种。说白了,它们都是靠时钟线(CLK)和数据线(DATA)来传数据。
4.2.1 SPI协议要点
SPI编码器一般用模式3(CPOL=1, CPHA=1),也就是时钟空闲时是高电平,数据在时钟上升沿采样。我遇到过不少工程师在这里栽跟头——模式没配对,读出来的数据全是乱的。
SPI读取编码器的典型时序:
- 主机拉低片选(CS),开始通信。
- 主机发送时钟脉冲,同时从机在MISO线上输出位置数据。
- 数据位长通常是12位到32位,具体看编码器型号。
- 传输结束后,主机拉高片选。
我个人习惯:在片选拉低后,先发一个空字节(0x00)来“唤醒”编码器,然后再读数据。有些编码器需要这个启动时序。
4.2.2 SSI协议差异
SSI和SPI最大的区别是:SSI没有片选线,而是靠时钟的间隔来判断数据帧的开始和结束。时钟停止一段时间后,编码器认为一帧结束,然后准备下一帧。
| 特性 | SPI | SSI |
|---|---|---|
| 片选信号 | 有(CS) | 无(靠时钟间隔) |
| 时钟空闲电平 | 可配置(常用高) | 固定高 |
| 数据采样边沿 | 可配置 | 上升沿 |
| 典型应用 | 多从机系统 | 单点对点 |
SSI还有一个特点:数据是格雷码格式。你需要把它转成二进制才能用。转换公式很简单:
uint32_t gray_to_binary(uint32_t gray) {
uint32_t bin = gray;
while (gray >>= 1) {
bin ^= gray;
}
return bin;
}
4.2.3 时序参数注意事项
SPI和SSI对时序要求比较严格。我整理了几个关键参数:
- 时钟频率:一般不超过10MHz,具体看编码器手册。
- 时钟空闲时间:SSI要求时钟停止至少20μs才算一帧结束。
- 数据建立时间:数据在时钟边沿前必须稳定,通常要求几十纳秒。
我曾经遇到过:时钟频率设得太高,导致数据采样不稳定。后来我把时钟从10MHz降到5MHz,问题就解决了。有时候慢一点反而更可靠。
4.3 BiSS协议CRC校验
BiSS协议是近几年在伺服驱动领域越来越流行的协议。它比SPI/SSI多了CRC校验和更灵活的配置能力。说白了,BiSS就是SPI的“升级版”。
4.3.1 BiSS协议帧结构
BiSS的帧结构分为几个阶段:
- 空闲阶段:时钟线保持高电平,数据线也保持高。
- 启动阶段:主机拉低时钟,编码器开始准备数据。
- 数据阶段:主机发送时钟脉冲,编码器逐位输出位置数据。
- CRC阶段:编码器输出6位CRC校验值。
- 结束阶段:时钟停止,数据线恢复高电平。
BiSS的典型数据位长是32位,其中包含位置信息和状态位。CRC是6位的,多项式是x^6 + x^1 + x^0(也就是0x03)。
4.3.2 CRC校验实现
CRC校验是BiSS协议里最容易出错的地方。我见过不少工程师因为CRC计算不对,导致通信一直报错。
BiSS的CRC计算规则:
- 初始值:0x00
- 多项式:0x03(x^6 + x + 1)
- 输入输出都不取反
- 计算范围:从数据阶段的第一位到CRC阶段的前一位
下面是一个标准的BiSS CRC计算函数:
uint8_t biss_crc6(uint32_t data, uint8_t bits) {
uint8_t crc = 0x00;
for (int i = bits - 1; i >= 0; i--) {
uint8_t bit = (data >> i) & 0x01;
uint8_t msb = (crc >> 5) & 0x01;
crc = (crc << 1) | bit;
if (msb) {
crc ^= 0x03; // 多项式 x^6 + x + 1
}
}
return crc & 0x3F; // 只保留低6位
}
我建议:在调试BiSS通信时,先用逻辑分析仪抓一下波形,手动算一遍CRC,跟代码算出来的对比。这样能快速定位问题。
4.3.3 BiSS vs SPI/SSI对比
| 特性 | BiSS | SPI | SSI |
|---|---|---|---|
| CRC校验 | 6位CRC | 无(需软件实现) | 无 |
| 数据速率 | 最高10MHz | 最高10MHz | 最高5MHz |
| 配置灵活性 | 高(可配置数据长度) | 中 | 低(固定格式) |
| 抗干扰能力 | 强(CRC+差分信号) | 中 | 中 |
4.4 本章知识体系
下面这张图总结了三种协议的核心逻辑和关系:
三种协议各有适用场景。ABZ适合低成本、高实时性的场合;SPI/SSI适合需要绝对位置的系统;BiSS则适合对可靠性和灵活性要求高的高端伺服驱动。选型时,你得根据实际需求来权衡。
好了,这一章的内容就到这里。协议这东西,光看理论是不够的,我建议你拿个逻辑分析仪,实际抓一下波形,感受会更深刻。