小车直立基础_第1页
小车直立基础_第2页
小车直立基础_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上    最近有很多网友在问,关于自平衡小车制作的问题,其实这在飞思卡尔智能车比赛的时候,清华的卓晴老师的那篇文档里面说的很清楚,很多没参加比赛的人不知道或者不重视这个文档,我用自己的理解来写一个总结希望对大家有帮助,大神勿拍砖。         首先确定一下我们的目标是什么?我们得让车站起来,小车整个身体只有电机可以控制轮子,自然对小车的控制就落在了对电机的控制上。很多参加比赛的朋友由于车模是组委会发的,没去想过什么样的电机是合适的? 自然启动会快,反映越快的

2、直流电机最合适。对于直流电机的控制调速,大家都知道最常用的是脉宽调制即PWM方式,这时候就得选好电机驱动芯片了,跟你的电机匹配,电流要扛的住。再一个,把小车想成一个骑独轮车的杂技演员,维持平衡,你的保证能前后转吧,所以驱动得做成H桥型的。总结一下我们第一个目标就是做好驱动电路,可以实现对电机的正反两个方向的大概调速控制(注意是大概,无反馈调节,如果想试试PID也可以先做一下速度反馈调节)。第二个问题,稍微有点控制思想的就应该明白,小车是自平衡,自然是自己在控制,那它控制的依据是什么?根据什么去控制?对于两轮小车当它倒下去的时候,只有一个维度的两个量,那就是和直立位置的角度值和在倒下去的时候的快

3、慢值(角速度),其实他俩是一个量,因为对角速度积分就是角度值。角速度只是反映了倒下去的快慢。即变化量。好比你拿一根筷子直立在手指上,你看见它要倒下去的时候肯定手会跟着移动,你一方面看到的是筷子倒下去的角度,另一个是筷子倒的时候的快慢,角度大速度快你自然移动的快,幅度也大,角度小速度慢,你自然移动的慢幅度也小。以上纯脑袋想的,从科学的严谨性来说,还是去看卓老大的文档,从建立数学模型,到自控原理的计算分析最后得出来。所以第二个目标出来了,我们要去实时测出小车偏离直立位置的角度,这个其实是自平衡小车的第一个难点。我们说测角度一般使用加速度计就可以了,加速度计是分为模拟的和数字的两种,都是可以用的,只

4、是在实际情况中,加速度计测量的角度是不准确的,因为在小车运动过程中存在震动加速度,这会使输出值不准确,不能真实反映小车的偏转角度。这是器件本身的问题,有些人说用简单的数字滤波(中值、均值等),这些滤波是滤除的干扰信号,这本身的错误信号怎么虑出?再来考虑另一个器件 陀螺仪,我们知道陀螺仪是测量角速度的,但是角速度转换为角度是需要一个积分过程,假如在输入时有一个极小的误差,那么随着积分这个误差将会越来越大,最后得出的角度自然也是不准确的。(器件的使用是最基本的,希望大家能把这两个传感器的使用先搞明白,明白角度具体是怎么计算出来的?)这个时候才有我们常说的卡尔曼滤波、互补滤波的登场,很多人

5、在制作过程中总是觉得卡尔曼或者互补滤波很高端的东西,视线全被它们蒙蔽了,实际上它们最终的目的任然是得到最准确的角度偏离值。对于这一目标,传感器的性能、电路设计同样是很重要的。至于卡尔曼滤波和互补滤波的优劣不在这讨论,我们只说说用的较多的卡尔曼滤波,卡尔曼的前世今生大家在网上搜一下,千篇一律,没一个说到点上了的。其实作为应用我们只需知道卡尔曼输入的两个量,一个是测量值,一个是预测值,程序都是成型的,重点还是在参数的调试上。整个算法中影响输出的就是Kg的值,可以简单的理解为一种加权行为,相信谁更多一点而已。代码如下:说明:简化版卡尔曼滤波volatile float QingJiao = 0;&#

6、160; /最终准确角度输出变量定义volatile float Gyro_Data = 0; /陀螺仪float Q =1,R =3900;    /调整卡尔曼的滞后 3900  static float RealData = 0,RealData_P =10000;float NowData = 0,NowData_P =0 ;float Kg = 0,gyroscope_rate = 0,gyroscope_rat = 0,accelerometer_angle;volatile float gyroscope_angle=0&

7、#160;                                                      /用卡尔曼滤波时不用此变量int  Gyro1_zero=0;void kalman_update(void)&

8、#160;  if(zeroflag>1000)                                       /与开机自检有关,没用到的可以删去                  

9、;        zeroflag=1001;                                        /确保zeroflag不会溢出/-           Acc_z = Acc_z

10、- 28850;      /加速度计采集的AD值减去直立时的输出值                       Gyro1_zero=zerosub/1000;   /陀螺仪开机自检累加1000次后取均值 得到陀螺仪零偏值                 &

11、#160;    Gyro1  = Gyro1  - Gyro1_zero;             /陀螺仪AD采集值减去陀螺仪零偏值                    Gyro_Data = Gyro1;            &#

12、160;    accelerometer_angle=    Acc_z*180/(47915.71-12843.7);    /加速度计计算出的角度 归一化到-90 到+90     gyroscope_rate = Gyro1*0.0235*0.005;  /0.0235 是转换角度的比例值 0.005是控制周期      gyroscope_rat =gyroscope_rat

13、-Gyro1*0.0235*0.005;     /积分角速度得到角度/卡尔曼五个公式的算法实现                                                     

14、0;                            NowData = RealData -gyroscope_rate;    NowData_P = Q+RealData_P;    Kg = NowData_P/(NowData_P+R);    RealData = NowData + Kg*(accelerometer_angle - No

15、wData);    RealData_P = (1-Kg)*NowData_P;      QingJiao =  RealData;    /将准确角度结果给QingJiao        整个调试过程有三个参数需要调整,Q  R  及那个0.0235 。具体的调试这个真是说不清楚,往往算法的调试都是经验,尝试多了就有规律了。个人感觉做到这,就得用去三分之二时间。  好了,假如你已经得到准确角度,自然是开始以此作为控制量,那我们要控制成啥样?想一想也知道是要把这个角度值控制成0度(我自己将直立时定义为0度),那么自然使用常用的PID算法,偏差自然就是QingJiao-0=QingJiao,当然你可以反过来,这其实根据你自己对方向的定义。我们来个最简单的位置式PD算法:fValue = (float) P *QingJiao -(float) D*Gyro_Data;     P就是PID的P参数 D就是PID的D

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论