第3章 电流环PI参数整定:带宽设计、计算公式与仿真验证
电流环是整个弱磁控制系统的基石。说白了,如果电流环没调好,后面的速度环、位置环全是空中楼阁。我见过不少工程师一上来就调速度环,结果电流响应慢半拍,系统抖得跟筛子似的。所以这一章,咱们把电流环的PI参数整定彻底讲透。
3.1 电流环带宽设计——先定目标再动手
带宽是什么?简单说,就是电流环能跟踪多快的指令。带宽越高,响应越快,但噪声也越容易被放大。你想想看,如果带宽设到2000Hz,那PWM开关频率的谐波全进来了,电流波形肯定没法看。
我个人习惯,带宽按以下原则选:
- PWM开关频率的1/10 ~ 1/20:这是工程上最常用的范围。比如开关频率10kHz,带宽取500Hz~1kHz。
- 电机电气时间常数的倒数:带宽至少要大于1/τe,否则电流环跟不上电机的电磁变化。
- 系统噪声水平:如果电流采样噪声大,带宽就得往低了压。
我的经验: 刚开始做项目时,我总想把带宽拉满,觉得越快越好。结果有一次在伺服驱动器上试,电流波形全是毛刺,电机嗡嗡响。后来老老实实降到开关频率的1/15,问题全解决了。带宽不是越高越好,够用就行。
带宽设计流程,我习惯用下面这张图来理清思路:
3.2 PI参数计算公式——从理论到代码
带宽定好了,接下来就是算PI参数。这里我用的是最经典的零极点对消法。原理不复杂:把PI控制器的零点对消掉电机电气时间常数对应的极点,剩下的就是一阶惯性环节,带宽直接由增益决定。
公式其实就两个:
电流环PI参数计算公式(d/q轴通用):
- Kp = ωbw × Ls
- Ki = ωbw × Rs
其中:ωbw为电流环带宽(rad/s),Ls为定子电感(H),Rs为定子电阻(Ω)。
为什么会这么简单?我解释一下。电流环的传递函数是 G(s) = 1/(Lss + Rs),PI控制器是 Kp + Ki/s。把两者串起来,闭环传递函数就变成了 ωbw/(s + ωbw)。你看,是不是一个干净利落的一阶低通?
注意: 这个公式成立的前提是忽略数字控制延迟。实际系统中,PWM更新延迟、采样延迟、计算延迟都会影响带宽。我曾经在一个项目中,按公式算出来带宽1000Hz,结果实测只有700Hz。后来加了延迟补偿才拉回来。所以,公式算出来的值只是起点,最终要实测调整。
实际代码实现时,我习惯用增量式PI,避免积分饱和的问题。下面是我常用的代码模板:
// 电流环PI参数计算(离散域)
// 输入:带宽 ω_bw (rad/s), 电感 Ls (H), 电阻 Rs (Ω), 采样周期 Ts (s)
// 输出:Kp, Ki
float calc_current_pi_params(float omega_bw, float Ls, float Rs, float Ts) {
float Kp = omega_bw * Ls;
float Ki = omega_bw * Rs;
// 离散化:前向欧拉法
float Kp_d = Kp;
float Ki_d = Ki * Ts;
return Kp_d, Ki_d;
}
// 增量式PI控制器
float current_pi_update(float err, float Kp, float Ki) {
static float err_prev = 0;
static float u_prev = 0;
float delta_u = Kp * (err - err_prev) + Ki * err;
float u = u_prev + delta_u;
err_prev = err;
u_prev = u;
return u;
}
3.3 仿真验证方法——别信公式,信波形
公式算完了,参数填进去了,然后呢?直接上电机?千万别。我吃过这个亏。有一次在实验室,参数算得挺漂亮,一上电电机就啸叫,电流波形跟心电图似的。从那以后,我养成了先仿真再上机的习惯。
仿真验证,我一般分三步走:
- 阶跃响应测试:给电流指令一个阶跃,看响应时间、超调量、稳态误差。
- 带宽扫频验证:用正弦波扫频,看实际带宽是否达到设计值。
- 抗扰能力测试:在电流环输出端加一个扰动,看恢复速度。
下面是我在MATLAB/Simulink中常用的验证脚本:
% 电流环阶跃响应仿真
% 电机参数
Rs = 0.5; % 定子电阻 (Ω)
Ls = 0.005; % 定子电感 (H)
omega_bw = 2*pi*500; % 目标带宽 500Hz
% PI参数
Kp = omega_bw * Ls;
Ki = omega_bw * Rs;
% 仿真模型:闭环传递函数 = ω_bw / (s + ω_bw)
s = tf('s');
G_cl = omega_bw / (s + omega_bw);
% 阶跃响应
figure;
step(G_cl);
title('电流环阶跃响应');
grid on;
% 读取响应时间
info = stepinfo(G_cl);
fprintf('上升时间: %.3f ms\n', info.RiseTime * 1000);
fprintf('超调量: %.2f %%\n', info.Overshoot);
fprintf('稳态误差: 0 (一阶系统无静差)\n');
仿真结果怎么看?我总结了一个快速判断表:
| 指标 | 理想值 | 可接受范围 | 问题诊断 |
|---|---|---|---|
| 上升时间 tr | 0.35 / fbw | ±20% | 偏大→带宽不足;偏小→噪声敏感 |
| 超调量 Mp | 0%(一阶系统) | <5% | 超调大→有未建模延迟或零点 |
| 稳态误差 ess | 0 | <1% | 有静差→积分增益不足或饱和 |
| 带宽 fbw | 设计值 | ±10% | 偏低→延迟影响;偏高→噪声放大 |
我的仿真小技巧: 仿真时一定要加入PWM更新延迟和采样延迟。最简单的做法是在电流环输出后面加一个1.5倍Ts的延迟环节。这样仿真结果才贴近实际。不加延迟的仿真,参数永远调不准。
3.4 实际调试中的避坑指南
仿真通过了,参数看着也漂亮,但上机后还是可能出问题。我把自己踩过的坑列出来,你们少走弯路:
- 积分饱和:电流指令突变时,积分项疯狂累积,导致输出饱和。解决办法是加抗饱和(anti-windup),或者用增量式PI。
- 电感饱和:大电流时电感会下降,按空载电感算的Kp偏大。我一般在额定电流点测一下电感,用那个值算参数。
- 电阻温漂:电机发热后电阻能变到1.5倍。Ki跟着漂,电流环性能下降。解决办法是加在线电阻辨识,或者留足裕量。
- 采样噪声:电流采样如果带毛刺,PI输出也会抖。我习惯在电流反馈路径上加一个截止频率为2倍带宽的低通滤波器。
曾经有一次: 我在一个高速主轴项目上,电流环怎么调都抖。折腾了两天,最后发现是电流传感器的屏蔽线没接好。所以,调试前先检查硬件,别一上来就调参数。硬件问题软件永远补不回来。