PID及其衍生算法是工业应用中最广泛的算法之一,堪称“万能算法”。如果能够熟练掌握PID算法的设计与实现过程,对于大多数研发人员来说,足以应对常见的控制问题了。更可贵的是,在众多控制算法中,PID控制算法相对简单,最能体现反馈思想的核心,是经典中的经典。经典并不意味着复杂,相反,它常常是简单的。
PID算法的一般形式
PID算法通过误差信号来控制被控量,而控制器本身就是比例、积分、微分三个环节的输出之和。我们规定在 t 时刻:
- 输入量为

- 输出量为

- 偏差量为

则 PID 控制器的输出 u(t) 为:

PID算法的数字离散化
在数字系统中,我们需要将连续的PID公式进行离散化。假设采样间隔为 T,则在第 K 个采样时刻:
偏差 err(k) = 
积分环节用加和的形式表示:
微分环节用斜率(即差分)的形式表示:
由此,PID算法离散化后的表达式为:

通常可以表示为更简洁的形式:

其中:
- 比例系数 k_p
:控制器的输出与输入偏差值成比例关系。系统一旦出现偏差,比例调节立即产生调节作用以减少偏差。
特点:过程简单快速;比例作用大,可以加快调节,减小误差;但过大的比例增益会使系统稳定性下降,产生振荡,并且存在稳态余差。
- 积分系数 k_i
:积分环节主要用来消除静差。静差是指系统稳定后,输出值与设定值之间的差值。积分环节实质上是偏差累计的过程,将累积的误差添加到系统输出中,用以抵消系统固有的静差。
- 微分系数 k_d
:微分信号反映了偏差信号的变化规律或趋势。根据偏差的变化趋势进行超前调节,可以增加系统的快速响应能力,抑制超调。
上述离散表达式属于 位置型PID。另一种常用的表述方式是 增量式PID。由 u(k) 的表达式,我们可以轻易得到上一时刻的输出 u(k-1):

那么,当前时刻输出的增量 Δu(k) = u(k) - u(k-1) 为:

这个公式就是离散化 PID 的增量式表示。从公式可以看出,增量式的输出只与最近三次的偏差有关,这有助于提高系统的稳定性和抗积分饱和能力。需要注意的是,最终的执行机构输出量应为:当前输出量 = 上次输出量 + 本次计算出的增量调节值
。
为何需要PID控制?
也许你会问:我控制温度,难道不能等温度值一到就停止加热吗?这里首先要明确控制目标。假设我们设定目标温度为30℃,理想的响应曲线是快速、平稳地达到设定值,没有过冲和抖动。

如果采用“温度一到就停”的简单开关控制,由于系统的热惯性和散热等因素,温度往往会超过设定值,然后下降,再上升,形成振荡,无法快速稳定在目标值。这正是计算机科学中经典反馈控制所要解决的问题。因此,我们需要PID这类算法来应对具有滞后特性的系统,使输出能够快速、稳定、精确地到达设定值。
PID控制的整体框图如下,清晰地展示了其反馈控制过程:

控制器的P、I、D项选择
不同的控制规律有其适用的场景:
- 比例控制 (P):能较快克服扰动,响应速度快,但会存在稳态余差。适用于控制要求不高、允许存在余差的场合。
- 比例积分控制 (PI):在比例基础上加入积分,可消除稳态余差,是应用最广泛的一种。适用于不允许有余差的场合。
- 比例微分控制 (PD):微分具有超前预测作用,能提高系统的动态性能,减少超调。适用于系统惯性(容量滞后)较大的场合。但对于纯滞后很大的系统或测量噪声大的系统,不宜使用微分。
- 比例积分微分控制 (PID):结合了三者的优点,既能消除余差,又能提高稳定性和快速性。适用于控制要求较高、时间常数或滞后较大的场合,如温度、成分控制。
Kp、Ti、Td(或 kp、ki、kd)三个参数的设定是PID控制算法的核心。通常编程时先设定大概数值,然后在系统运行时通过反复调试来确定最佳值。
数字PID控制器
数字控制器的设计基于连续系统的离散化。
- 模拟PID的离散化:

- 数字PID的差分方程:

PID参数的自整定
对于不确定被控对象的通用场合,需要参数自整定功能。即系统首次运行时,自动寻找一套合适的PID参数。常用方法有三种:
1. 临界比例度法 (Ziegler-Nichols)
在纯比例控制下,逐渐增大比例增益 K,直至系统出现等幅振荡。记录此时的临界增益 Ku 和临界振荡周期 Tu。

然后根据下表计算PID参数:

注意事项:此法适用于可承受短暂等幅振荡的系统,且对象通常为二阶以上。若系统开环增益 KpKu 满足 2 < KpKu < 20
,则较为适用。
2. 衰减曲线法
在纯比例控制下,调整增益 K,使系统出现4:1(或10:1)的衰减振荡。记录此时的比例增益 Ks 和振荡周期 Ts(或上升时间 Tr)。
然后根据下表经验公式计算参数:

