STM32-MPU6050+DAM库源码(江协笔记)
目录
1、MPU6050简介
2、MPU6050参数
3、MPU6050硬件电路
4、MPU6050结构
5、MPU6000和MPU6050的区别
6、MPU6050应用场景
7、MPU6050电气参数
8、MPU6050时钟源选择
9、MPU6050中断源
10、MPU6050的I2C读写操作
11、DMP库移植
1、MPU6050简介
10轴传感器:3轴加速度传感器+3轴陀螺仪传感器+3轴磁场传感器+气压传感器
欧拉角:以飞机为例,欧拉角便是飞机机身相对于初始3个轴的夹角,用于表达飞机的姿态。飞机机头上倾或者上仰,与z轴的夹角称为俯仰(Pitch);飞机机身左翻滚或者右翻滚,与x轴的夹角称为滚转(Roll);飞机机身保持水平,机头向左转向或者向右转向,这个轴的夹角称为偏航(Yaw)。
3轴加速度传感器:陀螺仪内部x/y/z轴方向分别放置了一个加速度计(原理与压力计相似),可以想象一个内置小球的方框模型,正方体六个面所测到的力就是3个轴的加速度值。如果把芯片水平放置在地球上,便只有底面测力计受到小球的压力,此时XY轴输出为0,z轴输出一个向下的加速度值;如果在自由落体,则xyz输出均为0。需要注意的是,加速度计具有静态稳定性,不具有动态稳定性,用加速度求角度只能在物体静止时使用,当物体运动时,这个角度会受加速度的影响而变得不准确。
3轴陀螺仪传感器:上图模型中,中间是一个有一定质量的旋转轮,外面是3个轴的平衡环。当中间的旋转轮高速旋转时,根据动量守恒的原理,该旋转轮具有保持其原有角动量的趋势,这个趋势可以保持旋转轴方向不变,当外部物体转动时,内部的旋转轴方向并不会转动,这就会在平衡环连接处产生角度偏差,如果在连接处放置一个旋转的电位器,通过测量电位器的电压便可得到旋转的角度。理论是MPU6050是可以直接测量角度的,可能是结构的差异或者工艺的限制,芯片内部的陀螺仪测量的是角速度。陀螺仪测量的xyz轴的角速度值,分别表示此时芯片绕x轴、y轴和z轴旋转的角速度。可以想象一下游乐园的飞轮,中间的轴转的越快,椅子飞的越远,测量椅子飞起的距离或者夹角,便可得到中间值的角度,对角速度进行积分便可得到角度。需要注意的是,陀螺仪具有动态稳定性,不具有静态稳定性,因为角速度积分得到的角度的误差会随着时间而变大,当物体静止时,角速度会因为噪声无法完全归零,然后经过积分的不断累积,这个小噪声就会导致计算出来的角度产生缓慢的漂移。但是该角度不受物体运动的影响。
2、MPU6050参数
ADC:MPU6050需要通过内部ADC将读取到达电压信号转化为数字信号;
加速度满量程:g=9.8m/s^2;
陀螺仪满量程:。/sec(角速度单位),表示每秒旋转的度数。
(如果所测量的物体运动非常剧烈,可将满量程设置大一些,防止加速度或者角速度超出量程;如果所测量的问题运动非常平缓,可将满量程设置小一下,以提高分辨率。)
数字低通滤波器:使输出数据变得平缓;
时钟源和时钟采样分频:时钟源结果分频,可以为AD转换和内部其他电路提供时钟,控制分频系数便可控制AD转换的快慢。
I2C从机地址:在程序在可以直接用二进制表示,如果要用16进制表示,有2种表示方式:1、认为0x68为从机地址,1101000-》0x68,但在I2C通信的时序中,第一个字节的高7位才是从机地址,最低位是读写位,所以发送地址要表示为(0x68<<1)|(读写位);2、认为0xD0为从机地址,即0x68左移一位后的数据,所以发送地址要表示为(0xD0)|(读写位)。
3、MPU6050硬件电路
XCL、XDA:用于外接磁力计或气压计,MPU6050的主机接口可以直接访问这些扩展芯片的数据,把这些扩展芯片数据读取到MPU6050中去,MPU6050的DMP单元对这些数据进行数据融合和姿态解算。但如果不需要MPU6050的解算功能的话,也可以直接挂载到SDA、SCL上,因为I2C可以同时挂载多个设备;
SDA、SCL:MPU6050的该引脚已内置上拉电阻;
AD0:接高电平,7位从机地址为1101001;接低电平,7位从机地址为1101000;悬空默认低电平;
INT:可以配置芯片内部的一些事件,来触发中断引脚的输出,比如数据准备好了、I2C主机错误等;另外,芯片内部还内置了一些实用的小功能,比如自由落体检测、运动检测、零运动检测等,这些信号都可以触发INT引脚产生电平跳变,需要时进行中断配置即可。
4、MPU6050结构
传感器自测单元:用于验证芯片好坏。外力施加到传感器上,这个外力使传感器数据会比平时大一些。先使能自测,读取数据,再失能自测,读取数据,两个数据的差值称为自测响应,如果自测响应在芯片手册规定的范围内,说明芯片没有问题,反之则可能损坏。
电荷泵:一种升压、降压电路,由于陀螺仪内部需要一个高低压支持,所以需要电荷泵进行升压,这在OLED中也有应用。因为电容比较小,所以切换速度要快,再在电压输出端接电源滤波,便可进行平稳升压。
-
阶段1:输入电压Vin个fly电容充电,Vfly = Vin。
-
阶段2:改变如图改变电容的接入方式,由于阶段1中电容已经充电,fly电容上端的电压 = Vin + Vfly = 2 * Vin = Vout,实现倍压。
中断状态寄存器:控制内部事件到中断引脚的输出;
先入先出寄存器:对数据流进行缓存;
配置寄存器:对内部各个电路进行配置;
传感器寄存器(数据寄存器):存储各个传感器的数据;
工厂校准:用于内部传感器校准;
数字运动处理器(DMP):芯片内部自带的一个姿态解算的硬件算法,配合官方的DMP库,可以进行姿态解算;
接口旁路选择器:开关接上时,MPU6050和扩展设备均由STM32控制;接下,MPU6050由STM32控制,扩展设备由MPU6050控制。
5、MPU6000和MPU6050的区别
两种型号的陀螺仪功能差不多,仅有些许差异:
-
MPU6050有一个独立的逻辑电源引脚VLOGIC,可以支持供电和IO口不一样的电平等级,而MPU6000没有
-
MPU6000同时支持I2C和SPI通信接口,而MPU6050仅支持I2C通信
6、MPU6050应用场景
-
BlurFreeTM技术(用于视频/静止图像稳定)
-
AirSignTM技术(用于安全/认证)
-
TouchAnywhereTM技术(用于“无触控”UI应用控制/导航)
-
MotionCommandTM技术(用于手势快捷键)
-
支持动作的游戏和应用框架
-
InstantGesture TMiGTM手势识别
-
基于位置的服务,兴趣点和航位推算
-
手机和便携式游戏
-
基于动作的游戏控制器
-
用于联网的数字电视和机顶盒的3D遥控器,3D鼠标
-
用于健康、健身和运动的可穿戴传感器
-
玩具
7、MPU6050电气参数
(1)绝对最大参数
如果超过绝对最大参数芯片便有可能损坏。
(2)I2C时序表征
MPU6050的I2C的SCL时钟频率最大可达400KHz,如果STM32的I2C时钟频率超过则芯片可能跟不上,当然,I2C是同步时序,对时间的要求不是非常严格,所以400KHz只是一个最大参数,实际速率可以慢一些。
虽然供电绝对最大参数为5~6V,但其电气特性的供电范围为2.375~3.46V,若超过芯片可能无法正常工作,所以使用3.3V供电即可。
8、MPU6050时钟源选择
-
MPU6050内部晶振。
-
X、Z、Y轴陀螺仪。因为陀螺仪内部需要高精度时钟的支持,所以陀螺仪内部也有独立的时钟,这3个时钟可以输出作为内部时钟。
-
通过外部的CLKIN引脚,输入32.768Hz或者19.2MHz的方波作为系统时钟。
一般使用前2种。
9、MPU6050中断源
以自由落体检测为例:自由落体时,3个加速度值均为0,当加速度值低于预设的阈值时,开始计数,当计数足够多时,发生自由落体事件,可以配置这个事件去触发中断引脚的电平跳变。
运动检测和零运动检测也是类似的逻辑。需要注意的是,运动检测会有一个高通滤波器,用来滤除重力造成的稳定数据偏置,即滤除加速度计静置时那1gd的重力加速度,不需要时可不理会。
10、MPU6050的I2C读写操作
11、MPU6050的I寄存器
寄存器上电后默认为0x00,除了ID号寄存器(0x68)和电源管理寄存器1(0x40,即上电后默认为睡眠模式,所以操作时要注意解除睡眠,否则操作其他寄存器无效)。
(1)采样频率寄存器
8位为一个整体作为分频值,可以配置采样频率的分频系数。分频越小,内部的AD转换越快,数据寄存器刷新就越快,反之越慢。以陀螺仪时钟源为例,
采样频率(数据刷新率)=陀螺仪输出时钟频率/(1+分频值),注意,不使用低通滤波器时,陀螺仪时钟频率为8KHz,使用则频率为1KHz。
(2)配置寄存器
由外部同步设置和低通滤波器配置组成,外部同步一般不使用。
低通滤波器可以使输出数据变得平滑,配置滤波器参数越大,输出数据抖动越小。
设为0时,即不使用低通滤波器,陀螺仪时钟频率为8KHz;使用则频率为1KHz。设为7时,是保留位,一般不使用。
(3)陀螺仪寄存器
高3位:X、Y、Z轴的自测使能位;
-
自测响应=自测使能时的数据-自测失能时的数据,上电后,先使能自测,读取数据,再失能自测,读取数据,自动进行求差。自测响应规定范围如下:
中间两位:满量程选择位;
(4)加速度计配置寄存器
高3位:X、Y、Z轴的自测使能位;
中间两位:满量程选择位;
低3位:配置高通滤波器。内置小功能如运动检测所用到的,对数据输出无影响。
读取数据的话直接读取数据寄存器即可,寄存器中的数据是一个16进制的有符号数,以二进制补码的方式存储。读出高8位和低8位,高位左移8次或上低位数据并存在一个int16_t的变量里,便可得到数据。温度传感器数据和陀螺仪传感器数据同理。
(5)电源管理寄存器1
Bit7:设备复位,写1,则所有寄存器恢复到默认值;
Bit6:睡眠模式,写1,芯片随眠,不工作,进入低功耗模式,省电;
Bit5:循环模式,写1,设备进入低功耗模式,每过一段时间启动一次,唤醒的频率由电源管理寄存器2决定;
Bit3:温度传感器失能,写1,禁用内部温度传感器;
Bit2~0:选择系统时钟来源。
最好选择陀螺仪晶振,因为其更为精确
(6)电源管理寄存器2
Bit7/6:设置唤醒电源管理寄存器1的唤醒频率;
Bit5~0:可以分别控制6个轴进入待机模式,如果只需要部分数据,可以让其他轴待机,省电;
(7)ID号寄存器
该寄存器为只读寄存器,ID号不可修改,表示该芯片的I2C地址。
Bit7:为0;
Bit6~1:固定为110100;
Bit0:为0;
所以该寄存器的值为0x68;
需要注意的是,AD0引脚的值并不反映在这个寄存器上,所以虽然I2C的地址可以通过AD0引脚进行配置,但是ID号寄存器的最低位并不随AD0引脚的变化而变化,读出的ID号始终为0x68,当然ID号并不是非要与I2C地址一致;
11、DMP库移植
MPU6050是一款集成了陀螺仪和加速度计的6轴运动处理组件,能够提供丰富的运动数据。然而,要从这些原始数据中准确解算出姿态角(如滚转角、俯仰角、偏航角),需要进行复杂的数学运算和数据融合。而DMP(Digital Motion Processor)库是Invensense公司针对其产品推出的软件包,它内部实现了复杂的滤波和数据融合算法,能够直接输出四元数或欧拉角等姿态信息。这大大简化了外围微处理器的工作负担,使得开发者无需深入了解底层的数学运算和数据融合原理,即可快速获取准确的姿态信息。
MPU6050的DMP库原本是针对特定处理器(如MSP430)设计的,我们要直接将官方的DMP库移植到STM32还需要进行一系列的修改,这里就不讲了,因为网上已经有许多开源,参考:
MPU6050获取欧拉角—超详细DMP移植教程_mpu6050移植dmp详细步骤-CSDN博客
STM32平台下官方DMP库6.12超详细移植教程_mpu motion driver下载-CSDN博客
百度网盘
链接:https://pan.baidu.com/s/1bBqZZIv48LP_2kcbqCE4Dg?pwd=0obc
提取码:0obc
相关文章:

