MPU6050模块

一:MPU6050简介

输出一个随姿态变化而变化的电压,想要量化电压,就得使用ADC转化

欧拉角

偏航角(Yaw):也叫航向角,通常是绕 z 轴旋转的角度,以 x 轴正向为起始边,旋转后 x 轴在 xOy 平面上的投影与起始边的夹角就是偏航角,范围一般是 [-π, π] 。例如,在飞机飞行中,偏航角表示飞机机头相对于初始航向的左右偏转角度。

俯仰角(Pitch):是绕 y 轴旋转的角度,以 x 轴正向为起始边,旋转后 x 轴与 xOz 平面的夹角就是俯仰角,范围一般是 [-π/2, π/2] 。对于飞机来说,俯仰角反映飞机机头的上下仰俯程度。

滚转角(Roll):绕 x 轴旋转的角度,以 y 轴正向为起始边,旋转后 y 轴与 yOz 平面的夹角就是滚转角,范围一般是 [-π, π] 。比如飞机飞行时,机翼的倾斜状态就由滚转角体现。

加速度计具有静态稳定性,不具备动态稳定性

陀螺仪具有动态稳定性,不具有静态稳定性

两组数据相互融合,就可以得到姿态角

参数

0X68为从机地址,左移一位 再 按位或上读写位(1/0)

把0X68左移一位后的数据作为,从机地址0XD0

读0XD0 或上0X01记0XD1为读

写 0XD0 或上 0x00 记0XD0 为写,就是把读写位融入从机地址

硬件电路图

通信引脚(SDA/SCL、XDA/XCL)


SDA/SCL:主 I2C 总线,直连主机(如 STM32),支持挂载多设备(如磁场传感器),简化拓扑。

XDA/XCL:从 I2C 总线,用于级联从设备,因控制复杂、效率低,实际少用,优先选 “多设备共 SDA/SCL” 方案。

 XCL 和XDA通常用于外接磁力计,或气压计,主机能直接读取数据

 地址配置(AD0)


7 位从机地址由 AD0 电平决定:

  1. AD0=0(默认下拉)→ 地址 0x68(二进制 1101000);
  2. AD0=1(接 VCC)→ 地址 0x69(二进制 1101001)。
  3. 可通过改 AD0 电平,实现同一总线挂多个 MPU6050(需硬件改引脚)。

 中断引脚(INT)


  1. 功能丰富:支持 “数据就绪、I2C 错误、自由落体、零运动检测” 等事件触发。
  2. 价值:主机无需轮询寄存器,靠中断快速响应,适合低功耗 / 高实时性场景(如运动控制、传感器融合)。

供电逻辑(VDD、VCC-5V、LDO)


  1. VDD:核心供电(2.375 - 3.46V),需精准稳压,不可直连 5V。
  2. VCC-5V:宽压输入(3.3 - 5V),经板载 LDO 转 3.3V 供内部电路,适配不同电源环境。

内部框图

陀螺仪内部是需要高电压支持的所以,用了电荷泵进行升压

时钟源一般选择内置时钟源,或者陀螺仪内部晶振时钟

由于电容的电荷量少,所以需要充电和放电的过程来回转化,就可以持续稳定升压,再经过滤波器,就得到稳定的10v电压

使用

写字节时,要先解除睡眠模式

寄存器

运动传感器

SMPLRT_DIV采样率分频器 ,用于设置传感器数据输出的采样率分频系数,SMPLRT_DIV[7:0]表示该寄存器是 8 位可读写(RW)的,通过设置不同数值调整采样率。

CONFIG:配置 ,EXT_SYNC_SET[2:0]用于设置外部同步输入的配置,DLPF_CFG[2:0]是数字低通滤波器(Digital Low Pass Filter )配置,可设定滤波特性来处理信号噪声等。

GYRO_CONFIG:陀螺仪配置 ,FS_SEL[1:0]用于选择陀螺仪的满量程范围(Full Scale Select ),决定陀螺仪可测量的角速度范围。

ACCEL_CONFIG加速度计配置 ,XA_ST、YA_ST、ZA_ST分别是 X、Y、Z 轴的自测试(Self - Test )使能位;AFS_SEL[1:0]选择加速度计的满量程范围(Accelerometer Full Scale Select );ACCEL_HPF[2:0]是加速度计高通滤波器(High Pass Filter )配置,用于过滤低频信号。

惯性测量单元(如 MPU6050 等传感器)的寄存器映射表

加速度计数据寄存器:ACCEL_XOUT_H/L、ACCEL_YOUT_H/L、ACCEL_ZOUT_H/L ,分别存储 X、Y、Z 轴加速度测量值的高 8 位和低 8 位,拼接成 16 位数据反映加速度大小 。

