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口配置表:
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 DMP 到 STM32F103 上需要进行以下步骤: 1. 准备工作 首先需要准备好 MPU6050 模块,以及 STM32F103 开发板,并连接好它们。另外,还需要下载 MPU6050 DMP 库文件和 STM32F103 的开发环境,例如 Keil 或者 CubeMX。 2. 配置 I2C MPU6050 是通过 I2C 协议与 STM32F103 通信的,因此需要配置好 I2C。在 CubeMX 中选择 I2C 外设并进行配置,设置好 I2C 的时钟和引脚等参数。在 Keil 中,需要编写 I2C 相关的初始化代码。 3. 配置 MPU6050MPU6050 DMP 库中,有一份 MPU6050 库文件,其中包含了 MPU6050 初始化相关的代码。需要将该文件添加到工程中,并按照需要进行修改。主要需要配置 MPU6050 的采样率、陀螺仪量程、加速度计量程等参数。 4. 导入 DMP 库 将 MPU6050 DMP 库文件加入到工程中,并在代码中进行调用。需要注意的是,DMP 库文件需要与 MPU6050 库文件进行配合使用。 5. 填充缓冲区 在 DMP 库文件中,有一个叫做“dmp_read_fifo”的函数,该函数用于读取 MPU6050 的原始数据,并调用 DMP 算法进行处理。在该函数内部,需要填充缓冲区,将处理后的数据存储到缓冲区中。 6. 解析数据 解析数据是将缓冲区中的数据进行解析,得到姿态角度等信息。在 DMP 库文件中,有一个叫做“dmp_get_data”的函数,该函数用于解析数据。需要注意的是,解析数据的过程需要根据具体情况进行调整,例如需要考虑坐标系的转换等问题。 7. 输出结果 最后,将得到的姿态角度等信息进行输出。可以通过串口或者 OLED 屏幕等方式进行显示。 总的来说,移植 MPU6050 DMP 到 STM32F103 上需要进行一系列的配置和调试工作,需要有一定的硬件和软件基础。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值