MPU6050六轴传感器的原理及编程说明

一.简介

MPU6050 是 InvenSense 公司推出的整合性 6 轴运动处理组件,其内部整合了 3 轴陀螺仪和 3 轴加速度传感器,并且含有一个IIC 接口, 可用于连接外部磁力传感器,并利用自带的数字运动处理器(DMP: Digital Motion Processor) 硬件加速引擎,通过主 IIC 接口,向应用端输出完整的 9 轴融合演算数据。
InvenSense 公司提供了一套基于DMP的运动处理驱动库,可大大降低单片机对动处理运算的负荷,同时也大大降低了编程难度。该模块广泛运用于飞控、计步等电子产品中。
在这里插入图片描述
MPU6050芯片及模块

二.MPU6050原理及参数

1.芯片内部框图

MPU内部自带有7路16bit的ADC转换电路,其中3路为陀螺仪、3路为加速度计、1路为内部温度传感器。ADC转换后的数据通过DMP处理后,存储在FIFO里。单片机通过对芯片内部寄存器进行读写操作,完成对MPU的控制。
在这里插入图片描述

2.芯片引脚说明

MPU6050的接线比较简单,使用3.3V的工作电源,通过IIC接口(MPU6000还可用SPI接口)与MCU通信。
在这里插入图片描述

3.模块电路图

模块原理图如下,其中使用了SPX3810M稳压芯片,将5V电源转换为3.3V电压给MPU6050芯片供电,P-MOS管Q1、Q2作为电平转换电路,将芯片的IIC电平转化为5.0V电平,可兼容51单片机和STM32单片机的控制电平(注:STM32引脚需要配置为开漏状态,且需要所用引脚能兼容5.0V电压,引脚标志为FT)。采用3.3V的单片机控制,如果不想要或者无法兼容5V电压,可将电平转换电路去掉,将IIC接口直接接单片机IIC引脚。
在这里插入图片描述

4.单片机与模块接线图

单片机IIC接口采用模拟IIC通信。
在这里插入图片描述

三.MPU6050编程及控制

因为MPU6050内部带有DMP处理单元,加上官方提供了比较完整的运动处理驱动库,大大降低了我们的编程和对数据的处理难度。我们可以将各个运动的参数计算,如旋转矩阵、四元数(quaternion)、欧拉角格式(Euler Angle forma)的融合演算数据,通过调用运动处理驱动库函数,直接读取出数据来。
如果想要使用官方提供的运动处理驱动库,需要在工程里面增加文件“inv_mpu_dmp_motion_driver.h”、“inv_mpu_dmp_motion_driver.c”、“inv_mpu.h”、“inv_mpu.c”、“dmpKey.h”、“dmpmap.h"六个文件。

以下程序是基于正点原子ATK-MPU6050模块的开发例程为例。

在完成标准的IIC驱动程序后,先实现读寄存器和写寄存器操作;

(1)读寄存器操作
//IIC读一个字节 
//reg:寄存器地址 
//返回值:读到的数据
u8 MPU_Read_Byte(u8 reg)
{
	u8 res;
    MPU_IIC_Start(); 
	MPU_IIC_Send_Byte((MPU_ADDR<<1)|0);//发送器件地址+写命令	
	MPU_IIC_Wait_Ack();		//等待应答 
    MPU_IIC_Send_Byte(reg);	//写寄存器地址
    MPU_IIC_Wait_Ack();		//等待应答
    MPU_IIC_Start();
	MPU_IIC_Send_Byte((MPU_ADDR<<1)|1);//发送器件地址+读命令	
    MPU_IIC_Wait_Ack();		//等待应答 
	res=MPU_IIC_Read_Byte(0);//读取数据,发送nACK 
    MPU_IIC_Stop();			//产生一个停止条件 
	return res;		
}
(2)写寄存器操作
//IIC写一个字节 
//reg:寄存器地址
//data:数据
//返回值:0,正常
//    其他,错误代码
u8 MPU_Write_Byte(u8 reg,u8 data) 				 
{ 
    MPU_IIC_Start(); 
	MPU_IIC_Send_Byte((MPU_ADDR<<1)|0);//发送器件地址+写命令	
	if(MPU_IIC_Wait_Ack())	//等待应答
	{
		MPU_IIC_Stop();		 
		return 1;		
	}
    MPU_IIC_Send_Byte(reg);	//写寄存器地址
    MPU_IIC_Wait_Ack();		//等待应答 
	MPU_IIC_Send_Byte(data);//发送数据
	if(MPU_IIC_Wait_Ack())	//等待ACK
	{
		MPU_IIC_Stop();	 
		return 1;		 
	}		 
    MPU_IIC_Stop();	 
	return 0;
}

