智能车制作

标题: 求指导如何调节速度PID保持相对静止的直立。。。。。 [打印本页]

作者: 小钟    时间: 2014-3-24 12:13
标题: 求指导如何调节速度PID保持相对静止的直立。。。。。
参考官方资料将代码加进去,没有出现错误,可是在调节速度PID的时候,基本没有反应,,,,这个是什么原因?下面是我的代码void SpeedControl(int bmq_l,int bmq_r) {
        float fDelta;
        float fDelta_cha;
        float fDelta_old,fD;
        float fP, fI;

        g_fCarSpeed = (bmq_l + bmq_r) / 2;
        g_fCarSpeed *= CAR_SPEED_CONSTANT;             //计算出电机转速
       
        fDelta = CAR_SPEED_SETfDelta - g_fCarSpeed;         //给定速-电机实际转
       
        fP = fDelta * SPEED_CONTROL_P;               //计算p
        fI = fDelta * SPEED_CONTROL_I;              //计算I
        g_fSpeedControlIntegral += fI;               
        /* if(g_fSpeedControlIntegral>=10)
        {g_fSpeedControlIntegral=10;}
        if(g_fSpeedControlIntegral<=-10)
        {g_fSpeedControlIntegral=-10;}
        if(fP>=1000)
        {fP=100;}
        if(fP<=-1000)
        {fP=-1000;} */
        fDelta_cha = fDelta - fDelta_old;       
        fD = fDelta_cha * SPEED_CONTROL_D;
       // if(fD>=220)
        //{fD=220;}
      //  if(fD<=-220)
        //{fD=-220;}
        g_fSpeedControlOutOld = g_fSpeedControlOutNew;
        g_fSpeedControlOutNew = fP +fD+ g_fSpeedControlIntegral;
        fDelta_old=fDelta;
        }
/************速度输出函数(编码器)**********/
void SpeedControlOutput(void)
{
  float fValue;
  fValue=g_fSpeedControlOutNew - g_fSpeedControlOutOld;
  g_fSpeedControlOut=fValue*(g_nSpeedControlPeriod)/100+g_fSpeedControlOutOld;
  g_nSpeedControlPeriod++;
}



/***********************************************************************/
/*
*  功能说明:直立速度计算
*  参数说明:angle                融合后最终角度
*            angle_dot            陀螺仪角速度
*
*  函数返回:无符号结果值
*  修改时间:2013-2-10
* 备注:参考清华源码
*/


/**************************速度闭环程序****************************************/

void MotorOutput(void)
{
  g_fLeftMotorOut = speed_Start - g_fSpeedControlOut;
  g_fRightMotorOut = speed_Start - g_fSpeedControlOut;

}


/******************************************************************************/
void Speed_Calculate(float angle,float angle_dot)
{
    /***********************************速度计算************************************/
    speed_Start = angle * P_ANGLE  + angle_dot * D_ANGLE ;  //直立时所要的速度
   // printf("\n转速:%d",speed_Start);
    MotorOutput();
    //P_ANGLE  P_GYRO  宏定义 直立所需要的PD参数

    Speed_L =g_fLeftMotorOut;//speed_Start;//左轮总速度
   // printf("\n左轮R:%d",Speed_L);
    Speed_R =g_fRightMotorOut;//speed_Start;//右轮总速度
   // printf("\n右轮R:%d",Speed_R);
    /***********************将最大速度限制在985个PWM内******************************/
    if(Speed_L > 985)  Speed_L = 985;
    if(Speed_L < -985) Speed_L = -985;
    if(Speed_R > 985)  Speed_R = 985;
    if(Speed_R < -985) Speed_R = -985;

    /***************因为驱动部分加了反相器,所以需对速度进行一个最终的处理******************/
    if(Speed_L > 0)     //因为加了反相器,所以PWM要反过来添加
        Speed_L_Last =  Speed_L;
    else
        Speed_L_Last = Speed_L;

    if(Speed_R > 0)     //因为加了反相器,所以PWM要反过来添加
        Speed_R_Last =  Speed_R;
    else
        Speed_R_Last =   Speed_R;

    /*************用所得到的对应角度的速度进行PWM控制********************/
    if(Speed_L >= 0)    //angle大于0,向前,小于0,向后
    {
        FTM_PWM_Duty(FTM0,FTM_CH3,(uint32)(Speed_L_Last-MOTOR_DEAD_VAL_L));    //加入死区电压
        FTM_PWM_Duty(FTM0,FTM_CH4,0);

    }
    else
    {
        FTM_PWM_Duty(FTM0,FTM_CH3,0);
        FTM_PWM_Duty(FTM0,FTM_CH4,(uint32)(-Speed_L_Last-MOTOR_DEAD_VAL_L));  //加入死区电压
    }

    if(Speed_R >= 0)    //angle大于0,向前,小于0,向后
    {
        FTM_PWM_Duty(FTM0,FTM_CH6,0);
        FTM_PWM_Duty(FTM0,FTM_CH5,(uint32)(Speed_R_Last-MOTOR_DEAD_VAL_R));    //加入死区电压
    }
    else
    {
        FTM_PWM_Duty(FTM0,FTM_CH5,0);
        FTM_PWM_Duty(FTM0,FTM_CH6,(uint32)(-Speed_R_Last-MOTOR_DEAD_VAL_R));   //加入死区电压
    }
}



