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信号寻找磁极初始位置
电机上电时,转子在什么位置?你不知道。增量式编码器也不知道。怎么办?
常用的方法有两种:
- 预定位法:给电机通一个固定方向的电流,强行把转子拉到已知位置。简单粗暴,但会转动,有些场合不允许。
- 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 知识体系总览
下面这张图,把本章的核心逻辑串起来了。你可以把它当作一个快速索引。
3.6 避坑指南
最后,分享几个我踩过的坑:
- Z信号抖动:有些编码器的Z信号在边沿附近会有抖动。我建议加一个简单的去抖滤波,比如连续采样3次都一致才认为有效。
- 换相延迟:从检测到位置到执行换相,中间有延迟。高速时这个延迟会导致换相滞后。我一般会做一个前馈补偿,根据当前速度提前换相。
- 编码器线数选择:不是线数越高越好。线数太高,脉冲频率也高,对MCU的捕获能力要求高。我一般根据最高转速和MCU性能来选,留出30%余量。
嗯,增量式编码器的换相,核心就是这些。理解了ABZ信号的本质,剩下的就是工程细节了。