[项目]基于FreeRTOS的STM32四轴飞行器: 十一.MPU6050配置与读取

基于FreeRTOS的STM32四轴飞行器: 十一.MPU6050

  • 一.芯片介绍
  • 二.配置I2C
  • 三.编写驱动
  • 四.读取任务的测试

一.芯片介绍

芯片应该放置在PCB中间,X Y轴原点,敏感度131表示范围越小越灵敏。理想状态放置在地面上X,Y,Z轴为0,即使地面极平有可能锡膏导致芯片倾斜。
在这里插入图片描述
在这里插入图片描述
AD0接地和接电源地址不一样:
在这里插入图片描述
寄存器介绍:
在这里插入图片描述
在这里插入图片描述

二.配置I2C

观察原理图:
在这里插入图片描述
CubeMX中配置I2C1,配置Master Features 速度为高速,400KHz,占空比33%。
在这里插入图片描述
配置PB3为下拉输入模式:
在这里插入图片描述

三.编写驱动

I2C协议中,地址需要左移1位,最低位表示读写方向
0 表示写操作,1 表示读操作,直接将查好寄存器的代码直接移植。
在这里插入图片描述
写入寄存器和读取寄存器函数:

/*** @description: 向指定的寄存器写入一个字节* @param {uint8_t} reg* @param {uint8_t} byte* @return {*}*/
void Inf_MPU6050_WriteReg(uint8_t reg, uint8_t byte)
{HAL_I2C_Mem_Write(&hi2c1,MPU6050_ADDR_W,reg,I2C_MEMADD_SIZE_8BIT,&byte,1,2000);
}/*** @description: 从指定的寄存器startReg写入多个字节* @param {uint8_t} startReg 开始寄存器地址* @param {uint8_t} *bytes 写的字节数据* @param {uint8_t} len 多少个字节* @return {*}*/
void Inf_MPU6050_WriteRegs(uint8_t startReg, uint8_t *bytes, uint8_t len)
{HAL_I2C_Mem_Write(&hi2c1,MPU6050_ADDR_W,startReg,I2C_MEMADD_SIZE_8BIT,bytes,len,2000);
}/*** @description: 从指定的寄存器读取一个字节* @param {uint8_t} reg* @return {*}*/
uint8_t Inf_MPU6050_ReadReg(uint8_t reg)
{uint8_t rByte = 0;HAL_I2C_Mem_Read(&hi2c1,MPU6050_ADDR_R,reg,I2C_MEMADD_SIZE_8BIT,&rByte,1,2000);return rByte;
}/*** @description: 从指定的寄存器读取多个字节* @param {uint8_t} startReg* @param {uint8_t} *bytes* @param {uint8_t} len* @return {*}*/
void Inf_MPU6050_ReadRegs(uint8_t startReg, uint8_t *bytes, uint8_t len)
{HAL_I2C_Mem_Read(&hi2c1,MPU6050_ADDR_R,startReg,I2C_MEMADD_SIZE_8BIT,bytes,len,2000);
}

根据数据手册MPU6050初始化流程配置:
在这里插入图片描述
低通滤波器:
数据输出速率1kHz。
在这里插入图片描述
采样率:
采样率是多少的时候,才能正确的反应模拟。
香农定律(麦克斯韦定律):采样率 >= 2 * 最高的频率
这时候可以根据数字信号还原出模拟信号了。
采样频率 = 陀螺仪输出频率 / (1 + SMPLRT_DIV)
500Hz = 1000Hz / (1 + x)
x = 1
因为飞控任务调度周期是4ms,意味着1S执行250次,这时采样频率为500Hz可以1S将数据转换500次,转换多读取少没问题,不能低于250Hz。
在这里插入图片描述
加速度和陀螺仪是否进入待机模式:
在这里插入图片描述
读取角速度:
在这里插入图片描述
读取加速度:
在这里插入图片描述
初始化:

