嵌入式常用滤波算法与控制算法(10)PID 参数整定
·
第 10 篇:PID 参数整定——从震荡到稳定,手把手调参
PID 代码很简单,但 Kp、Ki、Kd 怎么选?这篇讲三套整定方法,从理论到实操。
1. 齐格勒-尼科尔斯法(Z-N 震荡法)
最经典的方法,不需要系统模型,直接在线操作。
步骤:
1. Ki=0, Kd=0(纯 P 控制)
2. 逐步增大 Kp,直到系统出现"等幅震荡"
3. 记下此时的 Kp(记作 Ku)和震荡周期 Tu
输出 ↑
│ /\ /\ /\ /\
│ / \/ \/ \/ \ ← 等幅震荡
│/
└─────────────────→ 时间
←── Tu ──→
4. 根据下表设置参数:
| 控制器 | Kp | Ki (Ti) | Kd (Td) |
|---|---|---|---|
| P | 0.5 Ku | - | - |
| PI | 0.45 Ku | 0.54 Ku / Tu | - |
| PID | 0.6 Ku | 1.2 Ku / Tu | 0.075 Ku × Tu |
实例——电机调速:
1. KP=0.1 → 响应慢,不震荡
2. KP=0.5 → 有点过冲,但马上稳定
3. KP=1.0 → 等幅震荡!Ku=1.0, Tu≈0.2s
查表得 PID 参数:
Kp = 0.6 × 1.0 = 0.6
Ki = 1.2 × 1.0 / 0.2 = 6.0
Kd = 0.075 × 1.0 × 0.2 = 0.015
2. 口诀整定法(经验法)
如果 Z-N 法太麻烦,用"口诀法"更快:
参数 增大时的效果 参数减小时的効果
────────────────────────────────────────
Kp ↑ 响应快、超调大 响应慢、超调小
Ki ↑ 消除稳态误差快 稳态误差消除慢
但容易震荡 但稳定
Kd ↑ 抑制超调 响应变慢
但对噪声敏感
整定顺序:先 P、后 I、再 D
Step 1:Ki=0, Kd=0 → 调 Kp 到"有点过冲但能稳定"
Step 2:加入 Ki → 调到"稳态误差消失但不过冲"
Step 3:加入 Kd → 调到"过冲消失、响应快"
Step 4:微调 → 3 个参数都微调,来回迭代
3. 不同系统的 PID 特征
| 系统类型 | Kp | Ki | Kd | 说明 |
|---|---|---|---|---|
| 温度(大滞后) | 中 | 大 | 小/0 | I 要强才能消除稳态误差,D 容易放大噪声 |
| 电机速度 | 大 | 中 | 中 | 响应要快,I 别太大 |
| 电机位置 | 大 | 小 | 大 | D 要强来抑制位置超调 |
| 液位控制 | 小 | 大 | 0 | 液位是积分型系统,P 不能大 |
| 流量控制 | 中 | 中 | 0 | 响应快,噪声大不宜用 D |
4. 用 VOFA+ 串口虚拟示波器调 PID
眼睛看着数据调比盲调效率高 10 倍。VOFA+ 是一个免费的串口示波器软件。
步骤:
// 在单片机里,把以下数据通过串口发出
printf("target:%.2f, actual:%.2f, output:%.2f\r\n",
pid.setpoint, measurement, output);
1. 打开 VOFA+,选"JustFloat"协议
2. 串口波特率 115200,连接
3. 拖动波形窗口,看三条曲线:
- 绿线:设定值
- 红线:实际值
- 蓝线:PID 输出
4. 边调参数边观察波形变化
看波形判断问题:
设定值阶跃 0→1000:
过冲大、震荡多 → Kp 太大或 Kd 太小
设定 ━━━━━━━━━
实际 ∕‾‾\___/‾‾\ ← 震荡!
稳态有偏差 → Ki 太小
设定 ━━━━━━━━━
实际 ─────── ← 一直差 50
响应太慢 → Kp 太小
设定 ━━━━━━━━━
实际 ____/‾‾‾ ← 慢慢爬
5. 实战:电机速度环 PID 整定
pid_t speed_pid;
void speed_control_init(void) {
pid_init(&speed_pid, 0.5f, 2.0f, 0.01f, 0.0f, 1.0f);
speed_pid.setpoint = 1000.0f; // 目标 1000rpm
}
void speed_control_loop(void) {
float speed = encoder_read_speed_rpm(); // 当前转速
float duty = pid_update(&speed_pid, speed, 0.001f); // dt=1ms
pwm_set_duty(duty); // 输出 PWM
delay_ms(1);
}
整定过程记录(真实数据):
Z-N 法得到初始值:Kp=0.6, Ki=6.0, Kd=0.015
结果:超调 30%,震荡 3 个周期
第 1 轮:Kp→0.4(减小超调)
结果:超调 10%,震荡 1 个周期,好多了
第 2 轮:Kd→0.03(增大阻尼)
结果:几乎无超调,稳!
第 3 轮:Ki→4.0(稍减,防止低频震荡)
结果:稳态误差 ±3rpm,满意。
最终参数:Kp=0.4, Ki=4.0, Kd=0.03
6. 一句话总结
P 决定"力度",I 决定"精度",D 决定"稳度"。先 P 后 I 再 D,眼睛盯着波形调。
下一篇:前馈控制——不等误差产生就提前出手,PID 的最佳拍档
更多推荐



所有评论(0)