反馈、PID 与工程实践

之前两篇文章分别写了自动化的基本概念和一本概论书的读后感,属于”扫盲”和”逛地图”。这篇打算往深走一步,聚焦在反馈控制最核心也最实用的东西——PID 控制,从数学原理到工程实现,把关键环节串一遍。

从定性到定量

前一篇文章讲反馈的时候,用的全是定性描述:”持续测量输出,比较偏差,自动修正”。这句话方向是对的,但真要动手设计一个控制系统,光有方向不够——偏差到底怎么修正?修正多少?修得多快?多慢? 这些问题不给定量答案,代码和参数就写不出来。

反馈控制说白了就一句话:用误差来消除误差。控制器做的事情很简单——看到有误差,就往消除误差的方向输出一个控制量。但”一个控制量”太模糊了,具体是多少?这就是传递函数和 PID 要解决的问题。

反馈系统的数学语言

要定量描述一个控制系统,首先要找到一种方法描述系统对输入信号的处理能力。控制工程选的路子是传递函数

一个线性时不变系统的传递函数 $G(s)$ 定义为输出 $Y(s)$ 与输入 $U(s)$ 的拉普拉斯变换之比:

$$G(s) = \frac{Y(s)}{U(s)}$$

$s$ 是复频率变量,$s = \sigma + j\omega$。拉普拉斯变换的神奇之处在于,它把微分方程变成了代数方程——时域里的卷积变成了复频域里的乘法。一个 RC 低通滤波器,时域里要解 $\dot{V}_o = (V_i - V_o)/RC$,频域里直接写:

$$G(s) = \frac{1}{RCs + 1}$$

对闭环系统来说,最关键的关系是反馈连接后的传递函数。前向通道是控制器 $C(s)$ 串联被控对象 $P(s)$,反馈通道是传感器 $H(s)$,整个闭环的传递函数是:

$$\frac{Y(s)}{R(s)} = \frac{C(s)P(s)}{1 + C(s)P(s)H(s)}$$

这个公式值得盯着多看几秒。分母里的 $1 + C(s)P(s)H(s)$ 就是反馈的灵魂——它叫回差(return difference)。放大系数越大,分母越大,闭环增益越趋近于 $1/H(s)$——也就是说,闭环系统的行为主要由反馈通道决定,而不依赖前向通道的精度

这解释了为什么反馈控制能降低对元器件的精度要求:前向通道里的放大器漂移了 20%?没关系,只要开环增益够大,闭环特性基本不受影响。这就是反馈那一篇文章里提到的”系统能力不一定取决于单个部件的质量,更取决于你的结构设计”,这里是它的数学解释。

PID 控制的深度解析

PID 是比例-积分-微分的缩写。这三个词对应的是三种不同的误差处理方式。

比例控制——当下

比例控制是最直觉的方式:误差有多大,控制量就成正比地给多大。

$$u(t) = K_p e(t)$$

$e(t) = r(t) - y(t)$ 是设定值与实际输出的偏差,$K_p$ 是比例增益。

比例控制的好处是——误差刚一出现,立即就有控制作用。但它的硬伤也明显:有静差。所谓静差,就是系统稳定之后,实际输出跟目标之间始终差着一截。为什么会有静差?因为比例控制要输出一个非零的控制量 $u$,就必须有一个非零的误差 $e = u / K_p$——误差是驱动控制量的燃料,燃料烧完了,控制量也没了。

从数学上看,开环增益 $K_p$ 越大,静差越小,但过大又会引发振荡。这是一个两难。

积分控制——过去

积分控制看的是误差的历史累积

$$u(t) = K_i \int_0^t e(\tau) d\tau$$

只要过去存在误差,积分项就不为零,它就会持续作用,直到误差被完全消除。这就是积分项消除静差的原理——它不需要靠误差”活着”,误差即使已经趋于零,积分项的累积值还在。

但积分项的代价是滞后。误差出现之后,积分项需要时间累积才能产生足够大的控制量,这会让系统的响应变慢。更麻烦的是,积分累积过大——比如执行器已经饱和了,积分还在继续累加——就会造成积分饱和(integrator windup),后面单独说。

积分增益 $K_i$ 的另一个写法是 $K_i = K_p / T_i$,$T_i$ 是积分时间常数。$T_i$ 越小,积分作用越强。

微分控制——未来

微分控制看的是误差的变化趋势

$$u(t) = K_d \frac{de(t)}{dt}$$

误差在快速增大?微分项提前给出一个反向的控制力来”刹车”。误差在快速趋近目标?微分项提前减小控制量,防止超调。

