马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
【Artix-7开发板试用】之二系统设计方案和MPU6050简介 1
系统方案介绍项目采用ARTIX-7开发板为核心,外加MPU6050姿态传感器、L298N电机控制器、两轮电机和航模电池等核心模块构建两轮自平衡小车,利用FPGA的强大并行计算能力实时处理算法中的浮点数据运算,提高运算速度和精度,充分体现FPGA的强大逻辑控制功能和并行算法、浮点算法等处理功能,最终实现两轮小车的自动行走、加速、减速、转弯、静止等功能。 本系统设计方案如下:
在两轮自平衡小车中最重要的是MPU6050算法和整体控制逻辑,下面整理下关于MPU6050的资料: 2
MPU6050介绍2.1
产品简介MPU-60X0是全球首例9轴运动处理传感器。 它集成了3轴MEMS陀螺仪 , 3轴MEMS加速度计 ,以及一个可扩展的数字运动处理器DMP( Digital Motion Processor ),可用 I2C接口连接一个第三方的数字传感器,比如磁力计。扩展之后就可以通过其 I2C 或 SPI 接口输出一个9轴的信号(SPI接口仅在MPU-6000 可用)。MPU-60X0 也可以通过其 I2C 接口连接非惯性的数字传感器,比如压力传感器。 MPU-60X0 对陀螺仪和加速度计分别用了三个16位的 ADC,将其测量的模拟量转化为可输出的数字量。为了精确跟踪快速和慢速的运动,传感器的测量范围都是用户可控的,陀螺仪可测范围为± 250 , ± 500 , ± 1000 , ± 2000 ° / 秒( dps ) ,加速度计可测范围为 ± 2 , ± 4 ,± 8 , ± 16g 。 一个片上 1024 字节的 FIFO ,有助于降低系统功耗。 和所有设备寄存器之间的通信采用 400kHz 的 I2C 接口或1MHz 的 SPI 接口(SPI 仅MPU-6000可用 )。对于需要高速传输的应用,对寄存器的读取和中断可用 20MHz的SPI 。 另外,片上还内嵌了一个温度传感器和在工作环境下仅有 ± 1% 变动的振荡器。 芯片尺寸 4 × 4 × 0.9mm ,采用 QFN 封装(无引线方形封装) ,可承受最大 10000g 的冲击,并有可编程的低通滤波器。 2.2
MPU6050特点以数字输出6轴或9轴的旋转矩阵、四元数 (quaternion) 、欧拉角格式 (Euler Angle forma)的融合演算数据。 具有 131 LSBs/°/sec 敏感度与全格感测范围为 ± 250 、± 500 、 ± 1000 与 ± 2000 °/sec 的3轴角速度感测器 ( 陀螺仪 ) 。 可程式控制,且程式控制范围为 ± 2g 、 ± 4g 、 ± 8g 和± 16g 的 3 轴加速器。移除加速器与陀螺仪轴间敏感度,降低设定给予的影响与感测器的飘移。数字运动处理(DMP: Digital Motion Processing) 引擎可减少复杂的融合演算数据、感测器同步化、姿势感应等的负荷。运动处理数据库支持 Android 、 Linux 与Windows 内建之运作时间偏差与磁力感测器校正演算技术,免除了客户须另外进行校正的需求。
2.3
加速度测量重力加速度可以理解成是由x,y,z三个方向的加速度共同作用的结果。反过来说就是重力加速度可以分解成x,y,z三个方向的加速度。 加速度计可以测量某一时刻x,y,z三个方向的加速度值。而自平衡小车利用加速度计测出重力加速度在x,y,z轴的分量,然后利用各个方向的分量与重力加速度的比值来计算出小车大致的倾角。 如下图,把加速度计平放,分别画出xyz轴的方向。这三个轴就是我们后边分析所要用到的坐标系。
把mpu6050安装在自平衡车上时也是这样的水平安装在小车底盘上的,假设两个车轮安装时车轴和y轴在一条直线上。那么小车摆动时,参考水平面就是桌面,并且车轴(y轴)与桌面始终是平行的,小车摆动和移动过程中y轴与桌面的夹角是不会发生变化的,一直是0度。发生变化的是x轴与桌面的夹角以及z轴与桌面的夹角,而且桌面与x轴z轴夹角变化度数是一样的。所以我们只需要计算出x轴和z轴中任意一个轴的夹角就可以反映出小车的倾斜的情况了。
为了方便分析,由于y轴与桌面夹角始终不变,我们从y轴的方向俯看下去,那么这个问题就会简化成只有x轴和z轴的二维关系。假设某一时刻小车上加速度计(mpu6050)处于如下状态,下图是我们看到简化后的模型。
在这个图中,y轴已经简化和坐标系的原点o重合在了一起。我们来看看如何计算出小车的倾斜角,也就是与桌面的夹角a。上图g是重力加速度,gx、gz分别是g在x轴和z轴的分量。 由于重力加速度是垂直于水平面的,得到: 角a+角b=90度 X轴与y轴是垂直关系,得到: 角c+角b=90度 于是轻松的就可以得出: 角a=角c 根据力的分解,g、gx、gz三者构成一个长方形,根据平行四边形的原理可以得出: 角c=角d
所以计算出角度d就等效于计算出了x轴与桌面的夹角a。前边已经说过gx是g在x轴的分量,那么根据正弦定理就可以得出: Sind=gx/g 得到这个公式可是还是得不到想要的角度,因为需要计算反正弦,而反正弦在单片机里不是很好计算。 为了得到角度,于是又查了相关资料,原来在角度较小的情况下,角度的正弦与角度对应的弧度成线性关系。先看看下边的图:
这个图x轴是角度,取值范围是0~90度,有三个函数曲线,分别是: Y=sinx 正弦曲线 Y=x*3.14/180 弧度 Y=0.92*x*3.14/180 乘以一个0.92系数的弧度 从图上可以看出,当角度范围是0~29度时: sinx=x*3.14/180 对于自平衡车来说,小车的摆动范围在-29~29度之内,如果超过这个范围,小车姿态也无法调整,所以对于自平衡小车sinx=x*3.14/180基本上是成立的。当然有时候也会担心-29~29度的摇摆范围还是无法满足需求。那可以给上边的公式乘一个系数。得到如下公式: Sinx=k*x*3.14/180 从上边的函数对比图可以看出,当系数取0.92时,角度范围可以扩大到-45~45度。经过这一系列的分析,终于得到角度换算方法: Sind=gx/g Sind=k*d*3.14/180 得到: gx/g=k*d*3.14/180 那么角度就可以通过如下公式计算出: d=180*gx/(k*g*3.14) 而gx可以从加速度计里读出来,所以这下角度就可以轻松得到了。而之前也说过这个角度不是很精确,但是至少可以反映出角度变化的趋势。不过可以通过卡尔曼滤波等算法把加速度计读出的角度和陀螺仪读出的角度结合起来,使小车的角度更加准确。
2.4
陀螺仪测量角速度通过陀螺仪来测量角度就很简单了,因为陀螺仪读出的是角速度,大家都知道,角速度乘以时间,就是转过的角度。把每次计算出的角度做累加就会等到当前所在位置的角度。先看下图:
假设最初陀螺仪是与桌面平行,单片机每tms读一次陀螺仪的角速度,当读了三次角速度以后 z轴转到上图的位置,则在这段时间中转过的角度为x: 角x=角1+角2+角3 假设从陀螺仪读出的角速度为w,那总角度为: X=(w1*t1+w2*t2+w3*t3)/1000 假设经过n次,那么总的角度如下: X=(w1*t1+w2*t2+w3*t3+…+wn*tn)/1000 实际上这就是一个积分过程。 其实这种计算出来的角度也存在一定的误差,而且总的角度是经过多次相加得到的,这样误差就会越积累越大,最终导致计算出的角度与实际角度相差很大。于是也可以使用卡尔曼滤波把加速度计读出的角度结合在一起,使计算出的角度更准确。
|