4、PID参数整定方法:Ziegler-Nichols法、临界比例度法、衰减曲线法,手动试凑技巧
调参这件事,说难也难,说简单也简单。我刚入行那会儿,调一个位置环能调一整天,最后发现是积分限幅设得太小了。后来慢慢摸出些门道,发现其实有套路可循。
今天聊的这几种方法,都是经过实战检验的。你不需要全记住,但得知道每种方法适合什么场景。
4.1 Ziegler-Nichols法:最经典的起手式
Ziegler-Nichols法,简称Z-N法。这是1942年提出的老方法,但到现在还在用。为什么?因为它简单、有效。
操作步骤:
- 先把积分系数Ki和微分系数Kd设成0,只保留比例项Kp。
- 慢慢增大Kp,直到系统输出出现等幅振荡。
- 记录此时的临界增益Ku和振荡周期Tu。
- 按表格查参数。
| 控制器类型 | Kp | Ki | Kd |
|---|---|---|---|
| P | 0.5 × Ku | — | — |
| PI | 0.45 × Ku | 1.2 × Kp / Tu | — |
| PID | 0.6 × Ku | 2 × Kp / Tu | Kp × Tu / 8 |
我的经验:Z-N法给出的参数通常偏激进。我在做四轮差速底盘时,用Z-N法算出来的Kp直接上,结果电机啸叫得厉害。后来我习惯把算出来的Kp再打八折,作为安全起点。
4.2 临界比例度法:工业现场的实用派
临界比例度法,其实就是Z-N法的变种。区别在于它用「比例度」代替了「比例增益」。
比例度δ = 1 / Kp,单位是百分比。比例度越小,比例作用越强。
操作流程:
- 同样先让系统进入等幅振荡,记录临界比例度δu和临界周期Tu。
- 然后按经验公式计算。
| 控制器类型 | 比例度δ | 积分时间Ti | 微分时间Td |
|---|---|---|---|
| P | 2 × δu | — | — |
| PI | 2.2 × δu | 0.85 × Tu | — |
| PID | 1.7 × δu | 0.5 × Tu | 0.125 × Tu |
注意:临界比例度法要求系统能稳定地进入等幅振荡。如果系统本身就不稳定,或者有死区、摩擦等非线性因素,这个方法会失效。我曾经在一个老旧机械臂上试过,死活振荡不起来,后来发现是减速器间隙太大。
4.3 衰减曲线法:更温和的替代方案
有些系统不允许出现等幅振荡,比如医疗设备、精密加工。这时候衰减曲线法就派上用场了。
核心思想:让系统出现4:1衰减振荡。也就是第二个波峰的高度是第一个波峰的1/4。
操作步骤:
- 同样只保留比例环节,增大Kp。
- 观察响应曲线,直到出现4:1衰减比。
- 记录此时的Kp(记为Ks)和振荡周期Ts。
- 查表计算。
| 控制器类型 | Kp | Ti | Td |
|---|---|---|---|
| P | Ks | — | — |
| PI | 0.83 × Ks | 0.5 × Ts | — |
| PID | 1.25 × Ks | 0.3 × Ts | 0.1 × Ts |
什么时候用衰减曲线法?
- 系统不允许长时间振荡
- 被控对象有安全约束
- 你希望得到一个相对保守的参数
4.4 手动试凑技巧:老工程师的看家本领
说实话,公式算出来的参数很少能直接用。我个人的习惯是:先用公式算个大概,然后手动微调。
试凑口诀:
- Kp:先调比例。太小了响应慢,太大了振荡。调到系统「刚有反应但不抖」的程度。
- Ki:消除静差。但别太大,否则积分饱和会让你头疼。我一般从0.01开始往上加。
- Kd:抑制超调。但微分对噪声敏感,尤其是编码器信号有毛刺的时候。
避坑指南:我曾经在一个AGV项目上,微分项加得太多,结果地面有个小坑,轮子瞬间打滑,微分项直接爆了。后来我加了低通滤波,才把问题压下去。
试凑顺序建议:
- 先调P,让系统能跟上指令,允许有静差。
- 再加I,消除静差。注意观察积分项是否饱和。
- 最后加D,抑制超调。如果系统噪声大,D可以不加。
4.5 三种方法的对比与选择
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| Z-N法 | 线性系统、允许振荡 | 公式简单、快速 | 参数偏激进 |
| 临界比例度法 | 工业过程控制 | 与现场仪表习惯一致 | 需要等幅振荡 |
| 衰减曲线法 | 安全要求高的系统 | 振荡幅度可控 | 需要人工判断衰减比 |
你想想看,这三种方法其实都是在找系统的「边界」。Z-N法找的是稳定边界,衰减曲线法找的是性能边界。知道边界在哪,你才能安全地调参。
嗯,这里要注意一点:这些方法都是基于线性系统的假设。如果你的系统有摩擦、间隙、饱和等非线性,公式算出来的参数只能当参考。我个人的习惯是,先用公式算个初值,然后手动试凑,最后再跑一遍阶跃响应验证。
重要提醒:调参时一定要记录每次修改的参数值和对应的响应曲线。别问我为什么强调这个——我曾经调了一下午,最后忘了初始参数是什么,只能重来。