/*** @description: mpu6050初始化函数* @return {*}*/
void Inf_MPU6050_Init(void)
{/* 1. 复位MPU6050:   复位->休眠200ms->唤醒 */Inf_MPU6050_WriteReg(MPU_PWR_MGMT1_REG, 1 << 7);HAL_Delay(200);Inf_MPU6050_WriteReg(MPU_PWR_MGMT1_REG, 0);/* 2. 设置量程 *//* 2.1 角速度的量程  +-2000°/s */Inf_MPU6050_WriteReg(MPU_GYRO_CFG_REG, 3 << 3);/* 2.2 加速度的量程  +2g  */Inf_MPU6050_WriteReg(MPU_ACCEL_CFG_REG, 0);/* 3. 关闭中断、关闭 第2 IIC 接口、禁止 FIFO */Inf_MPU6050_WriteReg(MPU_INT_EN_REG, 0);Inf_MPU6050_WriteReg(MPU_USER_CTRL_REG, 0);Inf_MPU6050_WriteReg(MPU_FIFO_EN_REG, 0);/* 4. 设置陀螺仪采样率和低通滤波器低通滤波器:  数据输出速率时 1kHz采样率: 采样率是多少的时候,才能正确的反应模拟信号香浓定律(奈奎斯特定律): 采样率 >= 2 * 信号中最高的频率采样频率 = 陀螺仪输出频率 / (1 + SMPLRT_DIV)500Hz = 1000Hz / (1 + x)x = 1*/Inf_MPU6050_WriteReg(MPU_SAMPLE_RATE_REG, 1); /*  采样率 */Inf_MPU6050_WriteReg(MPU_CFG_REG, 1 << 0);    /* 低通滤波器 *//* 5. 配置系统时钟源 */Inf_MPU6050_WriteReg(MPU_PWR_MGMT1_REG, 1);/* 6. 使能角速度传感器和加速度传感器   进入工作模式 (禁用待机模式)*/Inf_MPU6050_WriteReg(MPU_PWR_MGMT2_REG, 0);/* 校准6轴数据 */Inf_MPU6050_Calibrate();
}

读取角速度和加速度:

/*** @description: 读取角速度* @param {Gyro_Struct} *gyro* @return {*}*/
void Inf_MPU6050_ReadGyro(Gyro_Struct *gyro)
{uint8_t data[6] = {0};Inf_MPU6050_ReadRegs(MPU_GYRO_XOUTH_REG, data, 6);gyro->gyroX = (int16_t)((data[0] << 8) | data[1]);gyro->gyroY = (int16_t)((data[2] << 8) | data[3]);gyro->gyroZ = (int16_t)((data[4] << 8) | data[5]);
}/*** @description: 读取加速度* @param {Accel_Struct} *accel* @return {*}*/
void Inf_MPU6050_ReadAccel(Accel_Struct *accel)
{uint8_t data[6] = {0};Inf_MPU6050_ReadRegs(MPU_ACCEL_XOUTH_REG, data, 6);accel->accelX = (int16_t)((data[0] << 8) | data[1]);accel->accelY = (int16_t)((data[2] << 8) | data[3]);accel->accelZ = (int16_t)((data[4] << 8) | data[5]);
}/*** @description: 读取角速度和加速度* @param {GyroAccel_Struct} *gyroAccel* @return {*}*/
void Inf_MPU6050_ReadGyroAccel(GyroAccel_Struct *gyroAccel)
{Inf_MPU6050_ReadGyro(&gyroAccel->gyro);Inf_MPU6050_ReadAccel(&gyroAccel->accel);
}

四.读取任务的测试

飞行模块中初始化MPU6050:
在这里插入图片描述
编写打印角速度加速度数据的函数:
在这里插入图片描述
观察打印数据,角速度和加速度都有误差值,应该尽量让前5个值为0。
在这里插入图片描述

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

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

