如何通过软件IIC使用MPU6050陀螺仪

目录

1.  MPU6050简介

2.  MPU6050参数

3.  MPU6050硬件电路

4.  代码编写

4.1  MPU6050写寄存器

4.2  MPU6050读寄存器

4.3  初始化

4.4  MPU6050获取ID号

4.5  MPU6050获取数据


1.  MPU6050简介

        MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景。

3轴加速度计(Accelerometer) :测量X、Y、Z轴的加速度

3轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度

2.  MPU6050参数

16位ADC采集传感器的模拟信号,量化范围:-32768~32767

加速度计满量程选择:±2、±4、±8、±16(g)

陀螺仪满量程选择: ±250、±500、±1000、±2000(°/sec)

可配置的数字低通滤波器:数字低通滤波器用于去除信号中的高频噪声,保留信号中的低频成分。这对于在嘈杂的环境中准确测量传感器数据非常重要。

可配置的时钟源:时钟源可以是内部时钟或外部时钟,用于同步传感器的采样和数据传输。

可配置的采样分频:采样分频确定了采样率,即每秒钟进行多少次数据采样。较低的采样率可能会降低功耗,但也可能导致数据分辨率的损失。

I2C从机地址:1101000(AD0=0)             1101001(AD0=1)

3.  MPU6050硬件电路

4.  代码编写

对于软件IIC的代码参考:

STM32F1之I2C通信·软件I2C代码编写-CSDN博客

        对于MPU6050的代码,首先我们先创建一个宏定义,用于存放从机地址,便于以后修改:

#define MPU6050_ADDRESS		0xD0		//MPU6050的I2C从机地址

        然后我们基于上述链接给出的IIC的代码,初始化MPU6050:

void MPU6050_Init(void)
{
	MyI2C_Init();									//先初始化底层的I2C
	
}

4.1  MPU6050写寄存器

        根据上图时序进行代码编写:

void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data)
{
	MyI2C_Start();						//I2C起始
	MyI2C_SendByte(MPU6050_ADDRESS);	//发送从机地址,读写位为0,表示即将写入
	MyI2C_ReceiveAck();					//接收应答
	MyI2C_SendByte(RegAddress);			//发送寄存器地址
	MyI2C_ReceiveAck();					//接收应答
	MyI2C_SendByte(Data);				//发送要写入寄存器的数据
	MyI2C_ReceiveAck();					//接收应答
	MyI2C_Stop();						//I2C终止
}

        以上是写入单个数据,要想写入多个数据可以使用for循环来进行实现:

void MPU6050_WriteReg(uint8_t RegAddress, uint8_t *Data, uint8_t Length)
{
    MyI2C_Start();                      //I2C起始
    MyI2C_SendByte(MPU6050_ADDRESS);    //发送从机地址,读写位为0,表示即将写入
    MyI2C_ReceiveAck();                 //接收应答
    MyI2C_SendByte(RegAddress);         //发送寄存器地址
    MyI2C_ReceiveAck();                 //接收应答
    
    for (uint8_t i = 0; i < Length; i++) {
        MyI2C_SendByte(Data[i]);        //发送要写入寄存器的数据
        MyI2C_ReceiveAck();             //接收应答
    }
    
    MyI2C_Stop();                       //I2C终止
}

4.2  MPU6050读寄存器

        根据上图时序进行代码编写:

uint8_t MPU6050_ReadReg(uint8_t RegAddress)
{
	uint8_t Data;
	
	MyI2C_Start();						//I2C起始
	MyI2C_SendByte(MPU6050_ADDRESS);	//发送从机地址,读写位为0,表示即将写入
	MyI2C_ReceiveAck();					//接收应答
	MyI2C_SendByte(RegAddress);			//发送寄存器地址
	MyI2C_ReceiveAck();					//接收应答
	
	MyI2C_Start();						//I2C重复起始
	MyI2C_SendByte(MPU6050_ADDRESS | 0x01);	//发送从机地址,读写位为1,表示即将读取
	MyI2C_ReceiveAck();					//接收应答
	Data = MyI2C_ReceiveByte();			//接收指定寄存器的数据
	MyI2C_SendAck(1);					//发送应答,给从机非应答,终止从机的数据输出
	MyI2C_Stop();						//I2C终止
	
	return Data;
}

