STM32学习笔记(10_2)- I2C通信协议MPU6050简介

无人问津也好,技不如人也罢,都应静下心来,去做该做的事。

最近在学STM32,所以也开贴记录一下主要内容,省的过目即忘。视频教程为江科大(改名江协科技),网站jiangxiekeji.com

本期开始学习 I2C通信,会分两大块来介绍,第一块, 就是介绍协议规则,然后用软件模拟的形式来实现协议;第二块, 就是介绍STM32的 I2C外设, 然后用硬件来实现协议。

I2C:高位先行,只有在SCL高电平时才会读取SDA的电平

MPU6050的读地址是0xD1,写地址是0xD0

上一期我们介绍通过I2C实现指定地址写和指定地址读的逻辑,即使这个外挂芯片的各种寄存器不在STM32内部,仍能通过通信协议实现读写外挂芯片寄存器的功能。

本期的内容其实就是对MPU6050芯片内部的寄存器进行读写,写入到配置寄存器,就可以对外挂的这个模块进行配置;读出数据寄存器,就可以获取外挂模块的数据。最终,我们读出的数据会显示在这个OLED上。而STM32对MPU6050的读写是通过I2C来进行的。

MPU6050简介

D:\software\STM32入门教程资料\模块资料(1)\模块资料\13-MPU6050 陀螺仪加速度计

里有一个是PS-MPU-6000A,是产品说明书;另一个是RM,寄存器映像。

MPU6050加速度的三轴和加速度的三轴加起来总共就是6个轴,所以这个芯片是6轴姿态传感器。当然如果芯片里再集成一个3轴的磁场传感器,测量XYZ轴的磁场强度,那就叫作9轴姿态传感器。如果再集成一个气压传感器,测量气压大小,从而判断海拔高度,便是10轴姿态传感器。

姿态角也叫欧拉角。以下图的飞机为例,欧拉角就是飞机机身相对于初始3个轴的夹角,飞机机头下倾或者上仰,这个轴的夹角叫作俯仰,Pitch。飞机机身左翻滚或者右翻滚,这个轴的夹角叫作滚转,Roll。飞机机身保持水平,机头向左转向或者向右转向,这个轴的夹角叫作偏航,Yaw。简单来说,欧拉角就表达了飞机此时的姿态,飞机是上仰了还是下倾了,飞机向左倾斜还是向右倾斜了,通过欧拉角都能清晰地表示出来。常见的数据融合算法,一般有互补滤波、卡尔曼滤波等。

可以把MPU6050看成六个测力的秤,组成一个正方体,中心有个单位质量的小球。 小球压在哪一个面上,就会有对应的数据输出。比如你把芯片静置水平放在地球上,那就只有底面测力计受到小球的压力,所以此时数据输出就是XY轴输出为0,Z轴输出1个g的加速度值。加速度计具有静态稳定性,不具有动态稳定性,因为物体运动时这个角度会受运动加速度的影响而变得不准确。

可以把陀螺仪看成是游乐园的旋转飞椅模型,中间的轴转的越快,这个椅子飞的就越远,最终我们测量一下对向两个椅子飞起来的距离或飞起来的夹角,就能得到中间轴的角速度了。对角速度积分便能得到角度,但是角速度积分得到的角度经不起时间的考验,会有一个随时间变化的漂移,但不受物体运动的影响。总结下来就是,陀螺仪具有动态稳定性,不具有静态稳定性。

把加速度和角速度进行互补滤波,就能通过数据融合得到静态和动态都稳定的姿态角了。

 MPU6050重要参数

数据是16位的,会分为2个字节存储。

单位是g,也就是重力加速度,1个g=9.8m/s2。

单位是°/sec,就是角速度的单位,每秒旋转了多少度。

如果物体运动比较剧烈,满量程可以选大一点。运动比较平缓的话,可以选择量程小一点,这样分辨率更大。

如果输出数据抖动太厉害,可以配置寄存器来选择对输出数据进行低通滤波。

两种MPU6050从机地址表示方式:一是把110 1000这7位二进制数转换为十六进制(即0x68),I2C通信时,在发第一个字节时,要先把0x68左移1位,再按位或上读写位(读置1写置0)。二是把0x68左移1位后的数据,当做从机地址,0x68左移1位之后,是0xD0。那这样MPU6050的从机地址就是0xD0,在发送第一个字节时,如果你要写,就直接把0xD0当作第一个字节。如果你要读,就把0xD0或上0x01,即0xD1当作第一个字节。这是融入了读写位的从机地址。总结就是MPU6050的读地址是0xD1,写地址是0xD0,本期采用这种方法表示MPU6050的从机地址。

