STM32 (十五)MPU6050
创始人
2025-05-30 06:31:30
0

简介

前言

一、MPU6050简介

MPU6050是一款性价比很高的陀螺仪,可以读取X Y Z 三轴角度,X Y Z 三轴加速度,还有内置的温度传感器,在姿态解析方面应用非常广泛。

下面是它在淘宝上的参数图

产品尺寸

产品参数

产品原理图:

二、硬件连接

由于采用IIC通信,最基本的只需要采用四根线就可以了。分别VCC,GND,SCL,SDA连接到单片机

SCL-----PB6

SDA-----PB7

GND-----GND

VCC接3V或者5V都行。

三、工作原理

MPU6050内部整合了三轴MEMS陀螺仪、三轴MEMS加速度计以及一个可扩展的数字运动处理器DMP(Digital Motion Processor),而且还可以连接一个第三方数字传感器(如磁力计),这样的话,就可以通过IIC接口输出一个9轴信号(链接第三方数字传感器才可以输出九轴信号,否则只有六轴信号)。

更加方便的是,有了DMP,可以结合InvenSense公司提供的运动处理资料库,实现姿态解算。通过自带的DMP,可以通过IIC接口输出9轴融合演算的数据,大大降低了运动处理运算对操作系统的负荷,同时也降低了开发难度。其实,简单一句话说,陀螺仪就是测角速度的,加速度传感器就是测角加速度的,二者数据通过算法就可以得到PITCH、YAW、ROLL角了。

特点:

以数字形式输出 6 轴或 9 轴(需外接磁传感器)的旋转矩阵、四元数(quaternion)、欧拉角格式(Euler Angle forma)的融合演算数据(需 DMP 支持)

具有 131 LSBs/° /sec 敏感度与全格感测范围为±250、±500、±1000 与±2000° /sec的 3 轴角速度感测器(陀螺仪)

集成可程序控制,范围为±2g、±4g、±8g 和±16g 的 3 轴加速度传感器

移除加速器与陀螺仪轴间敏感度,降低设定给予的影响与感测器的飘移

自带数字运动处理(DMP: Digital Motion Processing)引擎可减少 MCU 复杂的融合演算数据、感测器同步化、姿势感应等的负荷

内建运作时间偏差与磁力感测器校正演算技术,免除了客户须另外进行校正的需求

自带一个数字温度传感器

带数字输入同步引脚(Sync pin)支持视频电子影相稳定技术与 GPS

可程序控制的中断(interrupt),支持姿势识别、摇摄、画面放大缩小、滚动、快速下降中断、 high-G 中断、零动作感应、触击感应、摇动感应功能

VDD 供电电压为 2.5V±5%、 3.0V±5%、 3.3V±5%; VLOGIC 可低至 1.8V± 5%

陀螺仪工作电流: 5mA,陀螺仪待机电流: 5uA; 加速器工作电流:500uA,加速器省电模式电流: 40uA@10Hz

自带 1024 字节 FIFO,有助于降低系统功耗

高达 400Khz 的 IIC 通信接口

超小封装尺寸: 4x4x0.9mm(QFN)

MPU6050三轴角(姿态角)

绕向即为正方向,可根据右手螺旋定则确定方向。

MPU6050框图:

在这里插入图片描述可以很清晰地观察到,MPU6050芯片中内置了三轴加速度传感器、三轴陀螺仪和一个温度传感器。右侧INT为中断输出脚,TCS为片选脚、AD0为设置地址脚、SCL和SDA为主IIC接口、AUX_CL和AUX_DA为从IIC接口,主要用到的是AD0、SCL、SDA。

可以很清晰地观察到,MPU6050芯片中内置了三轴加速度传感器、三轴陀螺仪和一个温度传感器。右侧INT为中断输出脚,TCS为片选脚、AD0为设置地址脚、SCL和SDA为主IIC接口、AUX_CL和AUX_DA为从IIC接口,主要用到的是AD0、SCL、SDA。

相关寄存器

这部分就比较多了,不想看的也可以直接跳过,一样可以使用,想深入了解的朋友可以看一下。

1、电源管理寄存器

DEVICE_RESE=1,复位MPU6050,复位完成后,自动清零。SLEEP=1,进入睡眠模式;SLEEP=0,正常工作模式。TEMP_DIS,用于设置是否使能温度传感器,设置为0,则使能CLKSEL[2:0],用于选择系统时钟源,如下所示:

总之,电源管理寄存器就是复位MPU6050

该寄存器的LP_WAKE_CTRL用于控制低功耗时的唤醒频率,用不到。剩下的6位,分别控制加速度和陀螺仪的x/y/z轴是否进入待机模式,这里我们全部都不进入待机模式,所以全部设置为:0 ,即可。

总之,电源管理寄存器2就是用于设置加速度传感器和陀螺仪的X/Y/Z轴是进入休眠还是正常工作。

2、陀螺仪配置寄存器

该寄存器我们只关心FS_SEL[1:0]这两个位,用于设置陀螺仪的满量程范围:0,±250°/s;1,±500°/s;2,±1000°/s;3,±2000°/s;我们一般设置为3,即±2000°/S,因为陀螺仪的ADC为16位分辨率,所以得到灵敏度为:65536/4000=16.4LSB/(°/S)。

总之,陀螺仪配置寄存器就是配置陀螺仪满量程范围,设置最大

3、加速度配置寄存器

该寄存器我们只关心AFS_SEL[1:0]这两个位,用于设置加速度传感器的满量程范围:0,±2g;1,±4g;2,±8g;3,±16g;我们一般设置为0,即±2g,因为加速度传感器的ADC也是16位,所以得到灵敏度为:65536/4=16384LSB/g。

总之,加速度传感器配置寄存器就是配置加速度传感器满量程范围,不宜过大

4、FIFO使能寄存器

该寄存器用于控制FIFO使能,在简单读取传感器数据的时候,可以不用FIFO,设置对应位为:0,即可禁止FIFO,设置为1,则使能FIFO。加速度传感器的三个轴,全由一个位(ACCEL_FIFO_EN)控制,只要该位为1,则加速度传感器三个通道都开启FIFO;但是陀螺仪传感器的三个轴需要一个一个设置,即XYZ轴分别配置。

总之,FIFO使能寄存器用于控制使能FIFO(First Input First Output)

5、陀螺仪采样率分频寄存器

该寄存器用于设置MPU6050的陀螺仪采样频率,计算公式为:采样频率 = 陀螺仪输出频率 / (1+SMPLRT_DIV)。这里陀螺仪的输出频率,是1Khz或者8Khz,与数字低通滤波器(DLPF)的设置有关,当DLPF_CFG=0或7的时候,频率为8Khz,其他情况是1Khz。而且DLPF滤波频率一般设置为采样率的一半。采样率,我们假定设置为50Hz,那么:SMPLRT_DIV=1000/50-1=19。

总之,陀螺仪采样率分频寄存器就是用于设置陀螺仪的采样频率,如果采样频率为50Hz,那么采样周期就为1/50=20ms,即20ms采集一次陀螺仪的数据。

6、配置寄存器

总之,配置寄存器就是设置数字低通滤波器的DLPF_CFG位来结合陀螺仪采样分频寄存器来共同设置采样周期。

7、陀螺仪数据输出寄存器

陀螺仪数据输出寄存器总共由6个寄存器组成,输出X/Y/Z三个轴的陀螺仪传感器数据,高字节在前,低字节在后。

总之,陀螺仪数据输出寄存器就是把陀螺仪测量到的数据输出出来。

8、加速度传感器数据输出寄存器

加速度传感器数据输出寄存器总共由6个寄存器组成,输出X/Y/Z三个轴的加速度传感器值,高字节在前,低字节在后。

总之,加速度传感器数据输出寄存器就是把加速度传感器测量到的数据输出出来。

9、温度传感器数据输出寄存器

通过读取0X41(高8位)和0X42(低8位)寄存器得到,温度换算公式为:

Temperature = 36.53 + regval/340。其中,Temperature为计算得到的温度值,单位为℃,regval为从0X41和0X42读到的温度传感器值。

总之,温度传感器数据输出寄存器就是把温度寄存器测量到的数据处处出来。

工程创建

总配置如下

1 高速时钟选择外部8Mhz的晶振

2 开启debug调试功能

3 时钟树

4 打开串口设置

5 并且使能串口中断

6 打开IIC设置

7 打开IIC中断

代码讲解

代码重点是讲解我们的dmp库的移植:

一、首先我们要先去移植DMP的几个文件,这几个文件网上都可以找了,但是为了方便你们,我也就放在这里了。