相关文章

JVM垃圾回收笔记01

文章目录 前言1. 如何判断对象可以回收1.1 引用计数法1.2 可达性分析算法查看根对象哪些对象可以作为 GC Root ?对象可以被回收&#xff0c;就代表一定会被回收吗&#xff1f; 1.3 引用类型1.强引用&#xff08;StrongReference&#xff09;2.软引用&#xff08;SoftReference…

解决Popwindow宽高的问题。

问题 在使用Popwindow进行自定义的过程中&#xff0c;需要设置popwindow的宽高。但是宽高很多时候容易出问题。比如下面的例子。 布局文件如下 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.andr…

Bell-1量子计算机分析:开启量子计算2.0时代的创新引擎

Bell-1量子计算机:开启量子计算2.0时代的创新引擎 一、引言 1.1 研究背景 在当今科技飞速发展的时代,量子计算作为前沿领域,正深刻地改变着科技格局,引领新一轮科技革命与产业变革。自 20 世纪 80 年代量子计算概念被提出以来,历经多年的理论探索与技术攻坚,已取得了众…

什么?中断禁用失效了?

什么&#xff1f;中断禁用失效了&#xff1f; 1. 前言 道友们&#xff0c;在嵌入式的开发中我们不管是RTOS或NO-RTOS的开发&#xff0c;都无法避免“多线程”的应用场景&#xff0c;高优先级的任务或中断打断低优先级的任务或中断&#xff0c;此时为了要保证共享数据的安全性…

单表达式倒计时工具:datetime的极度优雅(Kimi)

一个简单表达式&#xff0c;也可以优雅自成工具。 笔记模板由python脚本于2025-03-22 20:25:49创建&#xff0c;本篇笔记适合任意喜欢学习的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值&#xff1a;在于输出思考与经验&#xff0c;而不仅仅是知识的简单复述。 Pyth…

[笔记.AI]多头自注意力机制(Multi-Head Attention)

多头自注意力是深度学习领域&#xff0c;特别是自然语言处理&#xff08;NLP&#xff09;和Transformer模型中的关键概念。其发展源于对序列数据中复杂依赖关系的建模需求&#xff0c;特别是在Transformer架构的背景下。 举例 比喻-读长篇文章 用一个简单的比喻来理解“多头注…

SOFABoot-02-模块化隔离方案

sofaboot 前言 大家好&#xff0c;我是老马。 sofastack 其实出来很久了&#xff0c;第一次应该是在 2022 年左右开始关注&#xff0c;但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFABoot-00-sofaboot 概览 SOFABoot-01-蚂蚁金…

【实用部署教程】olmOCR智能PDF文本提取系统:从安装到可视化界面实现

文章目录 引言系统要求1. 环境准备&#xff1a;安装Miniconda激活环境 2. 配置pip源加速下载3. 配置学术加速&#xff08;访问国外资源&#xff09;4. 安装系统依赖5. 安装OLMOCR6. 运行OLMOCR处理PDF文档7. 理解OLMOCR输出结果9. 可视化UI界面9.1 安装界面依赖9.2 创建界面应用…

asp.net core mvc模块化开发

