上一节我们聊了能控性与能观性 :先确认手上的执行器能影响关键状态,眼前的传感器能提供足够线索。
但即使系统既能控、又能观,控制器仍要面对一个更具体的问题:眼下有误差时,究竟该出多大力、持续多久,又要不要提前收力?
写在前面
想象你正在调一间恒温实验室。
早晨室温偏低,你把加热器功率调大,温度很快往设定值靠近;可当它只差一点点时,继续用同样的方式调,温度却总是差那么一小截。于是你又加大补偿,结果过了一会儿温度冲得太高;等你发现时,房间的热惯性已经把这次"补过头"放大了。
这里其实藏着三个不同的问题:
- 离目标还很远时,要用多大力度追赶?
- 总差一点点时,如何把长期遗留的偏差补掉?
- 已经冲得很快时,怎样及时收力,避免越过头?
这三件事,分别对应PID中的比例(P)、积分(I)、微分(D)。
PID 不是三个彼此独立的旋钮,而是一套同时参考"现在、过去和变化趋势"的纠偏策略。
本文只聚焦一个问题:P、I、D 各自究竟在解决什么控制难题,又为什么它们必须互相配合?
一、先回到闭环:PID处理的始终是"误差"
无论控制的是温度、电机转速,还是机械臂末端位置,PID都不直接问"现在该给多大电压"。它先看目标与实际之间还差多少。
设目标值为 r(t)r(t)r(t),实际输出为 y(t)y(t)y(t),两者之差就是误差:
e(t)=r(t)−y(t) e(t)=r(t)-y(t) e(t)=r(t)−y(t)
PID 控制器的工作,就是根据这条误差曲线产生控制输入 u(t)u(t)u(t),再让对象朝目标移动。图中的温控系统只是一个缩影:设定值、控制器、加热器、房间和温度传感器共同构成完整的反馈回路。

如图6-1:PID不会替代传感器和执行器;它只负责把"差多少"翻译成"下一步怎么做"。
只看某一刻的误差并不够。一个小误差可能刚刚出现,也可能已经持续了很久;它可能正在自行减小,也可能正以很快的速度扩大。P、I、D 正是在从三个不同角度补足这些信息。
二、比例P:看见差多少,就立刻给出相应的纠正力度
比例项最直觉,可以先写成:
uP(t)=KPe(t) u_P(t)=K_Pe(t) uP(t)=KPe(t)
误差大,动作就大;误差小,动作就收。就像推一辆偏离路线的小车,离轨越远,方向盘应当打得越明显;已经接近路线时,修正自然应当变轻。
P 真正解决的是什么?
它解决的是当前偏差的反应速度。
- KPK_PKP太小:系统反应慢,受到扰动后显得"没劲";
- KPK_PKP合适:误差一出现,控制器就能迅速把对象拉回;
- KPK_PKP太大:控制动作过猛,惯性和时延会让系统来回拉扯,甚至振荡。
但比例控制常常会留下一个现象:已经很接近目标,却总差最后一点。
以恒温系统为例,房间不断向外散热。仅靠 P 项时,要让加热器持续输出一小段功率,系统往往需要保留一小段温差来"提醒"控制器继续加热。这个长期存在的小误差,就是稳态误差。
所以P的长处是果断、直接;它的局限也同样清楚:只看当下,容易忘记历史。
三、积分I:把长期没消掉的误差,一点点记下来
积分项不只看"此刻差多少",还会累积"过去一共差了多久":
uI(t)=KI∫0te(τ) dτ u_I(t)=K_I\int_0^t e(\tau)\,d\tau uI(t)=KI∫0te(τ)dτ
如果误差很小但一直不消失,积分项仍会不断累积,直到输出再多一点、把剩余偏差真正推平。它像一位不轻易放过问题的记录员:一次小失误可以忽略,长期没有纠正就必须补回来。
这正是 I 项消除稳态误差的原因。比如电机带上额外负载后,P 项也许只能把速度拉回到"差一点"的位置;积分项则会不断看到这点差距,逐渐补足额外所需的转矩。
当然,记忆也可能变成包袱。
当执行器已经到达最大输出、对象却仍然跟不上时,积分项还会继续积累。等系统终于恢复可控,那些积攒的量会一次性释放,造成明显过冲------这就是常说的积分饱和(windup)。
因此,工程中的 I 项往往要配合:
- 输出限幅;
- 积分限幅或积分分离;
- 执行器饱和时的抗积分饱和(anti-windup)处理。
积分不是"加得越多越准",而是为持续误差保留一份有边界的记忆。
四、微分D:不是预知未来,而是对变化趋势及时踩刹车
微分项关注误差变化得有多快:
uD(t)=KDde(t)dt u_D(t)=K_D\frac{de(t)}{dt} uD(t)=KDdtde(t)
如果误差正在迅速缩小,说明对象可能正高速冲向目标;即使它此刻还没越过设定值,控制器也应该开始收力。微分项提供的正是这种"看见趋势后提前抑制"的作用,因此常被理解为给系统增加阻尼。
请注意,D并不是真的看到了未来。它只是从误差的斜率中判断:照当前速度继续走下去,过冲的风险正在升高。
下面这张图把三种直觉放在一起:左侧蓝色箭头对应"离得远就用力拉回"的 P;中间紫色累计标记对应"持续偏差不能一直放着"的I;右侧橙色制动箭头对应"接近目标时抑制过猛趋势"的D。

