本文由 Claude Code 编写。
记录一套可复现的PID调参流程。以三相DC-AC逆变器的电压环为例: 位置式PID, 误差单位是mV, 输出是调制比factor ∈ [0, 0.98], 控制频率≈50Hz(每个基波周期算一次RMS)。
1. 先明确环的前提
参数的量级和调参的难点, 都由这几件事决定:
- 误差单位是
mV, 输出是0~0.98的调制比, 所以增益是很小的数(这里Kp≈1e-4)。它是mV → factor的量纲换算: 几千mV的误差 ×1e-4≈ 零点几的factor, 不需要凑成整数。 - 这是个慢环(Ts≈20ms)。RMS用方差法每个基波周期才更新一次, 反馈带约1个周期的延迟, 再叠加电压卡尔曼滤波的相位滞后。慢环加反馈滞后是过冲和震荡的一部分来源, 单靠PID消不掉。
- 积分项有没有乘
Ts要看实现。这份integral_err += error是纯累加, 没乘采样周期,Ts被吸收进了Ki里, 所以Ki比教科书形式小很多是正常的。
2. 调参步骤
用串口在线改参(这里是USART3发"kp ki kd"), 配合日志打印output看曲线。顺序是Kp、Ki、Kd, 每次只动一个参数, 用倍数试探(×2 / ÷2)而不是小步微调。
- 只留P:
Ki = Kd = 0。从小往大翻倍加Kp, 直到输出出现等幅持续震荡, 记下临界增益Ku和震荡周期Tu(Ziegler-Nichols临界比例法)。 - 回退:
Kp ← 0.5 ~ 0.6 × Ku。此时快速逼近设定值, 但留有稳态误差。 - 加Ki消稳态误差: 从
Kp/20量级起往上加, 直到稳态误差在几个周期内被拉平。Ki过大会导致过冲或慢震荡。 - 需要压过冲、加阻尼再加Kd: 从
Ki附近量级试。Kd提供阻尼, 但会放大反馈噪声, 需配合反馈滤波, 不宜过大。
3. 三类典型问题
| 现象 | 主要原因 | 调整 |
|---|---|---|
| 收敛慢 | Kp偏小, 或Ki偏小(稳态段爬得慢) | 先加Kp; 稳态差消得慢再加Ki。检查反馈滤波是否太重拖慢了环 |
| 过冲(overshoot) | Kp / Ki偏大、阻尼不足; 常见于积分饱和(windup) | 降Ki、加Kd提供阻尼。排查下面的windup |
| 目标点附近震荡 | Kp偏大; Kd放大了采样/RMS噪声; 反馈滞后 | 降Kp、降Kd; 噪声抖动则加重卡尔曼滤波(降r或调q) |
4. 积分饱和(windup)
位置式实现里, 输出在末尾output = MIN/MAX处限幅到[0, 0.98], 但积分项integral_err仍在±max_integral之间持续累加。启动或大幅升压时积分会冲到很大, 回到设定值后要较长时间退饱和, 表现为过冲加回摆。这靠调Kp/Ki/Kd治不好, 需要加抗积分饱和:
- 条件积分: 输出顶到
max/min且误差还在同方向时, 暂停integral_err += error。 - 反算(back-calculation): 用限幅前后的输出差回退积分。
修掉windup后Ki可以适当开大, 过冲反而更小。增量式PID有形式不同的同类问题, 见增量式PID初始输出不为0怎么办。
5. 三个参数的数量级关系
以这套参数为例: Kp=1e-4, Ki=1.2e-5, Kd=5e-5, 大致 Kp : Ki : Kd ≈ 8 : 1 : 4。
- 绝对数量级(
1e-4 ~ 1e-5)由mV → factor的量纲决定, 不必凑整数。 - 相对关系的经验:
Kp最大,Ki和Kd比Kp小一个量级左右。 Ki太靠近Kp容易过冲或慢震荡;Kd太大容易在目标点附近抖。保持Ki、Kd都明显小于Kp。
Note
PID只负责把受控量拉到设定值。如果输出量和受控量本身是非线性关系(如buck-boost的占空比与电压), 调参无法让各工作点表现一致, 那是另一类问题, 见PID输出量与受控量关系非线性怎么办。