第 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 的最佳拍档

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