FireBLE裸奔之八MPU6050

  • 东方青
  • LV4工程师
  • |      2015-09-30 11:48:58
  • 浏览量 1779
  • 回复:5

**************************************************************************

                                       东方青学FireBle

                                        ———————转载请注明ICKey————————

**************************************************************************




FireBLE裸奔之八MPU6050

-----东方青

一直没机会玩四轴!以前做的平衡车基本上都是由三轴+加速度传感器,还有陀螺仪!能把这三轴传感器融为一体的神器还真是没用过,今天就体验一番!

在百度上扒拉了一段简介,如下:

MPU6050是全球首例9轴运动处理传感器。它集成了3MEMS陀螺仪,3MEMS加速度计,以及一个可扩展的数字运动处理器 DMP( DigitalMotion Processor),可用I2C接口连接一个第三方的数字传感器,比如磁力计。扩展之后就可以通过其 I2C接口输出一个9轴的信号。 MPU6050也可以通过其I2C接口连接非惯性的数字传感器,比如压力传感器。

嘿嘿!好像很流弊的样子!不管了!先使用它再说!首先逼逼几件东西,Datasheet和规格书。从Datasheet中基本上可以了解到,MPU6050存在主从IIC接口,即既能做主机,也可以做从机!啥意思呢?其实上面的那段话已经非常明确的表述了,MPU6050可以作为主机控制一些传感器,从而作为从机输出9轴信号,等待MCU来读取。并且还提供了各种中断,可以随时激活MCU进行读取数据。它的内部框架图如下:

FireBLE裸奔之八MPU6050

不在多说!架构图表明一切!其他的可自行参考以下两个手册:

MPU-6000 and MPU-6050 Product Specification Revision 3.4》产品规格书,描述了整一个MPU6050的架构和各种工作模式,中断等。

MPU-6000 and MPU-6050Register Map and Descriptions Revision 4.2》寄存器映射描述,讲述了MPU6050的寄存器的映射地址和寄存器的作用,也包括MPU6050数据的计算等等。再具体使用MPU6050的过程中,参考这两个手册即可。

作为在FireBLE板卡上的传感器,首先是需要让MPU6050工作起来!至于具体使用,得看详细用途。

由以上的描述可知,MCUMPU6050之间是通过IIC总线实现的通信,所以,必须要对IIC总线熟练的理解。在我的一篇文章《我的IIC学习笔记--I2C串行总线的组成及工作原理》中已经很详细的分析了IIC总线协议。在此不做多说。下面就是移植FireBLEMPU6050的例程为己用的过程。

1.确定硬件。

先看原理图:

FireBLE裸奔之八MPU6050

呵呵!好简单的原理图啊!与MCU相连的有三个引脚,并且按照功能分:IICSDA-P2.3 SCL-P2.4;中断P3.1。再看QN9021Datasheet

FireBLE裸奔之八MPU6050

嘿嘿!的确是IIC接口哇!因为每个GPIO口都可以作为外部中断输入,所以P3.1作为中断口毋庸置疑。

2.移植MPU6050例程

找到例程,如图:

FireBLE裸奔之八MPU6050

然后打开工程移植相关代码到我们自己的工程。

可分成两部分移植:

(1)IIC通信协议相关代码

(2)MPU6050的读写相关代码

(3)MPU6050初始化代码

由于代码较多!这里只说明一下MPU6050的初始化代码和应用代码,因为为了能让我更方便的时候,作了一些修改!

FireBLE裸奔之八MPU6050

这个MPU的初始化分成两个部分,先初始化IIC总线,再初始化MPU6050,初始化MPU6050其实就是想MPU6050的寄存器写入各种初始化值,使其能够正常按照我们的规定工作。关于寄存器,需要查询MPU6050的寄存器映射规格书。

FireBLE裸奔之八MPU6050

IIC的初始化,没什么好说的!但是需要注意的是,这里申请了一个长度为104Byte的内存空间,这里尤其注意。

FireBLE裸奔之八MPU6050

这里就是我写或者我修改过的了!mpu_6050_int_flag全局变量作为MPU6050的中断标志,数组mpu6050_buf用来读取MPU6050的数据,之所以用数组是因为其一定义就会分配好内存空间,并且是连续的内存空间。在下面的void mpu6050_int_init(void)函数就是中断引脚的初始化喽,因为MPU6050会产生中断来提醒MCU读取数据,所以配置MCU的外部中断输入口。然后我将所有的关于MPU6050的初始化全部写在一个函数void MPU6050_InitConfig(void);以方便调用。

这就是MPU6050_Device.c文件的初始化内容了!所有关于MPU6050的驱动代码和初始化代码都在此文件。

(4)应用MPU6050

实际上就是使用MPU6050干事啦!因MPU6050的有效数据的获取是需要中断来提醒MCU,再进行采集的,所有如果放在while循环里面轮询判断标志采集,我觉得这是一件吃力不讨好的事,而且为了能够更好的融合到我前面搭建的代码软件框架,所以就不走寻常路了。

因为前面的代码中,外部中断函数放在Key_Device.c文件中,索性也不修改位置了,并且还要保证前面的代码能够正常运行才是真理,所以就直接在Key_Device.c文件中干事了!因为这只与中断相关。

FireBLE裸奔之八MPU6050

这就是外部中断函数的回调函数。以前的关于按键扫描的代码一点都没有修改!在下面添加判断是不是P31引脚产生的中断,若是,则读取加速度和陀螺仪的数据,因为没有实际的应用,所以在这里打印出来。就是这样简单。

关于main函数的调用:

FireBLE裸奔之八MPU6050

呵呵!Mian函数除了多了一句关于MPU6050的初始化函数调用外,其他的代码和以前的代码没有任何差别!且看效果如下:

FireBLE裸奔之八MPU6050

以上就是打印出的MPU6050的数据,加速度和陀螺仪的数据。再看如下 ,当按下按键时的现象:

FireBLE裸奔之八MPU6050

嘿嘿!可以干很多事!基本上不影响相互之间的功能!就是这样!所以,编写代码是,风格个技巧是非常重要的!并且最好在这之前,只要思维导图构思过软件的框架,这样才能很好的保证代码的执行效率、可读性、可复用性等。当中这有些是冲突的,比如执行效率和可复用性有时候就会存在冲突,那么根据实际情况折中即可。


源码: 

  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:4
东方青 2015-10-13
0   回复
举报
发布
玲玲灵灵2013 2015-10-12
哈哈,大鹏兄
0   回复
举报
发布
东方青 2015-09-30
多谢大鹏兄捧场!
0   回复
举报
发布
秦时茗月 2015-09-30
稳稳地占据了一楼
0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子