[嵌入式C编程与固件开发] 增量式PID控制算法

[复制链接]
发表于 2025-8-9 22:25 | 显示全部楼层 |阅读模式
增量式PID算法的输出是控制量的变化量Δu(k),而不是控制量的绝对值u(k)。其计算公式由位置式PID推导而来:Δu(k) = Kp*[e(k)-e(k-1)] + Ki*e(k) + Kd*[e(k)-2e(k-1)+e(k-2)]

其中:
  • e(k) = 设定值 - 当前值(当前误差)
  • e(k-1) = 上一次误差
  • e(k-2) = 上上次误差
  • Kp = 比例系数
  • Ki = Kp*(T/Ti) = 积分系数(T为采样周期,Ti为积分时间常数)
  • Kd = Kp*(Td/T) = 微分系数(Td为微分时间常数)

算法实现步骤如下
1保存当前误差e(k)和前两次误差e(k-1)、e(k-2)
2计算控制增量:Δu(k) = Kp*(e(k)-e(k-1)) + Ki*e(k) + Kd*(e(k)-2e(k-1)+e(k-2))
3计算实际控制量:u(k) = u(k-1) + Δu(k)
4保存当前误差用于下一次计算:e(k-2) = e(k-1)                 e(k-1) = e(k)
增量式PID的优点还是很多的
无积分饱和问题:由于输出是增量,不会产生严重的积分饱和现象
手动/自动切换无冲击:当控制器从手动切换到自动时,可以做到无扰动切换
增量输出适合执行机构:许多执行机构(如步进电机)本身就需要增量式控制信号
算法安全性高:计算机故障时输出增量为零,不会对系统造成大的影响
增量式PID的缺点也有不少
积分截断效应大:积分作用只有在有误差时才会产生,可能导致静态误差
控制精度略低:相比位置式PID,控制精度稍低

c代码示例如下
typedef struct {
    float Kp, Ki, Kd;    // PID系数
    float e[3];          // 误差队列,e[0]=e(k), e[1]=e(k-1), e[2]=e(k-2)
    float u;             // 控制量输出
} IncrementalPID;

float IncrementalPID_Calculate(IncrementalPID* pid, float setpoint, float feedback)
{
    // 计算当前误差
    pid->e[0] = setpoint - feedback;

    // 计算控制增量
    float delta_u = pid->Kp * (pid->e[0] - pid->e[1])
                  + pid->Ki * pid->e[0]
                  + pid->Kd * (pid->e[0] - 2*pid->e[1] + pid->e[2]);

    // 计算控制量
    pid->u += delta_u;

    // 更新误差队列
    pid->e[2] = pid->e[1];
    pid->e[1] = pid->e[0];

    return pid->u;
}
参数整定是一个比较麻烦的过程,常用以下方法
试凑法:先调Kp,再调Ti,最后调Td
Ziegler-Nichols法:基于系统的临界增益和临界周期
经验法:根据被控对象特性选择初始参数
增量式PID广泛应用于电机控制、温度控制、流量控制等工业控制领域。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

101

帖子

0

粉丝
快速回复 返回顶部 返回列表