关于MPU6050

MPU6050简单介绍

对于各位接触到MPU6050的同学们来说,应该不缺MPU6050的参考资料,
其中有一篇《MPU-6000 / MPU-6050 产品说明书》—— By LeeDy.Li 2013.1.7的翻译文档。
正点原子、野火的开发指南都有详细的MPU6050介绍。

MPU6050有 3 轴陀螺仪3 轴加速度传感器,还有一个第二个IIC,用于接外部磁力传感器,对于这个IIC,应该算是一个比较鸡肋的功能,磁力计直接接到主控上面是一个不错的解决方案。
MPU6050自带的数字运动处理器(DMP: Digital Motion Processor)硬件
加速引擎
,可以减少MCU的负载,但是这个功能,亲测是比较麻烦的,它可能有时候初始化失败,或者是什么别的情况,甚至连导线连接都可能导致初始化失败,所以建议使用这个功能的时候,把它焊丝在主板上面,至少要保证接线的牢靠。

两种使用方式

如题,两种使用方式

一种是不使用DMP,直接将未经处理过的模拟量数据,直接输入到单片机中处理

另一种是使用DMP,将处理好的熟肉,发送到单片机中

频率解释

这个是加速度的介绍,加速度最高输出频率1KHz

这个是陀螺仪的介绍,陀螺仪最高输出频率8KHz

DMP解算频率最高200Hz,这个也就是可以设定的中断频率

也就是原子在inv_mpu.h文件中加入的这一个输出频率。
这个频率与中断引脚触发时间相同。

//设置MPU6050的采样率(假定Fs=1KHz)
//rate:4~1000(Hz)
//返回值:0,设置成功
//    其他,设置失败
u8 MPU_Set_Rate(u16 rate)
{u8 data;if(rate>1000)rate=1000;if(rate<4)rate=4;data=1000/rate-1;data=MPU_Write_Byte(MPU_SAMPLE_RATE_REG,data);  //设置数字低通滤波器return MPU_Set_LPF(rate/2);  //自动设置LPF为采样率的一半
}

那么这个设定频率的函数是干什么用的呢?
设置MPU6050的采样率,即陀螺仪的采样频率。

#define MPU_SAMPLE_RATE_REG      0X19    //采样频率分频器

其中操作了采样频率分频器,在原子的开发指南中有提到该寄存器,以及计算公式

关于地址


MPU6050通过改变AD0引脚的高低电平来改变地址
高电平为0X69,低电平为0X68
如果输出地址为0XFF,那么请检查IIC的引脚配置是否正确(具体方法见下)、接线是否牢靠、以及MPU6050是否放平(或是处于其检测的水平位置,可尝试适当倾斜MPU6050直至DMP初始化成功,输出数据)

关于FIFO

自带 1024 字节 FIFO,有助于降低系统功耗

MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);    //关闭FIFO

那么什么时候用,什么时候不用呢?
使用DMP的时候就可以不用FIFO。

正点原子程序移植

通过CSDN的这类标题搜索,可以找到相关大佬写的文章,里面都已经比较详细。
比如:《MPU6050移植正点原子指南和寄存器操作端口模式#define SDA_IN() /#define SDA_OUT()》
在这里重复做一下详细的梳理:

复制文件

首先将其工程内HARDWARE->MPU6050文件夹内所有文件拷贝到自己的工程文件夹中

如果不更改地址,那么所需要的更改部分只有三处,如果不改引脚,那就什么都不用动。
复制完之后记得在工程里添加头文件路径,以及将其添加到工程中。
这里以STM32F103ZET6即原子精英板工程为示例:
这里我们先说说改引脚的:

更改IO口

首先是mpuiic.c文件这里这个例程是软件模拟IIC,所以,只需要初始设置为推挽输出就可以了,如果用硬件IIC则需要设置为开漏输出,那么整个IIC文件就要重新写了。

然后是mpu6050.c文件,因为精英板的接线,以及ATK-MPU6050的设计,所以其AD0接到了PA15上了,这里的语句代表PA15端口重定义为普通IO口,并置为低电平。
AD0可以不接线,模块本身就带了一个下拉电阻,使其悬空状态为低电平,如果不用可以删掉,或者是从这里改引脚。

下面就是最容易出错的部分

这里是mpuiic.h文件

这里用到了寄存器的相关操作。

补充寄存器相关知识

以下内容均在手册或相关开发指南中有详细介绍。

