STM32 软件模拟 I2C 读写 MPU6050--实现加速度与陀螺仪数据采集

演示视频: https://www.bilibili.com/video/BV1iCQRYXEBb/?share_source=copy_web&vd_source=0e4269581b0bc60d57a80c9a27c98905

一、前言

        在嵌入式开发中,MPU6050 六轴传感器因其集成加速度计和陀螺仪且成本低廉,广泛应用于平衡小车、飞控、姿态检测等场景。

       本项目将通过 STM32 使用 软件模拟 I2C(Soft I²C),实现对 MPU6050 的读写操作,并在 OLED 上实时显示传感器数据。

二、项目硬件说明

  • 主控芯片:STM32F103C8T6

  • 传感器:MPU6050(I2C接口)

  • 显示器件:0.96寸 OLED(I2C)

  • 通信方式:软件模拟 I2C

  • 开发工具:Keil MDK + ST-Link 下载器

三、MPU6050 驱动关键实现

1. MPU6050 初始化

void MPU6050_init(void){MyI2C_Init();  // 初始化软件 I2CMPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x01);  // 使用陀螺仪X轴时钟MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x09);  // 采样分频MPU6050_WriteReg(MPU6050_CONFIG, 0x06);      // DLPF 设置为最平滑MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18); // 陀螺仪 ±2000°/sMPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18);// 加速度 ±16g
}

2. 寄存器读写函数

写寄存器:

void MPU6050_WriteReg(uint8_t reg, uint8_t data){MyI2C_Start();MyI2C_SendByte(0xD0);       // 写地址MyI2C_ReceiveAck();MyI2C_SendByte(reg);MyI2C_ReceiveAck();MyI2C_SendByte(data);MyI2C_ReceiveAck();MyI2C_Stop();
}

读寄存器:

uint8_t MPU6050_ReadReg(uint8_t reg){uint8_t data;MyI2C_Start();MyI2C_SendByte(0xD0);       // 写MyI2C_ReceiveAck();MyI2C_SendByte(reg);MyI2C_ReceiveAck();MyI2C_Start();MyI2C_SendByte(0xD1);       // 读MyI2C_ReceiveAck();data = MyI2C_ReceiveByte();MyI2C_SendAck(1);           // NACKMyI2C_Stop();return data;
}

 3. 获取加速度与陀螺仪数据

void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ,int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ){*AccX = (MPU6050_ReadReg(ACCEL_XOUT_H) << 8) | MPU6050_ReadReg(ACCEL_XOUT_L);*AccY = (MPU6050_ReadReg(ACCEL_YOUT_H) << 8) | MPU6050_ReadReg(ACCEL_YOUT_L);*AccZ = (MPU6050_ReadReg(ACCEL_ZOUT_H) << 8) | MPU6050_ReadReg(ACCEL_ZOUT_L);*GyroX = (MPU6050_ReadReg(GYRO_XOUT_H) << 8) | MPU6050_ReadReg(GYRO_XOUT_L);*GyroY = (MPU6050_ReadReg(GYRO_YOUT_H) << 8) | MPU6050_ReadReg(GYRO_YOUT_L);*GyroZ = (MPU6050_ReadReg(GYRO_ZOUT_H) << 8) | MPU6050_ReadReg(GYRO_ZOUT_L);
}

四、主函数 main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "MPU6050.h"
uint8_t ID;
int16_t AX,AY,AZ,GX,GY,GZ;
int main(){OLED_Init();MPU6050_init();OLED_ShowString(1,1,"ID:");ID=MPU6050_GetID();OLED_ShowHexNum(1,4,ID,2);while(1){MPU6050_GetData(&AX,&AY,&AZ,&GX,&GY,&GZ);OLED_ShowSignedNum(2,1,AX,5);OLED_ShowSignedNum(3,1,AY,5);OLED_ShowSignedNum(4,1,AZ,5);OLED_ShowSignedNum(2,8,GX,5);OLED_ShowSignedNum(3,8,GY,5);OLED_ShowSignedNum(4,8,GZ,5);}
}