三者面对的是同一条误差,却各自读取不同的时间信息。
D项并非总是越大越好。微分会放大高频变化,而测量噪声往往正好表现为高频抖动;因此在有噪传感器上,直接对误差求导很容易把噪声变成频繁的控制抖动。实践中常见的做法是:
- 对微分通道增加低通滤波;
- 优先对测量值而非突变的设定值求导,减少"微分冲击";
- 对噪声较大、惯性较小的对象,干脆先采用 PI 控制而不强行加入 D。
五、合在一起看:PID其实是在同时询问"现在、过去、趋势"
把三项叠加,便得到最常见的理想形式:
u(t)=KPe(t)+KI∫0te(τ) dτ+KDde(t)dt u(t)=K_Pe(t)+K_I\int_0^t e(\tau)\,d\tau+K_D\frac{de(t)}{dt} u(t)=KPe(t)+KI∫0te(τ)dτ+KDdtde(t)
不必把它当成需要立刻背下来的公式。更值得记住的是三项各自回答的问题:
| 分量 | 它看什么 | 它主要解决什么 | 典型风险 |
|---|---|---|---|
| P | 当前误差有多大 | 提高纠正的直接性与响应速度 | 太大时过冲、振荡 |
| I | 误差持续了多久 | 消除长期残留的稳态误差 | 饱和后累积过多、恢复时过冲 |
| D | 误差变化有多快 | 增加阻尼、抑制快速冲向目标的趋势 | 对噪声敏感、易引入抖动 |
这也解释了一个常见误解:P 负责"快"、I 负责"准"、D 负责"稳"只是方便记忆的简化说法,不是互不干扰的分工。
例如,增大 P 也可能让系统更快,但同时更容易不稳;加入 I 能消除静差,却可能让过冲更大;D 能改善阻尼,却不能替代一个本来就过小的 P。真正的效果取决于对象自身的惯性、时延、噪声、采样周期与执行器限制。
六、为什么调参总是"牵一发而动全身"?
把PID的三项都接入后,系统响应常会出现三种有代表性的轮廓:
- 蓝色曲线:比例作用足以把对象拉向目标,但在扰动或负载存在时留下稳态误差;
- 紫色曲线:积分最终消除了偏差,但若阻尼不足,可能经历较明显的来回修正;
- 橙色曲线 :在合适的阻尼配合下,能更快地靠近并较早稳定在目标附近。

这是用于理解权衡关系的示意图,不是任何一个对象的固定"标准答案"。同一组参数换到不同电机、不同负载上,曲线都可能改变。
因此,调 PID 不是分别把三个数"调到最大",而是在做一场多目标权衡:响应要快,超调要小,稳态误差要低,还要经得起噪声、时延和负载变化。
七、从理论回到工程:PID应该怎样开始调?
当一个控制系统表现不好时,先别急着把全部参数同时改掉。一个更稳妥的顺序是:
1. 先确认问题不是结构问题
执行器是否饱和?传感器方向是否接反?采样周期是否过慢?这些问题会让任何PID参数都变得难看。上一节讨论的能控、能观,仍然是这里的前提。
2. 先用P建立"能拉回"的基本反应
从较小的KPK_PKP开始,让系统对误差有可见反应,再逐步增大到"足够快但尚未明显振荡"的区域。此时不追求完全没有静差。
3. 再用I处理长期消不掉的偏差
确认稳态误差确实来自持续扰动或负载后,再缓慢加入KIK_IKI。一旦发现过冲持续变大、恢复变慢,就需要警惕积分过强或积分饱和。
4. 最后视需要加入D,并先处理噪声
当对象惯性明显、接近目标时容易冲过头,D才尤其有价值。若传感器读数本身抖得厉害,先做滤波与采样检查,往往比盲目增大KDK_DKD更有效。
调参的顺序,本质上是在先建立作用力,再补偿遗留误差,最后处理惯性和趋势。
八、把这一节放回整个专栏里看
上一节解决的是"系统能不能被影响、能不能被看见";这一节解决的是"已经看见误差后,怎样把它变成合适的动作"。
- 能控性提供了输入到状态的作用通路;
- 能观性提供了从输出理解状态的测量线索;
- PID则把目标与反馈之间的误差,转化为一条持续更新的控制输入。
这条链可以写成:
目标rrr → 比较,得到误差eee → PID 计算输入uuu → 对象响应yyy → 再次测量
它也是贯穿整个专栏的第一种反馈闭环:快、直接、可解释。以后走到状态反馈、嵌入式实时控制,乃至机器学习的梯度下降时,我们还会反复看到相同的结构------发现偏差,计算修正,再用新的结果校正下一次行动。
In the end:下一节该看什么?
PID的力量来自简单:只要有误差,就能用现在、过去和变化趋势组成一条有效的纠偏规则。
但当系统的关键状态不止一个------例如位置、速度、电流彼此耦合,或者我们希望直接规划它们共同的变化------只盯住一个输出误差就不够了。
下一节,我们会从PID走向更完整的状态视角:状态反馈:为什么知道系统内部状态,控制会更从容?