零基础STM32单片机编程入门(三十七) MPU6050陀螺仪传感器详解及实战源码

一.概要

MPU6050就是一种非常重要的传感器,被广泛应用于无人机、机器人、智能手机、平板电脑、可穿戴设备等领域。
MPU6050是一款功能强大的六轴运动跟踪传感器,适用于各类物体加速度与角速度的精确测量。
集成了三轴加速度计与三轴陀螺仪,并通过I2C接口与微控制器实现通信。在使用MPU6050之前,需进行一系列预处理步骤,包括初始化配置、校准操作及数据滤波等。
平衡车和无人机在内部都用到陀螺仪传感器和加速度计传感器,用来检测车体的姿态以及运动时发生的变化,再通过各方面的共同协调配合,从而保持平衡车和无人机的平衡与稳定。

在这里插入图片描述

二.MPU6050芯片介绍

1.MEMS传感器原理

MEMS加速度传感器通常由质量块、‌弹簧和电容等组件构成。‌当物体受到加速度作用时,‌质量块会受到力的作用而发生位移,‌而弹簧会受到拉伸或压缩。‌这些位移和变形将导致电容的改变,‌从而通过电容变化来测量加速度。
在这里插入图片描述

在这里插入图片描述

2.MPU6050芯片简介

MPU-6050是全球首例6轴运动处理传感器。它集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP(DigitalMotionProcessor),可用I2C接口连接一个第三方的数字传感器,比如磁力计。扩展之后就可以通过其I2C或SPI接口输出一个9轴的信号(SPI接口仅在MPU-6000可用)。MPU-6050也可以通过其I2C接口连接非惯性的数字传感器,比如压力传感器。
MPU-6050对陀螺仪和加速度计分别用了三个16位的ADC(0~65535),将其测量的模拟量转化为可输出的数字量。为了精确跟踪快速和慢速的运动,传感器的测量范围都是用户可控的,陀螺仪可测范围为±250,±500,±1000,±2000°/秒(dps),加速度计可测范围为±2,±4,±8,±16g。
芯片尺寸4×4×0.9mm,采用QFN封装(无引线方形封装),可承受最大10000g的冲击,并有可编程的低通滤波器。

3.芯片引脚定义

在这里插入图片描述

4.XYZ轴方向

三轴加速度计‌主要用于测量物体在三个空间维度(X,Y,Z三轴)上的加速度。‌它们可以检测物体在静止或运动状态下的加速度,‌包括重力加速度和线性加速度。‌通过测量感应质量的移动距离和方向,‌可以确定物体的加速度。有了加速度采样的数据,就可以应用到碰撞检测,设备或桥梁倾斜角度,机器振动检测,走路计步等场合。

三轴陀螺仪‌则主要用于测量物体在三个空间维度上的角速度,‌即Roll(‌左右倾斜)‌、‌Pitch(‌前后倾斜)‌、‌Yaw(‌左右摇摆)‌。‌它们可以检测物体的方向和姿态变化,‌对于维持设备的稳定性和实现某些功能(‌如自动旋转屏幕)‌至关重要。‌有了陀螺仪采样的数据,就可以应用到飞机航姿参考系统,及无人机惯性导航,人体运动姿势检测等场合。

在这里插入图片描述

Roll(‌左右倾斜)‌、‌Pitch(‌前后倾斜)‌、‌Yaw(‌左右摇摆)‌示意图如下:
在这里插入图片描述

5.芯片内部框图

在这里插入图片描述

6.芯片常用寄存器

1.WHO_AM_I寄存器

此寄存器用于验证设备的身份。默认读出为0x68,如果读出是0x68,说明单片机跟MPU6050通讯成功。
在这里插入图片描述

2.加速度数据

从上到下分别为X轴高八位陀加速度值、x轴低八位加速度值、Y轴高八位加速度值…由于其地址也为连续的,我们只需调取连续读函数读0x3B读取6次就可以了
在这里插入图片描述

3.陀螺仪数据

从上到下分别为X轴高八位陀螺仪值、x轴低八位陀螺仪值、Y轴高八位陀螺仪值,由于其地址为连续的,我们只需调取连续读函数读0x43读取6次就可以了。
在这里插入图片描述

