第四章:Ziegler-Nichols整定法:临界比例度法

大家好,欢迎来到第四章。

前面我们聊了PID的基本原理,也看了系统发散时那种让人头疼的波形。今天要讲的这个方法,我个人认为是PID整定里最经典、也最实用的一招——Ziegler-Nichols临界比例度法。

说白了,这个方法就是帮你找到系统「快要不稳定」的那个临界点,然后根据这个临界点的参数,反推出合适的PID系数。我当年刚入行时,师傅教我的第一套整定方法就是这个。嗯,到现在我还在用。

4.1 什么是临界比例度法?

先问大家一个问题:一个系统为什么会发散?

通常是因为比例增益太大了。你想想看,比例增益越大,系统响应越快,但过头了就会震荡,甚至发散。临界比例度法的思路很简单——先把积分和微分关掉,只留比例控制,然后慢慢增大比例增益,直到系统出现等幅震荡。

这个等幅震荡的状态,就是系统的临界点。这时候的比例增益,我们叫它临界增益(Ku),震荡周期叫临界周期(Tu)。

核心思想:找到系统「将稳未稳」的那个瞬间,用这个瞬间的参数来推算PID参数。

我在项目中遇到过一套温度控制系统,刚开始怎么调都发散。后来用临界比例度法一测,发现临界增益比我想象的小得多。嗯,这就是经验主义害死人——有时候你以为系统很稳,其实它已经在临界边缘了。

4.2 临界比例度法的操作步骤

步骤不复杂,但每一步都要细心。我建议你按这个顺序来:

  1. 准备工作:确保系统处于安全状态。如果系统发散得很厉害,先手动把比例增益降到很低。
  2. 关闭I和D:将积分时间Ti设为最大值(或9999),微分时间Td设为0。只保留比例控制。
  3. 施加阶跃信号:给系统一个小的设定值变化,比如5%或10%。观察响应曲线。
  4. 增大比例增益:每次增加10%-20%,重复步骤3。直到系统出现等幅震荡。
  5. 记录参数:记录此时的临界增益Ku和临界周期Tu。
  6. 计算PID参数:根据Ziegler-Nichols公式计算。

注意:等幅震荡不是发散!等幅震荡是振幅不变的持续震荡,而发散是振幅越来越大。如果你看到振幅越来越大,说明比例增益已经太大了,赶紧减小。

4.3 Ziegler-Nichols整定公式

好,现在你有了Ku和Tu。接下来就是见证奇迹的时刻——用下面这张表来计算PID参数。

控制器类型 Kp Ti Td
P控制器 0.5 × Ku — —
PI控制器 0.45 × Ku 0.83 × Tu —
PID控制器 0.6 × Ku 0.5 × Tu 0.125 × Tu

我个人习惯用PID控制器,因为效果最好。但要注意,这个公式是经验公式,不是万能公式。我曾经在一个大惯性系统上试过,算出来的参数偏激进,系统超调很大。后来我手动调了一下,把Kp降了10%,效果就好多了。

4.4 代码示例:用Python模拟临界比例度法

光说不练假把式。我们来写一段Python代码,模拟一个二阶系统的临界比例度整定过程。

import numpy as np
import matplotlib.pyplot as plt

# 模拟一个二阶系统:G(s) = 1 / (s^2 + 2*s + 1)
def system_response(Kp, setpoint=1.0, dt=0.01, total_time=10):
    t = np.arange(0, total_time, dt)
    y = np.zeros_like(t)
    e = np.zeros_like(t)
    y_prev = 0
    y_dot = 0
    
    for i in range(1, len(t)):
        e[i] = setpoint - y_prev
        u = Kp * e[i]  # 只有比例控制
        
        # 二阶系统差分方程
        y_ddot = u - 2*y_dot - y_prev
        y_dot += y_ddot * dt
        y_prev += y_dot * dt
        y[i] = y_prev
    
    return t, y

# 寻找临界增益
Ku = None
Tu = None
for Kp in np.arange(0.5, 5.0, 0.1):
    t, y = system_response(Kp)
    # 检测是否等幅震荡(简化版:看最后1/3的振幅是否稳定)
    last_third = y[int(2*len(y)/3):]
    if np.max(last_third) - np.min(last_third) > 0.5:
        Ku = Kp
        # 计算周期(找过零点)
        zero_crossings = np.where(np.diff(np.sign(y - np.mean(y))))[0]
        if len(zero_crossings) >= 4:
            Tu = 2 * (t[zero_crossings[2]] - t[zero_crossings[0]])
        break

print(f"临界增益 Ku = {Ku:.2f}")
print(f"临界周期 Tu = {Tu:.2f} 秒")

# 计算PID参数
Kp_pid = 0.6 * Ku
Ti_pid = 0.5 * Tu
Td_pid = 0.125 * Tu

print(f"PID参数:Kp={Kp_pid:.2f}, Ti={Ti_pid:.2f}, Td={Td_pid:.2f}")

小提示:实际系统中,你不需要写代码来找临界增益。手动调就行。但仿真时用代码可以帮你快速理解原理。

4.5 临界比例度法的适用场景

这个方法不是万能的。我总结了一下它的优缺点:

  • 优点:简单、直观、不需要系统模型。适合大多数工业过程。
  • 缺点:需要系统能安全地进入等幅震荡。有些系统(比如化学反应器)不允许震荡。
  • 适用:温度控制、液位控制、压力控制等慢速系统。
  • 不适用:快速系统(如电机转速)、不允许超调的系统、非线性严重的系统。

我曾经在一个液位控制系统上用过这个方法。那个罐子很大,液位变化很慢。我花了将近两个小时才找到临界点。但找到之后,PID参数一算出来,系统就稳了。嗯,值得。

4.6 知识体系流程图

下面这张图总结了临界比例度法的核心逻辑。你可以把它当作一个快速参考。

临界比例度法知识体系 关闭I和D 只保留P控制 增大比例增益 每次增加10%-20% 等幅震荡? 记录Ku和Tu 是 计算PID参数 使用Z-N公式 继续增大Kp 回到步骤2 核心公式 PID: Kp=0.6Ku, Ti=0.5Tu, Td=0.125Tu 适用于大多数线性、时不变系统

4.7 避坑指南

最后,分享几个我踩过的坑:

  • 不要在生产系统上直接试:我曾经在一个生产线上直接调,结果系统震荡了五分钟,产品全废了。嗯,从那以后我都在仿真或离线系统上先试。
  • 注意噪声:如果系统噪声很大,等幅震荡可能被噪声淹没。我建议先滤波,或者用继电器法(后面会讲)。
  • 临界点不是唯一的:同一个系统,不同工况下临界增益可能不同。我建议取最保守的那个值。
  • 算出来的参数要微调:Z-N公式给出的参数通常偏激进。我一般会把Kp再降10%-20%,让系统更稳健。

一句话总结:临界比例度法就像给系统「把脉」——找到它快要失控的那个点,然后退一步,海阔天空。

好了,这一章就到这里。记住,方法再好,也要结合实际系统灵活运用。下一章我们会讲另一种整定方法——衰减曲线法,适合那些不能承受等幅震荡的系统。

可可精品资料库