4、Ziegler-Nichols整定:Z-N第一法(阶跃响应法)、Z-N第二法(临界比例法)、参数计算表

聊到PI参数整定,Ziegler-Nichols法是个绕不开的话题。说实话,这方法虽然年头不短了,但在工程现场依然很能打。我最早接触它是在一个直流无刷电机的项目上,当时被参数调得焦头烂额,老工程师甩给我一张表说「照着算」。嗯,结果还真管用。

Z-N法分两种:第一法靠阶跃响应,第二法靠临界振荡。咱们一个一个说。

4.1 Z-N第一法:阶跃响应法

这个方法也叫「开环阶跃响应法」。说白了,就是先把系统开环,给一个阶跃信号,然后看输出曲线长什么样。

具体怎么做?

  1. 断开反馈,让电机开环运行。
  2. 给一个固定的占空比阶跃(比如从0%跳到10%)。
  3. 记录转速或电流的响应曲线。

你会得到一条典型的S形曲线。从曲线上提取两个关键参数:

  • 滞后时间 L:从阶跃开始到曲线开始明显上升的时间。
  • 时间常数 T:曲线从开始上升到最终值的63.2%所需的时间。

关键点:L和T的提取精度直接影响整定结果。我建议用示波器或高精度数据采集,别靠肉眼估。

拿到L和T后,查Z-N参数计算表就能算出Kp和Ki。我待会儿统一给表。

我的经验:有一次我在一个风机项目上用这个方法,结果L值特别小,差点以为是系统响应太快。后来发现是采样率不够,把延迟给吞了。所以采样频率至少要比系统带宽高10倍。

4.2 Z-N第二法:临界比例法

这个方法更常用,尤其是在现场调试的时候。它不需要开环,直接在闭环里调。

步骤很简单:

  1. 先把积分项关掉(Ki=0),微分项也关掉(Kd=0)。
  2. 慢慢增大比例增益Kp,直到系统开始等幅振荡。
  3. 记录此时的Kp值,记为临界增益 Ku
  4. 记录振荡周期,记为临界周期 Tu

注意:等幅振荡意味着系统处于临界稳定状态。千万别让振荡幅度太大,否则可能烧电机或损坏机械。我见过有人把Kp拧到最大,结果电机直接啸叫,电流飙到保护值。嗯,那场面挺吓人的。

拿到Ku和Tu后,同样查表计算。

4.3 参数计算表

这是Z-N法的核心。两张表,一张对应第一法,一张对应第二法。我直接给你整理好。

表1:Z-N第一法(阶跃响应法)参数计算

控制器类型 Kp Ki Kd
P控制器 T / L
PI控制器 0.9 × (T / L) Kp / (3.33 × L)
PID控制器 1.2 × (T / L) Kp / (2 × L) Kp × (0.5 × L)

表2:Z-N第二法(临界比例法)参数计算

控制器类型 Kp Ki Kd
P控制器 0.5 × Ku
PI控制器 0.45 × Ku Kp / (0.833 × Tu)
PID控制器 0.6 × Ku Kp / (0.5 × Tu) Kp × (0.125 × Tu)

注意:表中Ki的单位是「每秒积分次数」,也就是积分时间常数的倒数。有些资料直接给积分时间常数Ti,换算关系是Ki = Kp / Ti。别搞混了。

4.4 实际应用中的坑

Z-N法虽然经典,但也不是万能药。我踩过几个坑,跟你分享一下。

  • 第一法对噪声敏感:阶跃响应曲线如果噪声大,L和T根本读不准。我建议先做低通滤波,或者用多次平均。
  • 第二法可能找不到振荡:有些系统刚性太强,或者摩擦力太大,怎么调Kp都不振荡。这时候可以适当加一点积分项再试,或者改用其他方法。
  • 算出来的参数需要微调:Z-N法给出的参数通常偏激进,系统容易超调。我个人的习惯是算出来后,把Kp乘以0.7,Ki乘以0.8,先跑一轮看看。

避坑指南:我曾经在一个伺服电机项目上直接用Z-N第二法算出来的参数,结果系统振荡了半小时才稳定。后来发现是负载惯量太大,临界周期Tu测短了。解决办法是让系统带实际负载跑,别空载测。

4.5 代码示例:自动提取L和T

如果你用单片机或上位机做自动整定,可以写个简单的算法来提取L和T。下面是一个伪代码示例:

// 伪代码:从阶跃响应数据中提取L和T
float extract_L_T(float* data, int len, float step_time) {
    // 1. 找到响应开始上升的点
    float threshold = 0.05 * (data[len-1] - data[0]);
    int start_idx = 0;
    for (int i = 1; i < len; i++) {
        if (data[i] - data[0] > threshold) {
            start_idx = i;
            break;
        }
    }
    float L = (start_idx * sample_time) - step_time;

    // 2. 找到63.2%的点
    float final_val = data[len-1];
    float target = data[0] + 0.632 * (final_val - data[0]);
    int target_idx = 0;
    for (int i = start_idx; i < len; i++) {
        if (data[i] >= target) {
            target_idx = i;
            break;
        }
    }
    float T = (target_idx * sample_time) - (start_idx * sample_time);

    return L, T;
}

注意:这个算法对噪声很敏感。实际使用时,建议先对数据做滑动平均滤波,或者用最小二乘法拟合S曲线。否则提取出来的L和T可能偏差很大。

好了,Z-N法的核心内容就这些。下一章咱们聊聊更高级的自整定方法,比如基于继电反馈的整定。那个方法比Z-N法更鲁棒,尤其适合现场调试。