MPU6050硬件电路

这里MPU6050模块内部的SCL、SDA已经内置了上拉电阻,所以接线时,直接把SCL和SDA接在GPIO口就行了。

这个融合了六轴的姿态角会有个缺陷,这缺陷就是绕Z轴的角度,也就是偏航角。这就好像让你坐在车里,不让看窗户,判断车子行驶的方向,短时间还行,时间一长,没有稳定的参考就会迷失方向。这时就要带个指南针,提供长时间的稳定偏航角进行参考,对陀螺仪感知的方向进行修正,这就是9轴姿态传感器多出的磁力计的作用。另外,如果是无人机,需要定高飞行,这时候就还需要增加气压计,扩展为10轴,提供一个高度信息的稳定参考。XCL和XDA,通常就是用于外接磁力计或者气压计。本期不用。

最后一个引脚是INT,也就是中断输出脚,可以配置芯片内部的一些事件,来触发中断脚的输出。比如数据准备好了、I2C主机错误等,另外芯片内部还内置了一些实用的小功能,比如自由落体检测、运动检测、零运动检测等,这些信号都可以触发INT引脚产生电平跳变。需要可以进行引脚配置,本期不用。

MPU6050框图

我们读取数据寄存器就能得到传感器测量的值了 。这个芯片内部的转换,都是全自动进行的,每个ADC输出,对应16位的数据寄存器,不存在数据覆盖的问题。我们配置好转换频率之后,每个数据就自动以我们设置的频率刷新到数据寄存器,我们需要数据的时悮,直接来读就行了。

框图左边,每个传感器都有个自测单元,这部分是用来验证芯片好坏的。当启动自测后,芯片内部会模拟一个外力施加在传感器上,这个外力导致传感器数据会比平时大些。如何自测?先使能自测,读取数据;再使能自测,读取数据。两个数据一相减,得到的数据叫自测响应。这个自测响应,芯片手册里给出了一个范围,在范围内,就说明芯片没问题。

右边的数字运动处理器,简称DMP。是芯片内部自带的一个姿态解算的硬件算法,配合宫方的DMP库,可以进行姿态解算。本期不涉及。

两个程序现象

一是软件 I2C读写MPU6050 

对MPU6050芯片内部的寄存器进行读写,写入到配置寄存器,就可以对外挂的这个模块进行配置;读出数据寄存器,就可以获取外挂模块的数据。最终,我们读出的数据会显示在这个OLED上。最上面的是ID号,图中这个MPU6050的ID号固定为0x68,可以读取这个ID号用来测试 I2C读取数据的功能是不是正常,不同批次的MPU6050,ID号会有所不同。然后下面,左边3个,是加速度传感器的输出数据,分别是X轴、Y轴和Z轴的加速度,右边3个,是陀螺仪传感器的输出数据,分别是X轴、Y轴和Z轴的角速度。

二是硬件 I2C读写MPU6050

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/783367.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Linux_IMX6ULL驱动开发]-基础驱动

驱动的含义 如何理解嵌入式的驱动呢,我个人认为,驱动就是嵌入式上层应用操控底层硬件的桥梁。因为上层应用是在用户态,是无法直接操控底层的硬件的。我们需要利用系统调用(open、read、write等),进入内核态…

Java编程实战:疫情物资分配系统的设计与实现

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

Qt 富文本处理 (字体颜色大小加粗等)

Qt中支持HTML的控件有textEdit 、label 、textBrowser 。 接口:setHtml("Qt"); toHtml(). 文本样式设置 : 可分字设置 ,主要使用QTextCharFormat类进行文本样式设置。 示例: QTextCharFormat fmt; //粗体 fmt.setFontWeight…

查找算法及查找常用数据结构总结

1.顺序表查找 基本方法: 设查找表以一维数组来存储,要求在此表中查找出关键字的值为x的元素的位置,若查找成功,则返回其位置(即下标),否则,返回一个表示元素不存在的下标&#xff0…

VMware虚拟机共享主机v2rayN

目录 🌼前言 🌼解释 🚩操作 1)VMware -- 虚拟网络编辑器 2)VMware -- 网络适配器 3)主机 IP 地址 4)v2rayN 代理端口 5)VMware -- 网络代理(Network proxy) 🎂结…

红黑树介绍及插入操作的实现

🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🙈个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN&…

windows平台虚拟机安装

