2. PID控制进阶:位置式PID、增量式PID、积分分离与抗积分饱和、前馈补偿
各位同学,咱们今天聊点硬核的。上一章我们把PID的基础框架搭起来了,但说实话,那种教科书式的PID,拿到实际项目里,十有八九是要翻车的。我当年刚入行时,就吃过这个亏——一个简单的温控系统,积分项没处理好,温度直接冲过头,差点把加热管烧了。
所以这一章,咱们把PID的“进阶玩法”掰开揉碎讲清楚。说白了,就是教你如何让PID在真实世界里“活”下来。
2.1 位置式PID与增量式PID:两种实现思路
先搞清楚一个基本问题:你写的PID代码,最终输出的是什么?
位置式PID,输出的是执行机构的位置。比如阀门开度50%,电机转到某个角度。它的公式长这样:
u(k) = Kp * e(k) + Ki * Σe(i) + Kd * [e(k) - e(k-1)]
这里有个大坑——积分项是累加的。一旦过去有误差,它会一直记着。我见过一个项目,系统启动时积分项累积了巨大数值,一开机执行器直接打到极限,差点把机械结构撞坏。
增量式PID,输出的是变化量。它只关心“这次比上次多调多少”:
Δu(k) = Kp * [e(k) - e(k-1)] + Ki * e(k) + Kd * [e(k) - 2*e(k-1) + e(k-2)]
你想想看,增量式的好处是什么?它没有积分累加,所以不会出现“开机暴冲”的问题。而且它天然带记忆——上次的输出值还在,这次只输出增量,就算你算错了,影响也小。
| 对比项 | 位置式PID | 增量式PID |
|---|---|---|
| 输出含义 | 位置 | 变化量 |
| 积分累积 | 有,需处理 | 无 |
| 启动冲击 | 大 | 小 |
| 适用场景 | 位置伺服、阀门控制 | 速度控制、步进电机 |
我个人习惯:做位置控制时用位置式,但一定要加限幅;做速度或增量控制时,无脑选增量式,省心。
2.2 积分分离:别让积分帮倒忙
积分项的本意是消除静差,但有时候它反而会坏事。什么时候?系统刚启动、或者目标值突然改变时。
举个例子:你设定温度100度,当前是20度。误差80度,积分项疯狂累积。等温度到了100度,积分项已经累积了一大堆,它还会继续输出,导致温度冲过100度——这就是积分饱和。
积分分离的思路很简单:误差大的时候,把积分项关掉;误差小的时候,再让它干活。
if abs(e(k)) > threshold:
// 只做PD控制
u(k) = Kp * e(k) + Kd * [e(k) - e(k-1)]
else:
// 正常PID控制
u(k) = Kp * e(k) + Ki * Σe(i) + Kd * [e(k) - e(k-1)]
阈值怎么选?我一般取目标值的5%~10%。比如目标100度,阈值设10度。误差大于10度时,积分不参与;小于10度时,积分慢慢把静差吃掉。
2.3 抗积分饱和:别让积分“撑死”
积分分离解决了“大误差时积分捣乱”的问题,但还有一种情况:系统已经饱和了(比如阀门全开、电机转速到顶),积分还在累加。这时候误差虽然还在,但执行器已经没法响应了,积分项只会越积越大。
等误差反向时,积分项需要很长时间才能“消化”掉,导致系统响应迟钝。这就是积分饱和现象。
解决办法有几种:
- 限幅法:给积分项设个上限,比如最大不超过输出限幅的20%。
- 积分回退法:当输出饱和时,停止积分累加,甚至反向减小积分值。
- 条件积分法:只有在一定条件下才允许积分累加。
我常用的代码实现:
// 抗积分饱和
if (u(k) >= Umax) {
if (e(k) > 0) {
// 输出已饱和,且误差为正,停止积分
integral = integral; // 保持
} else {
integral += e(k) * Ki;
}
} else if (u(k) <= Umin) {
if (e(k) < 0) {
// 输出已饱和,且误差为负,停止积分
integral = integral;
} else {
integral += e(k) * Ki;
}
} else {
integral += e(k) * Ki;
}
2.4 前馈补偿:让PID“预判”未来
PID本质上是个“事后诸葛亮”——它看到误差了才去调整。但有些系统,你明明知道它接下来会怎么变化,为什么不提前干预?
比如机械臂的轨迹跟踪,你提前知道下一时刻的目标位置,就可以提前给一个前馈量,让系统提前动作。这样PID只需要处理“预测误差”和“实际误差”之间的差值,负担小很多。
前馈补偿的公式:
u(k) = u_PID(k) + u_ff(k)
其中u_ff(k)是前馈量,通常根据系统模型计算。比如电机速度控制,前馈量可以是目标速度乘以一个比例系数。
我做过一个项目,用前馈补偿做激光切割头的轨迹跟踪。不加前馈时,跟踪误差有2mm;加了前馈后,误差降到0.3mm以内。效果立竿见影。
2.5 知识体系总览
下面这张图,把本章的核心逻辑串起来了。你可以把它当作一个“决策树”——遇到实际问题时,按图索骥:
嗯,这张图基本把本章的脉络理清了。你拿到一个控制任务,先想清楚用位置式还是增量式;然后评估一下有没有积分饱和的风险;如果系统有可预测的扰动,果断加上前馈。
最后说一句:这些技巧不是孤立的。我做过一个六轴机械臂的轨迹跟踪项目,同时用了增量式PID(避免累积误差)、积分分离(防止启动冲击)、抗积分饱和(应对力矩限制)和前馈补偿(提前补偿重力)。四管齐下,效果才满意。
调试PID没有银弹,但把这些工具用好,至少能解决90%的问题。剩下的10%,靠经验和一点点运气。