从寄存器读上来的数据是原始值,真正的加速度,角速度值需要跟量程挂钩,所以还需加个转换,加(角)速度值真实值 = 原始数据 / 灵敏度,如果量程寄存器不配置,默认加速度量程是±2g,默认陀螺仪量程±250度/秒。

加速度数据灵敏度表格
在这里插入图片描述
陀螺仪数据灵敏度表格
在这里插入图片描述

三.MPU6050模块原理图及与模块接口定义使用

在这里插入图片描述

模块接口定义:

SCL:IIC从时钟信号线SCL,模块需要外接上拉电阻,一般为4.7K
SDA:IIC从时钟信号线SDA,模块需要外接上拉电阻,一般为4.7K
INT:中断输出引脚,可以不接
XCL:IIC主串行数据信号线,用于外接传感器,一般不接
XDA:IIC主串行时钟信号线,用于外接传感器,一般不接
VCC_5V:3.3/5V电源输入
AD0:从IIC接口的地址控制引脚,该引脚控制IIC地址的最低位。默认是悬空就可以,MPU6050的IIC地址是:0x68,所以一般不需要接。真正单片机去读的时候,还需要在最低位加上读写位,这样IIC地址在写的时候就是0xD0,读的时候就是0xD1。
GND:地信号。

所以单片机跟MPU6050模块连接,只要接IIC的两个脚还有电源,地就可以了,总共4根线就可以通信使用了。

四.STM32单片机驱动MPU6050读取加速度角速度值实验

板子与MPU6050陀螺仪模块用杜邦线连接:
板子G-----模块GND
板子3.3---模块VCC
板子B6---模块SCL
板子B7---模块SDA

用杜邦线连接OLED显示:
板子G----液晶GND
板子3.3--液晶VCC
板子B10---液晶SCL
板子B11---液晶SDA

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F103C8,再双击就创建新的工程
在这里插入图片描述
配置下载口引脚
在这里插入图片描述
配置外部晶振引脚
在这里插入图片描述

配置系统主频
在这里插入图片描述
IIC配置
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述
生成工程
在这里插入图片描述
用Keil5打开工程
在这里插入图片描述
添加代码
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

主要程序:

/**
  * 函数功能: 初始化MPU6050芯片
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
  */ 
void MPU6050_Init(void)
{
  int i=0,j=0;
  //在初始化之前要延时一段时间,若没有延时,则断电后再上电数据可能会出错
  for(i=0;i<1000;i++)
  {
    for(j=0;j<1000;j++)
    {
      ;
    }
  }
	MPU6050_WriteReg(MPU6050_RA_PWR_MGMT_1, 0x00);	    //解除休眠状态
	MPU6050_WriteReg(MPU6050_RA_SMPLRT_DIV , 0x07);	    //陀螺仪采样率,1KHz
	MPU6050_WriteReg(MPU6050_RA_CONFIG , 0x06);	        //低通滤波器的设置,截止频率是1K,带宽是5K
	MPU6050_WriteReg(MPU6050_RA_ACCEL_CONFIG , 0x00);	  //配置加速度传感器工作在2G模式,不自检
	MPU6050_WriteReg(MPU6050_RA_GYRO_CONFIG, 0x18);     //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
	MPU_INT_Init();
	

}

/**
  * 函数功能: 读取MPU6050的ID
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
  */ 
uint8_t MPU6050ReadID(void)
{
	unsigned char Re = 0;
    MPU6050_ReadData(MPU6050_RA_WHO_AM_I,&Re,1);    //读器件地址
	if(Re != 0x68)
	{
		return 0;
	}
	else
	{
		return 1;
	}
		
}
/**
  * 函数功能: 读取MPU6050的加速度数据
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
  */ 
void MPU6050ReadAcc(short *accData)
{
    uint8_t buf[6];
		MPU6050_ReadData(MPU6050_ACC_OUT, &buf[0], 6);

	
    accData[0] = (buf[0] << 8) | buf[1];
    accData[1] = (buf[2] << 8) | buf[3];
    accData[2] = (buf[4] << 8) | buf[5];
}

/**
  * 函数功能: 读取MPU6050的角速度数据
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
  */ 
