在上面三、四我们知道积分环节是为了消除静差,但有时候机器启动、结束或出现大幅的偏差时,这样在短时间内会累积大量的偏差,这样就导致积分项很大,以至于出现超调甚至震荡,这样是不允许的!
为了克服这个问题,我们对积分偏差的做一个选择,即通过控制积分偏差的大小来决定是否增加积分项的调节!
在第三篇的代码中做如下更改:
将
float PID_Cal(float Speed)
{
pid.SetSpeed = Speed;
pid.Err = pid.SetSpeed - pid.ActualSpeed;
pid.Integral += pid.Err;
pid.Voltage = pid.Kp*pid.Err + 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;
} 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。代码段一
改成
float PID_Cal(float Speed){
unsigned char index;
pid.SetSpeed = Speed;
pid.Err = pid.SetSpeed - pid.ActualSpeed;
if(abs(pid.Err) >=100) //取绝对值
{
index = 0;
}
else
{
index =1;
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;
} 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。代码段二
我们用199这个值来判断他们优化时间的快慢!
代码段一:
运行代码可以看到一下从198到199的越变的次数为 406次,即没积分环节的优化,达到199需要406次的PID控制,时间为406个单位!
代码段二:
运行代码可以看到一下从198到199的越变的次数为 406次,即没积分环节的优化,达到199需要219次的PID控制,时间为219个单位!
从上面我们知道优化后的PID比没优化的快了将近1倍的时间单位!