1、PID算法之积分分离
int index;//标志位,在index = 1时执行积分的稳态误差积累
//积分分离,设置误差阈值
//当误差较大时,放弃积分项的运算,当误差较小,计算积分误差积累
if(abs(pid->err)>200)
{
index = 0;
}
else
{
index = 1;
pid->integral = pid->integral + pid->err; // 积分误差积累
}
2、抗积分饱和:
积分饱和是指当系统存在持续的偏差时,积分项不断累积,可能导致控制器输出超出执行机构的最大或最小限制,从而引起系统超调和不稳定。
抗积分饱和的作用:
- 防止超调:通过限制积分项的累积,减少系统因积分作用引起的超调现象。
- 加快响应:避免积分项的无限增长,使系统能够更快地响应设定值的变化。
- 提高稳定性:减少因积分饱和导致的振荡现象,提高系统的稳定性。
实现方法:
- 积分分离:如上,设置阈值,当系统偏差较大时,暂时取消积分作用,以避免超调和振荡。
- 积分限制:设定积分项的上限和下限,防止积分项的过度累积。
- 反计算抗饱和:当输出信号达到饱和限制时,通过反馈机制减少积分项的累积。
// 积分饱和处理(反计算抗饱和)
void PID_IntegralWindup(PID *pid)
{
//将两个参数在结构体中提前定义好:
//double output_limit_min; // 输出限制最小值
//double output_limit_max; // 输出限制最大值
if (pid->output >= pid->output_limit_max) //当输出达到积分保护最大值时
{
if (pid->err > 0)
{
pid->integral += pid->err;//积分误差累计正偏差
}
}
else if (pid->output <= pid->output_limit_min)//当输出小于积分保护最小值时
{
if (pid->err < 0)
{
pid->integral += pid->err;//积分误差累计正偏差
}
}
else //此时输出值在设置的最大和最小值区间内
{
pid->integral += pid->err;//正常计算积分误差
}
}