智能车制作

标题: 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://111.231.132.190/) Powered by Discuz! X3.2