3、增量式编码器换相:ABZ信号解析

增量式编码器,说白了就是电机控制里最常用的“眼睛”。它不告诉你绝对位置,只告诉你“动了多少”和“往哪动”。很多刚入行的朋友觉得它简单,但真正用起来,坑不少。今天我就把ABZ信号这点事,掰开了讲清楚。

3.1 ABZ信号到底是什么?

A、B、Z,三根线,各司其职。

  • A相和B相:相位差90°的方波。正转时A领先B 90°,反转时B领先A 90°。通过判断谁先跳变,就能知道方向。
  • Z相:每转一圈,输出一个脉冲。这个脉冲很窄,通常只有1个电气周期宽度。它的作用,就是给你一个“绝对参考点”。

我刚开始做项目时,以为Z信号就是用来归零的。后来发现,它在换相中的作用远不止于此。

核心要点:A/B信号提供相对位置和速度,Z信号提供绝对位置基准。两者结合,才能实现精确的换相控制。

3.2 通过Z信号寻找磁极初始位置

电机上电时,转子在什么位置?你不知道。增量式编码器也不知道。怎么办?

常用的方法有两种:

  1. 预定位法:给电机通一个固定方向的电流,强行把转子拉到已知位置。简单粗暴,但会转动,有些场合不允许。
  2. Z信号搜索法:利用Z脉冲的绝对位置特性,配合A/B计数,找到磁极的初始电气角度。

我个人习惯用第二种。为什么?因为不产生位移,适合很多精密设备。

具体做法是这样的:

  • 上电后,记录当前A/B计数值。
  • 缓慢转动电机(或者用手盘一下),等待Z信号到来。
  • Z信号到来时,记录此时的A/B计数值。这个值,就是Z信号对应的机械位置。
  • 根据编码器线数和电机极对数,计算出Z信号对应的电气角度。
  • 以后每次上电,只要找到Z信号,就能知道转子的绝对电气位置。

小技巧:如果电机不允许转动,可以用高频注入法。给电机注入高频电压信号,通过检测电流响应来估算转子位置。这个方法我曾在伺服项目里用过,效果不错,但算法复杂一些。

3.3 利用A/B信号进行速度估算

速度估算,说白了就是算单位时间内转了多少角度。常用的方法有三种:

方法 原理 适用场景 优缺点
M法 固定时间T内,计数脉冲数m 高速场合 低速时误差大
T法 测量两个脉冲之间的时间间隔 低速场合 高速时精度下降
M/T法 结合M法和T法 宽速域 算法稍复杂,但精度高

我在实际项目中,大部分情况用M/T法。举个例子:

// 伪代码:M/T法速度估算
// 每1ms执行一次
void speed_calc(void)
{
    static uint16_t last_cnt = 0;
    static uint32_t last_time = 0;
    uint16_t now_cnt = get_encoder_cnt();  // 读取当前计数值
    uint32_t now_time = get_sys_tick();    // 读取当前系统时间

    int16_t delta_cnt = now_cnt - last_cnt;  // 脉冲增量
    uint32_t delta_time = now_time - last_time;  // 时间增量

    // 速度 = 脉冲增量 / 时间增量 * 系数
    speed = (float)delta_cnt / (float)delta_time * SPEED_COEFF;

    last_cnt = now_cnt;
    last_time = now_time;
}

你想想看,这个代码看起来简单,但实际用起来有几个坑:

  • 计数值溢出怎么办?要处理回绕。
  • 时间增量太小怎么办?要加滤波。
  • 低速时脉冲太少怎么办?要切换到T法。

3.4 利用A/B信号进行换相

换相,就是根据转子位置,决定给哪两相通电。对于增量式编码器,换相的核心是:把机械角度换算成电气角度。

公式很简单:

电气角度 = (机械角度 * 极对数) % 360°

举个例子:一个4对极的电机,编码器线数1000线。那么:

  • 每转一圈,A/B信号产生1000个脉冲(4倍频后是4000个)。
  • 每个脉冲对应的机械角度 = 360° / 1000 = 0.36°。
  • 每个脉冲对应的电气角度 = 0.36° * 4 = 1.44°。

有了电气角度,查表就能知道该换相了。常用的换相表是这样的:

电气角度范围 A相通电 B相通电 C相通电
0° ~ 60° + - 悬空
60° ~ 120° + 悬空 -
120° ~ 180° 悬空 + -
180° ~ 240° - + 悬空
240° ~ 300° - 悬空 +
300° ~ 360° 悬空 - +

注意:换相表必须和电机绕线方式匹配。我曾经在一个项目中,换相表搞反了,结果电机嗡嗡响就是不转。排查了半天,才发现是相序错了。

3.5 知识体系总览

下面这张图,把本章的核心逻辑串起来了。你可以把它当作一个快速索引。

增量式编码器换相知识体系 增量式编码器换相知识体系 增量式编码器信号 A/B信号 Z信号 A/B + Z 组合 速度估算(M法/T法/M/T法) 方向判断(相位差90°) 相对位置计数 每圈一个绝对参考点 磁极初始位置搜索 消除累积误差 机械角度 → 电气角度换算 换相表查表与执行 相序匹配与验证 核心逻辑:Z信号提供绝对基准 → A/B信号提供连续位置 → 换算电气角度 → 执行换相 注意:换相表必须与电机绕线方式匹配,否则电机无法正常运转

3.6 避坑指南

最后,分享几个我踩过的坑:

  • Z信号抖动:有些编码器的Z信号在边沿附近会有抖动。我建议加一个简单的去抖滤波,比如连续采样3次都一致才认为有效。
  • 换相延迟:从检测到位置到执行换相,中间有延迟。高速时这个延迟会导致换相滞后。我一般会做一个前馈补偿,根据当前速度提前换相。
  • 编码器线数选择:不是线数越高越好。线数太高,脉冲频率也高,对MCU的捕获能力要求高。我一般根据最高转速和MCU性能来选,留出30%余量。

嗯,增量式编码器的换相,核心就是这些。理解了ABZ信号的本质,剩下的就是工程细节了。