微分项是预测性的,这很妙。它不关心当前误差多大,也不关心过去累积了多少,它只关心”照这个趋势下去,下一步会怎样?”

实际上,理想的微分项在工程中几乎不可实现——它对噪声极度敏感。传感器测量噪声的导数会非常大,而且高频噪声经过微分之后会被进一步放大。所以工程上用的几乎都是实际微分(带一阶低通滤波):

$$D(s) = \frac{K_d s}{T_f s + 1}$$

$T_f$ 是滤波时间常数,通常取 $T_f = K_d / N$,$N$ 在 5 到 20 之间。

三个参数合在一起

完整的 PID 控制律:

$$u(t) = K_p e(t) + K_i \int_0^t e(\tau) d\tau + K_d \frac{de(t)}{dt}$$

在频域里:

$$C(s) = K_p + \frac{K_i}{s} + K_d s$$

或者用更工程化的写法:

$$C(s) = K_p \left(1 + \frac{1}{T_i s} + T_d s\right)$$

三个参数各管一摊,但互相牵扯。

  • 增大 $K_p$:加快响应,减小静差,但增大超调,系统更容易振荡
  • 增大 $K_i$(减小 $T_i$):彻底消除静差,但降低稳定性,可能引起低频振荡
  • 增大 $K_d$(增大 $T_d$):增加阻尼,抑制超调,但对高频噪声敏感

这里没有免费的午餐。

PID 参数整定的工程方法

理论讲清楚了,到现场怎么把这三个数定下来?这就是整定(tuning)。

Ziegler-Nichols 频域法

1942 年,Ziegler 和 Nichols 发表了至今仍在广泛使用的整定方法。基本流程:

  1. 先把 $K_i$ 和 $K_d$ 设为零,只用比例控制
  2. 逐步增大 $K_p$,直到系统输出出现等幅振荡(临界振荡)
  3. 记下此时的临界增益 $K_u$ 和振荡周期 $T_u$
  4. 按下表计算 PID 参数:
控制类型 $K_p$ $T_i$ $T_d$
P $0.5 K_u$
PI $0.45 K_u$ $T_u / 1.2$
PID $0.6 K_u$ $T_u / 2$ $T_u / 8$

这个方法简单粗暴,非常好用,但也有前提:被控对象必须能承受临界振荡——对于一个不允许大幅波动的化工反应釜,这个方法就不太合适。

Ziegler-Nichols 阶跃响应法

如果系统不允许临界振荡,可以用另一种方法:给系统一个开环阶跃输入,记录响应曲线。

对于大多数自衡对象(self-regulating process),阶跃响应呈 S 形。记下两个关键参数:滞后时间 $L$(从输入变化到输出开始响应的时间)和时间常数 $T$(输出变化到稳态值 63.2% 所需时间)。然后:

控制类型 $K_p$ $T_i$ $T_d$
P $T / L$
PI $0.9 T / L$ $L / 0.3$
PID $1.2 T / L$ $2L$ $L / 2$

Lambda 整定法

ZN 法的目标是”没有明显超调+合理的响应速度”,但在很多流程工业中,人们更关注鲁棒性而不是快速性。Lambda 整定法换了一个思路:你先告诉我你希望系统多快响应,然后倒推出 PID 参数。

对于一阶加滞后(FOPDT)模型:

$$G(s) = \frac{K}{Ts + 1} e^{-Ls}$$

按 Lambda 法:

$$K_p = \frac{T}{K (T_c + L)} \quad T_i = T \quad T_d = 0$$

$T_c$ 就是你要设定的闭环时间常数。$T_c$ 越小,响应越快,但控制作用也越强;$T_c$ 大一些,响应平缓,对模型误差的容忍度更高。现场工程师往往偏爱 Lambda 法,因为它直观——用 $T_c$ 一个旋钮就能在”快”和”稳”之间连续调节。

现场调参的经验法则

公式只能给个起点,现场必须手动微调。以下是几条有用的经验:

先调 P,再加 I,最后加 D。

先把 $K_p$ 从 0 逐渐增大,直到系统有适度的振荡倾向(不是等幅振荡,是振荡后能自己收敛)。然后逐步增加 $K_i$,观察静差是否消除——$K_i$ 太大会引入低频摇摆。如果超调过大,最后加 $K_d$ 来压制。

判断哪个参数出了问题:

  • 稳态误差不为零 → 加 I(或加大 $K_i$)
  • 响应太慢 → 加大 $K_p$
  • 超调太大、反复振荡 → 加 D
  • 高频抖动 → 减 D
  • 系统”嗡嗡”响(执行器频繁动作)→ 减 P 和 D,或者检查噪声