作者: 戥家三少    时间: 2014-3-24 14:40
差不多这样的问题,但我们的是跪下了就不能动了
作者: 小钟    时间: 2014-3-24 18:07
戥家三少 发表于 2014-3-24 14:40
差不多这样的问题,但我们的是跪下了就不能动了

那你们解决没?

作者: 戥家三少    时间: 2014-3-24 18:20
小钟 发表于 2014-3-24 18:07
那你们解决没?

解决了,静电问题
作者: 小钟    时间: 2014-3-24 19:44
戥家三少 发表于 2014-3-24 18:20
解决了,静电问题

静电问题?也就是说是硬件电路的干扰么?   你们调节加入速度PID的使车模直立的程序,,和我发的这个类似么?我这个程序是不是还缺少什么部分?

作者: 戥家三少    时间: 2014-3-24 19:55
小钟 发表于 2014-3-24 19:44
静电问题?也就是说是硬件电路的干扰么?   你们调节加入速度PID的使车模直立的程序,,和我发的这个类似 ...

没看你的程序,我们都改成自己能看懂的名称了

作者: 小钟    时间: 2014-3-25 10:07
戥家三少 发表于 2014-3-24 19:55
没看你的程序,我们都改成自己能看懂的名称了

哦哦,你是那个赛区的,,,可以参考下你们的那个速度这个环节的程序么,,,因为我不确定自己速度环节代码是不是缺少什么,,,,调节的时候基本没有反应

