智能车制作

标题: 请教一下关于速度闭环 [打印本页]

作者: shock    时间: 2015-3-30 16:37
标题: 请教一下关于速度闭环
直立控制基本可以了,使用了官方PI控制的方案,又用了增量式PID控制,结果两者现象相同,都是振荡两下,然后碰到地之后就跟疯狗一样狂跑不受控了,这个现象大家有遇到过么,大概是哪里的问题呢。
作者: shock    时间: 2015-3-30 16:41
本帖最后由 shock 于 2015-3-30 16:43 编辑

程序如下:
void Spd_Ctrl_PID(void)
{
                float Spd_Ctrl_Out_1=0;
                static float Spd_Ctrl_Out_2;
                int32_t Left_Count =0,Right_Count =0;
                Left_Count =Left_Count_Sum;                                    
                Right_Count =Right_Count_Sum;                                         
                Left_Count_Sum =0;                                                                           
                Right_Count_Sum =0;                                                                       
                Speed  = (Left_Count+Right_Count)/100.0;
                Speed_PID_Control.Spd_Error0=Spd_Set-Speed;               
                Spd_Ctrl_Out_1 = Speed_PID_Control.Spd_Kp*(Speed_PID_Control.Spd_Error0-Speed_PID_Control.Spd_Error1)+\
                   Speed_PID_Control.Spd_Error0*Speed_PID_Control.Spd_Ki+Speed_PID_Control.Spd_Kd*(Speed_PID_Control.Spd_Error0-\
                         2*Speed_PID_Control.Spd_Error1+Speed_PID_Control.Spd_Error2);
                Speed_PID_Control.Spd_Error2 = Speed_PID_Control.Spd_Error1;
                Speed_PID_Control.Spd_Error1 = Speed_PID_Control.Spd_Error0;
                Spd_Ctrl_Out_2 += Spd_Ctrl_Out_1;
                Spd_Ctrl_Out_Old = Spd_Ctrl_Out_New;
                Spd_Ctrl_Out_New = Spd_Ctrl_Out_2;
}

作者: 薇笑    时间: 2015-3-30 17:56
66666666
作者: shock    时间: 2015-3-30 18:11
薇笑 发表于 2015-3-30 17:56
66666666

大哥哥,别这样啊,愁死我了
能给点思路么,现在是会振荡,而且振荡越来越大,最后倒地,疯狗模式开启{:3_54:}
怎么把{:3_54:}

作者: 薇笑    时间: 2015-3-30 18:22
shock 发表于 2015-3-30 18:11
大哥哥,别这样啊,愁死我了
能给点思路么,现在是会振荡,而且振荡越来越大,最后倒地,疯狗模 ...

表示我是电磁组的

作者: shock    时间: 2015-3-30 18:39
薇笑 发表于 2015-3-30 18:22
表示我是电磁组的

好吧,你能回我我已经非常感动了{:2_43:},谢谢你

作者: 薇笑    时间: 2015-3-30 18:44
shock 发表于 2015-3-30 18:39
好吧,你能回我我已经非常感动了,谢谢你

:lol:lol
作者: shock    时间: 2015-3-30 18:52
薇笑 发表于 2015-3-30 18:44

你的电磁怎么样了呢,双车追逐诶,难度很大啊

作者: 囩と唂囩飄飄    时间: 2015-3-30 18:54
参数不对,建议先p后i,虽然视频说是先i后p,但是感觉好难调的。。。
作者: Young_rock    时间: 2015-3-30 18:57
调软点
作者: shock    时间: 2015-3-30 19:03
囩と唂囩飄飄 发表于 2015-3-30 18:54
参数不对,建议先p后i,虽然视频说是先i后p,但是感觉好难调的。。。

谢谢你的回复,调i不是来回震荡么,光调P是什么现象呢?我试试看
作者: shock    时间: 2015-3-30 19:05
Young_rock 发表于 2015-3-30 18:57
调软点

调软是指直立的P么,我刚刚吧直立的P调大了,能在一个立住,但是我轻轻推一下,出现震荡,而且震荡越来越大,最后倒地发疯,谢谢你的指示

作者: shock    时间: 2015-3-30 19:15
囩と唂囩飄飄 发表于 2015-3-30 18:54
参数不对,建议先p后i,虽然视频说是先i后p,但是感觉好难调的。。。

你好,刚刚我就单单调节P,发现P是让车停止的作用,效果也可以让车立住,算是有了新的突破,(激动)但是没有震荡,然后加了I之后,感觉P无效了一样,越震越大,最后还是倒地不起