五、现象

  • OLED 显示 MPU6050 ID(通常为 0x68

  • 第 2~4 行分别显示:加速度 X/Y/Z 和 陀螺仪 X/Y/Z 的数值

  • 当你晃动模块时,数据显示实时变化

附:MPU6050 常用寄存器地址宏定义 MPU6050_Reg.h

#ifndef __MPU6050_REG_H
#define __MPU6050_REG_H#define	MPU6050_SMPLRT_DIV		0x19
#define	MPU6050_CONFIG			0x1A
#define	MPU6050_GYRO_CONFIG		0x1B
#define	MPU6050_ACCEL_CONFIG	0x1C#define	MPU6050_ACCEL_XOUT_H	0x3B
#define	MPU6050_ACCEL_XOUT_L	0x3C
#define	MPU6050_ACCEL_YOUT_H	0x3D
#define	MPU6050_ACCEL_YOUT_L	0x3E
#define	MPU6050_ACCEL_ZOUT_H	0x3F
#define	MPU6050_ACCEL_ZOUT_L	0x40
#define	MPU6050_TEMP_OUT_H		0x41
#define	MPU6050_TEMP_OUT_L		0x42
#define	MPU6050_GYRO_XOUT_H		0x43
#define	MPU6050_GYRO_XOUT_L		0x44
#define	MPU6050_GYRO_YOUT_H		0x45
#define	MPU6050_GYRO_YOUT_L		0x46
#define	MPU6050_GYRO_ZOUT_H		0x47
#define	MPU6050_GYRO_ZOUT_L		0x48#define	MPU6050_PWR_MGMT_1		0x6B
#define	MPU6050_PWR_MGMT_2		0x6C
#define	MPU6050_WHO_AM_I		0x75#endif

六、总结

本项目展示了如何使用 STM32 软件模拟 I2C 成功与 MPU6050 进行通信,并实时获取六轴数据,是一个非常实用且适合入门传感器开发的例子。

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

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

相关文章

TFLOPs与TOPS的转换关系详解:如何衡量AI芯片的算力?

在评估AI芯片或计算硬件的性能时&#xff0c;我们经常会遇到TFLOPs和TOPS这两个关键指标。很多开发者对它们的区别和转换关系存在疑惑。本文将深入解析这两个指标的含义、应用场景及转换方法&#xff0c;并提供实际应用中的注意事项。 一、基本概念解析 1.1 TFLOPs&#xff08;…

C语言:第11天笔记

C语言&#xff1a;第11天笔记 内容提要函数函数的概述函数的分类函数的定义形参和实参函数的返回值函数的调用函数的声明函数 函数的概述 **函数&#xff1a;**实现一定功能的&#xff0c;独立的代码模块&#xff0c;对于函数的使用&#xff0c;一定是先定义&#xff0c;后使 ​…

java导出pdf(使用html)

引入maven <dependencies><!-- Thymeleaf --><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf</artifactId><version>3.1.1.RELEASE</version> <!-- 或与 Spring Boot 匹配的版本 --></de…

Qt 远程过程调用(RPC)实现方案

在分布式系统开发中&#xff0c;远程过程调用&#xff08;RPC&#xff09;是实现跨进程、跨机器通信的重要技术。Qt 作为一个强大的跨平台框架&#xff0c;提供了多种 RPC 实现方案&#xff0c;能够满足不同场景下的通信需求。本文将深入探讨 Qt 中 RPC 的各种实现方式&#xf…

攻防世界-引导-Web_php_unserialize

题目内容&#xff1a;出现一段源代码&#xff0c;分段分析第一部分如下<?php class Demo { private $file index.php;public function __construct($file) { $this->file $file; }function __destruct() { echo highlight_file($this->file, true); }function __w…

pytorch学习笔记-自定义卷积

未完结的草稿———&#xff01;大概是准备整合一下常见的层&#xff0c;整合完感觉就可以进行搭建了&#xff08;还没进行到这一步所以不太确定版&#xff09; &#xff08;ps我将在完结这一篇的时候删除上面的小字and二编一下整篇文章的结构&#xff0c;如果看到了这部分文字…

[明道云]-基础教学2-工作表字段 vs 控件:选哪种?

本文深入解析“工作表字段”与“控件”的关系与差别,并从结构、功能、使用场景和选型建议等方面进行对比。 一、基础概念厘清 ✅ 工作表字段 = 数据模型中的列 工作表字段相当于数据库表中的列,是记录每条业务对象(如订单、客户等)属性的数据项,每个字段都有明确的名称和…

C++-一篇文章入门coroutines协程

文章目录前言什么是协程协程实现原理C协程的最小例子12345协程等效代码协程传值的例子前言 最近学习了一下C协程&#xff0c;这篇文章将介绍协程的相关概念&#xff0c;以及在C中如何使用协程。 什么是协程 C中&#xff0c;协程&#xff08;coroutines&#xff09;可以理解为…

数字经济专业的就业全景指南

CDA数据分析师证书含金量高&#xff0c;适应了未来数字化经济和AI发展趋势&#xff0c;难度不高&#xff0c;行业认可度高&#xff0c;对于找工作很有帮助。一、数字经济就业热力图二、核心岗位发展路径1. 互联网数字运营岗2. 金融科技岗岗位类型技能组合证书加持5年薪资范围智…

PDF转Word免费工具!批量处理PDF压缩,合并, OCR识别, 去水印, 签名等全功能详解

大家好&#xff0c;欢迎来到程序视点&#xff01;我是你们的老朋友.小二&#xff01;前言PDF软件我发的非常多&#xff0c;但今天这款工具是大家公认最值得推荐的&#xff0c;这款软件就是PDF24PDF24几乎包含了PDF的所有功能&#xff0c;目前是更新到了最新版本&#xff01;文末…

Flutter开发实战之Widget体系与布局原理

第3章:Widget体系与布局原理 在前面两章中,我们已经搭建好了Flutter开发环境,并且了解了Dart语言的基础知识。现在是时候深入Flutter的核心——Widget体系了。如果说Dart是Flutter的语言基础,那么Widget就是Flutter的灵魂。理解Widget体系,是掌握Flutter开发的关键所在。…

C++:stack与queue的使用

stack与queue的使用一.stack与queuej基础1.stack1.1基本认识1.2示例代码代码功能解析2.queue2.1基础知识操作说明2.2示例代码代码分析 一.stack与queuej基础 1.stack 1.1基本认识以上图片展示了栈&#xff08;stack&#xff09;这种数据结构的基本操作示意。栈是一种遵循后进先…

Unity 编辑器开发 之 Excel导表工具

一个简单的Excel导表工具&#xff0c;可以用来热更数据配置工具使用&#xff1a;&#xfeff;&#xfeff;执行菜单 SDGSupporter/Excel/1.Excel2Cs 生成c#脚本。&#xfeff;&#xfeff;等待C#类编译完成&#xfeff;&#xfeff;执行菜单 SDGSupporter/Excel/2.Excel2Bytes …

【数据结构与算法】力扣 415. 字符串相加

题目描述 415. 字符串相加 给定两个字符串形式的非负整数 num1 和num2 &#xff0c;计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库&#xff08;比如 BigInteger&#xff09;&#xff0c; 也不能直接将输入的字符串转换为整数形式。 示例 1…

进阶向:Manus AI与多语言手写识别

Manus AI与多语言手写识别:从零开始理解 手写识别技术作为人工智能领域的重要应用之一,近年来在智能设备、教育、金融等行业得到了广泛运用。根据市场调研机构IDC的数据显示,2022年全球手写识别市场规模已达到45亿美元,预计到2025年将突破70亿美元。其中,多语言手写识别技…

Javaweb————HTTP请求头属性讲解

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️前面我们已经说过http请求分为三部分&#xff0c;请求行&#xff0c;请求头和请求体 请求头包含若干个属性&#xff1a;格式为属性名&#xff1a;属性值&#xff0c;这篇文章我们就来介绍一下http请求头中一些常见属性的含义 我们…

9.c语言常用算法

查找顺序查找&#xff08;线性查找&#xff09;算法思想&#xff1a;从数组的第一个元素开始&#xff0c;逐个与目标值进行比较&#xff0c;直到找到目标值或查找完整个数组。时间复杂度&#xff1a;最好情况&#xff1a;O(1)&#xff08;目标在第一个位置&#xff09;最坏情况…

AI小智源码分析——音频部分(一)

一、源码跳转这里采用了函数重载来进行代码复用&#xff0c;当需要对I2S接口的数据进行配置&#xff0c;比如左右音道切换&#xff0c;可以使用第二个构造函数&#xff0c;这里小智使用的是第一个构造函数&#xff0c;即只传递I2S相关的引脚参数&#xff08;不带slot mask&…

【GNSS原理】【LAMBDA】Chapter.12 GNSS定位算法——模糊度固定LAMBDA算法[2025年7月]

Chapter.12 GNSS定位算法——模糊度固定LAMBDA算法 作者&#xff1a;齐花Guyc(CAUC) 文章目录Chapter.12 GNSS定位算法——模糊度固定LAMBDA算法一.整周模糊度理论1.LAMBDA算法干了一件什么事情&#xff1f;2.LAMBDA算法步骤&#xff08;1&#xff09;去相关&#xff08;Z变换…

计算机毕业设计java在线二手系统的设计与实现 基于Java的在线二手交易平台开发 Java技术驱动的二手物品管理系统

计算机毕业设计java在线二手系统的设计与实现z2n189&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着互联网技术的飞速发展&#xff0c;二手交易市场也逐渐从传统的线下模式转…