PID控制器
提到PID,做控制的各位应该都是经常需要接触的。本章针对PID的定义、应用进行梳理与总结。本文主要参考了《电动机的单片机控制》1 PID控制器一章相关内容。
核心思想总结:
- 比例项 P:看的是 “现在差多少”,提供即时反应。
- 微分项 D:看的是 “变化有多快”,提供阻尼和预测。
- 积分项 I:看的是 “差了多久,总共差了多少”,致力于纠正那些小而持久的偏差。
1. 模拟PID控制原理
PID控制有基本要件:
- 比例(proportional)、积分(integral)、微分(derivative)。
- PID采集周期(循环周期)也是闭环系统的重要参数,因为有些时候传感器离执行器较远,过程变量改变和观测到该改变之间的时间延迟,也就是不响应期
PID控制系统的原理图:
graph LR
R@{ shape: lean-l, label: "$$ r(t) $$" } --> E@{ shape: circle, label: "$$ e(t) $$" }
C@{ shape: lean-r, label: "$$ y(t) $$" } --> E
E --> P[Proportional Kp] --> SUM@{ shape: circle, label: "$$ u(t) $$" }
E --> I[Integral Ki] --> SUM
E --> D[Derivative Kd] --> SUM
SUM --> G[Plant] --> C
说明
- $ r(t) $ 为输入值;
- $ y(t) $ 为输出值;
- $ e(t) $ 为每一次运行后的误差 $ e(t) = r(t) - y(t) $;
- Plant被控对象,通常是电机之类的设备;
- mermaind画出来的真丑;
根据PID控制系统的原理图,容易得出控制器控制规律:
\[u(t) = K_p \left[ e(t) + \frac{1}{T_i} \int_0^t e(t)\,dt + T_d \frac{d e(t)}{dt} \right] + u_0 \tag{1}\]式中
- $ u(t) $ 控制器输出;
- $ K_p $ 是比例系数;
- $ T_i $ 是积分常数;
- $ T_d $ 微分常数;
- $ e(t) $ 是当前时刻的误差;
- $ u_0 $ 控制常量,是在无误差时仍需要维持输出的那部分“基础控制量”,它是 PID 控制器中的一个静态偏置,保证系统能在稳态持续运转;
简单来说,PID控制器各环节作用如下:
- 比例环节仅仅取决于设定值和过程变量之间的差值。这个差值被称为“误差”。比例增益决定了输出响应对误差信号的比例。例如,错误项的误差幅值为10,比例增益为5,这将产生比例响应为50。一般情况下,增加比例增益将提高控制系统响应的速度。但是,如果比例增益太大,过程变量会出现振荡。如果继续增加,系统振荡会越来越大,使得系统变得不稳定,以至于失控。
- 积分环节将一段时间内的误差相加。即使是一个很小的误差,也会让积分响应缓慢增加。积分响应会根据时间持续增加,除非误差为0。因此,积分响应的目的在于将稳定状态的误差保持在0。稳定状态误差是过程变量和设定值之间的差值。当积分操作满足了控制器的条件,而控制器还未将误差保持在0时,会产生一种称为积分饱和的现象。
- 如果过程变量快速增加,微分分量会导致输出减少。微分响应与过程变量的变化率之间成比例关系。增加微分时间$ T_d $会使控制系统对误差的反应更加剧烈,也会增加整个控制系统的响应时间。大多数实用控制系统使用非常小的微分时间$ T_d $,因为微分响应对过程变量的噪声特别敏感。如传感器反馈信号中有噪声或控制循环速率太低,微分响应会使控制系统变得不稳定。
以上是模拟PID的控制原理,并不能实际作用于我们的单片机控制系统,因为单片机是一种采样控制,只能能根据采样时刻的偏差值计算控制量,所以需要采用离散化的方法。
2. 数字PID控制算法
数字PID控制算法可分为位置式PID控制算法和增量式PID控制算法
位置式PID控制算法和增量式PID控制算法之间存在密切的关系,可以通过增量式算法推导出位置式的递推公式。
2.1. 位置式PID控制算法
离散化:指将连续特征或者变量,转变成离散特征或者变量的过程。此处离散化处理方法为以T作为采样周期,$ k $ 作为采样序号,则采样连续时间$ t $可以用$ kT $代替,用求和的形式代替积分,用增量的形式代替微分;
可作如下近似变换:
\[\begin{cases} t \approx kT \quad (k = 0,1,2,\cdots) \\ \int_{0}^{t} e(t) dt \approx T \sum_{j=0}^{k} e(jT) = T \sum_{j=0}^{k} e_j \\ \frac{de(t)}{dt} \approx \frac{e(kT) - e[(k-1)T]}{T} = \frac{e_k - e_{k-1}}{T} \end{cases} \tag{2}\]将式(2)带入式(1),就可以得到离散化的PID表达式:
\[u_k = K_p \left[ e_k + \frac{T}{T_i} \sum_{j=0}^{k} e_j + \frac{T_d}{T} (e_k - e_{k-1}) \right] + u_0 \tag{3}\]或,进一步简化为:
\[u_k = K_p e_k + K_i \sum_{j=0}^{k} e_j + K_d (e_k - e_{k-1}) + u_0 \tag{4}\]式中
- $ K_p $ 是比例增益;
- $ K_i $ 是积分增益,$ K_i = K_p \frac{T}{T_i}$;
- $ K_d $ 是微分增益,$ K_d = K_p \frac{T_d}{T}$;
- $ e_k $ 是当前时刻的误差;
- $ \sum_{j=0}^{k} e_j $ 是误差的累加和。
因为直接由式(1)得出,每一次计算都给出了全部的控制量,故称为全量式或位置式。
2.2. 位置式PID的意义
积分完整,理论上可完全消除静态误差。
这种算法的缺点是:由于全量输出,所以每次输出均与过去状态有关,计算时要对$ e_k $累加,工作量大(其实对于现代计算机来说并不算什么);并且因为计算输出的$ u_k $是实际位置,如果计算错误,则会引起输出大幅度变化,从而易产生事故;更有可能的问题在于计算的溢出(随着系统长时间运行,积分项快速累积,理论上就是无限大,实际上我们可以做一些限幅)、精度丢失(在浮点数运算中,当一个非常大的数加上一个非常小的数时,小数的精度可能会丢失)。
2.3. 增量式PID控制算法
所谓增量是指控制器的输出只是控制量的增量$ \Delta u_k $,位置式的输出$ u_k $可以表示为上一次的输出$ u_{k-1} $加上当前的增量$ \Delta u_k $:
\[u_k = u_{k-1} + \Delta u_k \tag{5}\]那么$ u_{k-1} $,可由式(3)推到出:
\[u_{k-1} = K_p \left[ e_{k-1} + \frac{T}{T_i} \sum_{j=0}^{k-1} e_j + \frac{T_d}{T} (e_{k-1} - e_{k-2}) \right] + u_0 \tag{6}\]将式(3)与式(6)相减,即可得到增量式PID的输出$ \Delta u_k $,其表示控制量的变化量,其公式为:
\[\begin{align} \Delta u_k &= u_k - u_{k-1} \tag{7} \\ &= K_p \left[e_k - e_{k-1} + \frac{T}{T_i} e_k + \frac{T_d}{T} (e_k - 2e_{k-1} + e_{k-2}) \right] \tag{8} \\ &= K_p (e_k - e_{k-1}) + K_i e_k + K_d (e_k - 2e_{k-1} + e_{k-2}) \tag{9} \\ \end{align}\]式中
- $ K_p $ 是比例增益;
- $ K_i $ 是积分增益,$ K_i = K_p \frac{T}{T_i} $;
- $ K_d $ 是微分增益,$ K_d = K_p \frac{T_d}{T} $;
或,上式(8)也可以写成下面形式:
\[\begin{align} &= K_p (1 + \frac{T}{T_i} + \frac{T_d}{T}) e_k - K_p (1 + \frac{2T_d}{T}) e_{k-1} + K_p \frac{T_d}{T} e_{k-2} \tag{10} \\ &= A e_k + B e_{k-1} + C e_{k-2} \tag{11} \end{align}\]式中
- $ A = K_p (1 + \frac{T}{T_i} + \frac{T_d}{T}) $
- $ B = - K_p (1 + \frac{2T_d}{T}) $
- $ C = K_p \frac{T_d}{T} $
- 若带入$ K_i = K_p \frac{T}{T_i} $、$ K_d = K_p \frac{T_d}{T} $,即
- $ A = K_p + K_i + K_d $
- $ B = -K_p - 2K_d $
- $ C = K_d $
Q: 为什么会有式(11)这种形式的公式?
A: 这种形式的意义在于:实现简单,只需存储最近两个误差值;在微处理器中编程非常方便,只需三次乘法和两次加法。
2.3. 增量式PID的意义
通过递推公式简化了实现过程,同时保持了控制算法的完整性。并且避免直接计算误差的累加和$ \sum_{j=0}^{k} e_j $,从而减少计算量和内存占用。每次只需保存上一次的输出$ u_{k-1} $ 和最近的几次误差值$ e_k, e_{k-1}, e_{k-2} $,即可完成计算。因为输出是增量,一旦输出达到限幅,它就会停止增长,不会出现巨大的积分累积。系统反应更安全。
这种算法的缺点是:积分作用可能偏弱$ Ki * e(k) $,只与当前误差有关。
2.5. PID整定
设置P、I、D最佳增益,从而得到控制系统理想反馈的过程叫做整定。 PID整定方法有很多种。学习整理了一下手动整定和Ziegler Nichols整定方法。
手动整定方法:
- 先比例,后积分,再微分。
- 只使用P控制(将Ki和Kd设为0),从小到大逐渐增大Kp,直到系统出现持续、等幅的振荡。此时系统的响应速度最快,但无法稳定,记录当前P值。
- 加入积分控制(PI控制),在P控制稳定的基础上,引入积分。先将Kp设为之前临界增益的一半,从小到大逐渐增大Ki。积分作用会开始消除静差,但也会引起系统再次振荡。调整Ki,直到系统在快速消除静差和保持稳定之间取得平衡,记录当前I值。
- 加入微分控制(PID控制)如果系统经过PI调节后,响应速度仍然不够快,或者超调过大,可以引入微分。保持Kp和Ki不变,从小到大逐渐增大Kd。微分作用会抑制振荡,使系统更稳定,响应曲线更平滑。但Kd过大容易引入高频噪声。
ZN整定法-临界比例度法:
- 同样在手动整定的步骤1的基础上,纯P控制,直到系统出现持续、等幅的振荡。记录下此时的Kp值,称为临界增益(Ku),以及振荡的周期,称为临界周期(Tu)。
- 然后根据控制器类型,使用下表公式计算参数:
| 控制器类型 | Kp | Ti | Ki | Td | Kd |
|---|---|---|---|---|---|
| P | 0.50 Kᵤ | — | — | — | — |
| PI | 0.45 Kᵤ | Tᵤ / 1.2 | Kp / Ti | — | — |
| PID | 0.60 Kᵤ | Tᵤ / 2 | Kp / Ti | Tᵤ / 8 | Kp * Td |
// todo 咱自控学的也是皮毛,有待进一步深入学习。
3. 模糊PID控制算法
在上述数字PID控制算法章节中提到的PID控制算法即为经典的PID控制方式,已在工业等领域受到广泛应用。
但是传统的PID控制算法,在面对复杂的非线性的系统时,往往表现不佳。因为固定的PID参数难以在不同的工况下保持最优的性能。故引入模糊PID控制,将模糊逻辑与PID进行完美结合。
3.1. 模糊逻辑
模糊逻辑是一种处理不确定性和不精确性的数学方法,与传统的布尔逻辑“非0即1”不同,模糊逻辑允许“部分属于”。
模糊的处理流程:
- 模糊化:将精确的输入转为模糊集合
- 模糊规则库:基于专家经验设计规则
- 推理机制:根据规则,进行逻辑推理
- 解模糊化:根据模糊的输出再转换为精确输出
3.2. 模糊PID控制器
模糊PID控制器有两种实现方式:
- 模糊自整定PID:使用模糊推理系统实时调整Kp、Ki、Kd
- 模糊-PID混合控制:模糊控制器和PID控制器并行工作,输出相加
工作流程:
- 输入计算误差和误差变化率
e(k) = r(k) - y(k) # 当前误差 ec(k) = e(k) - e(k-1) # 误差变化率 - 模糊化,将e和ec映射到模糊合集(如:负大、负中、负小、零、正小、正中、正大)
- 模糊推理:应用模糊规则库
- 如果e是正大且ec是负小,那么ΔKp是正大
- 如果e是零且ec是正小,那么ΔKi是正中
- 解模糊:将模糊输出转换为精确的PID参数调整量(ΔKp, ΔKi, ΔKd)
- 参数更新:实时调整PID参数
根据实际工况,设计误差、误差变化率以及PID参数调整量。这个初始的模糊规则设定依赖于“专家经验”,后续需要进行方式和调试,进行逐步调整。
// todo 待实践应用
4. 电子膨胀阀的前馈-PID复合控制应用
前面整理了理想状态下PID控制与原理于算法实现,但是面对现实工作条件下,系统会收到各种干扰。以制冷系统的关键部件电子膨胀阀为例,器核心目标是维持稳定的过热度。
然而,压缩机频率的突变时一个巨大且快速的干扰,传统的PID控制器受限于器滞后性,会导致过热度剧烈的波动,影响系统稳定与安全。
本节引入前馈控制,与PID组成复合控制系统来解决实际问题。
4.1. 在制冷系统中电子膨胀阀控制的特殊性
控制目标:维持稳定的过热度
主要干扰源:压缩机频率变化
纯PID控制的缺陷:
- 响应滞后:只有当频率变化导致过热度偏差后,PID才开始动作。
- 响应太慢(开度太小):
蒸发器制冷剂不足 --> 制冷效果下降吸气温度过高 --> 排气温度过高 --> 系统故障停机
- 响应太慢(开度太大):
蒸发器制冷剂太多 --> 制冷剂未完全汽化 --> 进入压缩机带液运行 --> 压缩机损坏,影响使用寿命
- 响应太慢(开度太小):
- 动态偏差大:在PID响应期间,系统已经经历了较大的波动。
系统压力波动 --> 影响压力传感器检测 --> 反过来影响电子膨胀阀PID调节开度
- 系统震荡,影响用户体验
纯PID控制像是一个“亡羊补牢”的牧民,而我们需要一个能“未雨绸缪”的预言家,从维持系统安全与稳定。
4.2. 前馈控制
参考资料
National Instruments. (2025). PID控制器及其原理解释. https://www.ni.com/zh-cn/shop/labview/pid-theory-explained.html?srsltid=AfmBOoqWDqgwnvU19vFPLYO2AVHofH_WpVnJrkRhmNcJGRDRGauZNIqa
-
王晓明. (2011). 《电动机的单片机控制 第三版》 ↩