作者: Young_rock    时间: 2015-3-30 19:18
shock 发表于 2015-3-30 19:05
调软是指直立的P么,我刚刚吧直立的P调大了,能在一个立住,但是我轻轻推一下,出现震荡,而且震荡越来越 ...

软点好 加油加油
作者: shock    时间: 2015-3-30 19:24
Young_rock 发表于 2015-3-30 19:18
软点好 加油加油

但是软点我加上速度后,根本立不住啊,我没有反驳你的意思,但是根据现象,我发现,P大一点好啊,可能我原来就给的太软了,嗯嗯,继续努力,一起加油啊,你也是光电的吗?

作者: Young_rock    时间: 2015-3-30 19:28
shock 发表于 2015-3-30 19:24
但是软点我加上速度后,根本立不住啊,我没有反驳你的意思,但是根据现象,我发现,P大一点好啊,可能我原 ...

软的意思是 直立的时候是不荡不抖 不能停在一个点也行 重要的是稳定
加了速度P 会倒 有可能是极性反了  

作者: 囩と唂囩飄飄    时间: 2015-3-30 19:37
你是在调静止不动的速度环么?
作者: shock    时间: 2015-3-30 19:39
Young_rock 发表于 2015-3-30 19:28
软的意思是 直立的时候是不荡不抖 不能停在一个点也行 重要的是稳定
加了速度P 会倒 有可能是极性反了  ...

哦,原来软是这个意思啊,我的有点抖,后面还要再调过我的现象不是加了速度P后会倒,单单加速度P,不加速度I,推小车,可以较快地停住,但是不在原地停,然后加上I之后,现象应该是推小车,小车振荡,最后振荡越来越小,停住在原地才对,但是我加了I之后,推小车振荡越来越大,最后倒地,跑飞,不知道我的表达是不是很清楚,感谢你


作者: shock    时间: 2015-3-30 19:41
囩と唂囩飄飄 发表于 2015-3-30 19:37
你是在调静止不动的速度环么?

嗯嗯,是的

作者: shock    时间: 2015-3-30 19:44
囩と唂囩飄飄 发表于 2015-3-30 19:37
你是在调静止不动的速度环么?

就是设定速度为0,推小车,小车振荡,并能很快在原地停住

作者: 囩と唂囩飄飄    时间: 2015-3-30 19:55
知道,视频有,我没调这个,我直接给速度调的速度环,先i后p没经验,我也是学长和我说的先p后i,所以就i先调了
作者: Young_rock    时间: 2015-3-30 20:01
shock 发表于 2015-3-30 19:39
哦,原来软是这个意思啊,我的有点抖,后面还要再调过我的现象不是加了速度P后会倒,单单加速度P,不加速 ...

那就是I大了  可以先调I在加P

作者: shock    时间: 2015-3-30 20:01
囩と唂囩飄飄 发表于 2015-3-30 19:55
知道,视频有,我没调这个,我直接给速度调的速度环,先i后p没经验,我也是学长和我说的先p后i,所以就i先调 ...

啊,直接给速度啊,然后判断速度和给定速度的偏差吗?你说的这话前后不搭啊,你的学长跟你说先P后I,然后你先调的I?还是我理解错误了
作者: 囩と唂囩飄飄    时间: 2015-3-30 20:02
写错,我是先调的p
作者: shock    时间: 2015-3-30 20:15
Young_rock 发表于 2015-3-30 20:01
那就是I大了  可以先调I在加P

会不会有可能光是I的极性反了呢,待会就试试,现在小车在休息

作者: shock    时间: 2015-3-30 20:15
囩と唂囩飄飄 发表于 2015-3-30 20:02
写错,我是先调的p

哈哈,各种参数,各种乱

作者: 素衣叹风尘    时间: 2015-3-30 20:17
jia da D
作者: shock    时间: 2015-3-30 20:28
素衣叹风尘 发表于 2015-3-30 20:17
jia da D

啊?什么D啊,速度的D吗?速度不是一般都是P,I控制吗,如果你指的是角度的D,我再加大,就抖动了

作者: 上善若水任方圆    时间: 2015-3-30 20:39
控制周期那检查了没,SPEADCONTROL是20ms一次,而不是100ms,之前我们队是遇到这个问题,被坑了很长很长时间
作者: shock    时间: 2015-3-30 20:50
上善若水任方圆 发表于 2015-3-30 20:39
控制周期那检查了没,SPEADCONTROL是20ms一次,而不是100ms,之前我们队是遇到这个问题,被坑了很长很长时间 ...

啊!!官方方案是一百毫秒吧,我看到了啊
[attach]75671[/attach]

作者: 薇笑    时间: 2015-3-30 21:40
shock 发表于 2015-3-30 18:52
你的电磁怎么样了呢,双车追逐诶,难度很大啊

