4、Ziegler-Nichols整定:Z-N第一法(阶跃响应法)、Z-N第二法(临界比例法)、参数计算表
聊到PI参数整定,Ziegler-Nichols法是个绕不开的话题。说实话,这方法虽然年头不短了,但在工程现场依然很能打。我最早接触它是在一个直流无刷电机的项目上,当时被参数调得焦头烂额,老工程师甩给我一张表说「照着算」。嗯,结果还真管用。
Z-N法分两种:第一法靠阶跃响应,第二法靠临界振荡。咱们一个一个说。
4.1 Z-N第一法:阶跃响应法
这个方法也叫「开环阶跃响应法」。说白了,就是先把系统开环,给一个阶跃信号,然后看输出曲线长什么样。
具体怎么做?
- 断开反馈,让电机开环运行。
- 给一个固定的占空比阶跃(比如从0%跳到10%)。
- 记录转速或电流的响应曲线。
你会得到一条典型的S形曲线。从曲线上提取两个关键参数:
- 滞后时间 L:从阶跃开始到曲线开始明显上升的时间。
- 时间常数 T:曲线从开始上升到最终值的63.2%所需的时间。
关键点:L和T的提取精度直接影响整定结果。我建议用示波器或高精度数据采集,别靠肉眼估。
拿到L和T后,查Z-N参数计算表就能算出Kp和Ki。我待会儿统一给表。
我的经验:有一次我在一个风机项目上用这个方法,结果L值特别小,差点以为是系统响应太快。后来发现是采样率不够,把延迟给吞了。所以采样频率至少要比系统带宽高10倍。
4.2 Z-N第二法:临界比例法
这个方法更常用,尤其是在现场调试的时候。它不需要开环,直接在闭环里调。
步骤很简单:
- 先把积分项关掉(Ki=0),微分项也关掉(Kd=0)。
- 慢慢增大比例增益Kp,直到系统开始等幅振荡。
- 记录此时的Kp值,记为临界增益 Ku。
- 记录振荡周期,记为临界周期 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法更鲁棒,尤其适合现场调试。