STM32 的每个 IO 端口都有 7 个寄存器来控制。他们分别是:配置模式的 2 个 32 位的端口配置寄存器 CRL 和 CRH;2 个 32 位的数据寄存器 IDR 和 ODR;1 个 32 位的置位/复位寄存器BSRR;一个 16 位的复位寄存器 BRR;1 个 32 位的锁存寄存器 LCKR。大家如果想要了解每个寄存器的详细使用方法,可以参考《STM32 中文参考手册 V10》P105~P129。

这里操作的主要是两个32位的端口配置寄存器——CRL和CRH

CRL 和 CRH 控制着每个 IO 口的模式及输出速率。

CRL是低位寄存器,负责 IO 0-7
CRH是高位寄存器,负责 IO 8-15

不难理解,L代表LOW,H代表HIGH

一个IO口占4个位,这是STM32IO口配置表:

刚刚我们说它们是32位寄存器,一个IO占四位,4*8=32,所以低位寄存器可以控制8个IO口。(配合这个和上面的图理解一下)

那么我们应该如何修改这些代码呢?首先下列代码是控制PB11的:

#define MPU_SDA_IN()  {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}
//PB11上下拉输入
#define MPU_SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}
//PB11推挽输出

可以看见,这GPIOB->CRH即GPIOB的高位寄存器,控制 IO 8-15

GPIOB->CRH&=0XFFFF0FFF//对即将操作的那个IO的位进行清零
GPIOB->CRH|=3<<12//这个是一个位操作,即将数字3左移12位

为什么是12?前面有提到,一个IO口占四个位
前面一共有三个IO,或者说,你可以看上一个操作,清零操作的0的右边,有3个F,也就是三个IO,3*4=12

那么,3和8,又是什么意思?
3是0011 8是1000 对应上面对于寄存器位的控制数字
8就代表上拉/下拉输入 3代表推挽50MHz输出

如果还是不够清楚,CSDN上面还有很多类似的文章。

更改好的代码示例

下面是PB7的代码

#define MPU_SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<28;}
//PB7上下拉输入
#define MPU_SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;}
//PB7推挽输出

需要更改的地方有四处
1.高低位寄存器选择
2.清零的0的位置
3.位移的数目
4.GPIO的选择
当然,这里的改动,有些地方是不会变的,所以这里我们实际只改动了三处。

不过,有细心的小伙伴会发现,以上代码放进去会发生编译的错误:

…\HARDWARE\MPU6050\mpuiic.c(65): warning: #61-D: integer operation result is out of range
这是因为编译器默认signed int即32位有符号整数类型,而1<<31实际为0x80000000,这样就有可能改写了符号位(最高位) 。
所以

#define MPU_SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define MPU_SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}

在8<<28前面加上u32就可以了

继续移植代码

好了,接下来继续移植代码,这个改相应的数字就可以了。


那么现在你就已经算是大体上改完了,能用了。

提一个小小的建议,就是,不要去质疑代码的正确性,这类代码,如果移植之后不能用,那一定是哪些地方出了问题,引脚配置什么的,导线连接什么的。
因为,这个代码,是好多人都移植成功的东西。

地址更改

对于更改地址的同学,需要将AD0拉高之外,还有mpu6050.h文件中的这个引脚定义

以及同样在这个文件中的地址定义:


如果在改地址之后使用DMP的话,只改这一处是不够的,按照原子的说法

这两个文件是mpu6050的使用程序。

而这两个文件是DMP的使用程序


参照这个文章的说法《MPU6050/MPU9150传感器的DMP数据读取中遇到的问题总结》

inv_mpu.h文件中的这个位置也是需要更改的

总结

基本上MPU6050的使用也就是这些东西,当然有操作寄存器的部分,这些都是要看手册了,笔者也是一个入门的初学者,现在网上东西都比较乱,我想着把他们所说的,或者说是各类的资源,稍微的整合一下,希望这些能够帮助到你们,如果有错误,还请斧正。
MPU6050作为一个价格低廉的芯片,总是有各类玄学问题的产生,硬件就是这个样子,改同样的东西,你就不行,放别人电脑上,两三下就能用了。
基本上能焊死的尽量焊死就万事大吉了,对于这个的学习,还是应当去论坛或者是多翻一翻参考书,数据手册什么的。

