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周期,你如果没及时捕获,它就溜过去了。

我习惯的做法是:

  1. 用定时器的编码器模式(比如STM32的TIMx)自动处理A/B计数。
  2. 把Z脉冲接到一个外部中断引脚上。
  3. 在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协议 正交解码(4倍频) Z脉冲捕获与零位校准 时序参数配置 格雷码转二进制 帧结构解析 6位CRC校验实现 核心要点 ABZ用于增量式编码器,SPI/SSI用于绝对值编码器 BiSS是SPI的升级版,增加了CRC校验和配置灵活性

三种协议各有适用场景。ABZ适合低成本、高实时性的场合;SPI/SSI适合需要绝对位置的系统;BiSS则适合对可靠性和灵活性要求高的高端伺服驱动。选型时,你得根据实际需求来权衡。

好了,这一章的内容就到这里。协议这东西,光看理论是不够的,我建议你拿个逻辑分析仪,实际抓一下波形,感受会更深刻。