第3章 电流环PI参数整定:带宽设计、计算公式与仿真验证

电流环是整个弱磁控制系统的基石。说白了,如果电流环没调好,后面的速度环、位置环全是空中楼阁。我见过不少工程师一上来就调速度环,结果电流响应慢半拍,系统抖得跟筛子似的。所以这一章,咱们把电流环的PI参数整定彻底讲透。

3.1 电流环带宽设计——先定目标再动手

带宽是什么?简单说,就是电流环能跟踪多快的指令。带宽越高,响应越快,但噪声也越容易被放大。你想想看,如果带宽设到2000Hz,那PWM开关频率的谐波全进来了,电流波形肯定没法看。

我个人习惯,带宽按以下原则选:

  • PWM开关频率的1/10 ~ 1/20:这是工程上最常用的范围。比如开关频率10kHz,带宽取500Hz~1kHz。
  • 电机电气时间常数的倒数:带宽至少要大于1/τe,否则电流环跟不上电机的电磁变化。
  • 系统噪声水平:如果电流采样噪声大,带宽就得往低了压。
我的经验: 刚开始做项目时,我总想把带宽拉满,觉得越快越好。结果有一次在伺服驱动器上试,电流波形全是毛刺,电机嗡嗡响。后来老老实实降到开关频率的1/15,问题全解决了。带宽不是越高越好,够用就行。

带宽设计流程,我习惯用下面这张图来理清思路:

电流环带宽设计流程 确定PWM开关频率 f_sw 计算电气时间常数 τ_e = L_s / R_s 初选带宽 ω_bw = f_sw / (10~20) × 2π 校验:ω_bw ≥ 1/τ_e 且噪声可接受? 确定最终带宽 ω_bw 注意 带宽过高→噪声放大 带宽过低→响应滞后 折中才是王道

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 仿真验证方法——别信公式,信波形

公式算完了,参数填进去了,然后呢?直接上电机?千万别。我吃过这个亏。有一次在实验室,参数算得挺漂亮,一上电电机就啸叫,电流波形跟心电图似的。从那以后,我养成了先仿真再上机的习惯。

仿真验证,我一般分三步走:

  1. 阶跃响应测试:给电流指令一个阶跃,看响应时间、超调量、稳态误差。
  2. 带宽扫频验证:用正弦波扫频,看实际带宽是否达到设计值。
  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倍带宽的低通滤波器。
曾经有一次: 我在一个高速主轴项目上,电流环怎么调都抖。折腾了两天,最后发现是电流传感器的屏蔽线没接好。所以,调试前先检查硬件,别一上来就调参数。硬件问题软件永远补不回来。