4. 电流环设计(下):前馈补偿、解耦控制、电流环限幅与抗饱和

上一节我们把电流环的PI参数整定讲透了。但说实话,光调好PI参数,在实际项目中往往还是跑不稳。为什么?因为电机是一个强耦合、非线性的系统,你调好的那组参数,换个工况可能就崩了。

这一节,我们来解决这些“调好参数但跑不好”的问题。核心就三件事:前馈补偿、解耦控制、限幅与抗饱和。这三板斧下去,你的电流环才算真正有了“实战能力”。

4.1 为什么要做前馈补偿?

先想一个问题:你让电流从1A升到10A,PI控制器会怎么干?它会等误差出现,然后慢慢积分去追。这个过程有延迟,有超调。说白了,PI是“事后诸葛亮”,出了错才去纠正。

前馈补偿的思路完全不同——它提前预测系统需要多少电压,直接给出去。我习惯把它比作开车:PI是看到弯道再打方向盘,前馈是提前预判弯道曲率,提前打好方向。

核心公式:

最终输出电压 = PI控制器输出 + 前馈补偿量

前馈补偿量 ≈ 反电动势 + 电阻压降 + 电感压降

在项目中,我常用的前馈模型是这样的:

// 电流环前馈补偿计算
// ud_ref, uq_ref 为最终送给SVPWM的电压
// id_ref, iq_ref 为电流给定值
// id_fb, iq_fb 为电流反馈值
// omega_e 为电角速度
// Ld, Lq 为d/q轴电感
// Rs 为定子电阻
// flux 为永磁体磁链

// d轴前馈电压
ud_ff = -omega_e * Lq * iq_ref;
// q轴前馈电压  
uq_ff = omega_e * (Ld * id_ref + flux);

// 最终输出电压 = PI输出 + 前馈
ud_ref = ud_pi_out + ud_ff;
uq_ref = uq_pi_out + uq_ff;

你看,前馈项里包含了反电动势(omega_e * flux)和交叉耦合项(-omega_e * Lq * iq_ref)。这些量在电机高速运行时非常大,如果全靠PI去扛,积分器早就饱和了。

我的经验:前馈补偿不要给100%,我一般给80%~90%。留一点余量给PI去微调,系统会更鲁棒。给太满,模型误差反而会引入扰动。

4.2 解耦控制:把d轴和q轴“拆开”

做过FOC的人都知道,d轴和q轴是互相影响的。你调iq,ud上会有反应;你调id,uq上也会有反应。这就是交叉耦合。

为什么会这样?回到电机方程:

ud = Rs * id + Ld * did/dt - omega_e * Lq * iq
uq = Rs * iq + Lq * diq/dt + omega_e * (Ld * id + flux)

看到没?ud方程里有iq项,uq方程里有id项。这两个耦合项就是“捣乱分子”。

解耦控制说白了,就是在控制器里把这些耦合项“减掉”。我早期做项目时没做解耦,结果高速时电流震荡得一塌糊涂。后来加上解耦,世界清净了。

解耦控制的核心思想:

在控制器输出端,人为加上与耦合项大小相等、方向相反的补偿量。

具体实现:

// 解耦补偿计算
// 注意:这里用的是反馈值,不是给定值
ud_decouple = -omega_e * Lq * iq_fb;
uq_decouple = omega_e * (Ld * id_fb + flux);

// 最终电压指令
ud_ref = ud_pi_out + ud_ff + ud_decouple;
uq_ref = uq_pi_out + uq_ff + uq_decouple;

你可能会问:前馈和解耦看起来公式差不多,有什么区别?

对比项 前馈补偿 解耦控制
目的 提高动态响应速度 消除d/q轴相互影响
输入量 通常用给定值(id_ref, iq_ref) 通常用反馈值(id_fb, iq_fb)
主要作用 减少PI负担,提前给出电压 让d轴和q轴独立控制
高速时重要性 非常重要 非常重要

我个人习惯是把两者都用上。前馈用给定值,解耦用反馈值。这样既有快速响应,又能抑制耦合扰动。

4.3 电流环限幅:保护你的硬件

限幅这件事,听起来简单,做不好会出大问题。我记得有一次调试,电流环没做限幅,结果启动瞬间电流冲到了电机额定电流的3倍,驱动器直接炸了。嗯,从那以后我再也不敢忽视限幅了。