温度传感器寄存器:TEMP_OUT_H/L ,存储温度测量值的高、低 8 位,组合为 16 位数据表示芯片温度 .

陀螺仪数据寄存器:GYRO_XOUT_H/L、GYRO_YOUT_H/L、GYRO_ZOUT_H/L ,分别存储 X、Y、Z 轴角速度测量值的高、低 8 位,拼接成 16 位数据体现角速度情况 ,这些寄存器用于读取传感器采集的运动、温度数据 。

电源管理寄存器

PWR_MGMT_1(电源管理 1):可读写(RW),DEVICE_RESET用于设备复位;SLEEP控制睡眠模式;CYCLE使能循环模式;TEMP_DIS用于关闭温度传感器;CLKSEL[2:0]选择系统时钟源 。

PWR_MGMT_2(电源管理 2):可读写(RW),LP_WAKE_CTRL[1:0]配置低功耗唤醒控制;STBY_XA、STBY_YA、STBY_ZA分别使能加速度计 X、Y、Z 轴待机;STBY_XG、STBY_YG、STBY_ZG分别使能陀螺仪 X、Y、Z 轴待机 ,用于灵活控制传感器各轴的功耗状态 。

设备 ID 寄存器

WHO_AM_I:只读(R)寄存器,WHO_AM_[6:1]存储设备自身的标识 ID ,用于主机通过 I2C 等总线读取,识别设备型号、判断设备是否正常连接,是传感器通信初始化时常用的 “设备身份确认” 寄存器 。

二:I2C

物理层特性

I2C 协议仅需要两根线即可实现通信:

  1. SDA(Serial Data Line):串行数据线
  2. SCL(Serial Clock Line):串行时钟线

这两根线都需要通过上拉电阻连接到电源,因此当总线上的所有设备都不驱动总线时,总线会保持高电平状态。这种设计使得多个设备可以共享同一总线,实现多主多从的通信架构。

数据传输格式

I2C 通信以字节(8 位)为基本单位进行数据传输,每个字节后面会跟随一个应答位(ACK/NACK)。数据传输时,最高位(MSB)先发送。

通信流程通常包括:

  1. 起始信号(Start Condition)
  2. 从设备地址(7 位或 10 位)+ 读写位
  3. 应答位(ACK/NACK)
  4. 数据传输
  5. 停止信号(Stop Condition)

硬件

时序图 

起始信号的核心是 “当 SCL 为高电平时,SDA 出现下降沿(从高到低的跳变)”。要产生这个下降沿,必须先让 SDA 处于高电平状态,再在 SCL 保持高电平期间将 SDA 拉低。

停止信号(Stop):当 SCL 为高电平时,SDA 由低电平变为高电平(上升沿),表示通信结束。

void MyI2C_Start(void)
{MyI2C_W_SDA(1);MyI2C_W_SCL(1);MyI2C_W_SDA(0);MyI2C_W_SCL(0);	
}
void MyI2C_Stop(void)
{MyI2C_W_SDA(0);MyI2C_W_SCL(1);MyI2C_W_SDA(1);
}

该函数通过循环逐位发送 8 位数据:先通过位运算将当前位输出到 SDA 线,再拉高 SCL 让从机读取,最后拉低 SCL 准备下一位,按 I2C 时序完成 1 字节传输。 

void MyI2C_SendByte(uint8_t Byte)
{uint8_t i;for(i=0;i<8;i++){//传递8位数据,这样写方便MyI2C_W_SDA(Byte & (0x80>>i));MyI2C_W_SCL(1);MyI2C_W_SCL(0);}
}	

 整个过程遵循 I2C 时序:SCL 高电平时读取 SDA 数据,低电平时准备下一位,确保数据按位(高位优先)正确接收。

uint8_t MyI2C_ReceiveByte(void)
{uint8_t i,Byte=0x00;MyI2C_W_SDA(1);//先释放for(i=0;i<8;i++){MyI2C_W_SCL(1);if(MyI2C_R_SDA()==1) {Byte |=(0x80 >>i);}MyI2C_W_SCL(0);}return Byte;
}

MyI2C_SendAck(uint8_t AckByte):发送应答信号:每传输 1 字节数据后,接收方必须发送应答信号。若发送 “非应答”(1),通常表示数据传输结束或接收失败。

MyI2C_ReceiveAck(void):接收应答信号AckByte为 0 时表示接收成功,为 1 时表示接收失败或需终止传输。 

void MyI2C_SendAck(uint8_t AckByte)
{MyI2C_W_SDA(AckByte);MyI2C_W_SCL(1);MyI2C_W_SCL(0);
}	
uint8_t MyI2C_ReceiveAck(void)
{uint8_t i,AckByte=0x00;MyI2C_W_SDA(1);//先释放MyI2C_W_SCL(1);AckByte=MyI2C_R_SDA();MyI2C_W_SCL(0);return AckByte;
}

 三:MPU6050的逻辑

整个过程遵循 I2C “主设备写从设备” 的标准流程:起始信号→设备地址(写)→应答→寄存器地址→应答→数据→应答→停止信号,确保数据准确写入 MPU6050 的目标寄存器 

void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data)
{MyI2C_Start();MyI2C_SendByte(MPU6050_ADDRESS);MyI2C_ReceiveAck();MyI2C_SendByte(RegAddress);MyI2C_ReceiveAck();MyI2C_SendByte(Data);MyI2C_ReceiveAck();MyI2C_Stop();
}

