732 字
4 分钟
PID 控制算法:从数学原理到 C 语言工程实现

1. PID 控制器的基本原理#

PID 控制器是一种闭环反馈控制系统。它通过计算设定值(Setpoint)与实际值(Actual Value)之间的误差(Error),利用比例、积分、微分三个环节的线性组合来计算控制量。

三个环节的物理含义:#

  1. 比例环节 (P - Proportional):反馈系统的“当下”。误差越大,输出越强。它能迅速减小误差,但会导致静差(Steady-state Error)
  2. 积分环节 (I - Integral):反馈系统的“过去”。它累积历史误差,只要存在偏差,积分项就会持续增加输出,直到消除静差。
  3. 微分环节 (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 的顺序:

  1. 先调节 P 直到产生等幅振荡。
  2. 加入 I 消除静差,观察稳定时间。
  3. 最后加入 D 抑制超调,提高响应速度。
PID 控制算法:从数学原理到 C 语言工程实现
https://hw.rscclub.website/posts/pidjbsfsx/
作者
杨月昌
发布于
2018-03-23
许可协议
CC BY-NC-SA 4.0