732 字
4 分钟
PID 控制算法:从数学原理到 C 语言工程实现
1. PID 控制器的基本原理
PID 控制器是一种闭环反馈控制系统。它通过计算设定值(Setpoint)与实际值(Actual Value)之间的误差(Error),利用比例、积分、微分三个环节的线性组合来计算控制量。
三个环节的物理含义:
- 比例环节 (P - Proportional):反馈系统的“当下”。误差越大,输出越强。它能迅速减小误差,但会导致静差(Steady-state Error)。
- 积分环节 (I - Integral):反馈系统的“过去”。它累积历史误差,只要存在偏差,积分项就会持续增加输出,直到消除静差。
- 微分环节 (D - Derivative):反馈系统的“未来”。它根据误差的变化率进行调节,具有预测功能,能抑制超调,增加系统的稳定性。
2. 位置式 PID 的 C 语言实现
位置式 PID 适用于执行器不带记忆功能的系统(如电加热器)。
2.1 基础版本
typedef struct { float Kp, Ki, Kd; float prev_error; float integral;} PID;
float PID_Compute(PID *pid, float setpoint, float actual) { float error = setpoint - actual; pid->integral += error; float derivative = error - pid->prev_error;
float output = (pid->Kp * error) + (pid->Ki * pid->integral) + (pid->Kd * derivative);
pid->prev_error = error; return output;}2.2 进阶:抗饱和(Anti-Windup)
在工程中,执行器(如电机电压、阀门开度)是有物理极限的。如果积分项持续增加超出极限,会产生积分饱和,导致系统在回归平衡点时出现严重的超调。
// 在计算积分时增加限幅pid->integral += error;if (pid->integral > INTEGRAL_MAX) pid->integral = INTEGRAL_MAX;if (pid->integral < INTEGRAL_MIN) pid->integral = INTEGRAL_MIN;3. 增量式 PID 控制器
增量式 PID 计算的是控制量的改变量()。它适用于步进电机控制或带寄存器记忆的执行器。
优点: * 逻辑简单,不需累加积分,不容易产生积分饱和。
- 切换手动/自动模式时冲击较小。
增量式 C 语言实现
typedef struct { float Kp, Ki, Kd; float error_n; // 当前误差 e(n) float error_n1; // 上一次误差 e(n-1) float error_n2; // 上上一次误差 e(n-2)} PID_Inc;
float PID_Inc_Compute(PID_Inc *pid, float setpoint, float actual) { pid->error_n = setpoint - actual;
// 增量公式:Δu = Kp*(e[n]-e[n-1]) + Ki*e[n] + Kd*(e[n]-2*e[n-1]+e[n-2]) float delta_output = pid->Kp * (pid->error_n - pid->error_n1) + pid->Ki * pid->error_n + pid->Kd * (pid->error_n - 2 * pid->error_n1 + pid->error_n2);
// 更新误差历史 pid->error_n2 = pid->error_n1; pid->error_n1 = pid->error_n;
return delta_output;}4. 总结:如何选择?
| 算法类型 | 适用场景 | 关键特点 |
|---|---|---|
| 位置式 PID | 温度控制、液位控制 | 输出直接对应执行器开度,需处理积分饱和。 |
| 增量式 PID | 步进电机、阀门位置 | 输出对应步数或位移增量,安全性高,抗干扰好。 |
专家提示:
在实际调试硬件时,建议遵循 P → I → D 的顺序:
- 先调节 P 直到产生等幅振荡。
- 加入 I 消除静差,观察稳定时间。
- 最后加入 D 抑制超调,提高响应速度。
PID 控制算法:从数学原理到 C 语言工程实现
https://hw.rscclub.website/posts/pidjbsfsx/