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作为一个价格低廉的芯片,总是有各类玄学问题的产生,硬件就是这个样子,改同样的东西,你就不行,放别人电脑上,两三下就能用了。
基本上能焊死的尽量焊死就万事大吉了,对于这个的学习,还是应当去论坛或者是多翻一翻参考书,数据手册什么的。

物联沃分享整理
物联沃-IOTWORD物联网 » MPU6050在STM32F103上的移植:注意事项与关于几个频率的解释

发表评论