实现这个两个函数后,就可实现对MPU6050的各种操作了;但是无法调用官方自带的运动处理驱动库。
首先我们在Keil工程里面增入文件“inv_mpu_dmp_motion_driver.h”、“inv_mpu_dmp_motion_driver.c”、“inv_mpu.h”、“inv_mpu.c”、“dmpKey.h”、“dmpmap.h"。
然后将在两个实现驱动库里两个基本操作函数,然后映射到驱动库的inv_mpu.h文件里面后,便可直接调用运动处理库的API了。

(3)首先实现IIC连续读取数据函数
/IIC连续读
//addr:器件地址
//reg:要读取的寄存器地址
//len:要读取的长度
//buf:读取到的数据存储区
//返回值:0,正常
//    其他,错误代码
u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{ 
 	MPU_IIC_Start(); 
	MPU_IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令	
	if(MPU_IIC_Wait_Ack())	//等待应答
	{
		MPU_IIC_Stop();		 
		return 1;		
	}
    MPU_IIC_Send_Byte(reg);	//写寄存器地址
    MPU_IIC_Wait_Ack();		//等待应答
    MPU_IIC_Start();
	MPU_IIC_Send_Byte((addr<<1)|1);//发送器件地址+读命令	
    MPU_IIC_Wait_Ack();		//等待应答 
	while(len)
	{
		if(len==1)*buf=MPU_IIC_Read_Byte(0);//读数据,发送nACK 
		else *buf=MPU_IIC_Read_Byte(1);		//读数据,发送ACK  
		len--;
		buf++; 
	}    
    MPU_IIC_Stop();	//产生一个停止条件 
	return 0;	
}
(4)实现IIC连续写数据函数
//IIC连续写
//addr:器件地址 
//reg:寄存器地址
//len:写入长度
//buf:数据区
//返回值:0,正常
//    其他,错误代码
u8 MPU_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{
	u8 i; 
    MPU_IIC_Start(); 
	MPU_IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令	
	if(MPU_IIC_Wait_Ack())	//等待应答
	{
		MPU_IIC_Stop();		 
		return 1;		
	}
    MPU_IIC_Send_Byte(reg);	//写寄存器地址
    MPU_IIC_Wait_Ack();		//等待应答
	for(i=0;i<len;i++)
	{
		MPU_IIC_Send_Byte(buf[i]);	//发送数据
		if(MPU_IIC_Wait_Ack())		//等待ACK
		{
			MPU_IIC_Stop();	 
			return 1;		 
		}		
	}    
    MPU_IIC_Stop();	 
	return 0;	
} 

完成这两个函数后,将这两个函数映射到ipv_mpu.h里面,如图。
在这里插入图片描述

设置完成后,便可使用官方的运动处理驱动库。其他功能性函数就不一一列出;

(5)最后实现MPU6050的初始化。
//初始化MPU6050
//返回值:0,成功
//    其他,错误代码
u8 MPU_Init(void)
{ 
	u8 res; 
	MPU_IIC_Init();//初始化IIC总线
	MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);	//复位MPU6050
    delay_ms(100);
	MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);	//唤醒MPU6050 
	MPU_Set_Gyro_Fsr(3);					//陀螺仪传感器,±2000dps
	MPU_Set_Accel_Fsr(0);					//加速度传感器,±2g
	MPU_Set_Rate(50);						//设置采样率50Hz
	MPU_Write_Byte(MPU_INT_EN_REG,0X00);	//关闭所有中断
	MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);	//I2C主模式关闭
	MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);	//关闭FIFO
	MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);	//INT引脚低电平有效
	res=MPU_Read_Byte(MPU_DEVICE_ID_REG); 
	if(res==MPU_ADDR)//器件ID正确
	{
		MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);	//设置CLKSEL,PLL X轴为参考
		MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);	//加速度与陀螺仪都工作
		MPU_Set_Rate(50);						//设置采样率为50Hz
 	}else return 1;
	return 0;
}

