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

但这里有个坑:电流过零点附近,电流方向判断不准。你判断错了,补偿方向就反了,反而把波形搞得更差。

我曾经在一个伺服项目里被这个问题折磨了两周。后来用了两种方法结合:

  1. 平均电压补偿法:在电流过零点附近,不依赖瞬时方向,而是用平均电流方向做补偿。
  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 是电流调节器的反馈输出。前馈项把大头吃掉,反馈项只处理误差。这样电流环的带宽可以设计得更高,动态响应更快。

下面这张图展示了三种补偿在控制系统中的位置和关系:

电压前馈补偿结构图 转速 ωe 电流 Id/Iq 磁链 ψf 相电流方向 交叉耦合补偿 Vd_ff = -ωe·Lq·Iq 反电动势前馈 Vq_ff = ωe·ψf 死区效应补偿 Vdead = f(Tdead, fsw, Vdc) Σ 电压指令 Vd_ref / Vq_ref 说明: 1. 交叉耦合补偿和反电动势前馈依赖转速和电流精度,参数不准时需加在线辨识。 2. 死区补偿在电流过零点附近容易误判,建议结合平均电压法和脉冲消除法。 3. 三种补偿叠加后,电流调节器只需处理残余误差,带宽可提升30%~50%。 4. 实际工程中,建议先调好交叉耦合和反电动势前馈,再加死区补偿,分步验证。

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();
}

嗯,到这里,电压前馈补偿的核心内容就讲完了。三种补偿各有各的脾气,但合在一起,就是弱磁区间电流控制的「定海神针」。你回去调试的时候,建议先开交叉耦合和反电动势前馈,跑顺了再加死区补偿。一步一步来,别想一口吃成胖子。