基于MiniSTM32的mpu6050学习笔记(一)

本文详细介绍了基于MiniSTM32的MPU6050学习,包括MPU6050的特点、模块寄存器、引脚说明及初始化步骤。通过IIC接口连接STM32,初始化后,MPU6050能输出3轴陀螺仪和3轴加速度传感器的原始数据,文中还提供了部分关键程序代码。
摘要由CSDN通过智能技术生成

一、MPU6050简介

mpu6050内部整合了 3 轴陀螺仪和 3 轴加速度传感器,并可利用自带的数字运动处理器(DMP: Digital Motion Processor)硬件加速引擎,通过主 IIC 接口,向应用端输出姿态解算后的数据。有了DMP,我们可以使用 InvenSense 公司提供的运动处理资料库,非常方便的实现姿态解算,降低了运动处理运算对操作系统的负荷,同时大大降低了开发难度。

mpu6050的特点:

① 以数字形式输出 6 轴或 9 轴(需外接磁传感器)的旋转矩阵、四元数(quaternion)、欧拉角格式(Euler Angle forma)的融合演算数据(需 DMP 支持)
② 具有 131 LSBs/°/sec 敏感度与全格感测范围为±250、±500、±1000 与±2000°/sec 的 3 轴角速度感测器(陀螺仪)
③ 集成可程序控制,范围为±2g、±4g、±8g 和±16g 的 3 轴加速度传感器
④ 移除加速器与陀螺仪轴间敏感度,降低设定给予的影响与感测器的飘移
⑤ 自带数字运动处理(DMP: Digital Motion Processing)引擎可减少 MCU 复杂的融合演算数据、感测器同步化、姿势感应等的负荷
⑥ 内建运作时间偏差与磁力感测器校正演算技术,免除了客户须另外进行校正的需求
⑦ 自带一个数字温度传感器
⑧ 带数字输入同步引脚(Sync pin)支持视频电子影相稳定技术与 GPS
⑨ 可程序控制的中断(interrupt),支持姿势识别、摇摄、画面放大缩小、滚动、快速下降中断、high-G 中断、零动作感应、触击感应、摇动感应功能
⑩ VDD 供电电压为 2.5V±5%、3.0V±5%、3.3V±5%、VLOGIC 可低至 1.8V± 5%
⑪ 陀螺仪工作电流:5mA,陀螺仪待机电流:5uA;加速器工作电流:500uA,加速器省电模式电流:40uA@10Hz
⑫ 自带 1024 字节 FIFO,有助于降低系统功耗
⑬ 高达 400Khz 的 IIC 通信接口
⑭ 超小封装尺寸:4x4x0.9mm(QFN)
MPU6050 传感器的检测轴如图 1.1.1 所示:
在这里插入图片描述
MPU6050 的内部框图如图 1.1.2 所示:
图1.1.2MPU6050框图
其中,SCL 和 SDA 是连接 MCU 的 IIC 接口,MCU 通过这个 IIC 接口来控制MPU6050,另外还有一个 IIC 接口:AUX_CL 和 AUX_DA,这个接口可用来连接外部从设备,比如磁传感器,这样就可以组成一个九轴传感器。
AD0 是从 IIC 接口(接 MCU)的地址控制引脚,该引脚控制IIC 地址的最低位。如果接 GND,则 MPU6050 的 IIC 地址是:0X68,如果接 VDD,则是0X69 注意:这里的地址是不包含数据传输的最低位的(最低位用来表示读写)!!

接下来对一些主要寄存器的简要介绍

二、模块重要寄存器简介

1、电源管理寄存器1(寄存器地址为0X6B)电源管理器寄存器1各位描述
DEVICE_RESET 位用来控制复位,设置为 1,复位 MPU6050,复位结束后,MPU
硬件自动清零该位。
SLEEEP 位用于控制 MPU6050 的工作模式,复位后,该位为 1,即进入了睡眠模式(低功耗),所以我们要清零该位,以进入正常工作模式。
TEMP_DIS 用于设置是否使能温度传感器,设置为 0,则使能。
CLKSEL[2:0]用于选择系统时钟源,选择关系如下表:

CLKSEL[2:0] 时钟源
000 内部 8M RC 晶振
001 PLL,使用 X 轴陀螺作为参考
010 PLL,使用 Y 轴陀螺作为参考
100 PLL,使用外部 32.768Khz 作为参考
101 PLL,使用外部 19.2Mhz 作为参考
110 保留
111 关闭时钟,保持时序产生电路复位状态

我们一般选择 X/Y/Z 轴陀螺作为参考的 PLL 作为时钟源,一般设置 CLKSEL=001 即可。