四.MPU6050的控制及数据采集

在单片机进行初始化时,先需要调用MPU_Init函数初始化后,还要调用mpu_dmp_init函数对模块进行初始化。代码如下

int main(void)
 { 
	float pitch,roll,yaw; 		//欧拉角
	short aacx,aacy,aacz;		//加速度传感器原始数据
	short gyrox,gyroy,gyroz;	//陀螺仪原始数据
	short temp;					//温度	    
	MPU_Init();					//初始化MPU6050

	while(mpu_dmp_init())
 	{
	}  
 	while(1)
	{

		if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
		{ 
			temp=MPU_Get_Temperature();	//得到温度值
			MPU_Get_Accelerometer(&aacx,&aacy,&aacz);	//得到加速度传感器数据
			MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);	//得到陀螺仪数据
		}
	} 	
}

需要实现更多的功能,可查询官方的运动处理驱动库API文件(分享的资料里面有该文件)

如需MPU6050相关资料及完整例程, 请关注公众号,首页回复MPU6050获取资料
在这里插入图片描述

使用芯片:MPU-6050MPU-6050数据手册) 供电电源:3-5v(内部低压差稳压) 通信方式:标准IIC通信协议 芯片内置16bit AD转换器,16位数据输出 陀螺仪范围:±250 500 1000 2000 °/s 加速度范围:±2±4±8±16g MPU-6000(MPU-6000数据手册)为全球首例整合性6运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时之间差的问题,减少了大量的包装空间。MPU-6000整合了3陀螺仪、3加速器,并含可藉由第二个I2C端口连接其他厂牌之加速器、磁力传感器、或其他传感器的数位运动处理(DMP: Digital Motion Processor)硬件加速引擎,由主要I2C端口以单一数据流的形式,向应用端输出完整的9融合演算技术 InvenSense的运动处理资料库,可处理运动感测的复杂数据,降低了运动处理运算对操作系统的负荷,并为应用开发提供架构化的API。 MPU-6000的角速度全格感测范围为±250、±500、±1000与±2000°/sec (dps),可准确追緃快速与慢速动作,并且,用户可程式控制的加速器全格感测范围为±2g、±4g±8g与±16g。产品传输可透过最高至400kHz的I2C或最高达20MHz的SPI。 MPU-6000可在不同电压下工作,VDD供电电压介为2.5V±5%、3.0V±5%或3.3V±5%,逻辑接口VVDIO供电为1.8V± 5%。MPU-6000的包装尺寸4x4x0.9mm(QFN),在业界是革命性的尺寸。其他的特征包含内建的温度感测器、包含在运作环境中仅有±1%变动的振荡器。 应用运动感测游戏 现实增强 电子稳像 (EIS: Electronic Image Stabilization) 光学稳像(OIS: Optical Image Stabilization) 行人导航器 “零触控”手势用户接口 姿势快捷方式 认证 市场智能型手机 平板装置设备 手持型游戏产品 3D遥控器 可携式导航设备 特征以数字输出6或9的旋转矩阵、四元数(quaternion)、欧拉角格式(Euler Angle forma)的融合演算数据。 具有131 LSBs/°/sec 敏感度与全格感测范围为±250、±500、±1000与±2000°/sec 的3角速度感测器(陀螺仪)。 可程式控制,且程式控制范围为±2g、±4g、±8g和±16g的3加速器。 移除加速器与陀螺仪间敏感度,降低设定给予的影响与感测器的飘移。 数字运动处理(DMP: Digital Motion Processing)引擎可减少复杂的融合演算数据、感测器同步化、姿势感应等的负荷。 运动处理数据库支持Android、Linux与Windows 内建之运作时间偏差与磁力感测器校正演算技术,免除了客户须另外进行校正的需求。 以数位输出的温度传感器 以数位输入的同步引脚(Sync pin)支援视频电子影相稳定技术与GPS 可程式控制的中断(interrupt)支援姿势识别、摇摄、画面放大缩小、滚动、快速下降中断、high-G中断、零动作感应、触击感应、摇动感应功能。 VDD供电电压为2.5V±5%、3.0V±5%、3.3V±5%;VDDIO为1.8V± 5% 陀螺仪运作电流:5mA,陀螺仪待命电流:5A;加速器运作电流:350A,加速器省电模式电流: 20A@10Hz 高达400kHz快速模式的I2C,或最高至20MHz的SPI串行主机接口(serial host interface) 内建频率产生器在所有温度范围(full temperature range)仅有±1%频率变化。 使用者亲自测试 10,000 g 碰撞容忍度 为可携式产品量身订作的最小最薄包装 (4x4x0.9mm QFN)
### 回答1: MPU6050是一款集成了三加速度计和三陀螺仪的传感器。学习MPU6050的使用可以帮助我们实现更精确的运动控制和姿态检测。 首先,使用MPU6050之前,我们需要了解其硬件接口和通信协议。MPU6050使用I2C通信协议进行数据传输,所以我们需要连接MPU6050到相应的MCU或开发板,并学习如何通过I2C配置和读取传感器数据。 其次,了解MPU6050的工作原理和数据输出格式也是非常重要的。MPU6050能够测量物体的加速度和角速度,并将其转换为数字信号输出。我们需要学习如何解析这些数据,并将其应用到具体的项目中。 在实际应用中,我们可以利用MPU6050的加速度和陀螺仪数据来进行姿态检测和运动控制。例如,通过对加速度数据进行积分,我们可以得到物体的速度和位移信息。而通过对陀螺仪数据进行积分,我们可以得到物体的姿态角信息。通过综合利用这些数据,我们可以实现智能车、无人机等项目的运动控制和姿态稳定。 此外,学习MPU6050还需要了解一些常见的应用案例和库函数。有许多开源的库函数可以帮助我们快速、方便地使用MPU6050。通过学习这些库函数的使用方法,我们可以更高效地使用MPU6050,并在项目开发中节省时间和精力。 总之,学习MPU6050的使用需要掌握硬件接口、通信协议、工作原理和数据处理方法。通过掌握这些知识,我们可以应用MPU6050的功能,实现更高精度的运动控制和姿态检测。 ### 回答2: MPU6050是一款集成了三加速度计和三陀螺仪的传感器。它可以用于许多应用,如姿态感知、导航控制和运动跟踪等。 首先,要开始学习MPU6050的使用,我们需要掌握相关的基础知识。了解三加速度计的工作原理和三陀螺仪的工作原理是十分重要的。加速度计用于测量物体在空间中的加速度,而陀螺仪则测量物体的角速度。 其次,我们需要了解MPU6050的硬件连接和通信方式。通常,MPU6050使用I2C总线与单片机进行通信。学习如何正确连接MPU6050与开发板或单片机,并掌握正确的I2C通信协议是非常关键的。 一旦我们完成了硬件连接和通信设置,我们可以开始编写代码了。根据不同的开发平台或编程语言,我们要学习如何使用相应的库函数或驱动程序来与MPU6050进行通信。这些库函数通常包括读取加速度和角速度的数据、校准传感器和设置采样率等功能。 在使用MPU6050之前,我们还需要进行传感器的校准和数据处理。对于加速度计,我们需要进行零偏校准,以消除外界干扰;对于陀螺仪,我们需要进行偏移校准,以提高测量的准确性。此外,我们还可以使用滤波算法来保持测量结果的稳定性。 最后,我们可以利用MPU6050提供的数据来实现各种应用。例如,我们可以通过读取加速度计数据来估计物体的倾斜角度,或者通过读取陀螺仪数据来测量物体的旋转速度。根据具体的应用需求,我们可以进一步对数据进行处理和分析,以达到所需的结果。 总而言之,学习MPU6050的使用需要对其工作原理和通信方式有一定的了解,并掌握相关的编程知识。通过掌握这些基础知识,我们可以利用MPU6050进行各种应用,从而实现更多有趣的项目。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值