第1章:PID控制器离散化——从连续域到离散域的转换
各位工程师朋友,今天咱们来聊聊PID控制器的离散化。说实话,我刚入行那会儿,总觉得连续域和离散域差别不大,不就是把积分换成累加、微分换成差分嘛。直到有一次在移动机器人上跑连续PID,电机抖得像筛糠一样……嗯,从那以后我才真正重视起离散化这件事。
1.1 为什么需要离散化?
你想想看,我们学PID时接触的都是连续形式:
u(t) = Kp * e(t) + Ki * ∫e(t)dt + Kd * de(t)/dt
但现实中的控制器是啥?是单片机、DSP、FPGA。这些东西只能处理离散的采样点,没法处理连续的微分和积分。说白了,计算机的世界是离散的,物理世界才是连续的。
我做过一个项目,用STM32控制差速驱动底盘。如果直接把连续PID公式套进去,采样周期一长,系统就振荡。后来我意识到:离散化不是简单的近似,而是重新理解控制器的本质。
1.2 离散化的核心方法
离散化说白了就两件事:积分怎么算?微分怎么算?
1.2.1 积分项的离散化
连续积分是求曲线下的面积。离散后,我们用累加来近似。最常用的是矩形法:
∫e(t)dt ≈ Σ e(k) * Ts
其中Ts是采样周期。我习惯用后向矩形法,因为实现简单,而且不会引入超前项。
1.2.2 微分项的离散化
连续微分是求斜率。离散后,我们用差分来近似:
de(t)/dt ≈ [e(k) - e(k-1)] / Ts
这里有个坑——微分项对噪声极其敏感。我曾经在AGV小车上试过,传感器噪声稍微大一点,微分项就疯狂跳动,电机跟着嗡嗡响。后来我加了低通滤波才压住。
1.3 位置式PID与增量式PID
离散化后,PID公式就分成了两大流派:位置式和增量式。这两者有什么区别?我直接上代码对比。
1.3.1 位置式PID
位置式PID直接计算控制量的绝对值:
u(k) = Kp * e(k) + Ki * Σe(i)*Ts + Kd * [e(k)-e(k-1)]/Ts
代码实现:
float pid_positional(float setpoint, float measurement) {
float error = setpoint - measurement;
integral += error * Ts;
float derivative = (error - prev_error) / Ts;
float output = Kp * error + Ki * integral + Kd * derivative;
prev_error = error;
return output;
}
优点:直观,容易理解。
缺点:积分项会累积误差。如果长时间饱和,积分项会变得很大,导致超调严重。这就是所谓的积分饱和问题。
1.3.2 增量式PID
增量式PID计算的是控制量的变化量:
Δu(k) = Kp * [e(k)-e(k-1)] + Ki * e(k)*Ts + Kd * [e(k)-2e(k-1)+e(k-2)]/Ts
代码实现:
float pid_incremental(float setpoint, float measurement) {
float error = setpoint - measurement;
float delta_u = Kp * (error - prev_error)
+ Ki * error * Ts
+ Kd * (error - 2*prev_error + prev_prev_error) / Ts;
prev_prev_error = prev_error;
prev_error = error;
output += delta_u; // 累加得到实际输出
return output;
}
优点:没有积分累积问题,抗积分饱和能力强。切换手动/自动模式时冲击小。
缺点:需要保存两个历史误差值,内存占用稍大。
1.4 两种PID的对比
| 对比项 | 位置式PID | 增量式PID |
|---|---|---|
| 输出形式 | 控制量绝对值 | 控制量变化量 |
| 积分处理 | 需单独限幅 | 天然抗饱和 |
| 历史数据 | 需保存1个误差 | 需保存2个误差 |
| 切换冲击 | 较大 | 较小 |
| 适用场景 | 稳态控制 | 动态控制 |
1.5 离散化中的关键参数:采样周期Ts
采样周期Ts的选择,直接决定了离散化效果。我总结了几条经验:
- Ts不能太大:否则离散化误差大,系统容易失稳。一般建议Ts ≤ 系统时间常数的1/10。
- Ts不能太小:否则微分项噪声放大严重,计算负担也重。
- 经验值:对于差速驱动底盘,我通常取Ts = 10ms~20ms。太快了没必要,太慢了控制跟不上。
1.6 本章知识体系
下面这张图总结了离散化PID的核心逻辑:
1.7 避坑指南
最后,分享几个我踩过的坑:
- 积分限幅不能忘:位置式PID的积分项一定要限幅。我曾经没限幅,结果积分项累积到1000多,电机直接飞车。
- 微分项要滤波:直接差分得到的微分项噪声很大。我习惯加一阶低通滤波,截止频率取采样频率的1/10。
- Ts要固定:采样周期必须严格固定。如果Ts抖动,PID参数就白调了。我一般用定时器中断来保证固定采样。
- 初始化要小心:增量式PID启动时,历史误差要清零。否则第一次计算会跳变。
公众号:蓝海资料掘金营,微信deep3321