还行吧
作者: 王七七    时间: 2015-3-31 08:25
会不会加入速度闭环没处理好
作者: 最美的时光    时间: 2015-3-31 09:10
*void Speed_PID(void)
{
   s16 P_Value,I_Value,D_Value;
   
   s16 Speed_Out;
     
   Speed_Old=Speed_New;
   Error=SPEED-Now_Speed;
   if(Error)
   P_Value=P_DATA*(Error-Last_Error);
   I_Value=I_DATA*Error/100;
   D_Value=D_DATA*(Error-2*Last_Error+Pre_Error)/10;
   
  if(I_Value>=100)
   {
      I_Value=100;
   }
   else if(I_Value<=-100)
   {
      I_Value=-100;
   }
   
if(P_Value>=600)
   {
      P_Value=600;
   }
   else if(P_Value<=-600)
   {
      P_Value=-600;
   }
  if(Error>=-10&&Error<=10)
   {
      Speed_New=0;
   }
   Speed_Out=P_Value+I_Value+D_Value;
   Speed_New=Speed_Old+Speed_Out;
   if(Speed_New>=500)
   {
      Speed_New=500;
   }
   else if(Speed_New<=-500)
   {
      Speed_New=-500;
   }
   if(Speed_New>=0)
   {
      Speed_New=350;
   }
   
   else if(Speed_New<=-350)
   {
      Speed_New=-350;
   }
   Pre_Error=Last_Error;
   Last_Error=Error;
   
}*/





void Speed_Count(void)//5ms采集计算一次 50ms计算一次
{


  Speed_Flag++;

  Left_Speed_Temp=FTM1_CNT; //左边电机  编码器
  Right_Speed_Temp=FTM2_CNT;//右边电机  编码器
  FTM1_CNT=0;//清零
  FTM2_CNT=0;//清零
      
if( FTM_QDCTRL_REG(FTMx[FTM1])&0x04)//判断左边电机的正传和反转
  {
      Left_Speed+= Left_Speed_Temp;
  }
  
  else
  {
      Left_Speed+=Left_Speed_Temp;
   }
if( FTM_QDCTRL_REG(FTMx[FTM2])&0x04)//判断右边电机的正传反转
{
     Right_Speed+= Right_Speed_Temp;
  }
  else
  {
     Right_Speed+= Right_Speed_Temp;
  }
  if(Speed_Flag==16)
  {
      Speed_Flag=0;
     
        
        Now_Speed=-(Left_Speed+Right_Speed)/20;
       // var[0]=Now_Speed;
   
      // vcan_sendware((uint8_t *)var, sizeof(var));
        Left_Speed=0;
        Right_Speed=0;
        Speed_Control();

      
  }
SpeedControlOutPut();
   
}

/*****************************************************************
功能:位置式PID计算,用于控制车速
*****************************************************************/

void Speed_Control(void)
{
     
    s16 P_Value,I_Value,D_Value;

      //---当前误差的计算,目标速度减去当前速度---//
    Current_Error=SPEED-Now_Speed;
  
    P_Value=P_DATA*Current_Error;
    I_Value=I_DATA*Current_Error;
    D_Value=D_DATA*(Current_Error-LastError);
    //---速度积分---//
    nSpeedControlKeep+=I_Value;
   
    //---把上次经PI运算后的值存起来---//
    Speed_Old=Speed_New;
   
    Speed_New=(P_Value+I_Value+D_Value)/100 ;
   
    if(nSpeedControlKeep>50)    nSpeedControlKeep=50;
   
    else if(nSpeedControlKeep<-50)   nSpeedControlKeep=-50;   
     
     LastError=Current_Error;    //将本次误差存为上次误差
   

}  


/*****************************************************************
功能:将车速均匀分配在角度控制的20个周期里,可以保证车模的稳定性
*****************************************************************/
void SpeedControlOutPut(void)
{
    if(OK==1)
    {
        s16 nValue;
        nValue=Speed_New-Speed_Old;
        
        /*--速度值分级输出--*/
        nValue=nValue*(Speed_Flag+1)/ 16+Speed_Old;
        
        Speed_OutPut=nValue;
        
        if(Speed_OutPut>100)      Speed_OutPut=100;
        
       else if (Speed_OutPut<-100)      Speed_OutPut=-100;   

        ANGLE_ZERO=Remember_Angle_Zero+Speed_OutPut;
    }
}
作者: 喜欢桃子    时间: 2015-4-1 17:28
囩と唂囩飄飄 发表于 2015-3-30 19:37
你是在调静止不动的速度环么?

麻烦问一下,如果先p后i,当p调到什么现场的时候才开始i呢




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2