2、陀螺仪配置寄存器(寄存器地址为:0X1B)
在这里插入图片描述
我们只关心 FS_SEL[1:0]这两个位,用于设置陀螺仪的满量程范围:0,±250°/S;1,±500°/S;2,±1000°/S;3,±2000°/S;我们一般设置为 3,即±2000°/S,因为陀螺仪的 ADC 为 16 位分辨率,所以得到灵敏度为:65536/4000=16.4LSB/(°/S)。

3、加速度传感器配置寄存器(寄存器地址为:0X1C)
在这里插入图片描述
我们只关心 AFS_SEL[1:0]这两个位,用于设置加速度传感器的满量程范围:0, ±2g;1,±4g;2,±8g;3,±16g;我们一般设置为 0,即±2g,因为加速度传感器的ADC 也是 16 位,所以得到灵敏度为:65536/4=16384LSB/g。

4、FIFO 使能寄存器(寄存器地址为:0X1C)
在这里插入图片描述
设置对应位为 0 即可禁止 FIFO,设置为 1,则使能 FIFO。注意加速度传感器的 3 个轴,全由 1个位(ACCEL_FIFO_EN)控制,只要该位置 1,则加速度传感器的三个通道都开启 FIFO了。

5、陀螺仪采样率分频寄存器(寄存器地址为:0X19)
在这里插入图片描述该寄存器用于设置 MPU6050 的陀螺仪采样频率,计算公式为:采样频率 = 陀螺仪输出频率 / (1+SMPLRT_DIV)
DLPF 滤波频率一般设置为采样率的一半。采样率,我们假定设置为 50Hz,那么 SMPLRT_DIV=1000/50-1=19。

6、配置寄存器(寄存器地址为:0X1A)
在这里插入图片描述
我们主要关心数字低通滤波器(DLPF)的设置位,即:DLPF_CFG[2:0],加速度计和陀螺仪,都是根据这三个位的配置进行过滤的。DLPF_CFG 不同配置对应的过滤情况如图所示:
在这里插入图片描述
一般我们设置角速度传感器的带宽为其采样率的一半,如前面所说的,如果设置采样率为 50Hz,那么带宽就应该设置为 25Hz,取近似值 20Hz,就应该设置 DLPF_CFG=100。

7、电源管理寄存器 2(寄存器地址为:0X6C)
在这里插入图片描述
LP_WAKE_CTRL 用于控制低功耗时的唤醒频率。剩下的 6 位,分别控制加速度和陀螺仪的 x/y/z 轴是否进入待机模式,这里我们全部都不进入待机模式,所以全部设置为 0 即可。

8、陀螺仪数据输出寄存器(总共有 8 个寄存器组成,地址为:0X43~0X48)通过读取这 8 个寄存器,就可以读到陀螺仪 x/y/z 轴的值,比如 x 轴的数据,可以通过读取0X43(高 8 位)和 0X44(低 8 位)寄存器得到,其他轴以此类推

9、加速度传感器数据输出寄存器(也有 8 个,地址为:0X3B~0X40)
读取数据与陀螺仪方式相同。

10、温度传感器数据输出寄存器:可以通过读取 0X41(高 8 位)和 0X42(低 8 位)寄存器得到,温度换算公式为:Temperature = 36.53 + regval/340
其中,Temperature 为计算得到的温度值,单位为℃,regval 为从 0X41 和 0X42 读到的温度传感器值。

三、模块引脚说明

MPU6050的原理图
MPU6050模块原理图
由于MiniSTM32开发板没有自带ATK-MODULE接口,所以运用杜邦线将其连接。连接关系如图所示:

MiniSTM32与MPU6050模块实物连接图
我们的 MiniSTM32 开发板与 MPU6050 模块的连接,只用了 4 根线:VCC,GND,SDA,SCL。模块的 MPU_INT 和 MPU_AD0 并没有用到,所以,模块的地址为:0X68。另外,这里我们将 MPU6050 模块的 SDA 和 SCL 连接在开发板的 PC11 和 PC12上面,实际上和开发板板载的 24C02 芯片共用了 IIC 接口,不过因为 24C02 的地址和MPU6050 的地址并不冲突,所以他们可以共用这个 IIC 接口,互不影响。

四、串口打印原始数据

1、mpu6050初始化步骤

