MPU6050使用/正点原子代码移植/MPU6050注意事项/关于几个频率的解释/STM32F103
关于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相关推荐
- 单片机 STM32F103C8T6 cubeMX HAL库 从环境到开发 正点原子工程移植 freeRTOS
文章目录 0 准备材料 1 闪烁PC13的小灯 2 正点原子工程移植 注意点以及细节 3 freeRTOS 3.1 LED KEY 串口1 的一个实验 0 准备材料 1.需要正点原子的HAL介绍书籍可 ...
- STM32F103C8T6工程模板 ——固件库版、正点原子代码风格、包含SYSTEM文件夹
提示:文章包括省事部分和学会部分 文章目录 前言 一.想自己写在哪里学? 二.省事直接下载作者写好的 1.部分代码 2.工程模板包 总结 前言 笔者学习了STM32F103ZET6和STM32F104 ...
- 正点原子Linux移植Qt,正点原子I.MX6U Qt综合例程源码
I.MX6U Qt综合例程源码 介绍 正点原子I.MX6U Qt综合例程源码 使用说明 1.Windows下编译,安装Qt 5.12.9,可以在Windows编译,打开工程,编译完成后把src文件夹放 ...
- STM32F103使用MPU6050代码遇到的一些bug(正点原子代码)
1.mpu_dmp_init() 始终通过不了,运行debug之后发现卡在mpu_init(),不得不说正点这部分代码写的很瞎,我不太理解.自己找了很多资料都是返回8,然而我的却不是这种情况.只能把这 ...
- 【cubemx】移植正点原子ov2640
一.前言 这几天在用cubemx移植ov2640,数据输出到屏幕始终是蓝色的,百思不得其解,终于我找到了个大坑,那就是之前把lcd显示的方向改成了横屏(一定要设置成竖屏!),接下来进入正题,本文想实现 ...
- 正点原子gt9xx系列linux驱动移植
写这个博客的前景: 正点原子的RGB电容触摸屏触摸芯片系列: 4.3 寸屏 480x272分辨率 使用的触摸芯片是gt9xx系列 4.3寸屏 800x480分辨率 使用的触摸芯片是gt9xx系列 7 ...
- 正点原子Linux阿尔法开发板4.3 寸多点电容触摸屏测试问题和gt9xx系列linux驱动移植
正点原子Linux阿尔法开发板4.3 寸多点电容触摸屏测试问题和gt9xx系列linux驱动移植 正点原子官方CSDN 4.3 寸多点电容触摸屏测试问题 正点原子gt9xx系列linux驱动移植 1. ...
- 【正点原子FPGA连载】第二章 实验平台简介 -摘自【正点原子】新起点之FPGA开发指南_V2.1
1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...
- 【正点原子MP157连载】 第十章 U-boot使用-摘自【正点原子】【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7
1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...
最新文章
- lede 插件_家中路由换新——lede软路由安装教程
- boost::mp11::tuple_transform相关用法的测试程序
- SpringSecurity案例之认证服务security配置
- 【Java】导入项目时,出现The project cannot be built until build path errors are resolved错误解决方法
- Hadoop概念学习系列之Hadoop HA进一步深入(二十八)
- 体验下Xcode5与ios7
- AIML框架标签详解
- mysql超市管理系统怎么写_vb6.0+mysql编写的小型超市管理系统
- 使用 .NET Core 开发 BT Tracker 服务器
- Linux查看文件数量
- 软件工程(2019)第四次作业
- 弘辽科技:淘宝店铺违规再也不用怕了 这个新规能抵消扣分处罚
- SQL server-数据库的创建
- 深度学习中,偏置(bias)在什么情况可以不要?
- 高温大量程热流传感器结构及信号调理电路的设计
- C++设计模式——装饰着模式(高屋建瓴)
- 详解超声波测距模块HC-SR04的使用
- 莱布尼兹三角形(OJ0082)
- 关键绩效指标KPI项目
- C语言与G语言哪个科技含量高,20165201 学习基础和C语言基础调查