正点原子STM32学习笔记——MPU6050介绍

2023-05-16

一、MPU6050简介

1.什么是MPU6050?

        MPU6050是InvenSense公司推出的全球首款整合性6轴运动处理组件,内带3轴陀螺仪和3轴加速度传感器,并且含有一个第二IIC接口,可用于连接外部磁力传感器,利用自带数字运动处理器(DMP: Digital Motion Processor)硬件加速引擎,通过主IIC接口,可以向应用端输出完整的9轴姿态融合演算数据。

        有了DMP,我们可以使用InvenSense公司提供的运动处理资料库,非常方便的实现姿态解算,降低了运动处理运算对操作系统的负荷,同时大大降低了开发难度 。

2.MUP6050特点。

MPU6050 的特点包括:
① 以数字形式输出 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,陀螺仪待。
⑫ 自带 1024 字节 FIFO,有助于降低系统功。
⑬ 高达 400Khz 的 IIC 通信接口。
⑭ 超小封装尺寸:4x4x0.9mm(QFN)。

3.MPU6050框图。

MPU6050

        其中,SCL 和 SDA 是连接 MCU 的 IIC 接口,MCU 通过这个 IIC 接口来控制 MPU6050,另外还有一个 IIC 接口:AUX_CL 和 AUX_DA,这个接口可用来连接外部从设备,比如磁传感器,这样就可以组成一个九轴传感器。VLOGIC 是 IO 口电压,该引脚最低可以到 1.8V,我们一般直接接 VDD 即可。AD0 是从 IIC 接口(接 MCU)的地址控制引脚,该引脚控制IIC 地址的最低位。如果接 GND,则 MPU6050 的 IIC 地址是:0X68,如果接 VDD,则是0X69,注意:这里的地址是不包含数据传输的最低位的(最低位用来表示读写)!!

另:
①ATK-MPU6050 六轴传感器模块外观:
在这里插入图片描述
        模块自带了 3.3V 超低压差稳压芯片,给 MPU6050 供电,因此外部供电可以选择:3.3V / 5V 都可以。模块通过 P1 排针与外部连接,引出了 VCC、GND、IIC_SDA、IIC_SCL、MPU_INT 和 MPU_AD0 等信号,其中,IIC_SDA 和 IIC_SCL 带了 4.7K上拉电阻,外部可以不用再加上拉电阻了,另外 MPU_AD0 自带了 10K 下拉电阻,当 AD0悬空时,默认 IIC 地址为(0X68)。
②ATK-MPU6050 模块原理图:
在这里插入图片描述

4.MPU6050初始化。

1 )初始化 IIC 接口
        MPU6050 采用 IIC 与 STM32F1 通信,所以我们需要先初始化与 MPU6050 连接的 SDA和 SCL 数据线。

2 )复位 MPU6050
        这一步让 MPU6050 内部所有寄存器恢复默认值,通过对电源管理寄存器 1(0X6B)的bit7 写 1 实现。 复位后,电源管理寄存器 1 恢复默认值(0X40),然后必须设置该寄存器为0X00,以唤醒 MPU6050,进入正常工作状态。

3 )设置角速度传感器(陀螺仪)和加速度传感器的满量程范围
        这一步,我们设置两个传感器的满量程范围(FSR),分别通过陀螺仪配置寄存器(0X1B)和加速度传感器配置寄存器(0X1C)设置。我们一般设置陀螺仪的满量程范围为±2000dps,加速度传感器的满量程范围为±2g。

4 )设置其他参数
        这里,我们还需要配置的参数有:关闭中断、关闭 AUX IIC 接口、禁止 FIFO、设置陀螺仪采样率和设置数字低通滤波器(DLPF)等。本章我们不用中断方式读取数据,所以关闭中断,然后也没用到 AUX IIC 接口外接其他传感器,所以也关闭这个接口。分别通过中断使能寄存器(0X38)和用户控制寄存器(0X6A)控制。MPU6050 可以使用 FIFO 存储传感器数据,不过本章我们没有用到,所以关闭所有 FIFO 通道,这个通过 FIFO 使能寄存器(0X23)控制,默认都是 0(即禁止 FIFO),所以用默认值就可以了。陀螺仪采样率通过采样率分频寄存器(0X19)控制,这个采样率我们一般设置为 50 即可。数字低通滤波器(DLPF)则通过配置寄存器(0X1A)设置,一般设置 DLPF 为带宽的 1/2 即可。

