4. 编码器与SVPWM的相位对齐:对齐的必要性、编码器零位与电机反电动势零位的关系、对齐流程(上电寻零、UVW对齐)、软件对齐与硬件对齐方法
好,咱们进入第四章。前面几章我们把编码器原理和SVPWM基础都聊透了。但有个关键问题一直悬着——你手里的编码器,怎么跟SVPWM的坐标系“对上眼”?
说白了,编码器告诉你转子在哪儿,SVPWM要往哪儿送电压。如果这两个“参考系”没对齐,你送出去的电压方向就是错的。轻则电机抖、电流大、效率低;重则直接过流保护,甚至烧MOS管。我在项目里见过不止一次,工程师调了半天电流环,发现增益怎么调都不对,最后查出来是相位偏了30度电角度。嗯,这种坑,踩过一次就记住了。
4.1 为什么必须对齐?
先想一个问题:SVPWM输出的电压矢量,是相对于定子坐标系(α-β轴)的。而编码器测量的转子位置,是相对于它自己的零位。这两个零位,天生就不在一起。
你想想看,电机反电动势的零位(也就是转子N极与A相轴线重合的位置)才是SVPWM真正的参考点。编码器安装到电机轴上时,它的零位脉冲(Z信号)和反电动势零位之间,必然存在一个固定的角度偏差。这个偏差,就是我们要找的“对齐角”。
核心结论:相位对齐的本质,就是找到编码器零位与电机反电动势零位之间的固定角度偏移量,并在软件中补偿掉。
如果不做对齐,你读到的电角度 = 编码器机械角 × 极对数 + 未知偏移。这个未知偏移会让电流环的dq轴解耦完全失效。我习惯在每次换电机或换编码器后,第一件事就是做一次完整的相位对齐,哪怕厂家说“出厂已对齐”。
4.2 编码器零位与反电动势零位的关系
咱们用一张图把关系理清楚。
从图上可以看得很清楚:反电动势零位是转子N极与A相轴线重合的位置,这是电机本身的物理特性。编码器零位是Z脉冲出现时转子所处的机械位置。两者之间的夹角θ_offset,就是我们要测量的值。
经验之谈:θ_offset在电机生命周期内是固定的,除非你拆装了编码器或更换了电机。所以对齐只需要做一次,把结果存到EEPROM或Flash里,下次上电直接读取就行。
4.3 对齐流程
对齐流程分两大步:上电寻零和UVW对齐。我习惯把它们拆成两个独立阶段来调试,这样出问题时好定位。
4.3.1 上电寻零
上电寻零的目的是让电机转子转到一个已知的、可重复的初始位置。对于增量式编码器,这一步尤其重要,因为增量式没有绝对位置信息。
具体做法是这样的:
- 给一个固定的电压矢量,比如U相正、V相负、W相悬空,让转子转到与U相轴线对齐的位置。
- 记录当前编码器计数值,作为零位参考。
- 重复几次,取平均值,消除机械摩擦带来的随机误差。
我曾经在一个风机项目里遇到过问题:上电寻零时给的电压太大,转子“啪”地一下转过去,带着负载惯性冲过了头。后来我把电压幅值降到额定电压的10%,再配合一个500ms的斜坡,才稳定下来。
注意:上电寻零时,电机可能会转动。如果负载不允许转动(比如夹持机构),必须使用带绝对位置记忆的编码器,或者采用高频注入等无感对齐方法。
4.3.2 UVW对齐
UVW对齐是更精细的一步。它要找到编码器计数值与电机电角度之间的精确映射关系。
标准流程如下:
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 给U+V-电压矢量 | 转子锁定在U相轴线方向 |
| 2 | 读取编码器值 | 记为Cnt_U |
| 3 | 给V+W-电压矢量 | 转子转到V相轴线方向 |
| 4 | 读取编码器值 | 记为Cnt_V |
| 5 | 给W+U-电压矢量 | 转子转到W相轴线方向 |
| 6 | 读取编码器值 | 记为Cnt_W |
| 7 | 计算偏移量 | θ_offset = (Cnt_U + Cnt_V + Cnt_W) / 3 |
为什么取三个位置的平均?因为单个位置可能有安装误差或磁滞效应。三个位置均匀分布在电角度周期内,平均后能有效消除这些误差。
代码实现大概是这样的:
// UVW对齐 - 伪代码示例
#define VOLTAGE_ALIGN 0.1f // 10%额定电压
uint32_t align_uvw(void) {
uint32_t cnt_u, cnt_v, cnt_w;
// 步骤1: U+V-
set_voltage_vector(VECTOR_U_PLUS_V_MINUS, VOLTAGE_ALIGN);
delay_ms(500); // 等待转子稳定
cnt_u = encoder_get_count();
// 步骤2: V+W-
set_voltage_vector(VECTOR_V_PLUS_W_MINUS, VOLTAGE_ALIGN);
delay_ms(500);
cnt_v = encoder_get_count();
// 步骤3: W+U-
set_voltage_vector(VECTOR_W_PLUS_U_MINUS, VOLTAGE_ALIGN);
delay_ms(500);
cnt_w = encoder_get_count();
// 计算偏移量(单位:编码器计数)
uint32_t offset = (cnt_u + cnt_v + cnt_w) / 3;
// 保存到非易失存储
eeprom_write(ADDR_ENC_OFFSET, offset);
return offset;
}
4.4 软件对齐与硬件对齐方法
对齐方法分两种:软件对齐和硬件对齐。我个人的建议是:能用软件解决的,就别动硬件。
4.4.1 硬件对齐
硬件对齐就是物理上调整编码器的安装位置,让它的Z脉冲正好出现在反电动势零位。具体做法是:
- 给电机通一个直流电,让转子锁定在U相轴线。
- 松开编码器的固定螺丝,旋转编码器壳体,直到Z信号输出。
- 锁紧螺丝,完成。
听起来简单,但实际操作很麻烦。编码器安装空间通常很狭小,螺丝刀都伸不进去。而且一旦电机振动,编码器可能移位,又得重新调。我在一个伺服项目里试过硬件对齐,调了整整一个下午,最后还是偏了2度。后来我改成软件对齐,十分钟搞定,精度还更高。
硬件对齐的缺点:精度受限于机械安装公差和操作人员的手感;无法在线校准;一旦更换编码器或电机,必须重新物理调整。
4.4.2 软件对齐
软件对齐的核心思想是:不管编码器物理上怎么装,我在软件里记下这个偏差,然后在每次读取编码器值时自动补偿。
补偿公式很简单:
// 软件对齐补偿
float get_electrical_angle(void) {
uint32_t raw_count = encoder_get_count();
uint32_t offset = eeprom_read(ADDR_ENC_OFFSET);
// 补偿后的机械角
int32_t compensated = (int32_t)raw_count - (int32_t)offset;
if (compensated < 0) compensated += ENCODER_RESOLUTION;
// 转换为电角度(0 ~ 2*PI)
float elec_angle = (float)compensated / ENCODER_RESOLUTION * 2 * M_PI * MOTOR_POLE_PAIRS;
elec_angle = fmodf(elec_angle, 2 * M_PI);
return elec_angle;
}
你看,代码里就多了一个减法操作,没有任何硬件改动。而且这个offset可以随时更新——如果你发现对齐精度下降了,重新跑一次对齐流程,把新值写进去就行。
我的推荐:量产产品一律用软件对齐。硬件对齐只适合实验室原型验证,或者编码器本身不带任何存储功能的极端情况。
4.5 对齐精度的影响
最后聊一下对齐精度到底有多重要。我拿一个实际测试数据来说话:
| 对齐误差(电角度) | 电流环带宽下降 | 电机效率下降 | 转矩脉动 |
|---|---|---|---|
| 0° | 0% | 0% | 无 |
| 5° | ~5% | ~1% | 轻微 |
| 15° | ~20% | ~5% | 明显 |
| 30° | ~50% | ~15% | 严重,可能过流 |
从表里能看出来,5度以内的误差还能接受,超过15度性能就明显恶化了。我一般要求对齐精度控制在2个编码器计数以内,对于4096线的编码器,这大概是0.09度机械角,换算成电角度取决于极对数。
小技巧:如果你用的是绝对值编码器,可以在出厂前做一次精确对齐,把offset写入编码器内部存储。这样每次上电都不用重新寻零,直接读取绝对位置加上offset就是正确的电角度。