windows平台虚拟机安装 1. 安装VMwareWorkstationPro 1.1 软件下载 官网下载 官网 百度网盘下载 版本 VMwareWorkstationPro16 链接:https://pan.baidu.com/s/1LidMxoM9e4a4CANixyRoyg?pwd1157 提取码:1157 1.2 软件安装 软件安装注意事项 软件…

代码学习第32天---动态规划

随想录日记part32 t i m e : time: time: 2024.03.30 主要内容:今天开始要学习动态规划的相关知识了,今天的内容主要涉及两个方面: 不同路径 ; 不同路径 II。 62.不同路径 63. 不同路径 II 动态…

Canvas实现圆点动画

示例效果图&#xff1a; 话不多说直接上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><t…

Unity类银河恶魔城学习记录11-10 p112 Items drop源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili ItemObject_Trigger.cs using System.Collections; using System.Collecti…

P28—P31:变量

P28-变量的定义 什么是变量&#xff1f; 从本质上来说&#xff0c;变量就是一块内存空间&#xff0c;而这块内存空间有数据类型、名字、字面值。变量包含三部分&#xff1a;数据类型、名字、字面值&#xff08;数据&#xff09;变量是内存中存储的基本单元。 数据类型的作用&a…

Linux 查看磁盘信息:df与du命令详解

一、df 1.简介 df 是 disk free的缩写&#xff0c;从UNIX和类UNIX操作系统的早期开始&#xff0c;它就是UNIX和类UNIX操作系统的一部分。它被设计为一种工具&#xff0c;用于监视系统上已使用和可用的磁盘空间数量。 df 命令主要用于需要检查文件系统上已使用和可用的磁盘空…

第十三届蓝桥杯JavaA组省赛真题 - GCD

解题思路&#xff1a; 找规律 最大的最小公因数就是两数的差值 5 7 gcd2 1 3 gcd2 1 4 gcd3 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);long a scan.nextLong();long b scan.ne…

查找--二分查找(Binary Search)

二分查找属于静态查找表&#xff0c;当以有序表表示静态查找表时&#xff0c;查找函数可用折半查找来实现。 查找过程&#xff1a;先确定待查记录所在的范围&#xff08;区间&#xff09;&#xff0c;然后逐步缩小范围直到找到或找不到该记录为止。 以处于区间中间位置记录的…

Linux appimage如何正确打开

在之前的文章中&#xff0c;提到使用appimage软件非常方便。 但是首次使用会遇到这样的问题&#xff1a; 1. 双击打不开 2. 在终端打开提示&#xff1a; /home/roy/software/appimage/Obsidian-1.5.11.AppImage dlopen(): error loading libfuse.so.2 AppImages require …

Python下载bing每日壁纸并实现win11 壁纸自动切换

前言: 爬虫哪家强,当然是python 我是属于啥语言都用,都懂点,不精通,实际工作中能能够顶上就可以。去年写的抓取bing每日的壁纸&#xff0c;保存到本地&#xff0c;并上传到阿里云oss&#xff0c;如果只是本地壁纸切换&#xff0c;存下来就行&#xff0c;一直想做个壁纸站点&…

vuees6新语法

vue的学习网站&#xff1a; https://www.runoob.com/vue2/vue-tutorial.html1.Vue的介绍 学习目标 说出什么是Vue能够说出Vue的好处能够说出Vue的特点 内容讲解 【1】Vue介绍 1.vue属于一个前端框架&#xff0c;底层使用原生js编写的。主要用来进行前端和后台服务器之间的…

CubeIDE 下如何将版本号和日期关联。

1. 使用__DATE__ 和__TIME__获取编译日期和时间。 2. 将__DATE__ 和__TIME__转换成UINT 3. 将转换后的数赋值给版本号。 4. 设置工程保证每次都会重新编译对应文件。 对应函数如下&#xff1a; uint8_t VER_MAIN; uint8_t VER_SUB; uint8_t VER_MIN; #include <stdlib.…

我为什么愿意当韭菜

这几年&#xff0c;为了提升自己&#xff0c;我给无数的我认为优秀的人和课付过费。但我从来不认为自己有被割过韭菜。 如果非要说是韭菜&#xff0c;那我认为这个社会每个人都是韭菜&#xff0c;就看是甘愿被割&#xff0c;还是不甘愿。没办法&#xff0c;只有被割才能获得自己…

Python|OpenCV-实现检测人脸以及性别检测(12)

前言 本文是该专栏的第13篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 性别检测是计算机视觉领域里面的一个重要学习领域,简单的来说,它可以实现自动识别一张图片中的人物性别。为此在本文中,笔者将结合OpenCV和Tensorflow来实现对一张图进行“图片中的人物人…