uint8_t MPU6050_ReadReg(uint8_t RegAddress)
{uint8_t Data;MyI2C_Start();MyI2C_SendByte(MPU6050_ADDRESS);MyI2C_ReceiveAck();MyI2C_SendByte(RegAddress);MyI2C_ReceiveAck();MyI2C_Start();MyI2C_SendByte(MPU6050_ADDRESS | 0x01);MyI2C_ReceiveAck();Data = MyI2C_ReceiveByte();MyI2C_SendAck(1);MyI2C_Stop();return Data;
}

初始化

配置完后的检测的数据都放到了相应的寄存器中

最后直接调用寄存器

void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ, int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ)
{uint8_t DataH, DataL;DataH = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);*AccX = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);DataL = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);*AccY = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);DataL = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);*AccZ = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);DataL = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);*GyroX = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);DataL = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);*GyroY = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);DataL = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);*GyroZ = (DataH << 8) | DataL;
}

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

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

相关文章

jvm的栈和堆

在 JVM 中&#xff0c;栈&#xff08;Stack&#xff09;和堆&#xff08;Heap&#xff09;是两种核心内存区域&#xff0c;用于存储不同类型的数据&#xff0c;它们的设计和存储规则有明确区分&#xff0c;主要体现在存储内容、生命周期和管理方式上&#xff1a;一、栈&#xf…

自动驾驶车辆的敏捷安全档案

简介近年来&#xff0c;在开发安全关键软件时&#xff0c;敏捷开发方法的使用日益增多。敏捷方法非常适合自动驾驶汽车软件的增量改进、运行设计域的逐步扩展以及新型智能路侧单元的开发。由于车辆和智能路侧单元的预期改进&#xff0c;未来几年将会有新的自动驾驶车辆试验。因…

【时时三省】(C语言基础)动态内存分配与它的指针变量

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省什么是内存的动态分配全局变量是分配在内存中的静态存储区的&#xff0c;非静态的局部变量&#xff08;包括形参&#xff09;是分配在内存中的动态存储区的&#xff0c;这个存储区是一个称为栈…

SpringMVC的核心架构与请求处理流程

Spring MVC 核心架构核心组件组件作用类比DispatcherServlet前端控制器&#xff0c;统一接收请求并协调各组件处理一个餐厅的前台HandlerMapping根据请求URL映射到对应的处理器&#xff08;Controller&#xff09;路由表HandlerAdapter执行处理器方法&#xff0c;处理参数绑定、…

css 不错的按钮动画

效果图wxml <view class"{{status?active:}}"><view class"up-top btn"><text>向上</text></view><view class"up-left btn"><text>向左</text></view><view class"up-center b…

若依框架RuoYi-Vue-Plus-5.X的启动,本地安装docker,再部署 Redis、PG数据库(智慧水务)SmartWaterServer

一、部署redis数据库拉取镜像 docker pull redis启动Redis容器docker run -d --name redis-server -p 6379:6379 -v redis-data:/data redis redis-server --requirepass 123redis版本二、部署PostgreSQL 数据库拉取镜像docker pull postgres:15 创建数据存储目录、建议将数据挂…

Idea 清除无用的引用类

在IntelliJ IDEA中&#xff0c;你可以通过以下方式将选中的代码设置为大写&#xff1a;1. 使用快捷键(推荐)Windows/Linux&#xff1a;Ctrl Shift UMac&#xff1a;Cmd Shift U操作步骤&#xff1a;选中文本按下快捷键&#xff0c;即可在大小写之间切换。2. 通过菜单操作选…

同个主机拉取不同权限仓库的方法

背景&#xff1a;因为某些神奇的原因&#xff0c;无法同时授权仓库权限给自己。 1.本地电脑只有权限访问web仓库地址&#xff0c;无权限访问backend仓库&#xff1b; 2.堡垒机服务器只有权限访问backend仓库&#xff0c;无权限访问web仓库地址。 web仓库地址 &#xff1a;codeu…

