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° 以上。相位裕度不够,阶跃响应会有振荡,甚至不稳定。

怎么测?简单:

  1. 给电流环一个正弦波指令(频率从低到高扫频)
  2. 记录实际电流的幅值和相位
  3. 幅值下降到 -3dB 的频率就是带宽
  4. 相位滞后 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 控制知识体系 PI控制器 比例项 Kp 积分项 Ki 响应速度 稳态误差 超调量 稳定性 整定方法:试凑法 / 极点配置法 / 自动整定 离散化实现:增量式PI / 位置式PI 核心原则:先比例后积分,带宽与噪声平衡,积分必须限幅

这张图把 PI 控制器的两个核心参数、它们的影响、整定方法和实现方式都串起来了。你调试时,可以对照这张图,一步步排查问题。

2.8 常见问题与排查

最后,我总结几个实际项目中经常遇到的问题:

  • 电流振荡:Kp 太大,或者 Ki 太大。先降 Kp,再降 Ki。
  • 稳态误差大:Ki 太小,或者积分限幅太紧。适当增加 Ki,放宽限幅。
  • 响应慢:Kp 太小,或者带宽设置太低。提高 Kp,但注意不要引起振荡。
  • 噪声大:带宽太高,或者 AD 采样有噪声。降低带宽,或者加低通滤波。

我的经验:调电流环时,先用示波器看实际电流波形。如果波形干净、跟踪快,说明参数合适。如果波形毛刺多、有振荡,别急着调参数,先检查硬件——采样电阻、运放、PWM 死区,这些都可能引入噪声。