第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\):

「稳、快、准」在这里互相打架。增益只能把波特图整体上下平移,要同时满足几项指标,就得改变开环频率特性的形状:在系统里加一个专门设计的环节 \(G_c(s)\),这叫校正。按三频段的思路:低频段要高(准),中频段以 −20 dB/dec 穿越并且够宽(稳、快),高频段要低(抗噪声)。

校正方式做法特点
串联校正\(G_c(s)\) 串在前向通道里,通常放在对象前面最常用,设计简单。PID 控制器就是一种串联校正
反馈校正用局部反馈包围对象中的某些环节(比如测速反馈)能削弱被包围环节的参数变化和非线性的影响
前馈 / 复合校正按给定值或可测扰动直接补偿不在回路里,不影响稳定性,常与反馈配合使用(第9章)

6.2 串联超前校正

$$G_c(s)=\frac{Ts+1}{\alpha Ts+1},\qquad \alpha<1$$

零点 \(-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}\),换成正弦更好记:

$$\sin\varphi_m=\frac{1-\alpha}{1+\alpha},\qquad \omega_m=\frac{1}{T\sqrt\alpha},\qquad |G_c(j\omega_m)|=\frac{1}{\sqrt\alpha}\ \ (\text{即 }10\lg\tfrac1\alpha\ \text{dB})$$

\(\alpha\) 越小超前越多,但单级一般不超过 60°(\(\alpha\approx0.07\)),再多就要用两级。

作用:在截止频率附近补上一段正相角,相位裕度变大 → 超调减小;同时它抬高了中高频的幅值,截止频率右移,响应变快。代价:高频增益变大,对噪声更敏感。从根轨迹看,它加了一对零极点,零点更靠近原点、起主要作用,所以根轨迹向左弯。

设计步骤(频域法)

  1. 按稳态误差要求定开环增益 \(K\);
  2. 画出校正前的波特图,求出 \(\gamma_0\);
  3. 需要的超前角 \(\varphi_m=\gamma^*-\gamma_0+\Delta\),\(\Delta\) 补偿截止频率右移后多出的相位滞后,一般取 5°~12°(原系统相角下降很快时要取得更大);
  4. 由 \(\sin\varphi_m=\dfrac{1-\alpha}{1+\alpha}\) 求 \(\alpha\);
  5. 在校正前的幅频曲线上找 \(L_0(\omega)=-10\lg\dfrac1\alpha\) 的频率,把它作为新的截止频率 \(\omega_c=\omega_m\)(这样校正后正好在最大超前角处穿越 0 dB);
  6. \(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\):

$$\alpha=\frac{1-\sin45^\circ}{1+\sin45^\circ}=0.172,\qquad \omega_m=1.55\ \text{rad/s},\qquad T=\frac{1}{\omega_m\sqrt\alpha}=1.56\ \text{s}$$ $$G_c(s)=\frac{1.56s+1}{0.267s+1}$$
\(\omega_c\)相位裕度 \(\gamma\)幅值裕度超调量调节时间(Δ=2%)
校正前0.93 rad/s29.8°9.5 dB42.5%13.4 s
超前校正后1.55 rad/s50.5°12.1 dB15.9%4.2 s

超调减小、速度加快,稳态误差不变(\(G_c(0)=1\),开环增益没变)。这就是超前校正的典型效果。

实验:超前校正

用运放搭超前校正装置(输入支路为 \(R_1\parallel(R_2+\frac{1}{Cs})\),反馈电阻 \(R_4\)),推导传递函数(反相电路,略去负号):

$$Z_i=\frac{R_1\left(R_2+\frac{1}{Cs}\right)}{R_1+R_2+\frac{1}{Cs}},\qquad G_c(s)=\frac{R_4}{Z_i}=\frac{R_4}{R_1}\cdot\frac{(R_1+R_2)Cs+1}{R_2Cs+1}=K_c\frac{Ts+1}{\alpha Ts+1}$$ $$K_c=\frac{R_4}{R_1},\qquad T=(R_1+R_2)C,\qquad \alpha=\frac{R_2}{R_1+R_2}<1$$

