4、电流环PI控制器设计:电流环带宽选择、PI参数整定方法(极点配置法)、抗饱和积分处理

好,咱们进入电流环设计的正题。说实话,电流环是整个伺服控制的基石。你速度环调得再花哨,电流环响应慢了,一切都是白搭。我在项目里见过太多人,上来就调速度环,结果电机嗡嗡响,一查发现电流环带宽根本没跟上。嗯,咱们今天就把这块彻底讲透。

4.1 电流环带宽怎么选?

带宽这个词,说白了就是电流环能响应多快的指令。你给一个正弦波电流指令,频率越高,电流实际跟踪的幅度就会衰减。带宽就是衰减到-3dB时的那个频率点。

我个人习惯,电流环带宽一般选在开关频率的1/10到1/20之间。举个例子:

  • 开关频率10kHz → 带宽500Hz~1kHz
  • 开关频率20kHz → 带宽1kHz~2kHz

为什么会这样?因为电流环的更新周期就是PWM周期。你想想看,一个周期内只能采样一次电流、计算一次PI、更新一次占空比。带宽太高了,系统会不稳定,出现震荡。

经验法则:电流环带宽 f_bw ≤ f_sw / 10。这是我踩过坑之后才深刻理解的。我曾经为了追求极致响应,把带宽设到f_sw/5,结果电机在高速时电流波形全是毛刺,最后发现是采样延迟导致的相位裕度不够。

另外,带宽还受限于电机本身的电气时间常数 τ = L/R。你带宽再高,电机电感也会限制电流的变化率。所以实际中,带宽上限大约是 1/(2π·τ) 的2~3倍。

4.2 PI参数整定:极点配置法

好了,带宽选好了,接下来就是算PI参数。我推荐用极点配置法,这方法简单、直观,而且物理意义明确。

先看电流环的简化模型。忽略反电动势的影响(因为电流环响应远快于速度变化),电机电枢回路可以看作一个一阶惯性环节:

G(s) = 1 / (L·s + R)

其中 L 是电感,R 是电阻。PI控制器传递函数:

C(s) = Kp + Ki / s

闭环传递函数就是:

G_cl(s) = (Kp·s + Ki) / (L·s² + (R+Kp)·s + Ki)

我们希望这个闭环系统是二阶系统,并且把极点配置在期望的位置。通常我们把它配置成临界阻尼或过阻尼,避免超调。我个人习惯配置成两个相等的实极点:

s² + 2·ζ·ω_n·s + ω_n² = 0

令 ζ=1(临界阻尼),ω_n = 2π·f_bw(带宽对应的自然频率)。

对比系数,得到:

Kp = 2·ζ·ω_n·L - R
Ki = ω_n² · L

你看,公式就这么简单。代入你选的带宽和电机参数,直接算出Kp和Ki。

小技巧:实际调试时,我通常先按公式算出一组参数,然后让电机空载运行,给一个阶跃电流指令。观察电流响应波形,如果超调太大,就适当降低Kp;如果响应太慢,就提高带宽重新算。理论计算给了你一个很好的起点,但最终还是要靠实测微调。

4.3 抗饱和积分处理

嗯,这里要重点讲一下。很多新手调PI,发现积分项一饱和,电流就失控了。我在一个项目中遇到过,电机启动时电流指令很大,积分项疯狂累积,等电流真正跟上时,积分已经积了太多,导致严重的超调,甚至触发过流保护。

这就是积分饱和(Integral Windup)。解决办法就是抗饱和积分处理。常用的方法有两种:

4.3.1 条件积分法

简单说就是:当控制器输出饱和时,停止积分。伪代码如下:

// 条件积分法
error = ref - feedback;
if (abs(output) < saturation_limit) {
    integral += Ki * error * Ts;
} else {
    // 输出饱和,不更新积分
    // 或者只在误差方向与饱和方向相反时才更新
    if (error * output < 0) {
        integral += Ki * error * Ts;
    }
}
output = Kp * error + integral;
output = saturate(output, -limit, limit);

我个人更推荐第二种判断方式:只在误差与输出方向相反时更新积分。这样既能防止饱和,又能让系统在退出饱和时快速响应。

4.3.2 反计算法(Back-calculation)

这个方法更精细一些。它把饱和量反馈回去,修正积分项:

// 反计算法
error = ref - feedback;
integral += Ki * error * Ts;
output_unlimited = Kp * error + integral;
output = saturate(output_unlimited, -limit, limit);

// 关键:计算饱和量,并反馈修正积分
saturation_amount = output - output_unlimited;
integral += K_aw * saturation_amount * Ts;  // K_aw是抗饱和增益

K_aw一般取 1/τ,其中τ是电流环的时间常数。这样积分项会快速退饱和。

注意:抗饱和积分不是可选项,而是必选项。尤其是在大惯量负载启动、速度阶跃变化时,积分饱和会导致系统失控。我曾经在调试一个升降机项目时,就因为没加抗饱和,电机启动时直接冲过了目标位置,差点造成机械碰撞。从那以后,我的代码里永远标配抗饱和处理。

4.4 实际调试步骤总结

好了,理论讲完了,咱们捋一下实际调试的步骤:

  1. 测量电机参数:L、R。可以用LCR表,也可以用软件辨识。
  2. 确定开关频率:根据硬件能力和损耗选择,比如10kHz。
  3. 选择电流环带宽:f_bw = f_sw / 10 ~ f_sw / 20。
  4. 用极点配置法计算Kp、Ki:代入公式。
  5. 加入抗饱和积分:推荐反计算法,K_aw取1/τ。
  6. 实测验证:给阶跃电流指令,观察响应。调整带宽或Kp直到满意。

最后说一句:电流环调好了,后面的速度环和位置环才有意义。别急着往上堆算法,先把基础打牢。我在带新人时,经常让他们花一周时间专门调电流环,直到能闭着眼睛写出PI参数。你想想看,如果电流环都抖得像筛子,位置精度从何谈起?

下一章咱们讲速度环的PI设计,到时候会用到电流环作为内环。所以这一章的内容,务必吃透。