4. 电压前馈补偿:交叉耦合电压补偿、反电动势前馈、死区效应补偿
弱磁区间最让人头疼的是什么?我个人觉得,是电压不够用。
你想想看,电机转速一高,反电动势跟着往上窜。母线电压就那么多,你还要留出余量给电流调节器去折腾。搞不好就饱和了,电流失控,系统直接崩掉。
电压前馈补偿,说白了就是提前把那些「吃掉电压」的因素算清楚,然后直接补到指令里。这样电流环就不用自己瞎猜了,它只需要处理那一点点误差就行。
这一节,我带你拆开三个最关键的补偿项:交叉耦合电压、反电动势、还有死区效应。每个都是我在项目里踩过坑的地方。
核心观点:电压前馈不是锦上添花,是弱磁区间电流控制的「氧气面罩」。不加前馈,电流环在高转速下几乎必饱和。
4.1 交叉耦合电压补偿
先问一个问题:d轴和q轴是独立的吗?
从数学模型上看,它们确实通过电感耦合在一起。你调q轴电流,d轴上就会感应出一个电压;反过来也一样。这个感应电压就叫交叉耦合项。
在低速时,这个耦合电压很小,电流环自己就能扛住。但到了弱磁区,转速高、电流大,耦合电压能占到母线电压的20%~30%。这时候如果不补偿,电流环的输出会被这个耦合量「带偏」,动态响应变得很慢,甚至振荡。
补偿公式很简单:
Vd_ff = -ωe * Lq * Iq
Vq_ff = ωe * Ld * Id + ωe * ψf
注意看,Vd_ff 里只有 Lq*Iq 这一项,没有反电动势。因为反电动势只出现在q轴。Vq_ff 里除了 Ld*Id,还加上了 ψf 这一项——这就是反电动势前馈,我们下一节细说。
我在项目里遇到过一个问题:电感参数不准,导致补偿过头或不足。补偿过头,电流环反而震荡;补偿不足,又等于没补。后来我加了一个在线电感辨识,每几个PWM周期更新一次Ld和Lq,这才稳住。
实战技巧:如果你暂时不想做在线辨识,至少用查表法。把Ld、Lq做成Id、Iq的二维表,实测标定一次,效果比固定值好很多。
4.2 反电动势前馈
反电动势是永磁同步电机天生的东西。转速越高,它越大。在额定转速以下,反电动势小于母线电压,电流环还能应付。但一进弱磁区,反电动势可能已经接近甚至超过母线电压了。
这时候电流调节器要输出一个很大的电压来对抗反电动势,才能让电流建立起来。但调节器的输出是有限的——它最大只能到母线电压。结果就是饱和,电流上不去,系统失控。
反电动势前馈的做法:
Vq_ff_emf = ωe * ψf
直接把这一项加到q轴电压指令里。这样电流环就不需要自己去对抗反电动势了,它只需要处理电感压降和电阻压降那一点点差值。
我记得有一次调试一个高速压缩机项目,转速跑到15万转。不加反电动势前馈,电流环在高速区根本稳不住,Id和Iq来回抖。加上前馈之后,波形一下子就干净了。说白了,就是把调节器从「扛大梁」变成「微调」。
注意:反电动势前馈依赖转速和磁链的精度。转速可以用编码器或观测器,磁链ψf会随温度变化。永磁体温度升高,ψf会下降。如果你用固定值,高温下前馈不足,低温下前馈过量。我建议加一个温度补偿系数,或者用在线磁链观测器。
4.3 死区效应补偿
死区效应,是逆变器带来的「原罪」。为了防止上下桥臂直通,你必须在开关信号里插入一段死区时间。这段死区里,电流通过续流二极管走,输出电压就不是你想要的理想波形了。
死区效应会导致什么?
- 电压畸变:实际输出电压比指令电压低,而且波形上有缺口。
- 电流谐波:尤其是5次、7次谐波,在弱磁区会被放大。
- 转矩脉动:谐波电流产生谐波转矩,高速时能听到明显的噪音。
死区补偿的基本思路是:根据电流方向,把死区造成的电压损失补回去。
Vdead_comp = sign(Iphase) * Vdead_loss
其中 Vdead_loss 由死区时间、开关频率、母线电压决定:
Vdead_loss = (Tdead * fsw * Vdc) / 2
但这里有个坑:电流过零点附近,电流方向判断不准。你判断错了,补偿方向就反了,反而把波形搞得更差。
我曾经在一个伺服项目里被这个问题折磨了两周。后来用了两种方法结合:
- 平均电压补偿法:在电流过零点附近,不依赖瞬时方向,而是用平均电流方向做补偿。
- 脉冲消除法:在过零点附近,主动消除窄脉冲,避免补偿方向反复跳变。
两种方法配合,死区效应基本被压到可以忽略的程度。
总结一下:死区补偿不是可选项,是必选项。尤其在弱磁区,电流谐波会被放大,不加补偿的话,电机噪音和发热都会明显增加。
4.4 三种补偿的协同关系
这三种补偿不是各自为战的。它们最终都要叠加到电压指令上:
Vd_ref = Vd_fb + Vd_ff_cross
Vq_ref = Vq_fb + Vq_ff_cross + Vq_ff_emf + Vq_ff_dead
其中 Vd_fb 和 Vq_fb 是电流调节器的反馈输出。前馈项把大头吃掉,反馈项只处理误差。这样电流环的带宽可以设计得更高,动态响应更快。
下面这张图展示了三种补偿在控制系统中的位置和关系:
4.5 工程实现要点
在C2000上实现这些补偿,有几个地方要特别注意:
| 补偿项 | 计算时机 | 关键参数 | 常见坑 |
|---|---|---|---|
| 交叉耦合 | 每个PWM周期 | Ld, Lq, ωe | 电感参数随电流变化 |
| 反电动势 | 每个PWM周期 | ψf, ωe | ψf随温度漂移 |
| 死区补偿 | 每个PWM周期 | Tdead, fsw, Vdc, 电流方向 | 过零点方向误判 |
在代码实现上,我习惯把前馈计算放在电流环的中断服务函数里,紧跟在电流采样和坐标变换之后。这样前馈值能和反馈值同步更新,不会引入额外延迟。
代码结构建议:
// 电流环中断服务函数
interrupt void currentLoopISR(void)
{
// 1. 电流采样 & 坐标变换
readCurrents();
clarkeTransform();
parkTransform();
// 2. 电压前馈计算
calcCrossCouplingFF(); // 交叉耦合补偿
calcBackEMFFF(); // 反电动势前馈
calcDeadTimeFF(); // 死区效应补偿
// 3. 电流PI调节(反馈)
runCurrentPI();
// 4. 电压指令合成
sumVoltageRef();
// 5. 坐标反变换 & PWM更新
inverseParkTransform();
updatePWM();
}
嗯,到这里,电压前馈补偿的核心内容就讲完了。三种补偿各有各的脾气,但合在一起,就是弱磁区间电流控制的「定海神针」。你回去调试的时候,建议先开交叉耦合和反电动势前馈,跑顺了再加死区补偿。一步一步来,别想一口吃成胖子。