增量式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]