STM32-MPU6050+DAM库源码(江协笔记)
目录 1、MPU6050简介 2、MPU6050参数 3、MPU6050硬件电路 4、MPU6050结构 5、MPU6000和MPU6050的区别 6、MPU6050应用场景 7、MPU6050电气参数 8、MPU6050时钟源选择 9、MPU6050中断源 10、MPU6050的I2C读写操作 11、DMP库移植 1、MPU6050简介 10轴传感器࿱…...
Ruby 数组(Array)
Ruby 数组(Array) 引言 Ruby,作为一种高级编程语言,以其简洁明了的语法和强大的功能而闻名。在Ruby中,数组(Array)是一种基本的数据结构,用于存储一系列有序的元素。本文将深入探讨…...

分享几个做题网站------学习网------工具网;
以下是就是做题网站;趣IT官网-互联网求职刷题神器趣IT——互联网在线刷题学习平台,汇集互联网大厂面试真题,拥有java、C、Python、前端、产品经理、软件测试、新媒体运营等多个热门IT岗位面试笔试题库,提供能力测评、面试刷题、笔…...

Spring MVC__入门
目录 一、SpringMVC简介1、什么是MVC2、什么是SpringMVC 二、Spring MVC实现原理2.1核心组件2.2工作流程 三、helloworld1、开发环境2、创建maven工程3、配置web.xml4、创建请求控制器5、创建springMVC的配置文件6、测试HelloWorld7、总结 一、SpringMVC简介 1、什么是MVC MV…...
MATLAB GUI组件全解析:构建交互式应用程序
MATLAB的图形用户界面(GUI)是一个功能强大的工具,它允许开发者创建直观且用户友好的界面。这些界面,也称为应用程序或app,提供了点击控制,使得用户无需学习编程语言或输入命令即可运行应用程序。本文将详细…...
MySQL 实验 2:数据库的创建与管理
MySQL 实验 2:数据库的创建与管理 目录 MySQL 实验 2:数据库的创建与管理一、查看数据库1、语法2、举例 二、创建数据库1、语法2、举例 三、选择数据库1、语法2、举例 四、删除数据库1、语法2、举例 一、查看数据库 1、语法 show databases;2、举例 m…...
LeetCode 2390. 从字符串中移除星号【栈】1347
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...