5 )配置系统时钟源并使能角速度传感器和加速度传感器
        系统时钟源同样是通过电源管理寄存器 1(0X1B)来设置,该寄存器的最低三位用于设置系统时钟源选择,默认值是 0(内部 8M RC 震荡),不过我们一般设置为 1,选择 x 轴陀螺 PLL 作为时钟源,以获得更高精度的时钟。同时,使能角速度传感器和加速度传感器,这两个操作通过电源管理寄存器 2(0X6C)来设置,设置对应位为 0 即可开启。

        至此,MPU6050 的初始化就完成了,可以正常工作了(其他未设置的寄存器全部采用默认值即可),接下来,我们就可以读取相关寄存器,得到加速度传感器、角速度传感器和温度传感器的数据了。不过,我们先简单介绍几个重要的寄存器。

5.寄存器介绍

①电源管理寄存器1(寄存器地址为 0X6B)
电源管理寄存器1各位描述
        其中,DEVICE_RESET 位用来控制复位,设置为 1,复位 MPU6050,复位结束后,MPU硬件自动清零该位。SLEEEP 位用于控制 MPU6050 的工作模式,复位后,该位为 1,即进入了睡眠模式(低功耗),所以我们要清零该位,以进入正常工作模式。TEMP_DIS 用于设置是否使能温度传感器,设置为 0,则使能。最后 CLKSEL[2:0]用于选择系统时钟源,选择关系如下表所示:
CLKSEL 选择列表
        默认是使用内部 8M RC 晶振的,精度不高,所以我们一般选择 X/Y/Z 轴陀螺作为参考的 PLL 作为时钟源,一般设置 CLKSEL=001 即可。

②陀螺仪配置寄存器(寄存器地址为0X1B)

陀螺仪配置寄存器各位描述
        该寄存器我们只关心 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)。

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

④ FIFO 使能寄存器(寄存器地址为0X23)

FIFO 使能寄存器各位描述
        该寄存器用于控制 FIFO 使能,在简单读取传感器数据的时候,可以不用 FIFO,设置对应位为 0 即可禁止 FIFO,设置为 1,则使能 FIFO。注意加速度传感器的 3 个轴,全由 1个位(ACCEL_FIFO_EN)控制,只要该位置 1,则加速度传感器的三个通道都开启 FIFO了。

⑤陀螺仪采样率分频寄存器(寄存器地址为0X19)
陀螺仪采样率分频寄存器各位描述
        该寄存器用于设置 MPU6050 的陀螺仪采样频率,计算公式为:
                        采样频率 = 陀螺仪输出频率 / (1+SMPLRT_DIV)

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

⑥配置寄存器(寄存器地址为0X1A)
配置寄存器各位描述
        这里,我们主要关心数字低通滤波器(DLPF)的设置位,即:DLPF_CFG[2:0],加速度计和陀螺仪,都是根据这三个位的配置进行过滤的。DLPF_CFG 不同配置对应的过滤情况如下表所示:
DLPF_CFG 不同配置对应的过滤情况
        这里的加速度传感器,输出速率(Fs)固定是 1Khz,而角速度传感器的输出速率(Fs),则根据 DLPF_CFG 的配置有所不同。一般我们设置角速度传感器的带宽为其采样率的一半,如前面所说的,如果设置采样率为 50Hz,那么带宽就应该设置为 25Hz,取近似值 20Hz,就应该设置 DLPF_CFG=100。

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

⑧陀螺仪数据输出寄存器(共6个寄存器,地址为0X43~0X48)
陀螺仪数据输出寄存器各位描述
        陀螺仪数据输出寄存器总共由6个寄存器组成,输出X/Y/Z三个轴的陀螺仪传感器数据,高字节在前,低字节在后。

⑨加速度传感器数据输出寄存器(6个,地址为0X3B~0X40)
加速度传感器数据输出寄存器各位描述
        加速度传感器数据输出寄存器总共由6个寄存器组成,输出X/Y/Z三个轴的加速度传感器值,高字节在前,低字节在后。