电流环限幅主要分三个层次:

  1. 给定值限幅:限制id_ref和iq_ref的幅值,防止用户或上位机给一个离谱的电流指令。
  2. PI输出限幅:限制PI控制器的输出电压,防止积分饱和导致输出过大。
  3. 最终电压限幅:限制SVPWM的调制比,通常不超过直流母线电压的0.577倍(SVPWM最大线性调制比)。

特别注意:电流环限幅一定要考虑矢量合成。你不能单独限制ud和uq,而要限制它们的合成矢量幅值 sqrt(ud² + uq²)。否则会出现“ud没超限,但合成矢量已经超过母线电压”的情况。

正确的限幅逻辑:

// 电压矢量限幅
float ud_ref, uq_ref;  // PI输出+前馈+解耦后的电压
float u_max = DC_BUS_VOLTAGE * 0.577;  // SVPWM最大线性调制电压

float u_mag = sqrtf(ud_ref * ud_ref + uq_ref * uq_ref);

if (u_mag > u_max) {
    // 等比例缩小,保持角度不变
    ud_ref = ud_ref * u_max / u_mag;
    uq_ref = uq_ref * u_max / u_mag;
}

4.4 抗饱和:别让积分器“卡死”

限幅之后,紧接着就是抗饱和问题。你想想看,PI输出被限幅了,但误差还在,积分器会继续积分。结果就是积分项越积越大,等误差反向时,积分器需要很长时间才能“退回来”。这就是积分饱和。

积分饱和的表现:电流响应迟钝,超调大,甚至震荡。我在一个风机项目里遇到过,启动时积分饱和导致电流过冲,每次启动都触发过流保护。后来加了抗饱和,问题就解决了。

常用的抗饱和方法有两种:

方法 原理 实现难度 效果
积分分离 误差大时停止积分 低 一般
反计算法(Back-calculation) 将超出限幅的量反馈回积分器 中 好

我推荐使用反计算法,效果更平滑。实现代码:

// 反计算法抗饱和
// Ki_aw 为抗饱和增益,通常取 1/Kp ~ 2/Kp

float ud_ref_sat, uq_ref_sat;  // 限幅后的电压
float ud_ref_raw, uq_ref_raw;  // 限幅前的电压

// 计算限幅前后的差值
float ud_diff = ud_ref_raw - ud_ref_sat;
float uq_diff = uq_ref_raw - uq_ref_sat;

// 将差值反馈回积分器
// 注意:只反馈被限幅的那个轴的差值
if (u_mag > u_max) {
    // 按比例分配反馈量
    float scale = (u_mag - u_max) / u_mag;
    ud_integral -= Ki_aw * ud_ref_raw * scale;
    uq_integral -= Ki_aw * uq_ref_raw * scale;
}

调参技巧:抗饱和增益Ki_aw不要太大,否则积分器会被“压死”,稳态精度下降。我一般从1/Kp开始调,观察电流响应,直到没有过冲为止。

4.5 本章知识体系总览

说了这么多,我们来画个图,把电流环设计的完整链路串起来。这样你脑子里会有一个整体框架。

电流环设计完整链路 电流给定 id_ref, iq_ref PI控制器 (含抗饱和) 前馈补偿 (给定值) 解耦控制 (反馈值) + 电压合成 & 矢量限幅 (SVPWM) 输出电压 ud_ref, uq_ref 反馈值 id_fb, iq_fb 关键原则:前馈用给定值提高响应,解耦用反馈值消除耦合,限幅保护硬件,抗饱和防止积分卡死 四者配合使用,才能让电流环在高速、重载、动态工况下稳定运行

从这张图可以看得很清楚:电流环不是简单的PI闭环,而是前馈 + 解耦 + PI + 限幅 + 抗饱和的组合体。每个环节都有自己的职责,缺一不可。

4.6 实战调参建议

最后,给几个我在项目中总结的调参顺序:

  1. 先调PI参数:让电流环能基本稳住,不震荡。
  2. 加上限幅:保护硬件,防止过流。
  3. 加入抗饱和:解决限幅后的积分饱和问题。
  4. 加入解耦控制:消除d/q轴耦合,让高速性能变好。
  5. 加入前馈补偿:提升动态响应速度。

避坑提醒:我曾经跳过步骤2和3,直接加前馈和解耦。结果限幅没做好,前馈量一大,电压直接饱和,电流失控。所以顺序很重要,别偷懒。

电流环是FOC的基石。这一节的内容虽然偏理论,但每个公式、每段代码,都是经过项目验证的。你把它吃透了,后面的速度环和位置环,其实就是在这个基础上加一层外环而已。