增量式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)]
其中: 算法实现步骤如下
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广泛应用于电机控制、温度控制、流量控制等工业控制领域。
|