3. 经验整定法
这是工程中最常用的方法,依靠工程师的经验和试凑。
- 先P后I再D:先整定纯比例P,使系统有较快响应且有一定余差;然后加入积分I以消除余差,同时观察系统稳定性;最后根据需要加入微分D来抑制超调,加快稳定。
- 口诀参考:“阶跃扰动投闭环,参数整定看曲线;先投比例后积分,最后再把微分加;理想曲线两个波,振幅衰减4比1;比例太强要振荡,积分太强过程长;动差太大加微分,频率太快微分降;偏离定值回复慢,积分作用再加强。”
- 经验参数范围(供初始值参考):
- 流量系统:P=40-100%, I=0.1-1分钟
- 压力系统:P=30-70%, I=0.4-3分钟
- 液位系统:P=20-80%, I=1-5分钟
- 温度系统:P=20-60%, I=3-10分钟, D=0.5-3分钟
实际应用体会
在STM32等嵌入式平台上实现PID控制是常见的任务。例如:
- 控制直流电机速度:通过光电编码器测量转速,与设定值比较得到误差,经PID运算后输出PWM占空比控制电机电压。实践中会发现控制有范围限制,且稳态精度和调节时间需要反复调试。
- 控制直流减速电机位置:通过电位器测量角度位置,与目标位置比较。这里需要将位置误差合理地映射为控制电机的PWM信号,系统建模和参数整定更具挑战性。
很多初学者的问题在于,对PID参数整定没有清晰的理论和步骤指导,导致调试过程盲目,效果不理想。在云栈社区的嵌入式板块,常有开发者分享他们的调试经验和教训。
形象理解PID算法
通过一个生活化的例子可以更直观地理解PID:
任务:维持一个漏水水缸的水位在固定高度。
- 采样周期:多久检查一次水位。检查太频繁浪费精力,太慢则水位偏差过大。
- 比例P:用什么工具加水(瓢、桶、盆)。工具大小决定了“加水量与水位偏差的比例关系”。用盆可能刚好,比例系数合适。
- 积分I:为了彻底消除因水缸漏水特性导致的持久水位差(稳态误差),你安装了一个漏斗,缓慢持续地加水来累积补偿这个误差。漏斗的口径大小决定了补偿的速度,即积分时间。
- 微分D:为了在水位快速下降时能及时反应,你准备了一盆备用水,一发现水位骤降就立刻泼水(根据水位变化趋势提前动作)。同时,你在水位线上方开个溢流孔,让加多的水流走,防止过冲。这个溢流的快慢体现了微分时间的作用。
PID各环节的深入解析
比例控制与稳态误差
比例控制的输出与误差成正比。比例带(PB)越小,比例作用越强。

纯比例控制必然存在稳态误差,这是因为在平衡时,控制器的输出必须恰好抵消干扰(如漏水),而这需要一个固定的误差来产生这个输出。

为了消除它,早期控制器引入了手动复位功能,即手动给输出加上一个偏移量MR:OUT = (100 / PB) * DV + MR
。这相当于人为将平衡点调整到设定值。

积分控制
积分控制能自动完成“手动复位”的功能,自动消除稳态误差。只要存在误差,积分作用就会不断累积输出,直到误差为零。

积分时间的定义是:在阶跃误差下,积分作用的输出达到与比例作用的输出相等时所需要的时间。积分时间越短,积分作用越强。
微分控制
微分控制根据误差的变化率进行调节,具有“预见性”。它能在误差变大之前就产生一个抑制性的控制作用,从而有效减少超调,提高系统稳定性。

微分时间的定义是:在斜坡误差下,微分作用的输出达到与比例作用的输出相等时所需要的时间。微分时间越长,微分作用越强。
PID参数对控制效果的影响
不同参数组合会产生截然不同的控制效果:


实际应用中的分段PID策略
以高频感应加热将工件从25℃加热到700℃为例,说明PID在实际中如何分阶段使用:
- 大偏差阶段(25~600℃):采用全功率(或开环最大输出)加热,快速逼近目标区。此时使用PID意义不大,主要追求速度。
- 中等偏差阶段(600℃以上):开启P控制。根据当前误差计算输出,平稳拉近与目标值的距离。但纯P控制会停留在某个低于目标的稳态值(如650℃)。
- 小偏差消除阶段(640℃附近):引入I控制。目的是累积P控制无法消除的残余误差(700-650=50℃),逐渐将输出推向目标值,最终消除稳态误差。
- 微调稳定阶段(690℃附近):可加入D控制。在非常接近目标时,抑制因积分或惯性可能引起的超调和振荡,实现平滑、精准的稳定。
总结:PID三个环节并非必须同时全程使用。P用于“粗调”和主体跟踪,I用于“精修”和消除残留偏差,D用于“微操”和抑制抖动。在许多对超调要求不高的场合,PI控制器已足够。理解每个环节的物理意义和作用时机,是成功优化和整定PID参数的关键。