简介
MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通
过数据融合,可进一步得到姿态角(欧拉角),常应用于平衡车、飞行器等需要检测自身姿态的场景
3轴加速度计(Accelerometer):测量X、Y、Z轴的加速度(具有静态稳定性,不具有动态稳定性)
3轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度(角速度积分得到角度。具有动态稳定性,不具有静态稳定性)
6轴:3加速度,3角速度
9轴:3加速度,3角速度, 3磁场
10轴:3加速度,3角速度, 3磁场, 1气压强度(海拔:海报越高气压越低)
![](https://img-blog.csdnimg.cn/direct/e8b46621806749ca975caab928e20cef.png)
参数
1101001(AD0=1)
两种方式表示:1. 七位(110 1000 = 0x68)用十六进制表示
把0x68<<1 || (r/w) (读/写) (0x68左移一位,或上读写位)
2.把0x68左移后的数据当地址(1101 0000 = 0xD0)
写0xD0 (w:0),读0xD1(r:1)
硬件电路
引脚 | 功能 |
VCC、GND | 电源 |
SCL、SDA | I2C通信引脚 |
XCL、XDA | 主机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