4、PI控制器原理:位置式PI与增量式PI的区别、积分饱和与抗积分饱和策略
说到电流环调参,PI控制器是绕不开的核心。很多新手一上来就对着Kp和Ki猛调,结果发现电流要么抖得厉害,要么响应慢得像蜗牛。其实,问题往往出在——你连PI的两种实现方式都没搞清楚。
今天我们就来掰扯清楚:位置式PI和增量式PI到底差在哪?积分饱和是怎么坑人的?以及,怎么把它防住。
4.1 位置式PI:最直观,但有个大坑
位置式PI,说白了就是直接算误差,然后累加。公式长这样:
u(k) = Kp * e(k) + Ki * Σe(i) (i从0到k)
其中u(k)是当前输出,e(k)是当前误差,Σe(i)是历史误差的总和。
这个结构很直观:比例项负责“现在错了多少”,积分项负责“过去错了多少”。但问题就出在这个积分累加器上。
一旦输出达到物理极限(比如PWM占空比100%),误差还在,积分项却继续累加。等你需要反向调节时,积分项已经堆了一大堆,输出半天降不下来——这就是积分饱和。
我刚开始做电机驱动时,就吃过这个亏。当时调一个200W的BLDC,电流环响应总是慢半拍,示波器一看,积分项已经堆到天上去了。嗯,从那以后,我再也不敢忽视积分饱和了。
4.2 增量式PI:只算变化量,天然防饱和?
增量式PI的思路不一样——它不输出绝对值,只输出变化量。公式:
Δu(k) = Kp * [e(k) - e(k-1)] + Ki * e(k)
u(k) = u(k-1) + Δu(k)
你看,它只关心“这次误差比上次大了还是小了”,以及“当前误差有多大”。积分项不再是一个无底洞式的累加器,而是通过Ki * e(k)逐步修正。
增量式PI有个天然优势:输出变化是受限的。即使积分项再大,每次输出也只增加Δu,不会瞬间冲到极限。但注意,这并不代表它完全免疫积分饱和——如果u(k)被限幅了,而Δu还在正方向累加,饱和依然会发生。
💡 我的经验:在FOC电流环中,我更喜欢用增量式PI。原因很简单:它天然适合数字控制器,不会因为一次误差突变导致输出跳变。而且,配合限幅处理,积分饱和问题更容易控制。
4.3 位置式 vs 增量式:一张表说清楚
| 对比项 | 位置式PI | 增量式PI |
|---|---|---|
| 输出形式 | 直接输出控制量 | 输出控制量的增量 |
| 积分实现 | 累加所有历史误差 | 通过Ki*e(k)逐步修正 |
| 积分饱和风险 | 高,累加器无上限 | 低,但仍有风险 |
| 输出突变 | 误差突变时输出跳变 | 输出平滑变化 |
| 适用场景 | 模拟控制器、低速系统 | 数字控制器、高速系统 |
| 代码实现 | 简单,但需防饱和 | 稍复杂,但更安全 |
说白了,位置式PI适合那些对输出跳变不敏感的系统,比如温度控制。而增量式PI更适合电机控制这种需要平滑响应的场景。
4.4 积分饱和:它到底是怎么发生的?
我们用一个具体场景来理解。假设你设定电流目标为10A,实际电流只有5A,误差5A。PI控制器开始工作,积分项不断累加。但你的PWM占空比已经到100%了,输出不能再增加。
此时,误差依然存在(实际电流上不去),积分项继续累加。等负载突然减小,你需要降低输出时,积分项已经堆到了相当于200%占空比的值。输出要花很长时间才能降下来——这就是积分饱和。
🔧 避坑指南:我曾经在一个项目中,因为积分饱和导致电机过冲,直接烧了MOS管。后来加了抗饱和策略,再也没出过问题。所以,任何用到PI的地方,都必须考虑积分饱和。
4.5 抗积分饱和策略:三种常用方法
既然积分饱和这么坑,怎么防?我总结了三种常用策略,按推荐程度排序:
4.5.1 积分限幅(最基础)
给积分累加器设一个上限。比如,积分项最大不超过Ki * I_max。代码实现:
integral += Ki * error;
if (integral > INTEGRAL_MAX) integral = INTEGRAL_MAX;
if (integral < -INTEGRAL_MAX) integral = -INTEGRAL_MAX;
这个方法简单粗暴,但有个问题:限幅值设小了,稳态精度下降;设大了,防饱和效果打折扣。
4.5.2 积分分离(推荐)
当误差超过某个阈值时,停止积分。只有误差小到一定程度,才让积分起作用。公式:
if (|error| < THRESHOLD) {
integral += Ki * error;
} else {
// 不积分
}
这样做的好处是:大误差时靠比例快速响应,小误差时靠积分消除静差。我在FOC电流环中经常用这个方法,效果很好。
4.5.3 反计算法(最优雅)
当输出被限幅时,把超出的部分从积分项中减掉。公式:
u = Kp * error + integral;
if (u > U_MAX) {
u = U_MAX;
integral -= Kc * (u - U_MAX); // 反计算
}
其中Kc是反计算系数,一般取1/Kp。这个方法能精确控制积分项,不会过度补偿。但实现稍复杂,需要调Kc。
💡 我的建议:新手先从积分限幅开始,稳定后再换成积分分离。反计算法适合对动态响应要求极高的场合,比如伺服驱动器。
4.6 一张图看懂PI控制器体系
下面这张SVG图,把位置式PI、增量式PI、积分饱和以及抗饱和策略的关系梳理清楚了:
4.7 实战建议:FOC电流环该用哪种?
回到FOC电流环这个场景。我个人习惯用增量式PI + 积分分离的组合。原因有三:
- 电流环响应快,增量式PI的输出平滑特性正好匹配。
- 积分分离能在大误差时(比如启动瞬间)让比例项快速响应,小误差时积分项消除静差。
- 代码实现简单,在STM32或DSP上跑起来毫无压力。
当然,如果你用的是位置式PI,一定要加上抗饱和策略。我曾经见过一个项目,位置式PI没做任何防饱和处理,结果电机在堵转时积分项疯狂累加,一松开就飞车——嗯,那场面,挺吓人的。
🔧 一个小技巧:调试时,把积分项的值打印出来。如果发现它长时间处于限幅值附近,说明你的抗饱和策略需要调整。我一般会先调积分分离的阈值,再调反计算系数。