2. 电流环基础:PI控制器原理与参数影响
电流环是电机控制的基石。说白了,你速度环调得再好,电流环跟不上,一切都是空谈。我刚开始做电机驱动时,就吃过这个亏——速度环参数怎么调都抖,最后发现是电流环带宽不够,相位裕度都快没了。
这一章,咱们就把电流环的核心——PI控制器,彻底讲透。不扯复杂的现代控制理论,就讲工程上怎么用、怎么调、参数大了小了会怎样。
2.1 PI控制器的数学本质
PI控制器,比例+积分。公式很简单:
u(t) = Kp * e(t) + Ki * ∫e(τ)dτ
其中:
- e(t):电流误差(目标值 - 实际值)
- Kp:比例增益
- Ki:积分增益
- u(t):输出电压指令
但在数字控制器里,我们用的是离散形式。我习惯用位置式PI,因为更直观:
u(k) = Kp * e(k) + Ki * Ts * Σe(i)
这里 Ts 是电流环采样周期。注意,Ki 前面乘了 Ts,这样 Ki 的量纲就和 Kp 统一了,调参时脑子不容易乱。
关键认知:比例项决定响应速度,积分项消除稳态误差。两者必须配合,不能偏废。
2.2 比例增益 Kp 的影响
Kp 大了,系统响应快,但容易超调甚至振荡。Kp 小了,系统反应慢,像个没睡醒的电机。
我举个例子。假设目标电流是 10A,Kp=10 时,误差 1A 就能产生 10V 的电压指令。Kp=1 时,同样误差只有 1V。你想想看,哪个更快?
但问题来了:Kp 太大,系统会振荡。为什么?
- 实际电流有延迟(PWM更新、AD采样、计算延时)
- Kp 太大,相位裕度下降
- 系统进入临界稳定甚至不稳定
我曾经在一个 48V 的 BLDC 项目上,把 Kp 调大了 3 倍,结果电流波形直接变成锯齿波,电机嗡嗡响。后来用示波器一看,电流环已经自激振荡了。嗯,从那以后我调 Kp 都是一点一点加,绝不大步跳。
2.3 积分增益 Ki 的影响
Ki 的作用是消除稳态误差。没有积分项,系统会有静差——比如目标 10A,实际只能到 9.5A,差那 0.5A 就是积分要干的活。
但 Ki 也不是越大越好。Ki 太大,积分饱和严重,系统会超调,甚至出现「积分 windup」现象——误差累积太多,输出饱和,等误差反向时,积分项还要慢慢退回来,导致响应变慢。
| 参数 | 偏小 | 偏大 | 合适范围(经验) |
|---|---|---|---|
| Kp | 响应慢,跟踪滞后 | 超调大,可能振荡 | 使电流环带宽为开关频率的 1/10 ~ 1/20 |
| Ki | 稳态误差大 | 超调大,积分饱和 | Ki = Kp * (带宽 / 10) 左右 |
个人习惯:先调 Kp 到系统刚好不振荡,再加 Ki 消除静差。Ki 从 0 开始,每次加 10%,观察稳态误差是否消失。如果出现超调,说明 Ki 加过头了。
2.4 电流环的带宽与相位裕度
电流环的带宽,决定了它能跟踪多快的电流变化。带宽越高,响应越快,但噪声也更容易进来。
工程上,电流环带宽通常设置为 PWM 开关频率的 1/10 ~ 1/20。比如 10kHz 的 PWM,电流环带宽设在 500Hz ~ 1kHz 比较合理。
相位裕度呢?我建议至少 45°,最好 60° 以上。相位裕度不够,阶跃响应会有振荡,甚至不稳定。
怎么测?简单:
- 给电流环一个正弦波指令(频率从低到高扫频)
- 记录实际电流的幅值和相位
- 幅值下降到 -3dB 的频率就是带宽
- 相位滞后 180° 时的增益,就是相位裕度
避坑指南:带宽不是越高越好。我见过有人把电流环带宽设到 2kHz(PWM 10kHz),结果电流噪声大得离谱,电机发热严重。后来降到 800Hz,一切正常。记住,带宽和噪声是一对矛盾。
2.5 PI参数整定方法
调 PI 参数,我常用的方法有三种:
| 方法 | 适用场景 | 操作步骤 |
|---|---|---|
| 试凑法 | 快速验证,原型调试 | 先 Kp 后 Ki,逐步逼近 |
| 极点配置法 | 已知电机参数,追求性能 | 根据电机电气时间常数计算 |
| 自动整定 | 量产产品,参数自适应 | 注入激励信号,在线辨识 |
我个人最常用的是极点配置法。对于表贴式永磁同步电机(SPMSM),电流环的传递函数可以简化为一阶惯性环节:
G(s) = 1 / (L*s + R)
其中 L 是电感,R 是电阻。那么 PI 参数可以这样算:
Kp = L * ωc
Ki = R * ωc
这里 ωc 是期望的电流环带宽(角频率)。比如想要 1kHz 带宽,ωc = 2π * 1000 ≈ 6283 rad/s。
注意:这个公式只适用于 SPMSM。对于内置式永磁同步电机(IPMSM),d-q 轴电感不同,需要分别计算。我当年第一次调 IPMSM 时,直接用 SPMSM 的公式,结果 d 轴电流振荡得一塌糊涂……
2.6 电流环的离散化实现
数字控制器里,PI 需要离散化。我推荐用增量式 PI,因为它天然抗积分饱和:
Δu(k) = Kp * [e(k) - e(k-1)] + Ki * Ts * e(k)
u(k) = u(k-1) + Δu(k)
代码实现也很简单:
// 增量式PI控制器
float pi_controller(float target, float actual, float *integral, float Kp, float Ki, float Ts) {
float error = target - actual;
float output = Kp * error + Ki * Ts * (*integral);
*integral += error;
return output;
}
注意:积分项一定要限幅!否则积分饱和会让你怀疑人生。我一般把积分输出限制在 PWM 最大占空比的 80% 以内,留点余量给比例项。
2.7 本章知识体系
下面这张图,把电流环 PI 控制的核心逻辑串起来了:
这张图把 PI 控制器的两个核心参数、它们的影响、整定方法和实现方式都串起来了。你调试时,可以对照这张图,一步步排查问题。
2.8 常见问题与排查
最后,我总结几个实际项目中经常遇到的问题:
- 电流振荡:Kp 太大,或者 Ki 太大。先降 Kp,再降 Ki。
- 稳态误差大:Ki 太小,或者积分限幅太紧。适当增加 Ki,放宽限幅。
- 响应慢:Kp 太小,或者带宽设置太低。提高 Kp,但注意不要引起振荡。
- 噪声大:带宽太高,或者 AD 采样有噪声。降低带宽,或者加低通滤波。
我的经验:调电流环时,先用示波器看实际电流波形。如果波形干净、跟踪快,说明参数合适。如果波形毛刺多、有振荡,别急着调参数,先检查硬件——采样电阻、运放、PWM 死区,这些都可能引入噪声。