MPU6050(陀螺仪)

本文介绍了MPU6050传感器,包括其加速度计和陀螺仪的功能、工作原理,以及如何通过I2C与STM32进行通信,提供初始化设置和数据获取方法。重点在于硬件电路、通信协议和参数配置。
摘要由CSDN通过智能技术生成

简介

        MPU6050是一个6轴姿态传感器,可以测量芯片自身XYZ轴的加速度、角速度参数,通

过数据融合,可进一步得到姿态角(欧拉角),常应用于平衡车、飞行器等需要检测自身姿态的场景

        3轴加速度计(Accelerometer):测量XYZ轴的加速度(具有静态稳定性,不具有动态稳定性)

        3轴陀螺仪传感器(Gyroscope):测量XYZ轴的角速度(角速度积分得到角度。具有动态稳定性,不具有静态稳定性)

6轴:3加速度,3角速度

9轴:3加速度,3角速度, 3磁场

10轴:3加速度,3角速度, 3磁场, 1气压强度(海拔:海报越高气压越低)

实际上芯片内是用电来实现的,不是这样的机械结构

参数

16 ADC 采集传感器的模拟信号,量化范围: -32768~32767(2^15=32768)
运动比较剧烈,选大量程。不然小量程
加速度计满量程选择: ±2 ±4 ±8 ±16 g )(1g = 9.8 m/s²)
陀螺仪满量程选择: ±250 ±500 ±1000 ±2000 °/sec
可配置的数字低通滤波器
可配置的时钟源
可配置的采样分频
I2C从机地址:1101000 AD0=0 ) 

                                  1101001(AD0=1)

           两种方式表示:1. 七位(110 1000 = 0x68)用十六进制表示 

                                        把0x68<<1 || (r/w) (读/写)     (0x68左移一位,或上读写位)

                                    2.把0x68左移后的数据当地址(1101 0000 = 0xD0)

                                               写0xD0 (w:0),读0xD1(r:1)

硬件电路

引脚

功能

VCCGND

电源

SCLSDA

I2C通信引脚

XCLXDA

主机I2C通信引脚

AD0

从机地址最低位

INT

中断信号输出

STM32代码模块

