2. PID控制基础:从原理到实战
各位工程师朋友,今天我们来聊聊PID控制的基础。说实话,PID这东西,我刚开始做电机控制时觉得挺简单的——不就是比例、积分、微分三个参数嘛。但真正上手调参时,才发现坑不少。这一章,我就把这些年踩过的坑和总结的经验,掰开了揉碎了讲给你听。
2.1 PID控制器原理:三兄弟的分工
PID控制器,说白了就是三个环节的配合:
- 比例(P):看现在,误差有多大就纠正多少
- 积分(I):看过去,累计误差慢慢消除
- 微分(D):看未来,预测误差变化趋势
公式很简单:
u(t) = Kp * e(t) + Ki * ∫e(t)dt + Kd * de(t)/dt
我在项目中遇到过不少新手,一上来就调三个参数,结果越调越乱。我的建议是:先只调P,让系统动起来再说。
我的经验: 调PID就像开车。P是油门大小,I是方向盘微调,D是预判刹车。你想想看,新手司机能同时控制好这三样吗?先学会踩油门再说。
2.2 位置式PID vs 增量式PID
这两种实现方式,我当年也纠结过。简单说:
| 特性 | 位置式PID | 增量式PID |
|---|---|---|
| 输出含义 | 直接输出控制量 | 输出控制量的增量 |
| 积分项 | 有积分饱和风险 | 天然抗积分饱和 |
| 执行器要求 | 支持绝对位置 | 支持增量累加 |
| 代码实现 | 需要存储所有误差 | 只需最近三次误差 |
我个人习惯在FOC控制中用增量式PID。为什么?因为电机控制中,我们经常需要限幅,增量式天然不会累积过大。我曾经在一个项目中用了位置式,结果积分项飙到天上去了,电机直接抖成筛子。
增量式PID的代码实现:
// 增量式PID
float pid_incremental(float target, float current) {
static float e_prev = 0, e_prev2 = 0;
float e = target - current;
float delta_u = Kp*(e - e_prev) + Ki*e + Kd*(e - 2*e_prev + e_prev2);
e_prev2 = e_prev;
e_prev = e;
return delta_u; // 外部累加
}
注意: 增量式PID的输出是增量,外部需要做累加。而且每次上电时,累加值要从0开始,否则电机可能会猛冲一下。
2.3 积分饱和:那个让我熬夜的坑
积分饱和,说白了就是积分项积得太多了,导致系统反应迟钝。为什么会这样?
举个例子:电机启动时,目标转速1000rpm,实际转速0。误差很大,积分项疯狂累积。等转速到了1000,积分项已经积了一大堆,还在继续输出,结果转速冲过了头。
我遇到过最惨的一次:一个伺服项目,积分饱和导致电机过冲了30%,直接把负载撞坏了。从那以后,我对积分饱和特别敏感。
2.4 抗积分饱和:三种实用方法
这里我分享三种我常用的方法:
- 积分限幅法:给积分项设个上限,比如最大输出的20%
- 积分分离法:误差大时停止积分,误差小时再开启
- 反馈抑制法:输出饱和时,把积分项往回拉
我个人最常用的是积分分离法,代码简单,效果明显:
// 积分分离PID
float pid_integral_separate(float target, float current) {
float e = target - current;
float p_out = Kp * e;
// 误差大于阈值时,不积分
if (fabs(e) < INTEGRAL_THRESHOLD) {
integral += Ki * e;
// 积分限幅
if (integral > INTEGRAL_MAX) integral = INTEGRAL_MAX;
if (integral < -INTEGRAL_MAX) integral = -INTEGRAL_MAX;
}
float d_out = Kd * (e - e_prev);
e_prev = e;
return p_out + integral + d_out;
}
关键点: 积分分离的阈值怎么设?我一般取目标值的5%-10%。太大起不到作用,太小又容易频繁切换。
2.5 PID参数对系统的影响:调参的直觉
调参这事,光看理论没用,得靠感觉。我总结了一个口诀:
- Kp太大:系统震荡,甚至发散。就像你开车猛打方向盘
- Kp太小:响应慢,像老牛拉车
- Ki太大:超调严重,积分项收不住
- Ki太小:稳态误差消不掉,永远差那么一点
- Kd太大:系统对噪声敏感,电机嗡嗡响
- Kd太小:抑制超调效果不明显
- 先调电流环:Kp从0开始慢慢加,直到电流响应不震荡
- 再调速度环:同样先Kp,再加一点Ki消除静差
- 最后调位置环:位置环的Kp要小一些,否则容易过冲
嗯,这里要注意:微分项在FOC控制中其实用得不多。为什么?因为电机本身有惯性,微分容易放大噪声。我一般只在位置环用微分,速度环和电流环基本不用。
避坑指南: 我曾经在电流环加了微分,结果电流波形全是毛刺。后来查了半天,发现是电流采样噪声被微分放大了。去掉微分后,波形立马干净了。
2.6 实战中的调参顺序
我的调参顺序是这样的:
你想想看,电流环是内环,速度环是外环,位置环是最外层。内环不稳,外环调得再好也没用。这个顺序我用了十年,从来没出过问题。
好了,这一章的内容就到这里。下一章我们聊聊具体的整定方法和工具,到时候我会分享一些我常用的调试技巧。