智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 8429|回复: 27
打印 上一主题 下一主题

求指导如何调节速度PID保持相对静止的直立。。。。。

  [复制链接]

6

主题

51

帖子

0

精华

高级会员

Rank: 4

积分
673
威望
385
贡献
198
兑换币
252
注册时间
2013-9-12
在线时间
45 小时
毕业学校
武汉长江工商学院
跳转到指定楼层
1#
发表于 2014-3-24 12:13:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
参考官方资料将代码加进去,没有出现错误,可是在调节速度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));   //加入死区电压
    }
}


回复

使用道具 举报

52

主题

725

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5889
威望
2514
贡献
1289
兑换币
1650
注册时间
2013-2-20
在线时间
1043 小时
毕业学校
韶关学院
2#
发表于 2014-3-24 14:40:15 | 只看该作者
差不多这样的问题,但我们的是跪下了就不能动了
回复 支持 反对

使用道具 举报

6

主题

51

帖子

0

精华

高级会员

Rank: 4

积分
673
威望
385
贡献
198
兑换币
252
注册时间
2013-9-12
在线时间
45 小时
毕业学校
武汉长江工商学院
3#
 楼主| 发表于 2014-3-24 18:07:21 | 只看该作者
戥家三少 发表于 2014-3-24 14:40
差不多这样的问题,但我们的是跪下了就不能动了

那你们解决没?
回复 支持 反对

使用道具 举报

52

主题

725

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5889
威望
2514
贡献
1289
兑换币
1650
注册时间
2013-2-20
在线时间
1043 小时
毕业学校
韶关学院
4#
发表于 2014-3-24 18:20:03 | 只看该作者
小钟 发表于 2014-3-24 18:07
那你们解决没?

解决了,静电问题
回复 支持 反对

使用道具 举报

6

主题

51

帖子

0

精华

高级会员

Rank: 4

积分
673
威望
385
贡献
198
兑换币
252
注册时间
2013-9-12
在线时间
45 小时
毕业学校
武汉长江工商学院
5#
 楼主| 发表于 2014-3-24 19:44:10 | 只看该作者
戥家三少 发表于 2014-3-24 18:20
解决了,静电问题

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

使用道具 举报

52

主题

725

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5889
威望
2514
贡献
1289
兑换币
1650
注册时间
2013-2-20
在线时间
1043 小时
毕业学校
韶关学院
6#
发表于 2014-3-24 19:55:01 | 只看该作者
小钟 发表于 2014-3-24 19:44
静电问题?也就是说是硬件电路的干扰么?   你们调节加入速度PID的使车模直立的程序,,和我发的这个类似 ...

没看你的程序,我们都改成自己能看懂的名称了
回复 支持 反对

使用道具 举报

6

主题

51

帖子

0

精华

高级会员

Rank: 4

积分
673
威望
385
贡献
198
兑换币
252
注册时间
2013-9-12
在线时间
45 小时
毕业学校
武汉长江工商学院
7#
 楼主| 发表于 2014-3-25 10:07:10 | 只看该作者
戥家三少 发表于 2014-3-24 19:55
没看你的程序,我们都改成自己能看懂的名称了

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

使用道具 举报

0

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
305
威望
153
贡献
88
兑换币
96
注册时间
2013-1-18
在线时间
32 小时
8#
发表于 2014-3-25 12:32:38 | 只看该作者
我的这段程序出现问题了
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 怎么办

回复 支持 反对

使用道具 举报

6

主题

51

帖子

0

精华

高级会员

Rank: 4

积分
673
威望
385
贡献
198
兑换币
252
注册时间
2013-9-12
在线时间
45 小时
毕业学校
武汉长江工商学院
9#
 楼主| 发表于 2014-3-25 18:18:13 | 只看该作者
海涛制作 发表于 2014-3-25 12:32
我的这段程序出现问题了
void Speed_Calculate(float angle,float angle_dot)
{

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

回复 支持 反对

使用道具 举报

6

主题

51

帖子

0

精华

高级会员

Rank: 4

积分
673
威望
385
贡献
198
兑换币
252
注册时间
2013-9-12
在线时间
45 小时
毕业学校
武汉长江工商学院
10#
 楼主| 发表于 2014-3-25 22:37:05 | 只看该作者
戥家三少 发表于 2014-3-24 18:20
解决了,静电问题

你们处理静电干扰是怎么处理的?求指导下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-6 15:29 , Processed in 0.055841 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表