https://download.csdn.net/download/DOF526570/87588566

里面打开是这样的一个文件

把里面的.c和.h文件分别放在对应的Src和Inc里面就好了

然后去工程里面记得添加一下文件就好了,也不用去添加路径了。

接下来讲解一下主函数的示例代码:

首先是我们的日常,重写一下我们的串口打印函数:

/*** 函数功能: 重定向c库函数printf到DEBUG_USARTx* 输入参数: 无* 返 回 值: 无* 说    明:无*/
int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);return ch;
}/*** 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx* 输入参数: 无* 返 回 值: 无* 说    明:无*/
int fgetc(FILE *f)
{uint8_t ch = 0;HAL_UART_Receive(&huart1, &ch, 1, 0xffff);return ch;
}

然后添加变量来获取mpu6050返回的信息:

float pitch,roll,yaw;         //欧拉角
short aacx,aacy,aacz;        //加速度传感器原始数据
short gyrox,gyroy,gyroz;    //陀螺仪原始数据
short temp;                    //温度

接下来是初始化一下我们的MPU6050还有dmp库

    while(MPU_Init());                    //初始化MPU6050printf("%s\r\n","Mpu6050 Init ok!");while(mpu_dmp_init()){HAL_Delay(200);printf("%s\r\n","Mpu6050 Init Wrong!");}printf("%s\r\n","Mpu6050 Init OK!");

最后在我们主函数的while里面打印出来获取的数量,这里为了我们方便看到变化,我就延时就了一点:

  while (1){/* USER CODE END WHILE */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);    //得到陀螺仪数据printf("三轴角度:%f-%f-%f\r\n",pitch,roll,yaw);printf("三轴加速度:%d-%d-%d\r\n",aacx,aacy,aacz);printf("三轴角角度:%d-%d-%d\r\n",gyrox,gyroy,gyroz);}HAL_Delay(1000);/* USER CODE BEGIN 3 */}

到这里就基本搞定了。

串口助手显示如下:

相关内容

热门资讯

【MySQL】锁 锁 文章目录锁全局锁表级锁表锁元数据锁(MDL)意向锁AUTO-INC锁...
【内网安全】 隧道搭建穿透上线... 文章目录内网穿透-Ngrok-入门-上线1、服务端配置:2、客户端连接服务端ÿ...
GCN的几种模型复现笔记 引言 本篇笔记紧接上文,主要是上一篇看写了快2w字,再去接入代码感觉有点...
数据分页展示逻辑 import java.util.Arrays;import java.util.List;impo...
Redis为什么选择单线程?R... 目录专栏导读一、Redis版本迭代二、Redis4.0之前为什么一直采用单线程?三、R...
【已解决】ERROR: Cou... 正确指令: pip install pyyaml
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
Lock 接口解读 前置知识点Synchronized synchronized 是 Java 中的关键字,...
Win7 专业版安装中文包、汉... 参考资料:http://www.metsky.com/archives/350.htm...
3 ROS1通讯编程提高(1) 3 ROS1通讯编程提高3.1 使用VS Code编译ROS13.1.1 VS Code的安装和配置...
大模型未来趋势 大模型是人工智能领域的重要发展趋势之一,未来有着广阔的应用前景和发展空间。以下是大模型未来的趋势和展...
python实战应用讲解-【n... 目录 如何在Python中计算残余的平方和 方法1:使用其Base公式 方法2:使用statsmod...
学习u-boot 需要了解的m... 一、常用函数 1. origin 函数 origin 函数的返回值就是变量来源。使用格式如下...
常用python爬虫库介绍与简... 通用 urllib -网络库(stdlib)。 requests -网络库。 grab – 网络库&...
药品批准文号查询|药融云-中国... 药品批文是国家食品药品监督管理局(NMPA)对药品的审评和批准的证明文件...
【2023-03-22】SRS... 【2023-03-22】SRS推流搭配FFmpeg实现目标检测 说明: 外侧测试使用SRS播放器测...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
初级算法-哈希表 主要记录算法和数据结构学习笔记,新的一年更上一层楼! 初级算法-哈希表...
进程间通信【Linux】 1. 进程间通信 1.1 什么是进程间通信 在 Linux 系统中,进程间通信...
【Docker】P3 Dock... Docker数据卷、宿主机与挂载数据卷的概念及作用挂载宿主机配置数据卷挂载操作示例一个容器挂载多个目...