封存into 发表于 2025-8-9 22:25

增量式PID控制算法

增量式PID算法的输出是控制量的变化量Δu(k),而不是控制量的绝对值u(k)。其计算公式由位置式PID推导而来:Δu(k) = Kp* + Ki*e(k) + Kd*

其中:
[*]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;          // 误差队列,e=e(k), e=e(k-1), e=e(k-2)    float u;             // 控制量输出} IncrementalPID;
float IncrementalPID_Calculate(IncrementalPID* pid, float setpoint, float feedback){    // 计算当前误差    pid->e = setpoint - feedback;
    // 计算控制增量    float delta_u = pid->Kp * (pid->e - pid->e)                   + pid->Ki * pid->e                  + pid->Kd * (pid->e - 2*pid->e + pid->e);
    // 计算控制量    pid->u += delta_u;
    // 更新误差队列    pid->e = pid->e;    pid->e = pid->e;
    return pid->u;}参数整定是一个比较麻烦的过程,常用以下方法试凑法:先调Kp,再调Ti,最后调TdZiegler-Nichols法:基于系统的临界增益和临界周期经验法:根据被控对象特性选择初始参数增量式PID广泛应用于电机控制、温度控制、流量控制等工业控制领域。
页: [1]
查看完整版本: 增量式PID控制算法