razor类库 新建PluginController using Microsoft.AspNetCore.Mvc;namespace RazorClassLibrary1.Controllers {public class PluginController : Controller{public IActionResult Index(){return View();}} }Views下Plugin下新建Index.cshtml {ViewBag.Title "插件页…

边缘计算革命:重构软件架构的范式与未来

摘要 边缘计算通过将算力下沉至网络边缘&#xff0c;正在颠覆传统中心化软件架构的设计逻辑。本文系统分析了边缘计算对软件架构的范式革新&#xff0c;包括分布式分层架构、实时资源调度、安全防护体系等技术变革&#xff0c;并结合工业物联网、智慧医疗等场景案例&#xff0c…

单链表:数据结构的灵动之链

本文主要讲解链表的概念和结构以及实现单链表 目录 一、链表的概念及结构 二、单链表的实现 1.1链表的实现&#xff1a; 1.2单链表的实现&#xff1a; 单链表尾插&#xff1a; 单链表的头插&#xff1a; 单链表的尾删&#xff1a; 单链表头删&#xff1a; 单链表查找&#…

链表题型-链表操作-JS

一定要注意链表现在的头节点是空节点还是有值的节点。 一、移除链表中的元素 有两种方式&#xff0c;直接使用原来的链表进行删除操作&#xff1b;设置一个虚拟头节点进行删除操作。 直接使用原来的链表进行删除操作时&#xff0c;需要考虑是不是头节点&#xff0c;因为移除…

读《浪潮之巅》:探寻科技产业的兴衰密码

引言&#xff1a;邂逅《浪潮之巅》 在信息技术飞速发展的今天&#xff0c;科技公司如繁星般闪烁&#xff0c;又似流星般划过。而我与《浪潮之巅》的相遇&#xff0c;就像在浩渺的科技海洋中&#xff0c;发现了一座指引方向的灯塔。初次听闻这本书&#xff0c;是在一次技术交流会…

【和春笋一起学C++】文本文件I/O

在windows系统中读取键盘的输入和在屏幕上显示输出统称为&#xff1a;控制台输入/输出。把读取文本文件和把字符输出到文本文件中统称为&#xff1a;文本文件I/O。 目录 1. 输出文本文件 2. 读取文本文件 1. 输出文本文件 把字符输出到文本文件中和输出到控制台很相似&#x…

【C#】WinForm自定义控件及窗体

前言 WinForm&#xff08;Windows Forms&#xff09;是Microsoft.NET框架中的技术&#xff0c;用于开发Windows桌面应用程序。它提供了一套丰富的控件和组件。通过拖放控件、编写事件处理程序等方式快速构建用户界面。 通过属性窗口定制这些控件的外观和行为。 通过数据绑定&am…

Live555+Windows+MSys2 编译Androidso库和运行使用

下载 wget http://www.live555.com/liveMedia/public/live555-latest.tar.gz tar -xzvf live555-latest.tar.gz加入版本控制 git init git add . git commit -a -m "first init" git log修改config.android-arm64 cd live vim config.android-arm64 ./genMakefile…

大模型-提示词工程与架构

什么是提示工程 提示工程&#xff08;Prompt Engineering&#xff09;是一门新兴的技术领域&#xff0c;专注于研究如何设计、构建和优化提示词&#xff0c;以充分发挥大模型的潜力 。它涉及到对语言结构、任务需求、模型特性等多方面因素的综合考量。提示工程的目标是通过精心…

Agent Team 多智能体系统解析

引言 在人工智能技术高速发展的今天&#xff0c;"多智能体协作系统"&#xff08;Agent Team&#xff09;正成为突破效率瓶颈的关键技术。与传统的单体AI不同&#xff0c;这种由多个专业化智能体组成的协同网络&#xff0c;通过分工协作和动态调整&#xff0c;展现出…

【蓝桥杯—单片机】IAP15F2K61S2专项 | 真题整理、解析与拓展 | 省赛题(更新ing...)

IAP15F2K61S2 专项 前言IAP15F2K61S2 介绍&#xff08;基于手册&#xff09;I/O口结构复位管脚RST中断第十四届省赛 外设通过PWM控制第十五届省赛题 性能与工作参数在线调试第十四届省赛题拓展与小结&#xff1a;单片机在线调试常用的接口 功耗第十五届省赛题 前言 在本文中我…

生物化学笔记:医学免疫学原理02 抗原概念+免疫应答+抗原的分类

抗原基本概念 影响抗原刺激机体产生免疫应答的因素 抗原的分类 CG 【北京大学】1080p 王月丹教授 《医学免疫学原理》2022春 全81p