快速搭建Node.js服务指南

Node.js是构建高效、可扩展网络应用的理想选择。以下是几种快速搭建Node.js服务的方法。 方法一&#xff1a;使用Express&#xff08;最流行框架&#xff09; 1. 初始化项目 mkdir my-node-service cd my-node-service npm init -y2. 安装Express npm install express3. 基础服…

通义千问Qwen3-30B-A3B-Thinking-2507技术解析:推理模型的工程实践突破

Qwen3-30B-A3B模型架构图2025年7月30日&#xff0c;阿里云通义千问团队发布了Qwen3-30B-A3B-Thinking-2507推理模型&#xff0c;这是继Qwen3-30B-A3B-Instruct-2507后的又一力作。作为专注于推理任务的专用模型&#xff0c;它在数学能力测试AIME25上取得85.0分&#xff0c;超越…

【源力觉醒 创作者计划】文心一言与deepseek集成springboot开发哪个更方便

一.实验背景 当前文心一言和deepseek都开源了&#xff0c;二者都可以作为大模型应用开发的模型基础了&#xff0c;我们都可以编写springboot项目来集成deepseek和文心一言了 二.实验目标 本文基于实际操作&#xff0c;通过实际操作来对比文心一言和deepseek在集成到springbo…

核磁共振数据T2几何均值计算

1、T₂ 几何均值公式如下&#xff1a;2、核磁T2几何均值计算代码 CSV 文件文件格式&#xff1a; 每一行是一个样点&#xff08;样品深度&#xff09;&#xff0c;列为&#xff1a;第一列是“深度”或其他&#xff1b;第二列及以后&#xff08;如 TASPEC0 ~ TASPEC199&#xff0…

微服务架构技巧篇——接口类设计技巧

目录 一、微服务架构的特点 二、微服务接口类设计技巧 2.1、BFF(Backend For Frontend) 2.1.1、 服务分布式带来的第一个挑战导致的几个典型问题 2.1.2、什么是 BFF 2.1.3、BFF 应用场景 2.1.4、BFF 落地经验 2.1.4.1、前端负责 BFF 开发优缺点 2.1.4.2、后端负责 BFF 开发优…

C++游戏开发(2)

直接上代码 1.首先是头文件编写 #include <iostream> #include <graphics.h> #include <string> 2,添加画布 长1280&#xff0c;宽720 initgraph(1280, 720); 3.添加主循环 bool running true; while(runing) { } 4.定义结构体变量msg ExMessge msg; 5.开…

Unity开发2D类银河恶魔城游戏学习笔记目录

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 玩家状态机 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现…

智慧社区项目开发(三)——基于 Spring Boot 实现动态路由加载:从数据库到前端菜单的完整方案

在后台管理系统中&#xff0c;不同用户角色往往拥有不同的操作权限&#xff0c;对应的菜单展示也需动态调整。动态路由加载正是解决这一问题的核心方案 —— 根据登录用户的权限&#xff0c;从数据库查询其可访问的菜单&#xff0c;封装成前端所需的路由结构并返回。本文将详细…

Python在自动化与运维领域的核心角色:工具化、平台化与智能化

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 引言 在 IT 系统日益复杂、运维任务持续增长的今天&#xff0c;自动化已成为企业基础设施管理的关键方向。Python 以其简洁的语法、强大…

RAG实战指南 Day 28:RAG系统缓存与性能优化

【RAG实战指南 Day 28】RAG系统缓存与性能优化 开篇 欢迎来到"RAG实战指南"系列的第28天&#xff01;今天我们将深入探讨RAG系统的缓存机制与性能优化策略。在实际生产环境中&#xff0c;RAG系统往往面临高并发、低延迟的需求&#xff0c;而合理的缓存设计和性能优…

swanlab实验优雅起名

init中的参数的作用project&#xff1a;整个实验的名字&#xff1b;experiment_name&#xff1a;在这个实验中&#xff0c;你的名字是什么&#xff1b; 比如说现在我们要进行对比实验&#xff0c;PEAN和Triflownet分别是对比方法的名字&#xff0c;这样的好处是&#xff0c;她们…

Nestjs框架: NestJS 核心机制解析 —— DI(依赖注入)容器与模块化工作原理

理解 NestJS 的 DI 管理机制 我们想要了解依赖注入&#xff08;Dependency Injection, DI&#xff09;最核心的工作逻辑NestJS 拥有自己的一套 DI 管理系统&#xff0c;它通过一个称为 DI 容器 的机制&#xff0c;来统一管理应用中所有类&#xff08;class&#xff09;的依赖关…