PID算法的精髓和缺陷
PID算法应用广泛,其核心思想就是 根据误差来消除误差。
但是它也是有一些缺点的。
- 微分。微分在物理上是不可实现的。只能用近似的增量,来代替微分。
- 积分。误差信号的积分,有时候由于干扰,或者噪声,会加大副作用。
- 线性组合不一定是最好的组合方式。有些系统是非线性的。
针对第三点,所以产生了一些衍生PID算法,当然,现在还有很多其他控制算法,比如ADRC,来来克服PID的这些缺陷。
这一篇,主要是想讲 衍生PID。其他控制算法。如ADRC,或许后续会有介绍。
衍生PID
单纯的位置式PID和增量式PID,不能调出满意的效果的时候,就可以考虑对PID算法,进行一些改造,以实现更好的控制目标,由此就产生了 衍生PID算法。
比如电磁智能小车中,对舵机的控制,就是使用到到了分段的PD算法,当误差比较小的时候,P给的很小,当误差比较大的时候,P则给的比较大。
if(-5<turn_erro[2]&&turn_erro[2]<5)
{
turn_angle=(turn_erro[2]-turn_erro[1])*2.5+(Dturn_erro[1]-Dturn_erro[0])*0.5;
Actualturn = 850+(int16)turn_angle;//PID
// Actualturn = 850+Fuzzy(turn_erro, Dturn_erro)*2.5;
// Actualturn = 850+(int16)(turn_erro[2]*1.5);
}
if((5<turn_erro[2]&&turn_erro[2]<7)||(-5<turn_erro[2]&&turn_erro[2]<-7))
{
//Actualturn = 850+(int16)(turn_erro[2]*3);
turn_angle=(turn_erro[2]-turn_erro[1])*5+(Dturn_erro[1]-Dturn_erro[0])*1;
Actualturn = 850+(int16)turn_angle;//PID
}
if((7<turn_erro[2]&&turn_erro[2]<10)||(-7<turn_erro[2]&&turn_erro[2]<-10))
{
// Actualturn = 850+(int16)(turn_erro[2]*5);
turn_angle=(turn_erro[2]-turn_erro[1])*5+(Dturn_erro[1]-Dturn_erro[0])*1.5;
Actualturn = 850+(int16)turn_angle;//PID
}
if((10<turn_erro[2]&&turn_erro[2]<25)||(-25<turn_erro[2]&&turn_erro[2]<-10))
{
// Actualturn = 850+(int16)(turn_erro[2]*9 );
turn_angle=(turn_erro[2]-turn_erro[1])*9+(Dturn_erro[1]-Dturn_erro[0])*2;
Actualturn = 850+(int16)turn_angle;//PID
}
if((25<turn_erro[2]&&turn_erro[2]<33)||(-33<turn_erro[2]&&turn_erro[2]<-25))
{
// Actualturn = 850+(int16)(turn_erro[2]*20);
turn_angle=(turn_erro[2]-turn_erro[1])*30+(Dturn_erro[1]-Dturn_erro[0])*3;
Actualturn = 850+(int16)turn_angle;//PID
}
if(33<turn_erro[2])
{
turn_angle=210;
Actualturn=duojiMAX;
}
if(-33>turn_erro[2])
{
turn_angle=-210;
Actualturn=duojiMIN;
}
其他还可以参考一下这篇:
变比例不完全积分式PID
反正要实现好的控制效果,这才是目的所在。