springboot文件上传(阿里云oss)
本地存储 使用uuid是为了避免文件名的重复,防止覆盖 RestController public class FIleUploadController {PostMapping("/upload")public Result<String> upload(MultipartFile file) throws IOException {//把文件的内容存储到本地磁盘上String …...
Linux下Nodejs应用service配置
Linux 的 service 命令用于对系统服务进行管理,比如启动(start)、停止(stop)、重启(restart)、查看状态(status)等。service 命令本身是一个 shell 脚本,它在…...
设计模式-结构型-常用:代理模式、桥接模式、装饰者模式、适配器模式
代理模式 快速入门 代理模式是指在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能。 比如这段统计性能的代码: public class UserController {//...省略其他属性和方法...private MetricsCollecto…...
用多了编程工具,还是Editplus3最贴心
编程久了,发现越是复杂的编程工具越是烦人,而不是帮助人。 早期Java届是没有统一的IDE的,有些人习惯用文本编辑器,但苦于缺乏提示,有些人从一些渠道用上了JBuilder,但毛病不少,直到Eclipse化解…...

Angular基础学习(入门 --> 入坑)
目录 一、Angular 环境搭建 二、创建Angular新项目 三、数据绑定 四、ngFor循环、ngIf、ngSwitch、[ngClass]、[ngStyle]、管道、事件、双向数据绑定--MVVM 五、DOM 操作 (ViewChild) 六、组件通讯 七、生命周期 八、Rxjs 异步数据流 九、Http …...

吊打ChatGPT4o!大学生如何用上原版O1辅助论文写作(附论文教程)
目录 1、用ChatGPT生成论文选题2、用ChatGPT生成论文框架3、用ChatGPT进行文献整理4、用ChatGPT进行论文润色5、用ChatGPT进行问题求解6、用ChatGPT进行思路创新7、用ChatGPT进行论文翻译8、如何直接使用ChatGPT4o、o1、OpenAI Canvas 9、OpenAI Canvas增强了啥?10、…...

Linux防火墙-常用命令
作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们经过上小章节讲了Linux的部分进阶命令,我们接下来一章节来讲讲Linux防火墙。由于目前以云服务器为主&#x…...

C++:STL常用算法随笔
主要的头文件#include <algorithm> < functional> <numeric> 遍历算法: for_each、transform(搬运容器到另一个容器中 ) void print1(int val) {cout << val <<" "; } for_each (v.begin(),v.end() , print1) 或者用仿…...
Python NumPy学习指南:从入门到精通
Python NumPy学习指南:从入门到精通 第一部分:NumPy简介与安装 1. 什么是NumPy? NumPy,即Numerical Python,是Python中最为常用的科学计算库之一。它提供了强大的多维数组对象ndarray,并支持大量的数学函…...
Flutter笔记--通知
这一节回顾一下Flutter中的Notification,Notification(通知)是Flutter中一个重要的机制,在widget树中,每一个节点都可以分发通知,通知会沿着当前节点向上传递,所有父节点都可以通过NotificationListener来监听通知,通过它可以实现…...

Aegisub字幕自动化及函数篇(图文教程附有gif动图展示)(二)
目录 template行 template pre-line template line template syl template syl noblank template char template notext template pre-line notext template syl noblank notext template keeptags 编辑 template loop number 内联变量 编辑 remeber函数 re…...

系统分析师16:系统测试与维护
1 内容概要 2 软件测试类型 2.1 测试类型 动态测试【计算机运行】 白盒测试法:关注内部结构与逻辑灰盒测试法:介于两者之间黑盒测试法:关注输入输出及功能 静态测试【人工监测和计算机辅助分析】 桌前检查代码审查代码走查以上三个都是做的…...

详解Java中的堆内存
详解Java中的堆内存 堆是JVM运行数据区中的一块内存空间,它是线程共享的一块区域(注意了!!!),主要用来保存数组和对象实例等(其实对象有时候是不在堆中进行分配的,想要了…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...