⑩温度传感器数据输出寄存器(0X41~0X42)
温度传感器数据输出寄存器各位描述
        通过读取0X41(高8位)和0X42(低8位)寄存器得到,温度换算公式为:
                                                Temperature = 36.53 + regval/340
        其中,Temperature为计算得到的温度值,单位为℃,regval为从0X41和0X42读到的温度传感器值。

二、DMP使用简介

        MPU6050 自带了数字运动处理器,即 DMP,并且,InvenSense 提供了一个 MPU6050 的嵌入式运动驱动库,结合 MPU6050 的 DMP,可以将我们的加速度传感器和角速度传感器的原始数据,直接转换成四元数输出,而得到四元数之后,就可以很方便的计算出欧拉角:航向角(yaw)、横滚角(roll)和俯仰角(pitch)。

        使用内置的 DMP,大大简化了四轴的代码设计,且 MCU 不用进行姿态解算过程,大大降低了 MCU 的负担,从而有更多的时间去处理其他事件,提高系统实时性。

        使用 MPU6050 的 DMP 输出的四元数是 q30 格式的,也就是浮点数放大了 2 的 30 次方倍。在换算成欧拉角之前,必须先将其转换为浮点数,也就是除以 2 的 30 次方,然后再进行计算,计算公式为:
        q0=quat[0] / q30; //q30 格式转换为浮点数
        q1=quat[1] / q30;
        q2=quat[2] / q30;
        q3=quat[3] / q30;
        //计算得到俯仰角/横滚角/航向角
        pitch=asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; //俯仰角
        roll=atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; //横滚角
        yaw=atan2(2*(q1q2 + q0q3),q0q0+q1q1-q2q2-q3q3) * 57.3; //航向角

        其中 quat[0]~ quat[3]是 MPU6050 的 DMP 解算后的四元数,q30 格式,所以要除以一个2 的 30 次方,其中 q30 是一个常量:1073741824,即 2 的 30 次方,然后带入公式,计算出欧拉角。上述计算公式的 57.3 是弧度转换为角度,即 180/π,这样得到的结果就是以度(°)为单位的。关于四元数与欧拉角的公式推导,这里不进行详细说明。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正点原子STM32学习笔记——MPU6050介绍 的相关文章

  • 基于四元数的扩展卡尔曼(EKF)滤波器四旋翼姿态解算详解-1.KF介绍

    先说明一下 xff0c 之前介绍的两种姿态解算算法http blog csdn net wkdwl article details 52119163 互补滤波和入梯度下降姿态解算算法 xff0c 虽然在姿态解算方面效果还比较不错 但是缺点就
  • android开发(一)常见问题

    1 android开发环境 1 添加环境变量名称为 xff1a ANDROID HOME ANDROID HOME 61 D xxx android android sdk 2 下面路径添加到path环境变量里 ANDROID HOME p
  • 基于四元数的扩展卡尔曼(EKF)滤波器四旋翼姿态解算详解-2.EKF介绍

    尽快抽时间写完吧
  • Linux环境安装RabbitMQ

    RabbitMQ Linux环境安装 检查当前linux服务器的版本 lsb release a 官网下载安装包 xff1a https www rabbitmq com download html 1 2 3 选择对应的安装环境 4 对照
  • MySQL的安装

    MySQL的安装 1 下载 网址 xff1a https dev mysql com downloads mysql 2 下载5 7版本 xff08 1 xff09 xff08 2 xff09 xff08 3 xff09 3 配置环境变量
  • Nginx windows server 2012部署过程

    部署静态网页到服务器 今天做了一个静态网页 xff0c 想部署带到自己的阿里云服务器 通过查询可以使用tomcat容器或者nginx xff0c 主流方式是nginx部署 xff0c 记录一下自己部署的过程 一 nginx简介 Nginx
  • 点击按钮实时刷新图片

    js给 lt img gt 标签的src赋值 最近做一个点击一个按钮刷新加载另一张图片的功能 主要就是改变图的路径 记录一下自己遇到的坑 支持原生的js和jq实现 用js原生方法 xff1a document getElementById
  • RestTemplate的学习与使用

    RestTemplate的学习与使用 最近在开发过程中遇到使用接口传输数据 了解到到RestTemplate 1 源码分析 span class token keyword public span span class token keyw
  • Linux环境下redis的安装

    Linux环境下redis的安装 1 下载redis安装包 服务器上执行以下命令下载redis安装包 cd export software wegt http download redis io releases redis 6 2 6 t
  • Docker的安装

    Docker的安装 1 linux下安装docker xff08 CentOS7 xff09 curl sSL https get daocloud io docker sh 2 查看docker的版本 docker v 3 启动 关闭do
  • Redis的应用场景

    1 String操作 xff08 1 xff09 计数器 incr artcle readconunt 文章id get artcle readconunt 文章id 2 Hash操作 1 对象缓存 hmset user 1 name li
  • nginx在linux环境安装

    1 安装依赖包 yum install pcre pcre devel y yum install openssl openssl devel y 2 官网下载安装包传到linux环境 安装包存放位置 export software 解压目
  • 开发杂谈(一)常见问题

    1 github 1 从GITHUB下载慢而且容易中断解决办法 1 从GITHUB下载慢而且容易中断解决办法 将github项目导入到码云网 xff08 https gitee com xff09 然后再下载会很快 xff0c 登录码云网后
  • Windows证书函数

    C语言操作WINDOWS系统存储区数字证书相关函数详解及实例 以下代码使用C 43 43 实现遍历存储区证书及使用UI选择一个证书 使用 CertOpenSystemStore打开证书存储区 在循环中 使用CertEnumCertifica
  • 使用Docker安装RabbitMQ

    1 yum 包更新到最新 yum update xff08 2 xff09 安装需要的软件包 xff0c yum util 提供yum config manager功能 xff0c 另外两个是devicemapper驱动依赖的 yum in
  • docker的安装及常用命令

    安装Docker 官网地址 https www docker com 文档地址 https docs docker com Dockerhub仓库地址 https hub docker com 名词解释 镜像 xff08 image xff
  • docker安装部署一些软件(nginx、tomcat、mysql、es)

    linux防火墙相关操作 systemctl restart firewalld service span class token comment 重启服务 span systemctl start firewalld span class
  • docker的commit和容器数据卷

    commit镜像 span class token function docker span commit 提交容器成为一个新的副本 span class token comment 命令和git原理相似 span span class t
  • DockerFile的使用

    DockerFile dockerfile是用来构建docker镜像的文件 xff01 命令参数脚本 构建步骤 xff1a 1 编写一个dockerfile文件 2 docker build 构建成为一个镜像 3 docker run 运行
  • Docker网络及SpringBoot应用打包

    1 查看当前阿里云的一网络信息 span class token comment 命令 ip addr span 2 查看容器内部网络地址 这里使用上一篇博客的自定义Dockerfile文件构建的tomcat xff0c 因为默认拉取的镜像

