智能车制作
标题:
PID调试。。。。。。。
[打印本页]
作者:
流氓兔
时间:
2014-5-19 19:56
标题:
PID调试。。。。。。。
调PID的时候,首先调的是P(I=0 D=0),,,设定了目标脉冲,,当P大的时候,反馈的脉冲在目标脉冲处波动特别的大,但是当P小的时候,就达不到目标脉冲了,,但是波动特别稳,波动不大(在3~5之间波动),,例如:目标脉冲是60 p小的时候反馈的脉冲就是在36左右波动(波动范围小)。这个是神魔情况。
float PID_Control(PID *pp )
{
signed long error1,error2,error3;//error是预定的速度和返回速度之差,d_error是偏差的偏差
pp->v_FeedBack= pulse_counter;
if(wandaojs>10000) //稳定赛道加速
{
if(wdjiasu<21) //递增
wdjiasu+=3;
}
else
wdjiasu=0; //否则为0
pp->ideal_speed=150+wdjiasu;
error1 = (signed long)(pp->ideal_speed - pp->v_FeedBack); // 当前偏差计算
ERROR1 = error1;
error2 = error1 - pp->v_PreError;//速度的偏差的偏差
error3 = error2 - pp->v_PreDerror;//这一次偏差的差和前一次偏差的差的差
pp->v_PreError = error1; //存储当前偏差
pp->v_PreDerror = error2;//存储偏差的偏差
setPID();
pp->Moto_Out+=(signed long)((pp ->v_Kp*error2)+pp->v_Ki*error1+ pp->v_Kd*error3);
if( pp->Moto_Out > speed_MAX )
pp->Moto_Out = speed_MAX;
if( pp->Moto_Out < speed_MIN )
pp->Moto_Out = speed_MIN;
return (pp->Moto_Out);// 返回预调节占空比
}
//------------------执行-----------------//
以上是PID公式,,求大神看看啥情况,,,
作者:
xunzhou
时间:
2014-5-19 20:10
首先,你要知道对于速度控制,你的被控对象是小车的直流电机,而直流电机一般可以视为一阶或二阶惯性对象。如果你的控制器仅包括比例作用,那你的控制系统会是一个0型系统,而0型系统对于阶跃信号会存在稳态误差。稳态误差也叫余差,他的大小与1/(Kp+1)有关,如果Kp越大则余差越小。
so,你懂得。
作者:
流氓兔
时间:
2014-5-19 20:41
xunzhou 发表于 2014-5-19 20:10
首先,你要知道对于速度控制,你的被控对象是小车的直流电机,而直流电机一般可以视为一阶或二阶惯性对象。 ...
这样的话,调p时候 让他到达目标脉冲(即使波动很大),,然后增加I的值吗?是波动减小,,,但是p调到社么时候才会比较合适呢?(是即能达到目标误差而且波动尽可能小?波动多少时候才算合适?)
作者:
xunzhou
时间:
2014-5-19 21:13
简单来说P越大瞬间调节的会快一些,但太大会导致对于测量的正常跳动过于敏感,也就是你说的P大的时候波动会变大。I 越大跟踪设定值的速度会快,但过了一定的值会引起控制滞后,最后导致超调。此外比例和积分会相互影响,增强比例能在一定程度上抵消积分的滞后从而减小超调。至于波动多少合适就全看你自己的要求了。
有一点提醒一下,让测量值跟上设定值重点在积分项上,因为当你的测量等于设定的时候误差是0,那样比例也就没作用了。
欢迎光临 智能车制作 (http://dns.znczz.com/)
Powered by Discuz! X3.2