一个实用的经验:现场最常犯的错误是把 $K_p$ 调得过大。 很多人看到响应慢就猛加 P,结果系统开始振荡,又去加 D 压振荡,最后参数一团糟。正确的做法往往是反过来——先把 P 减到安全范围,再用 PI 保证稳态精度。

数字控制中的实现问题

在实际的嵌入式系统或 PLC 中实现 PID,有几个绕不开的坑。

积分饱和

这是工程中最常见的 PID 问题,没有之一。

当执行器达到物理极限——比如阀门已经全开了——输出没法继续增大,但积分项还在累积误差。等到误差反转(比如温度终于开始下降了),积分项已经积累了很大的值,需要很长时间才能”退回去”,这期间系统一直处于失控状态——表现为很大的超调或很长的回落时间。

解决办法:

最简单的办法是积分限幅——给积分项设一个上下限,不让它无限制地累积。

稍好一点的是条件积分(conditional integration):只有当输出不在饱和区、或者误差在某个可接受范围内时,才允许积分累加。

更好的办法是反计算法(back-calculation):当输出饱和时,把超出限幅的部分反馈回积分输入端,让积分项自动调整到不饱和的水平。

微分冲击

当设定值突变时,误差 $e(t)$ 会发生跳变,它的导数理论上无穷大——实际中会产生一个巨大的控制尖峰,非常危险。

解决办法: 只对测量值做微分(derivative on measurement),不对误差做微分。这样设定值的变化不会直接引入微分冲击:

$$u_d(t) = -K_d \frac{dy(t)}{dt}$$

采样周期选择

数字 PID 是离散执行的,采样周期 $T_s$ 的选择很重要。基本原则:

  • $T_s$ 应远小于系统的主导时间常数(至少 10 倍以上)
  • 对于 ZN 整定的系统,$T_s \leq T_u / 10$ 是一个常用准则
  • 采样周期内,$K_p$、$K_i$、$K_d$ 需要从连续形式转换为离散形式

最简单的离散化是用前向欧拉法近似积分和微分:

$$u_k = K_p e_k + K_i T_s \sum_{j=0}^k e_j + K_d \frac{e_k - e_{k-1}}{T_s}$$

这就是位置式 PID。实践中更常用的是增量式 PID(velocity form),它输出的是控制量的增量而不是绝对值,天然具有抗积分饱和的能力:

$$\Delta u_k = K_p (e_k - e_{k-1}) + K_i T_s e_k + K_d \frac{e_k - 2e_{k-1} + e_{k-2}}{T_s}$$

从 PID 往前走一小步

PID 虽然经典,工程上经常需要更复杂的控制结构。

串级控制适合这种情况:被控对象有较大的滞后,或者存在一个可以提前测量的中间变量。比如加热炉的温度控制:温度响应很慢,但炉膛温度变化比物料温度快得多。外环(主环)是物料温度 PID,它的输出作为内环(副环)的设定值,内环 PID 控制炉膛温度。内环快速响应扰动,外环保证最终精度。

前馈-反馈复合控制适用于扰动可测但不方便通过反馈消除的场景。反馈负责”兜底”,前馈负责”提前动作”。比如锅炉汽包水位控制——蒸汽负荷变化是主要扰动,直接测量蒸汽流量,在它影响水位之前就提前调整给水量。

模型预测控制(MPC) 是更高阶的选择,在石油化工行业用得最多。它用一个过程模型预测未来一段时间内系统的行为,然后在线求解一个优化问题,算出最优的控制序列。MPC 天然支持多变量、带约束的控制问题,但计算量也大得多——好在今天的工业计算机已经足够强大。

不过话说回来,全球仍有超过 40% 的工业控制回路在用 PID。这并不是说工程师们不懂 MPC,而是对于绝大多数单入单出回路来说,PID 加上适当的抗饱和和滤波措施,效果已经足够好。简单可靠的方案,往往就是最好的方案。

结语

写这篇文章的时候,我的思路也从最开始的”把 PID 的原理讲清楚”慢慢变成了”把反馈控制背后的工程思想串起来”。反馈这个概念的深度远超它表面的简单——从一个直观的”用误差消除误差”,到传递函数的复频域分析,到 PID 三个参数的物理意义,再到工程现场调参的经验智慧,每一个层面都有值得琢磨的东西。

之前两篇文章分别从”自动化是什么”和”控制理论概览”两个角度切入,这篇算是沿着反馈这条线往深挖了一刀。后面可能会再写一篇关于状态空间控制或者数字滤波器在控制中的应用,燃尽了。

# 自动化 # 控制理论 # PID # 反馈控制 # 工程实践