|
在调试增量式PID时,查了很多资料,绕了很多弯路,最后总结了一些经验,供大家参考。
1. 源码
以整定速度PID为例,根据增量式PID程序
//*****************************************************************************
//!\brief The speed PID reset
//!\param None
//!\retval None
//*****************************************************************************
void SpeedPID_Rest(void)
{
SpeedPID.Err = 0;
SpeedPID.ErrBak = 0;
SpeedPID.Uout = 0;
SpeedPID.UoutBak = 0;
}
void SpeedPID_Init(void)
{
SpeedPID.OutMax = 5*131072; // OutMax = 5 * 65536
SpeedPID.OutMin = -5*131072; // OutMin = -5 * 65536
SpeedPID.Kp = 50; //
SpeedPID.Ki = 120; //
}
//*****************************************************************************
//!\brief The speed PID control logic
//!\param the set speed and the actual speed
//!\retval the offset value of the speed
//*****************************************************************************
LONG SpeedPID_Ctrl(LONG ref,LONG fdb)
{
SpeedPID.Ref = ref; // the set speed
SpeedPID.Fdb = fdb; // the actual speed
//-----Error-------------
SpeedPID.Err = SpeedPID.Ref - SpeedPID.Fdb;
//
SpeedPID.Uout = SpeedPID.UoutBak + SpeedPID.Kp * (SpeedPID.Err - SpeedPID.ErrBak) + SpeedPID.Ki * SpeedPID.Err;
//
SpeedPID.ErrBak = SpeedPID.Err;
//
if(SpeedPID.Uout > SpeedPID.OutMax)
{
SpeedPID.Uout = SpeedPID.OutMax; // set the maximum of Uout
}
else if(SpeedPID.Uout < SpeedPID.OutMin)
{
SpeedPID.Uout = SpeedPID.OutMin; // set the minimum of Uout
}
//
SpeedPID.UoutBak = SpeedPID.Uout;
//
SpeedPID.Uout >>= 17;
return SpeedPID.Uout;
}
可知PID程序将会return一个SpeedPID.Uout值,即g_PID_Data值,
SpeedPID.Uout = SpeedPID.UoutBak + SpeedPID.Kp * (SpeedPID.Err - SpeedPID.ErrBak) + SpeedPID.Ki * SpeedPID.Err;
其中 SpeedPID.Uout为本次PID将要输出的g_PID_Data值,以改变输出PWM的占空比
2. 理论
参数整定找最佳,从小到大顺序查
先是比例后积分,最后再把微分加
曲线振荡很频繁,比例度盘要放大(Kp增大)
曲线漂浮绕大湾,比例度盘往小扳(Kp减小)
曲线偏离回复慢,积分时间往下降(Ki增大)
曲线波动周期长,积分时间再加长(Ki减小)
曲线振荡频率快,先把微分降下来(Kd增大)
动差大来波动慢。微分时间应加长(Kd减小)
理想曲线两个波,前高后低4比1
一看二调多分析,调节质量不会低
3. 设定上下限OutMax 和 OutMin
如何确定outmax outmin
P是对现在的情况做出反应 I是对过去的积累
先找电机最高转速,根据这个转速设定OutMax和Outmin的值,具体为OutMax或min为最高转速的5~10倍之间,过大
会导致out值过小,变化幅度小;过小会导致导致out值平常过大,不能平滑输出out。例如-5 -4 -4 -3 -2 -1是我们想要的PID输出值
,而过大 out可能会为-1 -1 -1 0 0 ,过小输出可能会为5 5 5 5 5 0 0 -5 -5 -5 -5 ,震荡大。
4. 调试比例系数P
然后是P 和 I 的确定,先I为零 调P。当只有P,没i的时候,p是对现在的情况作出反应,若加速,起始时候p会乘上和0和目标的差值,
之后P会一直乘一个负值,最后out值会趋近与0,可能一直到不了目标速度。利用这个特性,找适合整个电机转速区间的P。
所以调P不要只在一个转速调,在最高速,最低速,中间速度,找到适合这三个转速区间的P。
何为适合,例如一个P值。
在高速的时候 能达到最高速的80%,但在中速只能到中速的60%,低速只能到低速的40%,那么这个P值,就还不适合
而另外一个P值,能达到高速的70%,中速的70%,低速的70%,那么这个P值就比较适合。这个时候,就需要用I值来达到目标速度。
5. 调试积分系数I
此刻调i,
先找稳态时候的误差 例如稳态 6W转时候 上下误差为2000r ,也就是说ERR要么为0 要么为2000,-2000,此时可以加入较小的I。观察目标波形的抖动,如果周期出现震荡,时间很长,则I太大 需要减小。如果振荡回复很慢,则I太小,需要增大。
I的调整很灵活,在P参数整定正常后,很快就能调好I。
以上是增量式PID 参数整定调试心得,如有不足请提出指正,谢谢阅读!
|
|