随机推荐

  • Docker学习目录

    自己整理的笔记 1 docker的安装及常用命令 2 docker的commit和容器数据卷 3 docker安装部署一些软件 xff08 nginx tomcat mysql es xff09 4 DockerFile的使用 5 Dock
  • Docker Compose

    1 Docker Compose官网说明 理解 Compose是Docker官方的开源项目 需要安装 xff01 Dockerfile 让程序在任何地方运行 web服务 redis mysql nginx 多个容器 run Compose的
  • Docker Swarm

    1 购买4台阿里云 按量付费买四台 2 都安装docker Xshell右键 可以将命令发送到所有会话 3 查看官网 地址 xff1a https docs docker com engine swarm 4 工作模式 5 搭建集群 私网不
  • 使用GPU跑代码,设置使用哪块GPU

    服务器多张GPU同时跑代码 1 查看电脑的显卡有几块 在控制台输入 nvidia smi 发现服务器有两个显卡 xff0c 0号和1号 2 在代码中指定GPU 使用0号显卡 xff1a device 61 torch span class
  • android StringBuiler常用方法

    String在java中是不可变长的 频繁拼接修改等效率会很低 StringBuiler 是个可变长的 xff0c 处理字符串效率比较高也可以减少内存开支 xff0c 比如append时并不是用String存储 而是放到一个value的ch
  • C++中的迭代器和泛型算法

    简单的迭代器和算法 1 迭代器令算法不依赖于容器 xff0c 但算法依赖于元素类型的操作 泛型算法本身不会执行容器的操作 xff0c 它们只会运行于迭代器之上 xff0c 执行迭代器的操作 算法永远不会改变底层容器的大小 算法可能改变容器中
  • 宝塔面板无法打开

    宝塔面板无法打开 在别的应用软件像putty 宝塔等打不开时 xff0c 弹出以下页面 在阿里云官网搜索服务器 rm f www server panel data admin path pl 到底部执行并保存 再次访问宝塔等就可以了
  • 【Ubuntu 安装指定版本RabbitMQ ※便捷版※】

    Ubuntu 16 04 安装 RabbitMQ 3 7 4 第一步 安装 erlang 需要注意 erlang和rabbitmq的版本比对关系 https www rabbitmq com which erlang html 我这里安装的
  • JavaScript 文件对象详解

    在浏览器中操作文件 xff0c 多数情况下用到的是 File 对象 xff0c 从 lt input type 61 39 file 39 gt 元素获取 xff0c 进而继续操作 例如将选择的图片展示在页面上 xff0c 用ajax将文件
  • 协议栈的定义

    所谓协议栈就是对信息进行多次封装和解封的过程 xff0c 以便能够在不同的实体间传送信息 是根据OSI体系模型划分的各层协议的总和 就是一套协议的规范 xff0c 比如HTTP gt TCP gt IP xff0c 一个HTTP请求 xff
  • 死锁,死锁的四个必要条件以及处理策略

    一 什么是死锁二 死锁与饥饿三 资源的类型 3 1 可重用资源和消耗性资源 3 1 1 可重用资源 xff08 永久性资源 xff09 3 1 2 消耗性资源 xff08 临时性资源 xff09 3 2 可抢占资源和不可抢占资源 3 2 1
  • 排查机器 负载过高, ssh进不去问题

    排查路径 xff1a 1 一开始怀疑可能是io阻塞导致 xff0c 于是使用iostat xdm 1 100 xff0c 查看 io状况 xff0c 发现io不高 2 于是使用top xff0c 查看系统负载情况 发现系统负载很高 xff0
  • 什么是奇偶校验

    什么是奇偶校验 对数据传输正确性的一种校验方法 在数据传输前附加一位奇校验位 xff0c 用来表示传输的数据中 34 1 34 的个数是奇数还是偶数 xff0c 为奇数时 xff0c 校验位置为 34 0 34 xff0c 否则置为 34
  • Linux CentOS 7 elasticsearch 设置开机自启

    在 etc systemd system目录下创建elasticsearch service文件 span class token namespace Unit span Description 61 elasticsearch span
  • Centos7 设置开机自启的几种方式

    一 系统服务的方式 1 前提 xff08 1 xff09 首先要将需要自启的软件或应用注册成系统服务 xff0c 下面提供常用的软件注册系统服务的案例 nginx service 创建服务文件 vi usr lib systemd syst
  • ubuntu18.04 server配置 ip地址

    ubuntu18 04 server xff0c 启用了新的网络工具netplan xff0c 下面对齐配置参数进行介绍 1 其网络配置文件是放在 etc netplan yaml 缺省dhcp打开方式 xff0c 如果要配置静态地址 xf
  • Ardupilot基于UWB的定位飞行测试

    拖了许久的测试视频 xff0c 终于要发布了 xff0c 上个版本的代码有点问题 xff0c 没有考虑清楚UWB和NED坐标系的关系 xff0c 导致后面飞行故障不断 xff0c 这款UWB的坐标系为ENU坐标系 xff0c 飞机飞行的坐标
  • AutoBoat自动导航无人船

    AutoBoat 自动导航支持航线规划无人船 AutoBoat是一款功能强大自动驾驶无人船 xff0c 同时还可以搭配多款地面控制站使用 地面站中可以在线升级固件 调参 xff0c 使用一套全双工的无线数据传输系统在地面站与小车之间建立起一
  • PIXHAWK上安装PX4Flow光流传感器及调试过程

    小编最近刚调试完光流传感器 xff0c 效果非常理想 xff0c 无GPS情况下很稳定 小编把调试过程的过程和遇到的问题分享给大家 xff0c 希望大家少走弯路 在安装和调试光流传感器之前 xff0c 先保证旋翼机已经安装和调试完毕 xff
  • 正点原子STM32学习笔记——MPU6050介绍

    一 MPU6050简介 1 什么是MPU6050 xff1f MPU6050是InvenSense公司推出的全球首款整合性6轴运动处理组件 xff0c 内带3轴陀螺仪和3轴加速度传感器 xff0c 并且含有一个第二IIC接口 xff0c 可