作者: 海涛制作    时间: 2014-3-25 12:32
我的这段程序出现问题了
void Speed_Calculate(float angle,float angle_dot)
{
    /***********************************速度计算************************************/
    speed_Start = angle * P_ANGLE  + angle_dot * D_ANGLE ;  //直立时所要的速度
   // printf("\n转速:%d",speed_Start);
    MotorOutput();
    //P_ANGLE  P_GYRO  宏定义 直立所需要的PD参数

    Speed_L =g_fLeftMotorOut;//speed_Start;//左轮总速度
   // printf("\n左轮R:%d",Speed_L);
    Speed_R =g_fRightMotorOut;//speed_Start;//右轮总速度
   // printf("\n右轮R:%d",Speed_R);
    /***********************将最大速度限制在985个PWM内******************************/
    if(Speed_L > 985)  Speed_L = 985;
    if(Speed_L < -985) Speed_L = -985;
    if(Speed_R > 985)  Speed_R = 985;
    if(Speed_R < -985) Speed_R = -985;
输出的不是985 怎么办


作者: 小钟    时间: 2014-3-25 18:18
海涛制作 发表于 2014-3-25 12:32
我的这段程序出现问题了
void Speed_Calculate(float angle,float angle_dot)
{

不会吧,这个是不是你的硬件干扰比较大


作者: 小钟    时间: 2014-3-25 22:37
戥家三少 发表于 2014-3-24 18:20
解决了,静电问题

你们处理静电干扰是怎么处理的?求指导下

作者: 戥家三少    时间: 2014-3-26 09:16
小钟 发表于 2014-3-25 22:37
你们处理静电干扰是怎么处理的?求指导下

买芯片时不是用那些防静电袋装着的吗?剪开,在电路底板上粘一层,用电工黑胶布固定,而且不能底板的电路不要接触任何除了静电袋外的东西
作者: 小钟    时间: 2014-3-28 00:05
戥家三少 发表于 2014-3-26 09:16
买芯片时不是用那些防静电袋装着的吗?剪开,在电路底板上粘一层,用电工黑胶布固定,而且不能底板的电路 ...

恩恩,谢谢

作者: 小钟    时间: 2014-3-28 00:07
小钟 发表于 2014-3-28 00:05
恩恩,谢谢

想问下,你们遇到过,加上速度PID后,调节参数还是会往一个方向运动(好像没加速度PID一样),我们采用的是K60正交解码得到的编码器脉冲数,在速度PID中需要把采集到的脉冲数都纠正为正数么?

作者: 戥家三少    时间: 2014-3-28 09:12
小钟 发表于 2014-3-28 00:07
想问下,你们遇到过,加上速度PID后,调节参数还是会往一个方向运动(好像没加速度PID一样),我们采用的 ...

是极性反了的原因

作者: 小钟    时间: 2014-3-28 10:26
戥家三少 发表于 2014-3-28 09:12
是极性反了的原因

谢谢你哦,,,,不过还是不理解,你指的极性反了,是指什么极性?

作者: 南宫封枫    时间: 2014-3-28 10:45
小钟 发表于 2014-3-28 10:26
谢谢你哦,,,,不过还是不理解,你指的极性反了,是指什么极性?

角度控制的pwm输出和速度控制pwm输出的符号

作者: 戥家三少    时间: 2014-3-28 10:47
小钟 发表于 2014-3-28 10:26
谢谢你哦,,,,不过还是不理解,你指的极性反了,是指什么极性?

速度的那两个参数比例跟积分是有正负的,换过来试试吧

作者: 小钟    时间: 2014-3-28 11:55
戥家三少 发表于 2014-3-28 10:47
速度的那两个参数比例跟积分是有正负的,换过来试试吧

你的意思,把P和I参数互换过来,还是在都在前面添加一个负号?

作者: 戥家三少    时间: 2014-3-28 12:04
小钟 发表于 2014-3-28 11:55
你的意思,把P和I参数互换过来,还是在都在前面添加一个负号?

加负号

作者: 小钟    时间: 2014-3-28 12:58
戥家三少 发表于 2014-3-28 12:04
加负号

恩恩,我是试试,,,谢谢啦,,,,大神你QQ多少?加你QQ,希望得到你的帮助,尽快调好稳定的直立

作者: 戥家三少    时间: 2014-3-28 17:37
小钟 发表于 2014-3-28 12:58
恩恩,我是试试,,,谢谢啦,,,,大神你QQ多少?加你QQ,希望得到你的帮助,尽快调好稳定的直立

直立要调很久的,我们也没什么方法

作者: 小钟    时间: 2014-3-28 17:53
戥家三少 发表于 2014-3-28 17:37
直立要调很久的,我们也没什么方法

哦哦,那个你们编码器是是使用欧姆龙的么?关于编码器加入,需要在函数运行周期内讲测得的脉冲数累加起来么?

作者: 戥家三少    时间: 2014-3-28 17:58
小钟 发表于 2014-3-28 17:53
哦哦,那个你们编码器是是使用欧姆龙的么?关于编码器加入,需要在函数运行周期内讲测得的脉冲数累加起来 ...

是要累加的
作者: 小钟    时间: 2014-3-28 18:02
戥家三少 发表于 2014-3-28 17:58
是要累加的

恩恩,真心感谢啊,,,谢谢

作者: fske14    时间: 2014-6-6 13:35
小钟 发表于 2014-3-28 18:02
恩恩,真心感谢啊,,,谢谢

我们也在调速度控制,就是在调好角度PD之后很稳定,加了速度PI之后开始抖动,我是先加I的,车子现象跟官网上一样的,然后我加P,加了P之后车子就开始抖动了,如果想让车子静止在某个点,那P就要加大,加大之后车子就更抖,真心不知道该怎么解决,请问同学你们是怎么解决的?

作者: 人生在于奋斗    时间: 2014-11-25 17:08
我的车也是静止不了!!!不知哪个大神的车吧官方代码加入后,车静止了吗???
作者: 小镇qq    时间: 2014-12-23 10:15
fske14 发表于 2014-6-6 13:35
我们也在调速度控制,就是在调好角度PD之后很稳定,加了速度PI之后开始抖动,我是先加I的,车子现象跟官网 ...

同求啊,但现在我想问问P,I 参数大概在什么范围之内呢?谢谢

作者: sere    时间: 2016-3-19 18:54
我加了速度控制后,车子仍然直立的很稳???这是什么原因???




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