PID算法的C语言实现八 变积分的PID优化
在积分分离的章节,我们是用Ki去控制积分环节的偏差,是一个固定的值,但为了更好的稳定系统,我们要求在偏差大的时候,积分系数小,偏差小的时候,积分系数大,这样可以稳定系统,不至于出现超调过大、饱和等情况,而且能时间更短的使系统达到稳定状态!因此,变积分就是根据偏差的大小改变积分的速度!
其思想就是:改变积分的累加速度,使其与偏差大小相对应;偏差越大,积分越慢(可以理解为积分少),偏差越小,积分越快!
程序上我们要做的就是在积分系数上加一个速度比例值index:
当 偏差值>200 index=0;
当 偏差值<180 index=1;
当 200>偏差值>180 index= (200-偏差值)/20
具体代码如下:
struct _pid{
float SetSpeed;
float ActualSpeed;
float Err;
float Err_Last;
float Kp,Ki,Kd;
float Voltage;
float Integral;
}pid;
void PID_Init(void)
{
printf("PID_Init begin! \n");
pid.SetSpeed = 0;
pid.ActualSpeed = 0;
pid.Err = 0;
pid.Err_Last = 0;
pid.Kp = 0.2;
pid.Ki = 0.2; //增大了积分系数
pid.Kd = 0.2;
pid.Voltage = 0;
pid.Integral = 0;
printf("PID_Init end! \n");
}
float PID_Cal(float Speed)
{
unsigned char index;
pid.SetSpeed = Speed;
pid.Err = pid.SetSpeed - pid.ActualSpeed;
if(abs(pid.Err)>200) //变积分处理控制
{
index = 0;
}
else if(abs(pid.Err)<180)
{
index =1;
pid.Integral += pid.Err;
}
else
{
index = (200-abs(pid.Err))/20;
pid.Integral += pid.Err;
}
pid.Voltage = pid.Kp*pid.Err +index*pid.Ki*pid.Integral + pid.Kd*(pid.Err - pid.Err_Last);
pid.Err_Last = pid.Err;
pid.ActualSpeed = pid.Voltage*1.0;
return pid.ActualSpeed;
}
int main(void)
{
int count = 0 ;
printf("SYSTEM BEGIN! \n");
PID_Init();
while(count<1000)
{
float speed = PID_Cal(200.0);
printf("-%d-%f-",count,speed);
count++;
}
return 0;
其思想就是:改变积分的累加速度,使其与偏差大小相对应;偏差越大,积分越慢(可以理解为积分少),偏差越小,积分越快!
程序上我们要做的就是在积分系数上加一个速度比例值index:
当 偏差值>200 index=0;
当 偏差值<180 index=1;
当 200>偏差值>180 index= (200-偏差值)/20
具体代码如下:
struct _pid{
float SetSpeed;
float ActualSpeed;
float Err;
float Err_Last;
float Kp,Ki,Kd;
float Voltage;
float Integral;
}pid;
void PID_Init(void)
{
printf("PID_Init begin! \n");
pid.SetSpeed = 0;
pid.ActualSpeed = 0;
pid.Err = 0;
pid.Err_Last = 0;
pid.Kp = 0.2;
pid.Ki = 0.2; //增大了积分系数
pid.Kd = 0.2;
pid.Voltage = 0;
pid.Integral = 0;
printf("PID_Init end! \n");
}
float PID_Cal(float Speed)
{
unsigned char index;
pid.SetSpeed = Speed;
pid.Err = pid.SetSpeed - pid.ActualSpeed;
if(abs(pid.Err)>200) //变积分处理控制
{
index = 0;
}
else if(abs(pid.Err)<180)
{
index =1;
pid.Integral += pid.Err;
}
else
{
index = (200-abs(pid.Err))/20;
pid.Integral += pid.Err;
}
pid.Voltage = pid.Kp*pid.Err +index*pid.Ki*pid.Integral + pid.Kd*(pid.Err - pid.Err_Last);
pid.Err_Last = pid.Err;
pid.ActualSpeed = pid.Voltage*1.0;
return pid.ActualSpeed;
}
int main(void)
{
int count = 0 ;
printf("SYSTEM BEGIN! \n");
PID_Init();
while(count<1000)
{
float speed = PID_Cal(200.0);
printf("-%d-%f-",count,speed);
count++;
}
return 0;
}
运行结果:
我们发现系统的稳定速度非常快,在94次PID控制后就趋于稳定了!