966 字
5 分钟
PID控制算法的改进与实现:提高鲁棒性与适应性

1. 传统PID的局限性#

传统 PID 控制器(Proportional-Integral-Derivative)凭借结构简单、鲁棒性好在工业中占据统治地位。但在工程实践中,开发者常遇到以下挑战:

  • 执行器饱和:电机电压或阀门开度有极限,导致积分项盲目累积。
  • 参数时变:系统负载或环境(如温度、风力)变化,导致预设参数失效。
  • 测量噪声:微分项 对高频噪声极度敏感,容易导致输出剧烈震荡。

2. 抗饱和 PID 控制(Anti-Windup)#

核心痛点: 当偏差长时间存在(如电机被卡死),积分项会累积到极大值。即使偏差消失,系统也需要很长时间才能退饱和,导致严重的超调。

改进方案: 引入积分限幅或反计算(Back-calculation)。

C语言工程实现#

typedef struct {
float Kp, Ki, Kd;
float integral;
float prev_error;
float out_max, out_min; // 输出限幅
float i_max; // 积分限幅(关键)
} AntiWindupPID;
float AntiWindupPID_Compute(AntiWindupPID *pid, float setpoint, float actual) {
float error = setpoint - actual;
// 1. 比例项
float p_out = pid->Kp * error;
// 2. 积分项:带抗饱和逻辑
pid->integral += error;
if (pid->integral > pid->i_max) pid->integral = pid->i_max;
else if (pid->integral < -pid->i_max) pid->integral = -pid->i_max;
float i_out = pid->Ki * pid->integral;
// 3. 微分项
float d_out = pid->Kd * (error - pid->prev_error);
pid->prev_error = error;
float output = p_out + i_out + d_out;
// 4. 输出限幅
if (output > pid->out_max) return pid->out_max;
if (output < pid->out_min) return pid->out_min;
return output;
}

3. 滑模 PID 控制(Sliding Mode PID)#

核心痛点: 传统 PID 对模型参数变化(如由于磨损导致的摩擦力改变)抵抗力弱。

核心原理: 定义一个滑模面 ,通常由偏差 和偏差变化率 线性组合而成。通过非线性控制律强迫系统状态向该平面靠拢。

C语言代码实现#

typedef struct {
float Kp, Ki, Kd;
float lambda; // 滑模增益
float prev_error;
} SMPID;
float SMPID_Compute(SMPID *pid, float setpoint, float actual) {
float e = setpoint - actual;
float de = e - pid->prev_error;
// 计算滑模切换面 s = de + lambda * e
float s = de + pid->lambda * e;
// 基础PID输出 + 滑模切换控制(这里使用简单的符号函数扩展)
float u_pid = pid->Kp * e + pid->Kd * de;
float u_smc = pid->Ki * (s > 0 ? 1.0f : -1.0f); // 切换项减少静态误差
pid->prev_error = e;
return u_pid + u_smc;
}

4. 鲁棒 PID 控制(Robust PID)#

核心原理: 针对噪声和外部随机扰动,在 PID 输出中加入不确定性补偿补偿。其思路是假设扰动是有界的,通过增加额外的阻尼项来抵消扰动。

核心实现逻辑#

鲁棒 PID 往往通过动态调整 增益来应对误差范围。当误差较大时,增大比例作用快速收敛;误差小时,减小作用防止震荡。

float RobustPID_Compute(RobustPID *pid, float setpoint, float actual) {
float error = setpoint - actual;
// 动态调整因子:误差越大,自适应调整项越强
float adjustment = pid->uncertainty_factor * (error * error);
float output = (pid->Kp + adjustment) * error + ... // 结合积分与微分
return output;
}

5. 算法选择建议#

算法类型适用场景优势劣势
抗饱和 PID阀门、电机控制、电源限流物理执行器安全保护参数增加,需额外整定积分阈值
滑模 PID强干扰环境、不确定机械系统极强的抗干扰能力容易产生震荡(抖振)
遗传算法优化离线参数整定、复杂多变量系统自动化整定,无需人工经验计算量巨大,不适合嵌入式在线运行

6. 总结与展望#

在实际工程中,建议遵循“先基础、后改进”的原则。对于大多数硬件项目,抗饱和 PID + 微分低通滤波(针对噪声)即可满足 90% 的需求。只有在高性能航模或精密机床上,才需要考虑滑模或鲁棒控制。

PID控制算法的改进与实现:提高鲁棒性与适应性
https://hw.rscclub.website/posts/pidgjsfss/
作者
杨月昌
发布于
2018-08-23
许可协议
CC BY-NC-SA 4.0