被校正对象是实验二中的二阶系统 [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 串联滞后校正

$$G_c(s)=\frac{bTs+1}{Ts+1},\qquad b<1$$

极点比零点更靠近原点,相角为负(滞后),高频幅值衰减 \(20\lg b\) dB,低频增益不变。

滞后校正不是靠相位滞后起作用的(那是副作用),而是靠高频幅值衰减:

  • 让截止频率左移到原系统相位裕度较大的地方,从而增大 \(\gamma\),代价是响应变慢;
  • 或者说:在保持动态性能的前提下,允许把低频增益(稳态精度)提高。

零点频率 \(1/(bT)\) 要放在新截止频率的 1/10 左右,这样它在 \(\omega_c\) 处只带来约 5° 的相位滞后。

设计步骤

  1. 按稳态误差要求定开环增益 \(K\);
  2. 在校正前的相频曲线上,找到 \(\varphi_0(\omega)=-180^\circ+\gamma^*+(5^\circ\sim12^\circ)\) 的频率,作为新的截止频率 \(\omega_c'\);
  3. 读出原系统在 \(\omega_c'\) 处的幅值 \(L_0(\omega_c')\),令 \(20\lg b=-L_0(\omega_c')\),求出 \(b\);
  4. 取 \(\dfrac{1}{bT}=\dfrac{\omega_c'}{10}\),求出 \(T\);
  5. 验算 \(\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%,不满足要求。

  1. 目标相角 \(-180^\circ+45^\circ+8^\circ=-127^\circ\):解 \(-90^\circ-\arctan\omega-\arctan\frac\omega3=-127^\circ\),得 \(\omega_c'=0.515\) rad/s;
  2. 原系统在 \(0.515\) rad/s 处 \(|L_0|=3.40\)(10.6 dB),所以 \(b=1/3.40=0.294\);
  3. \(bT=10/\omega_c'=19.4\) s,\(T=19.4/0.294\approx66\) s:
    $$G_c(s)=\frac{19.4s+1}{66s+1}$$
  4. 验算:校正后 \(\gamma=48.9^\circ\),幅值裕度 16.2 dB,\(K_v=2\) 不变。
\(\omega_c\)相位裕度超调量峰值时间调节时间(Δ=2%)
校正前(\(K=6\))1.19 rad/s18.3°59.4%2.8 s20.5 s
滞后校正后0.52 rad/s48.9°22.1%5.4 s23.6 s

超调大幅减小,稳态精度保住了,代价是变慢:截止频率降到不到一半,而且滞后网络的零极点很靠近原点(一个偶极子),阶跃响应后面有一段缓慢「爬」到稳态值的尾巴,调节时间并没有缩短。这是滞后校正的典型特点。

超前与滞后的对比

超前校正滞后校正
利用的特性相位超前高频幅值衰减
截止频率 \(\omega_c\)增大,响应变快减小,响应变慢
主要改善动态性能(超调、速度)稳态精度,或在牺牲速度的情况下增大 \(\gamma\)
抗高频噪声变差变好
不适用的情况原系统在 \(\omega_c\) 附近相角下降太快,需要的超前角太大对响应速度要求高;低频段没有相位裕度大的频率可选
对应的 PID 作用PDPI

两者结合就是滞后—超前校正:超前部分改善动态性能,滞后部分改善稳态精度。PID 可以看成它的一种特例。

6.4 PID 控制

$$u(t)=K_pe(t)+K_i\int_0^te(\tau)\,d\tau+K_d\frac{de(t)}{dt},\qquad G_c(s)=K_p+\frac{K_i}{s}+K_ds=K_p\left(1+\frac{1}{T_is}+T_ds\right)$$

两种写法的关系:\(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):

  1. \(K_i=K_d=0\),从小到大增大 \(K_p\),直到响应较快、略有超调;
  2. 加入积分消除稳态误差:\(K_i\) 从小往大调,同时把 \(K_p\) 稍微减小一些;
  3. 超调太大或振荡时加微分,\(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 参数:

$$K_p=4.8,\quad T_i=1.81\ \text{s},\quad T_d=0.45\ \text{s}\qquad\Longrightarrow\qquad K_i=2.65,\quad K_d=2.18$$

这组参数的闭环超调约 41%~53%(D 作用在误差上还是测量值上,结果不同),相位裕度约 30°。Z–N 法得到的参数偏激进,通常把它当起点,再适当减小 \(K_p\)、加大 \(T_i\)。第9章会介绍更稳妥的整定方法。

6.6 动手:PID 实验台和 app.py

下面这个实验台在浏览器里仿真「数字 PID + 被控对象」的闭环,默认参数就是上面 Z–N 例子的结果。试试:

同样的练习也可以在仓库的 app.py 里做(在项目目录执行 uv sync --locked,然后 uv run app.py)。区别在于 app.py 里的 PID 要你自己在 pid.py 里写,修改保存后按 F5 重新加载:

步骤在 pid.py 里写观察什么对应的理论
1. 只有 Pu = 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. 加 Iself.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\)。