void MPU6050ReadGyro(short *gyroData)
{
    uint8_t buf[6];
    MPU6050_ReadData(MPU6050_GYRO_OUT,buf,6);
    gyroData[0] = (buf[0] << 8) | buf[1];
    gyroData[1] = (buf[2] << 8) | buf[3];
    gyroData[2] = (buf[4] << 8) | buf[5];
}

unsigned char t,CleanTime;
uint32_t TimeCounter;
extern void i2c_CfgGpio(void);
short Accel[3];
short Gyro [3];
short Temp;
float AccelData[3];//单位mg
float GyroData[3];//单位mdps
/* USER CODE END 0 */
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C1_Init();
  /* USER CODE BEGIN 2 */
	OLED_Init();			       //初始化OLED  		
	MPU6050_Init();//MPU6050初始化配置
	if(MPU6050ReadID() == 0)//读取MPU6050 ID
	{	
	  while(1);
  }
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_Delay(100);
    CleanTime++;
		if(CleanTime>=8)
		{
			CleanTime=0;
	  OLED_Clear();
		}
    OLED_ShowCHinese(18,0,0);//光
		OLED_ShowCHinese(36,0,1);//子
		OLED_ShowCHinese(54,0,2);//物
		OLED_ShowCHinese(72,0,3);//联
		OLED_ShowCHinese(90,0,4);//网


		MPU6050ReadAcc(Accel);	
		for( int i=0;i<3;i++)
		{
		if(Accel[i]>=0)
		{
			AccelData[i]=Accel[i]*2000/32768;
		}else
		{
			AccelData[i]=-(-Accel[i]+1)*2000/32768;

		}		
	}
		
	if(AccelData[0]<0)
	{
	  OLED_ShowString(0,3,"-");
		OLED_ShowNum(8,3,-AccelData[0],4,16);//加速度x	
	}else
	{
		OLED_ShowNum(8,3,AccelData[0],4,16);//加速度x
	}
	
	if(AccelData[1]<0)
	{
	  OLED_ShowString(40,3,"-");
		OLED_ShowNum(48,3,-AccelData[1],4,16);//加速度y
	}else
	{
		OLED_ShowNum(48,3,AccelData[1],4,16);//加速度y
	}
	
	if(AccelData[2]<0)
	{
	  OLED_ShowString(80,3,"-");
		OLED_ShowNum(88,3,-AccelData[2],4,16);//加速度z
	}else
	{
		OLED_ShowNum(88,3,AccelData[2],4,16);//加速度z
	}


	
		MPU6050ReadGyro(Gyro);	 
		for( int i=0;i<3;i++)
		{

		if(Gyro[i]>=0)
		{

			GyroData[i]=Gyro[i]*2000/32768;
		}else
		{

			GyroData[i]=-(-Gyro[i]+1)*2000/32768;
		
		}

	 }		
		
	 	if(GyroData[0]<0)
	{
	  OLED_ShowString(0,6,"-");
		OLED_ShowNum(8,6,-GyroData[0],4,16);//陀螺仪x	
	}else
	{
		OLED_ShowNum(8,6,GyroData[0],4,16);//陀螺仪x
	}
	
	if(GyroData[1]<0)
	{
	  OLED_ShowString(40,6,"-");
		OLED_ShowNum(48,6,-GyroData[1],4,16);//陀螺仪y
	}else
	{
		OLED_ShowNum(48,6,GyroData[1],4,16);//陀螺仪y
	}
	
	if(GyroData[2]<0)
	{
	  OLED_ShowString(80,6,"-");
		OLED_ShowNum(88,6,-GyroData[2],4,16);//陀螺仪z
	}else
	{
		OLED_ShowNum(88,6,GyroData[2],4,16);//陀螺仪z
	}

	}	  
	
  /* USER CODE END 3 */
}

五.CubeMX工程源代码下载

通过百度网盘分享的文件:37.MPU6050陀螺仪实验.rar
链接:https://pan.baidu.com/s/1Y0II5SCt6KLbwE4ebyON0A
提取码:5id9
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行

CSDN源代码

六.小结

学会STM32单片机驱动MPU6050,在无人机、机器人、智能手机、平板电脑、可穿戴设备等应用6轴陀螺仪的场合就会得心应手。

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值