MPU6050写寄存器
/*MPU6050写寄存器
用I2C时序,如下:S;八位数据(MPU6050设备地址 + 一位读写(R/W));RA(应答);
				八位数据(MPU6050内部寄存器地址);RA(应答);八位数据(要发送的数据Data);
				RA(应答);停止(Stop)
*/				
void MPU6050_W_Reg(uint8_t RegAddress, uint8_t Data )
{
	MyI2C_Start();						//S
	MyI2C_SendByte(MPU6050_ADDRESS);	//八位数据(MPU6050设备地址 + 一位读写(R/W))
	MyI2C_ReceiveAck();					//RA(应答)
	MyI2C_SendByte(RegAddress);			//八位数据(MPU6050内部寄存器地址)
	MyI2C_ReceiveAck();					//RA(应答)
	MyI2C_SendByte(Data);				//八位数据(要发送的数据Data)
	MyI2C_ReceiveAck();					//RA(应答)
	MyI2C_Stop();						//停止(Stop)
}
MPU6050读寄存器
/*	MPU6050读寄存器
*/
uint8_t MPU6050_R_Reg(uint8_t RegAddress)
{	
	uint8_t Data;
	MyI2C_Start();
	MyI2C_SendByte(MPU6050_ADDRESS);
	MyI2C_ReceiveAck();
	MyI2C_SendByte(RegAddress);
	MyI2C_ReceiveAck();
	
	MyI2C_Start();
	MyI2C_SendByte(MPU6050_ADDRESS | 0x01);  //地址加一(MPU6050内部地址会加一,所以要手动加一)
	MyI2C_ReceiveAck();
	Data = MyI2C_ReceiveByte(); //MPU变成主机,stm32开始接收数据
	MyI2C_SendAck(1);    	//32发送应答给MPU6050    0:应答   1:非应答
	MyI2C_Stop();   		//没有停止(Stop),测试的时候OLED数据会显示,但是不会变化
	
	return Data;
}
MPU6050初始化
/*MPU6050初始化
	配置各个必要寄存器
*/
void MPU6050_Init(void)
{
	MyI2C_Init();
	MPU6050_W_Reg(MPU6050_PWR_MGMT_1, 0x01);	//电源控制1  接触睡眠,使用z轴陀螺仪时钟
	MPU6050_W_Reg(MPU6050_PWR_MGMT_2, 0x00);	//电源控制2	 六个轴均不待机
	MPU6050_W_Reg(MPU6050_SMPLRT_DIV, 0x09);	//采样率分频  10分频
	MPU6050_W_Reg(MPU6050_CONFIG, 0x06);		//配置寄存器
	MPU6050_W_Reg(MPU6050_GYRO_CONFIG, 0x18);	//陀螺仪配置寄存器
	MPU6050_W_Reg(MPU6050_ACCEL_CONFIG, 0x18 );	//加速度计配置寄存器
}
MPU6050获取数据(陀螺仪和加速度数据 Data)
void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ,
						int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ)
{
	uint8_t Data_H, Data_L;
	Data_H = MPU6050_R_Reg(MPU6050_ACCEL_XOUT_H);
	Data_L = MPU6050_R_Reg(MPU6050_ACCEL_XOUT_L);
	*AccX = (Data_H<<8) | Data_L;
	
	Data_H = MPU6050_R_Reg(MPU6050_ACCEL_YOUT_H);
	Data_L = MPU6050_R_Reg(MPU6050_ACCEL_YOUT_L);
	*AccY = (Data_H<<8) | Data_L;
	
	Data_H = MPU6050_R_Reg(MPU6050_ACCEL_ZOUT_H);
	Data_L = MPU6050_R_Reg(MPU6050_ACCEL_ZOUT_L);
	*AccZ = (Data_H<<8) | Data_L;

	Data_H = MPU6050_R_Reg(MPU6050_GYRO_XOUT_H);
	Data_L = MPU6050_R_Reg(MPU6050_GYRO_XOUT_L);
	*GyroX = (Data_H<<8) | Data_L;
	
	Data_H = MPU6050_R_Reg(MPU6050_GYRO_YOUT_H);
	Data_L = MPU6050_R_Reg(MPU6050_GYRO_YOUT_L);
	*GyroY = (Data_H<<8) | Data_L;
	
	Data_H = MPU6050_R_Reg(MPU6050_GYRO_ZOUT_H);
	Data_L = MPU6050_R_Reg(MPU6050_GYRO_ZOUT_L);
	*GyroX = (Data_H<<8) | Data_L;
}
MPU6050部分寄存器宏定义
#ifndef __MPU6050_REG_H
#define __MPU6050_REG_H

#define MPU6050_SMPLRT_DIV		0x19
#define MPU6050_CONFIG 			0x1A
#define MPU6050_GYRO_CONFIG		0x1B
#define MPU6050_ACCEL_CONFIG	0x1C

#define MPU6050_ACCEL_XOUT_H	0x3B
#define MPU6050_ACCEL_XOUT_L 	0x3C 
#define MPU6050_ACCEL_YOUT_H	0x3D
#define MPU6050_ACCEL_YOUT_L 	0x3E 
#define MPU6050_ACCEL_ZOUT_H 	0x3F 
#define MPU6050_ACCEL_ZOUT_L 	0x40
#define MPU6050_TEMP_OUT_H 		0x41 
#define MPU6050_TEMP_OUT_L 		0x42 
#define MPU6050_GYRO_XOUT_H 	0x43 
#define MPU6050_GYRO_XOUT_L 	0x44 
#define MPU6050_GYRO_YOUT_H 	0x45 
#define MPU6050_GYRO_YOUT_L 	0x46 
#define MPU6050_GYRO_ZOUT_H 	0x47 
#define MPU6050_GYRO_ZOUT_L 	0x48

#define MPU6050_PWR_MGMT_1 		0x6B 
#define MPU6050_PWR_MGMT_2 		0x6C

#define MPU6050_WHO_AM_I 		0x75


#endif

  • 15
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值