1)初始化 IIC 接口
MPU6050 采用 IIC 与 STM32F1 通信,所以我们需要先初始化与 MPU6050 连接的 SDA和 SCL 数据线。 (有关IIC通信协议的介绍可以点击这里
2)复位 MPU6050
这一步让 MPU6050 内部所有寄存器恢复默认值,通过对电源管理寄存器 1(0X6B)的bit7 写 1 实现。 复位后,电源管理寄存器 1 恢复默认值(0X40),然后必须设置该寄存器为0X00,以唤醒 MPU6050,进入正常工作状态。
3)设置角速度传感器(陀螺仪)和加速度传感器的满量程范围
这一步,我们设置两个传感器的满量程范围(FSR),分别通过陀螺仪配置寄存(0X1B)和加速度传感器配置寄存器(0X1C)设置。我们一般设置陀螺仪的满量程范围为±2000dps,加速度传感器的满量程范围为±2g。
4)设置其他参数
这里,我们还需要配置的参数有:关闭中断、关闭 AUX IIC 接口、禁止 FIFO、设置陀螺仪采样率和设置数字低通滤波器(DLPF)等。陀螺仪采样率通过采样率分频寄存器(0X19)控制,这个采样率我们一般设置为 50 即可。数字低通滤波器(DLPF)则通过配置寄存器(0X1A)设置,一般设置 DLPF 为带宽的 1/2 即可。
5)配置系统时钟源并使能角速度传感器和加速度传感器
系统时钟源同样是通过电源管理寄存器1(0X1B)来设置,该寄存器的最低三位用于设置系统时钟源选择,默认值是 0(内部 8M RC 震荡),不过我们一般设置为 1,选择 x 轴陀螺 PLL 作为时钟源,以获得更高精度的时钟。同时,使能角速度传感器和加速度传感器,这两个操作通过电源管理寄存器 2(0X6C)来设置,设置对应位为 0 即可开启。

至此,MPU6050 的初始化就完成了,可以正常工作了(其他未设置的寄存器全部采用默认值即可)

通过上面对MPU6050和其相关主要寄存器以及引脚原理图的介绍,相信大家对该模块也有了一个初始的了解,因为MPU6005整合了3 轴陀螺仪和 3 轴加速度传感器,并且也包含温度传感器,会通过陀螺仪数据输出寄存器、加速度传感器数据输出寄存器、温度传感器数据输出寄存器获取到X 、Y、Z轴的加速度和陀螺仪数据和温度。本次实验只测加速度和陀螺仪数据,通过串口打印出数据(属于原始数据,没有通过DMP处理)下面是部分程序代码

2、相关程序代码

先看一下mpuiic.c代码,里面有IIC通信

#include "mpuiic.h"
#include "delay.h"

//MPU IIC 延时函数
void MPU_IIC_Delay(void)
{
   
	delay_us(2);
}

//初始化IIC
void MPU_IIC_Init(void)
{
   					     
  GPIO_InitTypeDef  GPIO_InitStructure;
	
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//先使能外设IO PORTC时钟 
		
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11;	 // 端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
  GPIO_Init(GPIOC, &GPIO_InitStructure);					 //根据设定参数初始化GPIO 
	
  GPIO_SetBits(GPIOC,GPIO_Pin_12|GPIO_Pin_11);						 //PB10,PB11 输出高	
 
}

//产生IIC起始信号
void MPU_IIC_Start(void)
{
   
	MPU_SDA_OUT();     //sda线输出
	MPU_IIC_SDA=1;	  	  
	MPU_IIC_SCL=1;
	MPU_IIC_Delay();
 	MPU_IIC_SDA=0;//START:when CLK is high,DATA change form high to low 
	MPU_IIC_Delay();
	MPU_IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 
}	  
//产生IIC停止信号
void MPU_IIC_Stop(void)
{
   
	MPU_SDA_OUT();//sda线输出
	MPU_IIC_SCL=0;
	MPU_IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
 	MPU_IIC_Delay();
	MPU_IIC_SCL=1;  
	MPU_IIC_SDA=1;//发送I2C总线结束信号
	MPU_IIC_Delay();							   	
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 MPU_IIC_Wait_Ack(void)
{
   
	u8 ucErrTime=0;
	MPU_SDA_IN();      //SDA设置为输入  
	MPU_IIC_SDA=1;MPU_IIC_Delay();	   
	MPU_IIC_SCL=1;MPU_IIC_Delay();	 
	while(MPU_READ_SDA)
	{
   
		ucErrTime++;
		if(ucErrTime>250)
		{
   
			MPU_IIC_Stop();
			return 1;
		}
	}
	MPU_IIC_SCL=0;//时钟输出0 	   
	return 0;  
} 
//产生ACK应答
void MPU_IIC_Ack(void)
{
   
	MPU_IIC_SCL=0;
	MPU_SDA_OUT();
	MPU_IIC_SDA=
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值