PID 控制器以各种形式使用,广泛应用在机械设备、气动设备 和电子设备.在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法
PID 实指“比例 proportional”、“积分 integral”、“微分 derivative”,这三项构 成 PID 基本要素。每一项完成不同任务,对系统功能产生不同的影响。它的结构简单,参数易 于调整,是控制系统中经常采用的控制算法。其核心思想是通过 误差的实时反馈 ,结合过去误差的积累和未来误差的预测,实现系统的精准控制。
想象在用燃气灶烧一锅水,想让水温保持在80℃,PID控制相当于一个智能厨师:
PID控制公式

其中:
P = Kp × (当前温度误差)I = Ki × ∫(历史误差)dtD = Kd × d(误差)/dt输出 = Kp×误差 + Ki×∫误差·dt + Kd×d(误差)/dt
以烧水为例:
// 带滤波和抗饱和的PID计算
float PID_Compute(PID_Controller *pid, float input, float dt) {
float error = pid->setpoint - input;
// 积分项处理(带限幅防饱和)
pid->integral += error * dt;
pid->integral = fminf(fmaxf(pid->integral, -pid->output_max*2), pid->output_max*2);
// 微分项滤波(一阶低通滤波)
float derivative = (error - pid->prev_error) / dt;
derivative = 0.6 * pid->prev_derivative + 0.4 * derivative; // 滤波系数可调
pid->prev_derivative = derivative;
// PID输出计算
float output = pid->Kp * error
+ pid->Ki * pid->integral
+ pid->Kd * derivative;
// 输出限幅
output = fminf(fmaxf(output, pid->output_min), pid->output_max);
// 抗积分饱和处理
if(output >= pid->output_max || output <= pid->output_min){
pid->integral -= error * dt; // 回退积分
}
pid->prev_error = error;
return output;
}
在之前的代码中为了方便显示温度,我们直接将传感器中读到的参数进行了去尾取证,精度有所损失。
在PID控制时,为了精准的控制温度,我们将原始精度保留。另外PWM部分的精度也可以改用硬件原始数据。
从视频可以看到相比之前的只有P调节的代码,我们已经可以做到温度稳定到设定的目标,并且波动较小。
| 场景 | 传统PID问题 | 改进方案 |
|---|---|---|
| 大滞后系统(如工业锅炉) | 响应延迟导致超调 | Smith预估控制 |
| 非线性系统(如机械臂) | 参数难以整定 | 模糊PID |
| 强干扰环境 | 常规PID波动大 | 加入前馈控制 |
对于电烙铁这种存在热传导延迟的系统,微分项的滤波处理和动态调整积分限幅是保证控制精度的关键。
更多回帖