第6章
控制系统的校正与 PID
学完这一章你应该能
- 说清楚为什么只调增益不够,需要校正;
- 知道超前校正、滞后校正分别解决什么问题,并按步骤各设计一个;
- 理解 P、I、D 各自的作用和副作用,以及它们和超前、滞后校正的关系;
- 会用试凑法和 Ziegler–Nichols 法整定 PID 参数;
- 在
pid.py里自己写出 PID,并用app.py或本页的实验台验证前面各章的结论。
前置知识:第5章(波特图、相位裕度、三频段)、第4章 4.5 节(加零点和极点的影响)、第3章 3.6 节(稳态误差)。
6.1 为什么要校正
前几章一直在用同一个系统 \(\dfrac{K}{s(s+1)(s+3)}\)。如果只调增益 \(K\):
- 想让稳态误差小(\(K\) 大),相位裕度就变小:\(K=4\) 时 \(\gamma\approx30^\circ\),超调已经 42%;\(K=6\) 时 \(\gamma\approx18^\circ\),超调 59%;\(K\ge12\) 直接失稳;
- 想让超调小(\(K\) 小),系统又慢、稳态误差又大。
「稳、快、准」在这里互相打架。增益只能把波特图整体上下平移,要同时满足几项指标,就得改变开环频率特性的形状:在系统里加一个专门设计的环节 \(G_c(s)\),这叫校正。按三频段的思路:低频段要高(准),中频段以 −20 dB/dec 穿越并且够宽(稳、快),高频段要低(抗噪声)。
| 校正方式 | 做法 | 特点 |
|---|---|---|
| 串联校正 | \(G_c(s)\) 串在前向通道里,通常放在对象前面 | 最常用,设计简单。PID 控制器就是一种串联校正 |
| 反馈校正 | 用局部反馈包围对象中的某些环节(比如测速反馈) | 能削弱被包围环节的参数变化和非线性的影响 |
| 前馈 / 复合校正 | 按给定值或可测扰动直接补偿 | 不在回路里,不影响稳定性,常与反馈配合使用(第9章) |
6.2 串联超前校正
零点 \(-1/T\) 比极点 \(-1/(\alpha T)\) 更靠近原点,所以相角为正(超前)。有的教材写成 \(\dfrac{1+aTs}{1+Ts}\)(\(a>1\)),是同一个东西。
最大超前角的推导:\(\varphi_c(\omega)=\arctan\omega T-\arctan\alpha\omega T\)。令 \(\dfrac{d\varphi_c}{d\omega}=0\),得 \(\omega_m=\dfrac{1}{T\sqrt\alpha}\)(两个转折频率 \(1/T\) 和 \(1/(\alpha T)\) 的几何中点)。代回去,\(\tan\varphi_m=\dfrac{1-\alpha}{2\sqrt\alpha}\),换成正弦更好记:
\(\alpha\) 越小超前越多,但单级一般不超过 60°(\(\alpha\approx0.07\)),再多就要用两级。
作用:在截止频率附近补上一段正相角,相位裕度变大 → 超调减小;同时它抬高了中高频的幅值,截止频率右移,响应变快。代价:高频增益变大,对噪声更敏感。从根轨迹看,它加了一对零极点,零点更靠近原点、起主要作用,所以根轨迹向左弯。
设计步骤(频域法)
- 按稳态误差要求定开环增益 \(K\);
- 画出校正前的波特图,求出 \(\gamma_0\);
- 需要的超前角 \(\varphi_m=\gamma^*-\gamma_0+\Delta\),\(\Delta\) 补偿截止频率右移后多出的相位滞后,一般取 5°~12°(原系统相角下降很快时要取得更大);
- 由 \(\sin\varphi_m=\dfrac{1-\alpha}{1+\alpha}\) 求 \(\alpha\);
- 在校正前的幅频曲线上找 \(L_0(\omega)=-10\lg\dfrac1\alpha\) 的频率,把它作为新的截止频率 \(\omega_c=\omega_m\)(这样校正后正好在最大超前角处穿越 0 dB);
- \(T=\dfrac{1}{\omega_m\sqrt\alpha}\),写出 \(G_c(s)\),验算 \(\gamma\),不满足就加大 \(\Delta\) 重来。
例:把 \(K=4\) 的系统校正到 \(\gamma\ge50^\circ\)
校正前 \(\gamma_0=29.8^\circ\),需要补 20° 以上。这个系统的相频曲线在 \(\omega_c\) 右边下降很快(高频段斜率 −60 dB/dec),截止频率右移后相位损失比较大:按 \(\varphi_m=30^\circ\) 设计只得到 \(\gamma=44^\circ\),按 40° 得到 48.6°,最后取 \(\varphi_m=45^\circ\):
| \(\omega_c\) | 相位裕度 \(\gamma\) | 幅值裕度 | 超调量 | 调节时间(Δ=2%) | |
|---|---|---|---|---|---|
| 校正前 | 0.93 rad/s | 29.8° | 9.5 dB | 42.5% | 13.4 s |
| 超前校正后 | 1.55 rad/s | 50.5° | 12.1 dB | 15.9% | 4.2 s |
超调减小、速度加快,稳态误差不变(\(G_c(0)=1\),开环增益没变)。这就是超前校正的典型效果。
实验:超前校正
用运放搭超前校正装置(输入支路为 \(R_1\parallel(R_2+\frac{1}{Cs})\),反馈电阻 \(R_4\)),推导传递函数(反相电路,略去负号):
被校正对象是实验二中的二阶系统 [3](\(\omega_n=1\),\(\xi=0.2\))。校正前峰值 1.43 V、\(t_p\approx3.3\) s;校正后峰值约 1.3 V、\(t_p\approx2.8\) s。超调减小,响应变快,与理论一致。
6.3 串联滞后校正
极点比零点更靠近原点,相角为负(滞后),高频幅值衰减 \(20\lg b\) dB,低频增益不变。
滞后校正不是靠相位滞后起作用的(那是副作用),而是靠高频幅值衰减:
- 让截止频率左移到原系统相位裕度较大的地方,从而增大 \(\gamma\),代价是响应变慢;
- 或者说:在保持动态性能的前提下,允许把低频增益(稳态精度)提高。
零点频率 \(1/(bT)\) 要放在新截止频率的 1/10 左右,这样它在 \(\omega_c\) 处只带来约 5° 的相位滞后。
设计步骤
- 按稳态误差要求定开环增益 \(K\);
- 在校正前的相频曲线上,找到 \(\varphi_0(\omega)=-180^\circ+\gamma^*+(5^\circ\sim12^\circ)\) 的频率,作为新的截止频率 \(\omega_c'\);
- 读出原系统在 \(\omega_c'\) 处的幅值 \(L_0(\omega_c')\),令 \(20\lg b=-L_0(\omega_c')\),求出 \(b\);
- 取 \(\dfrac{1}{bT}=\dfrac{\omega_c'}{10}\),求出 \(T\);
- 验算 \(\gamma\)。
例:要求速度误差系数 \(K_v=2\),相位裕度 \(\ge45^\circ\)
系统 \(\dfrac{K}{s(s+1)(s+3)}\),\(K_v=K/3=2\Rightarrow K=6\)。校正前 \(\gamma_0=18.3^\circ\),超调约 59%,不满足要求。
- 目标相角 \(-180^\circ+45^\circ+8^\circ=-127^\circ\):解 \(-90^\circ-\arctan\omega-\arctan\frac\omega3=-127^\circ\),得 \(\omega_c'=0.515\) rad/s;
- 原系统在 \(0.515\) rad/s 处 \(|L_0|=3.40\)(10.6 dB),所以 \(b=1/3.40=0.294\);
- \(bT=10/\omega_c'=19.4\) s,\(T=19.4/0.294\approx66\) s:
$$G_c(s)=\frac{19.4s+1}{66s+1}$$
- 验算:校正后 \(\gamma=48.9^\circ\),幅值裕度 16.2 dB,\(K_v=2\) 不变。
| \(\omega_c\) | 相位裕度 | 超调量 | 峰值时间 | 调节时间(Δ=2%) | |
|---|---|---|---|---|---|
| 校正前(\(K=6\)) | 1.19 rad/s | 18.3° | 59.4% | 2.8 s | 20.5 s |
| 滞后校正后 | 0.52 rad/s | 48.9° | 22.1% | 5.4 s | 23.6 s |
超调大幅减小,稳态精度保住了,代价是变慢:截止频率降到不到一半,而且滞后网络的零极点很靠近原点(一个偶极子),阶跃响应后面有一段缓慢「爬」到稳态值的尾巴,调节时间并没有缩短。这是滞后校正的典型特点。
超前与滞后的对比
| 超前校正 | 滞后校正 | |
|---|---|---|
| 利用的特性 | 相位超前 | 高频幅值衰减 |
| 截止频率 \(\omega_c\) | 增大,响应变快 | 减小,响应变慢 |
| 主要改善 | 动态性能(超调、速度) | 稳态精度,或在牺牲速度的情况下增大 \(\gamma\) |
| 抗高频噪声 | 变差 | 变好 |
| 不适用的情况 | 原系统在 \(\omega_c\) 附近相角下降太快,需要的超前角太大 | 对响应速度要求高;低频段没有相位裕度大的频率可选 |
| 对应的 PID 作用 | PD | PI |
两者结合就是滞后—超前校正:超前部分改善动态性能,滞后部分改善稳态精度。PID 可以看成它的一种特例。
6.4 PID 控制
两种写法的关系:\(K_i=K_p/T_i\),\(K_d=K_pT_d\)。app.py 用的是左边这种「并联」形式。PID 不需要对象的精确模型,结构简单、物理意义清楚,工业控制回路里 90% 以上用的都是它(或者 PI)。
| 作用 | 效果 | 副作用 |
|---|---|---|
| P 比例 | 偏差一出现就按比例动作。\(K_p\) 增大,响应变快,稳态误差减小 | 对 0 型对象不能消除稳态误差;\(K_p\) 太大会振荡甚至失稳 |
| I 积分 | 只要有偏差就一直累积,直到偏差为 0,消除稳态误差(型别加 1) | 在原点加了一个极点,相位滞后 90°,稳定性变差、变慢;执行器饱和时会积分饱和 |
| D 微分 | 根据偏差的变化趋势提前动作,增加阻尼,减小超调 | 放大高频噪声;设定值突变时产生很大的冲击 |
和前面各章的联系:
- PD \(=K_p(1+T_ds)\) 提供超前相位,相当于理想的超前校正;在根轨迹上是加了一个零点,轨迹左移;
- PI \(=K_p\dfrac{T_is+1}{T_is}\) 是极点在原点的滞后校正,提高型别、消除稳态误差;
- PID 就是滞后—超前校正;
- 第3章的「比例微分控制」就是 PD,「扰动误差要靠扰动点之前的积分消除」就是 PI 里 I 的作用。
真正把 PID 用在项目里,还要处理积分饱和、微分噪声、采样周期、设定值突变、执行器限幅等问题,这些在第9章 PID 工程实践里详细讲。
6.5 参数整定
试凑法(先 P,后 I,再 D):
- \(K_i=K_d=0\),从小到大增大 \(K_p\),直到响应较快、略有超调;
- 加入积分消除稳态误差:\(K_i\) 从小往大调,同时把 \(K_p\) 稍微减小一些;
- 超调太大或振荡时加微分,\(K_d\) 从小往大调。
Ziegler–Nichols 临界比例度法:只用 P 控制,增大 \(K_p\) 直到输出等幅振荡,记下临界增益 \(K_u\) 和振荡周期 \(T_u\),然后查表:
| 控制器 | \(K_p\) | \(T_i\) | \(T_d\) |
|---|---|---|---|
| P | \(0.5K_u\) | — | — |
| PI | \(0.45K_u\) | \(T_u/1.2\) | — |
| PID | \(0.6K_u\) | \(0.5T_u\) | \(0.125T_u\) |
临界增益不一定要做实验去找,前面几章的方法都能算出来:劳斯表出现全零行、根轨迹与虚轴相交、幅值裕度为 0 dB,说的都是同一件事。实验三测到的 \(K_c=9.58\) 就是这里的 \(K_u\)。
例 对象 \(\dfrac{1}{(s+1)^3}\)(仓库里的三阶对象)。P 控制时特征方程 \(s^3+3s^2+3s+1+K_p=0\),劳斯表 \(s^1\) 行为 \(\dfrac{8-K_p}{3}\),所以 \(K_u=8\);由辅助方程 \(3s^2+9=0\) 得 \(\omega_u=\sqrt3\),\(T_u=2\pi/\sqrt3\approx3.63\) s。按表得 PID 参数:
这组参数的闭环超调约 41%~53%(D 作用在误差上还是测量值上,结果不同),相位裕度约 30°。Z–N 法得到的参数偏激进,通常把它当起点,再适当减小 \(K_p\)、加大 \(T_i\)。第9章会介绍更稳妥的整定方法。
6.6 动手:PID 实验台和 app.py
下面这个实验台在浏览器里仿真「数字 PID + 被控对象」的闭环,默认参数就是上面 Z–N 例子的结果。试试:
- 把 Ki、Kd 拉到 0,只用 P,看稳态误差;把 Kp 拉到 8 附近,看等幅振荡;
- 恢复 PID 后,把「执行器限幅」调到 1.5 左右,看积分饱和造成的大超调,再勾上「抗积分饱和」对比;
- 取消勾选「微分作用于测量值」,看设定值阶跃时 u 的尖峰(微分冲击);
- 加一点测量噪声,看 D 项把噪声放大;再勾上「微分低通滤波」;
- 把采样周期拉大到 0.3 s 以上,看系统怎样变得越来越振荡(第8章解释原因)。
同样的练习也可以在仓库的 app.py 里做(在项目目录执行 uv sync --locked,然后 uv run app.py)。区别在于 app.py 里的 PID 要你自己在 pid.py 里写,修改保存后按 F5 重新加载:
| 步骤 | 在 pid.py 里写 | 观察什么 | 对应的理论 |
|---|---|---|---|
| 1. 只有 P | u = self.kp * error | 一阶对象:有稳态误差,\(K_p\) 越大误差越小。三阶对象:\(K_p\) 接近 8 时等幅振荡。二阶对象:\(K_p\) 越大越振荡,但不会发散 | 0 型系统 \(e_{ss}=\frac{1}{1+K_p}\)(第3章);临界增益;二阶闭环 \(\xi=0.3/\sqrt{1+K_p}\) |
| 2. 加 I | self.integral += error * dt | 稳态误差消失。把 u limit 拉到 1~2,看积分饱和,再加抗饱和 | 积分提高型别;积分饱和(第9章) |
| 3. 加 D | (error - self.prev_error) / dt | 超调变小。加噪声看 D 放大噪声;改成对测量值求导,看设定值阶跃时 u 的尖峰消失 | D 增加阻尼;微分滤波、对测量值微分(第9章) |
| 4. 换对象 | — | 先看波特图预测哪些参数会振荡、失稳,再拖滑块验证 | 相位裕度和幅值裕度(第5章) |
参考实现(先自己写,写完再对照)
class PID:
def __init__(self, kp, ki, kd, out_limit=None):
self.kp, self.ki, self.kd = kp, ki, kd
self.out_limit = out_limit
self.integral = 0.0
self.prev_measurement = None
def update(self, setpoint, measurement, dt):
error = setpoint - measurement
# D 项对测量值求导:设定值突变时不会产生尖峰
if self.prev_measurement is None:
d = 0.0
else:
d = -(measurement - self.prev_measurement) / dt
self.prev_measurement = measurement
u = self.kp * error + self.ki * self.integral + self.kd * d
# 抗积分饱和:输出没有饱和,或者误差会让积分往回退时,才继续积分
saturated = self.out_limit is not None and abs(u) >= self.out_limit
if not saturated or error * u < 0:
self.integral += error * dt
return u
这个实现在仓库的三个对象上都测过:一阶对象只用 \(K_p=4\) 时稳态值 0.8(理论 \(1/(1+K_p)\) 的误差 0.2),加 \(K_i=4\) 后误差为 0;三阶对象用 Z–N 参数、限幅 1.5 时,有抗饱和超调 2%,没有抗饱和 44%。
常见错误
- 超前校正时忘了 \(\Delta\),截止频率右移后相位裕度不够;
- 滞后校正的零点放得太靠近截止频率,相位滞后吃掉了裕度;
- 把滞后校正理解成「利用滞后相位」;
- PID 的并联形式和标准形式(\(K_p, T_i, T_d\))的参数混用;
- 直接照抄 Z–N 参数上线,没有留余量。
本章小结
- 校正:改变开环频率特性的形状,按三频段的要求让稳、快、准同时满足。
- 超前校正:\(\sin\varphi_m=\frac{1-\alpha}{1+\alpha}\),在 \(\omega_m\) 处穿越,增大 \(\gamma\) 和 \(\omega_c\),更快更稳,怕噪声。
- 滞后校正:利用高频衰减,零点放在 \(\omega_c'/10\),保住稳态精度、增大 \(\gamma\),但变慢。
- PID:P 管快和准、I 消除稳态误差但降低稳定性、D 增加阻尼但放大噪声;PD≈超前,PI≈滞后。
- 整定:试凑法(先 P 后 I 再 D);Z–N 法从临界增益和振荡周期出发,结果偏激进。
练习
1. 一个系统动态性能令人满意,但稳态误差太大,应该用超前校正还是滞后校正?
滞后校正(或 PI)。它能提高低频增益、减小稳态误差,零点放得足够低时,基本不影响截止频率附近的动态特性。
2. 一个系统稳态误差满足要求,但超调太大、响应太慢,应该怎么办?
超前校正(或 PD)。它在截止频率附近提供正相角,增大相位裕度(超调变小),同时让截止频率右移(变快)。
3. 需要 30° 的最大超前角,超前网络的 α 取多少?在最大超前角处,校正装置的幅值增加多少 dB?
\(\alpha=\dfrac{1-\sin30^\circ}{1+\sin30^\circ}=\dfrac13\);幅值增加 \(10\lg3\approx4.8\) dB。
4. 为什么积分作用会降低稳定性?用根轨迹和波特图各说一句。
根轨迹:积分是在原点加了一个极点,根轨迹向右弯。波特图:积分在所有频率上都带来 −90° 的相位滞后(PI 的零点以上才逐渐恢复),截止频率处的相位裕度变小。
5. 用 Z–N 法测得 \(K_u=10\)、\(T_u=2\) s,PID 参数是多少?换成 app.py 的并联形式呢?
\(K_p=6\),\(T_i=1\) s,\(T_d=0.25\) s。并联形式 \(K_i=K_p/T_i=6\),\(K_d=K_pT_d=1.5\)。