查看: 3395|回复: 12

[分享] 自平衡小车--站立

[复制链接]
  • TA的每日心情
    开心
    2024-4-29 11:48
  • 签到天数: 822 天

    [LV.10]以坛为家III

    71

    主题

    2452

    帖子

    24

    金牌会员

    Rank: 6Rank: 6

    积分
    5531
    最后登录
    2024-5-1
    发表于 2017-11-8 01:18:18 | 显示全部楼层 |阅读模式
    有幸参加社区自平衡小车,经过一段时间的探索,前边也写了几个帖子,这个算是小总结吧。要想自平衡小车达到平衡的需要掌握4点(其实不止)
    1.mpu6050的数据采集,及有效数据的提取,我至少一多半的时间消耗在这里了


    2.重心的调整,也非常重要,我开始搞成了大头重,结果很难平衡,即使平衡也不稳定,经常像得了帕金森症一样,颤抖,让我想起了现在很火的舞蹈,非洲人穿着鸟服,在那抖动双脚,那感觉跟触电一样一样的

    3.pid参数的调整,不同结构的小车P(比例系数)参数和D(微分系数)参数是不相同的,调整起来比较费时。

    4.要考虑好嵌套终端优先级的管理,由于传感器比较多,就要考虑中断时间,优先级安排等。

    以上4点我认为比较重要的环节,单独列出mpu6050,并不是说其他传感器不重要,其他传感器得到的数值都是直接可以使用的,不需要像mpu6050那样,折磨起人来花样繁多,并且数据需要经过处理才行。
    经过n次的尝试和调整,把电池放下来能平衡的站立的时间比较久一些,但是也会跑,这个跑不是我加入了速度环,而是数据漂移的结果,前边的帖子里跟大神请教,有个比较不错的办法就是设定阈值(门限)。

    可以先看一下视频,视频里电池拿下来了,站立比较稳,当然不能时间太久,就是前边提到的数据漂移的问题,时间太久小车自己就会跑了,抗干扰性差一些,用力推一下就倒了,倒下去过程电机有做挣扎,显然是扭矩不够。我看社区的朋友已经转向环都实现了,比较牛。

    [视频]


    先贴下加速度和陀螺仪计算的函数,主要是利用mpu6050采集到的数据进行融合过滤,提取有效数据(每次贴代码就有乱码)
    1. void ACC_Ang_cal()
    2. {

    3.         MPU_Get_Accelerometer(&aacx,&aacy,&aacz);        //µÃµ½¼ÓËٶȴ«¸ÐÆ÷Êý¾Ý
    4.         
    5.         Ang_ACC=(180/Pi*(float)(atan2(aacz,aacy)));
    6.         if(Ang_ACC>90)
    7.                 Ang_ACC=90;
    8.         if(Ang_ACC<-90)
    9.                 Ang_ACC=-90;

    10. }
    11. void Gyro_Ang_cal()
    12. {
    13.                 int16_t Gyro_x_zero=0;  //ÍÓÂÝÒǾ²Ö¹Ê±XÖá½ÇËÙ¶È
    14.                 float Gyro_x_speed_ratio=0.00029386; //ÍÓÂÝÒÇ»ý·ÖϵÊý
    15.         float Gyro_x_speed;
    16.    MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);        //µÃµ½ÍÓÂÝÒÇÊý¾Ý
    17.         Car_Gyrox=(float)(gyrox*1.0-Gyro_x_zero); //xÖáÍÓÂÝÒÇËÙ¶È-¾²Ì¬Ê±Æ«²î
    18.         Gyro_x_speed=(float)((gyrox*1.0-Gyro_x_zero)*Gyro_x_speed_ratio);
    19.         Ang_Gyro=(float)(Ang_Gyro+(float)(Gyro_x_speed));
    20.                
    21. }
    复制代码


    在主函数代码,采用了互补滤波,这里关键部分实现了占空比转换,要用预分频的值作为分母,ControlPwm为分子,算出占空比,并且判断方向,控制电机正反转及速度

    1. ...............设置sctimer pwm初始化及设置部分省略,看前边的帖子
    2.                                                 ACC_Ang_cal();
    3.                                                 Gyro_Ang_cal();
    4.                                                 //PRINTF("Ang_ACC is  %d\t Ang_Gyro is %d\r\n",Ang_ACC,Ang_Gyro);
    5.                                                 
    6.                                                 /*»¥²¹Â˲£ balance filter  */
    7.                                                 Ang_Gyro_tmp=Ang_Gyro+(Ang_ACC-Ang_Gyro)*0.00525;//0.00425Ϊ»¥²¹ÏµÊý£¬ÒÀ¾Ý²¨Ðε÷Õû
    8.                                                         
    9.                                                         Ang_Deviation=Ang_Gyro_tmp-Ang_zero;
    10.                                                 ControlPwm=(int16_t)(P_up*Ang_Deviation+Car_Gyrox*D_up);
    11.                                         printf("ControlPWM is %d\r\n",ControlPwm);
    12.                                        
    13.                                         if(ControlPwm>0)
    14.                                                 direction=true;
    15.                                         else{
    16.                                                 direction=false;
    17.                                         ControlPwm=-ControlPwm;
    18.                                         }
    19.                                         updatedDutycycle=ControlPwm/(sctimerClock/2400000);
    20.                                         printf("updatedDutycycle is %d\r\n",updatedDutycycle);
    21.                                         if(updatedDutycycle==0)
    22.                                                 updatedDutycycle=1;
    23.                                         if(updatedDutycycle>98)
    24.                                                 updatedDutycycle=99;
    25.                                         //printf("ControlPWM is %d\r\n",ControlPwm);        
    26.                                         if(direction)
    27.                                         {
    28.             /* Update PWM duty cycle */
    29.             SCTIMER_UpdatePwmDutycycle(SCT0, kSCTIMER_Out_4, (updatedDutycycle), eventNumberOutput4);
    30.                                                 SCTIMER_UpdatePwmDutycycle(SCT0, kSCTIMER_Out_6, (updatedDutycycle), eventNumberOutput6);
    31.                                                 
    32.                                                 SCTIMER_UpdatePwmDutycycle(SCT0, kSCTIMER_Out_5, 1, eventNumberOutput5);
    33.                                                 SCTIMER_UpdatePwmDutycycle(SCT0, kSCTIMER_Out_7, 1, eventNumberOutput7);
    34.                                         }
    35.                                         else
    36.                                         {
    37.                                                 SCTIMER_UpdatePwmDutycycle(SCT0, kSCTIMER_Out_5, (updatedDutycycle), eventNumberOutput5);
    38.                                                 SCTIMER_UpdatePwmDutycycle(SCT0, kSCTIMER_Out_7, (updatedDutycycle), eventNumberOutput7);
    39.                                                 
    40.                                                 SCTIMER_UpdatePwmDutycycle(SCT0, kSCTIMER_Out_4, 1, eventNumberOutput4);
    41.                                                 SCTIMER_UpdatePwmDutycycle(SCT0, kSCTIMER_Out_6, 1, eventNumberOutput6);
    42.                                         }
    复制代码


    总结其实自平衡小车算法就这几种,也可以考虑用卡尔曼滤波代替互补滤波,据说效果更好,后边有时间可以做个实验。也可以拓展一下想法,别人用蓝牙/wifi控制小车,我们可以充分发挥这块板子的优势语音识别来进行声音控制,也可以考虑采用openmv(即将到来的rt1050可以发挥强大性能优势运行openmv),让小车进行主动跟踪,尽管这次任务马上要结束了,未来我还会继续更新,有条件把我的想法融入进来。由于我这边网络设置原因,上传视频比较慢,最后衷心感谢社区管管doatello帮忙代为上传视频。

    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-12-11 15:12
  • 签到天数: 190 天

    [LV.7]常住居民III

    1

    主题

    232

    帖子

    1

    高级会员

    Rank: 4

    积分
    677
    最后登录
    2019-12-11
    发表于 2017-11-8 08:09:18 | 显示全部楼层
    好帖
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2018-7-31 08:40
  • 签到天数: 43 天

    [LV.5]常住居民I

    299

    主题

    876

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    14705
    最后登录
    2020-3-1
    发表于 2017-11-8 08:22:28 | 显示全部楼层
    视频已经帮你放进去啦~
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-1-6 07:38
  • 签到天数: 736 天

    [LV.9]以坛为家II

    21

    主题

    3486

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    5093
    最后登录
    2024-1-7
    发表于 2017-11-8 10:24:32 | 显示全部楼层
    厉害厉害
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-7-5 15:45
  • 签到天数: 664 天

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5394
    最后登录
    2021-12-22
    发表于 2017-11-8 10:56:19 | 显示全部楼层
    祝贺!!
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2020-10-13 08:50
  • 签到天数: 1265 天

    [LV.10]以坛为家III

    1

    主题

    2072

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    4661
    最后登录
    2020-10-13
    发表于 2017-11-8 11:04:17 | 显示全部楼层
    围观大神作品。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-29 11:48
  • 签到天数: 822 天

    [LV.10]以坛为家III

    71

    主题

    2452

    帖子

    24

    金牌会员

    Rank: 6Rank: 6

    积分
    5531
    最后登录
    2024-5-1
     楼主| 发表于 2017-11-8 11:54:34 | 显示全部楼层
    感谢各位鼓励和支持
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
    发表于 2017-11-8 15:58:31 | 显示全部楼层
    不错不错,站立起来了,只是突然轰然倒塌,反应都没有,没有看到常见的来回摆到直立现象。不过蛮有意思的。我也想申请一个玩玩,但已很难在此网站申请到了。围观客吧。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-29 11:48
  • 签到天数: 822 天

    [LV.10]以坛为家III

    71

    主题

    2452

    帖子

    24

    金牌会员

    Rank: 6Rank: 6

    积分
    5531
    最后登录
    2024-5-1
     楼主| 发表于 2017-11-9 11:36:46 来自手机 | 显示全部楼层
    zhjb1 发表于 2017-11-8 15:58
    不错不错,站立起来了,只是突然轰然倒塌,反应都没有,没有看到常见的来回摆到直立现象。不过蛮有意思的。 ...

    有晃动,只是电池拿下来没有那么剧烈,另外仔细看看,是我推倒的,电机有反应的,抗干扰能力比较差,会逐步调校好我文中提到的几项参数,增加抗干扰能力。你想参与就长期关注社区活动,有很多这样的活动。感谢关注
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2021-1-28 20:09
  • 签到天数: 317 天

    [LV.8]以坛为家I

    61

    主题

    1582

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    8090
    最后登录
    2022-5-12
    发表于 2017-11-9 15:53:18 | 显示全部楼层

    可以通过无线模块  控制小车
    好好
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-7 22:21 , Processed in 0.133014 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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