MPU6050使用/正点原子代码移植/MPU6050注意事项/关于几个频率的解释/STM32F103相关推荐

  1. 单片机 STM32F103C8T6 cubeMX HAL库 从环境到开发 正点原子工程移植 freeRTOS

    文章目录 0 准备材料 1 闪烁PC13的小灯 2 正点原子工程移植 注意点以及细节 3 freeRTOS 3.1 LED KEY 串口1 的一个实验 0 准备材料 1.需要正点原子的HAL介绍书籍可 ...

  2. STM32F103C8T6工程模板 ——固件库版、正点原子代码风格、包含SYSTEM文件夹

    提示:文章包括省事部分和学会部分 文章目录 前言 一.想自己写在哪里学? 二.省事直接下载作者写好的 1.部分代码 2.工程模板包 总结 前言 笔者学习了STM32F103ZET6和STM32F104 ...

  3. 正点原子Linux移植Qt,正点原子I.MX6U Qt综合例程源码

    I.MX6U Qt综合例程源码 介绍 正点原子I.MX6U Qt综合例程源码 使用说明 1.Windows下编译,安装Qt 5.12.9,可以在Windows编译,打开工程,编译完成后把src文件夹放 ...

  4. STM32F103使用MPU6050代码遇到的一些bug(正点原子代码)

    1.mpu_dmp_init() 始终通过不了,运行debug之后发现卡在mpu_init(),不得不说正点这部分代码写的很瞎,我不太理解.自己找了很多资料都是返回8,然而我的却不是这种情况.只能把这 ...

  5. 【cubemx】移植正点原子ov2640

    一.前言 这几天在用cubemx移植ov2640,数据输出到屏幕始终是蓝色的,百思不得其解,终于我找到了个大坑,那就是之前把lcd显示的方向改成了横屏(一定要设置成竖屏!),接下来进入正题,本文想实现 ...

  6. 正点原子gt9xx系列linux驱动移植

    写这个博客的前景: 正点原子的RGB电容触摸屏触摸芯片系列: 4.3 寸屏  480x272分辨率 使用的触摸芯片是gt9xx系列 4.3寸屏 800x480分辨率 使用的触摸芯片是gt9xx系列 7 ...

  7. 正点原子Linux阿尔法开发板4.3 寸多点电容触摸屏测试问题和gt9xx系列linux驱动移植

    正点原子Linux阿尔法开发板4.3 寸多点电容触摸屏测试问题和gt9xx系列linux驱动移植 正点原子官方CSDN 4.3 寸多点电容触摸屏测试问题 正点原子gt9xx系列linux驱动移植 1. ...

  8. 【正点原子FPGA连载】第二章 实验平台简介 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  9. 【正点原子MP157连载】 第十章 U-boot使用-摘自【正点原子】【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

最新文章

  1. lede 插件_家中路由换新——lede软路由安装教程
  2. boost::mp11::tuple_transform相关用法的测试程序
  3. SpringSecurity案例之认证服务security配置
  4. 【Java】导入项目时,出现The project cannot be built until build path errors are resolved错误解决方法
  5. Hadoop概念学习系列之Hadoop HA进一步深入(二十八)
  6. 体验下Xcode5与ios7
  7. AIML框架标签详解
  8. mysql超市管理系统怎么写_vb6.0+mysql编写的小型超市管理系统
  9. 使用 .NET Core 开发 BT Tracker 服务器
  10. Linux查看文件数量
  11. 软件工程(2019)第四次作业
  12. 弘辽科技:淘宝店铺违规再也不用怕了 这个新规能抵消扣分处罚
  13. SQL server-数据库的创建
  14. 深度学习中,偏置(bias)在什么情况可以不要?
  15. 高温大量程热流传感器结构及信号调理电路的设计
  16. C++设计模式——装饰着模式(高屋建瓴)
  17. 详解超声波测距模块HC-SR04的使用
  18. 莱布尼兹三角形(OJ0082)
  19. 关键绩效指标KPI项目
  20. C语言与G语言哪个科技含量高,20165201 学习基础和C语言基础调查

热门文章

  1. 关于PureMVC的个人理解与实现
  2. 手把手教你CSDN排版(纯自留)
  3. 软件BUG造成本次动车追尾,警方已经拘留了两名 无证 程序员
  4. 事件分发机制原理及其分析
  5. 解决ie7,8不能使用css3的border-radius的方法
  6. 读 在浮躁的年代里做学问..
  7. Python学习日记(十九) 模块导入
  8. 记一次C语言课堂实验:实现进程调度及三态转换,基于LinuxGCC
  9. CSS选择器,盒子模型及浮动
  10. [网络工程师]-计算机硬件基础-Flynn分类法