4.3  初始化

        首先我们先创建一些宏定义,将其归类了解一下:

#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

// 加速度计X轴输出高字节
#define MPU6050_ACCEL_XOUT_H    0x3B
// 加速度计X轴输出低字节
#define MPU6050_ACCEL_XOUT_L    0x3C
// 加速度计Y轴输出高字节
#define MPU6050_ACCEL_YOUT_H    0x3D
// 加速度计Y轴输出低字节
#define MPU6050_ACCEL_YOUT_L    0x3E
// 加速度计Z轴输出高字节
#define MPU6050_ACCEL_ZOUT_H    0x3F
// 加速度计Z轴输出低字节
#define MPU6050_ACCEL_ZOUT_L    0x40
// 温度输出高字节
#define MPU6050_TEMP_OUT_H      0x41
// 温度输出低字节
#define MPU6050_TEMP_OUT_L      0x42
// 陀螺仪X轴输出高字节
#define MPU6050_GYRO_XOUT_H     0x43
// 陀螺仪X轴输出低字节
#define MPU6050_GYRO_XOUT_L     0x44
// 陀螺仪Y轴输出高字节
#define MPU6050_GYRO_YOUT_H     0x45
// 陀螺仪Y轴输出低字节
#define MPU6050_GYRO_YOUT_L     0x46
// 陀螺仪Z轴输出高字节
#define MPU6050_GYRO_ZOUT_H     0x47
// 陀螺仪Z轴输出低字节
#define MPU6050_GYRO_ZOUT_L     0x48

// 电源管理1寄存器
#define MPU6050_PWR_MGMT_1      0x6B
// 电源管理2寄存器
#define MPU6050_PWR_MGMT_2      0x6C
// WHO_AM_I寄存器
#define MPU6050_WHO_AM_I        0x75

#endif

        对于这些,我们初始化需要调用:

void MPU6050_Init(void)
{
	MyI2C_Init();									//先初始化底层的I2C
	
	/*MPU6050寄存器初始化,需要对照MPU6050手册的寄存器描述配置,此处仅配置了部分重要的寄存器*/
	MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x01);		//电源管理寄存器1,取消睡眠模式,选择时钟源为X轴陀螺仪
	MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0x00);		//电源管理寄存器2,保持默认值0,所有轴均不待机
	MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x09);		//采样率分频寄存器,配置采样率
	MPU6050_WriteReg(MPU6050_CONFIG, 0x06);			//配置寄存器,配置DLPF
	MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18);	//陀螺仪配置寄存器,选择满量程为±2000°/s
	MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18);	//加速度计配置寄存器,选择满量程为±16g
}

4.4  MPU6050获取ID号

uint8_t MPU6050_GetID(void)
{
	return MPU6050_ReadReg(MPU6050_WHO_AM_I);		//返回WHO_AM_I寄存器的值
}

4.5  MPU6050获取数据

void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ, 
						int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ)
{
	uint8_t DataH, DataL;								//定义数据高8位和低8位的变量
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);		//读取加速度计X轴的高8位数据
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);		//读取加速度计X轴的低8位数据
	*AccX = (DataH << 8) | DataL;						//数据拼接,通过输出参数返回
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);		//读取加速度计Y轴的高8位数据
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);		//读取加速度计Y轴的低8位数据
	*AccY = (DataH << 8) | DataL;						//数据拼接,通过输出参数返回
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);		//读取加速度计Z轴的高8位数据
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);		//读取加速度计Z轴的低8位数据
	*AccZ = (DataH << 8) | DataL;						//数据拼接,通过输出参数返回
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);		//读取陀螺仪X轴的高8位数据
	DataL = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);		//读取陀螺仪X轴的低8位数据
	*GyroX = (DataH << 8) | DataL;						//数据拼接,通过输出参数返回
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);		//读取陀螺仪Y轴的高8位数据
	DataL = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);		//读取陀螺仪Y轴的低8位数据
	*GyroY = (DataH << 8) | DataL;						//数据拼接,通过输出参数返回
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);		//读取陀螺仪Z轴的高8位数据
	DataL = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);		//读取陀螺仪Z轴的低8位数据
	*GyroZ = (DataH << 8) | DataL;						//数据拼接,通过输出参数返回
}

  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光の尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值