前言

本篇我们接收对MPU6050的基本使用,获取ID,通过IIC协议获取寄存器的值,至于高级滤波算法,比如卡尔曼滤波,或者上面的,后面再更新

基本配置

最好选择PA0和PA1,5V开漏

然后给上代码

MPU6050.c

#include "MPU6050.h"
#include "delay.h"// I2C通信相关的静态函数定义
// 设置 SCL 引脚电平,并添加延时
static void IIC_SCL_(uint8_t state)
{if (state)DL_GPIO_setPins(SOFT_IIC_SCL_PORT, SOFT_IIC_SCL_PIN);elseDL_GPIO_clearPins(SOFT_IIC_SCL_PORT, SOFT_IIC_SCL_PIN);delay_us(5);
}// 设置 SDA 引脚电平,并添加延时
static void IIC_SDA_(uint8_t state)
{DL_GPIO_initDigitalOutput(MPU6050_SDA_IOMUX);if (state)DL_GPIO_setPins(SOFT_IIC_SDA_PORT, SOFT_IIC_SDA_PIN);elseDL_GPIO_clearPins(SOFT_IIC_SDA_PORT, SOFT_IIC_SDA_PIN);delay_us(5);
}// 读取 SDA 引脚电平
static uint8_t IIC_SDA_Read(void)
{DL_GPIO_initDigitalInputFeatures(MPU6050_SDA_input,DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_NONE,DL_GPIO_HYSTERESIS_DISABLE, DL_GPIO_WAKEUP_DISABLE);return DL_GPIO_readPins(SOFT_IIC_SDA_PORT, SOFT_IIC_SDA_PIN);
}// I2C 初始化
static void IIC_Init(void)
{// 初始状态:SCL 和 SDA 都为高电平IIC_SCL_(1);IIC_SDA_(1);
}// 发送起始信号
static void IIC_Start(void)
{IIC_SDA_(1);IIC_SCL_(1);IIC_SDA_(0);IIC_SCL_(0);
}// 发送停止信号
static void IIC_Stop(void)
{IIC_SCL_(0);IIC_SDA_(0);IIC_SCL_(1);IIC_SDA_(1);
}// 发送一个字节
static void IIC_SendByte(uint8_t data)
{uint8_t i;for (i = 0; i < 8; i++){IIC_SDA_((data & 0x80) >> 7);data <<= 1;IIC_SCL_(1);IIC_SCL_(0);}
}// 接收一个字节
static uint8_t IIC_ReceiveByte(uint8_t ack)
{uint8_t i, data = 0;IIC_SDA_(1); // 释放 SDA 线for (i = 0; i < 8; i++){IIC_SCL_(1);data <<= 1;if (IIC_SDA_Read())data |= 0x01;IIC_SCL_(0);}if (ack)IIC_SDA_(0); // 发送应答elseIIC_SDA_(1); // 发送非应答IIC_SCL_(1);IIC_SCL_(0);return data;
}// 等待应答信号
static uint8_t IIC_WaitAck(void)
{uint8_t ack;IIC_SDA_(1);IIC_SCL_(1);ack = IIC_SDA_Read();IIC_SCL_(0);return ack;
}// 向 MPU6050 写入一个字节数据
static void IIC_Write_REG(uint8_t addr, uint8_t reg, uint8_t data)
{IIC_Start();IIC_SendByte((addr << 1) | 0); // 发送写地址IIC_WaitAck();IIC_SendByte(reg); // 发送寄存器地址IIC_WaitAck();IIC_SendByte(data); // 发送数据IIC_WaitAck();IIC_Stop();
}// 从 MPU6050 读取一个字节数据
static uint8_t IIC_Read_REG(uint8_t Address, uint8_t regaddress)
{uint8_t data;IIC_Start();                    // 发送起始信号IIC_SendByte(Address << 1 | 0); // 发送设备地址和写操作IIC_WaitAck();                  // 等待 ACKIIC_SendByte(regaddress);       // 发送寄存器地址IIC_WaitAck();                  // 等待 ACKIIC_Start();                    // 发送起始信号IIC_SendByte(Address << 1 | 1); // 发送设备地址和读操作IIC_WaitAck();                  // 等待 ACKdata = IIC_ReceiveByte(0);      // 读取数据IIC_Stop();                     // 发送停止信号return data;                    // 返回读取的数据
}// MPU6050 初始化函数
uint8_t MPU6050_Init(void)
{IIC_Init(); // 初始化 I2C 总线// 唤醒 MPU6050IIC_Write_REG(MPU6050_ADDR_AD0_LOW, PWR_MGMT_1, 0x00);delay_ms(100); // 等待唤醒// 设置采样率分频IIC_Write_REG(MPU6050_ADDR_AD0_LOW, SMPLRT_DIV, 0x07);// 设置低通滤波器IIC_Write_REG(MPU6050_ADDR_AD0_LOW, CONFIG, 0x06);// 设置陀螺仪量程 ±250°/sIIC_Write_REG(MPU6050_ADDR_AD0_LOW, GYRO_CONFIG, 0x00);// 设置加速度计量程 ±2gIIC_Write_REG(MPU6050_ADDR_AD0_LOW, ACCEL_CONFIG, 0x00);delay_ms(100); // 等待唤醒return 0;
}// 读取 MPU6050 的设备 ID
uint8_t MPU6050_GetDeviceID(void)
{uint8_t data;data = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, WHO_AM_I); // 读取设备 ID 寄存器return data;                                         // 返回设备 ID
}float MPU6050_GET_Tempure(void)
{int16_t temp;                                       // 用于存储温度传感器数据uint8_t H, L;                                       // 用于存储高字节和低字节的数据H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, TEMP_OUT_H); // 读取温度传感器高字节L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, TEMP_OUT_L); // 读取温度传感器低字节temp = (H << 8) | L;                                // 将高字节和低字节合并为一个 16 位数据return (float)temp / 340.0 + 36.53 - 200;           // 计算温度值并返回
}float MPU6050_GetAccelX(void)
{int16_t accel;                                        // 用于存储加速度传感器数据uint8_t H, L;                                         // 用于存储高字节和低字节的数据H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_XOUT_H); // 读取加速度传感器 X 轴高字节L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_XOUT_L); // 读取加速度传感器 X 轴低字节accel = (H << 8) | L;                                 // 将高字节和低字节合并为一个 16 位数据return ((float)accel / 16384.0 + 1) * 90 - 90;        // 直接返回角度
}float MPU6050_GetAccelY(void)
{int16_t accel;                                        // 用于存储加速度传感器数据uint8_t H, L;                                         // 用于存储高字节和低字节的数据H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_YOUT_H); // 读取加速度传感器 Y 轴高字节L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_YOUT_L); // 读取加速度传感器 Y 轴低字节accel = (H << 8) | L;                                 // 将高字节和低字节合并为一个 16 位数据return ((float)accel / 16384.0 + 1) * 90 - 90;        // 直接返回角度
}float MPU6050_GetAccelZ(void)
{int16_t accel;                                        // 用于存储加速度传感器数据uint8_t H, L;                                         // 用于存储高字节和低字节的数据H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_ZOUT_H); // 读取加速度传感器 Z 轴高字节L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_ZOUT_L); // 读取加速度传感器 Z 轴低字节accel = (H << 8) | L;                                 // 将高字节和低字节合并为一个 16 位数据return ((float)accel / 16384.0 + 1) * 90 - 90;        // 直接返回角度
}float MPU6050_GetAngleX(void)
{int16_t gyro;                                        // 用于存储陀螺仪数据uint8_t H, L;                                        // 用于存储高字节和低字节的数据H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_XOUT_H); // 读取陀螺仪 X 轴高字节L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_XOUT_L); // 读取陀螺仪 X 轴低字节gyro = (H << 8) | L;                                 // 将高字节和低字节合并为一个 16 位数据return (float)gyro / 131.0;                          // 计算角速度值并返回
}float MPU6050_GetAngleY(void)
{int16_t gyro;                                        // 用于存储陀螺仪数据uint8_t H, L;                                        // 用于存储高字节和低字节的数据H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_YOUT_H); // 读取陀螺仪 Y 轴高字节L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_YOUT_L); // 读取陀螺仪 Y 轴低字节gyro = (H << 8) | L;                                 // 将高字节和低字节合并为一个 16 位数据return (float)gyro / 131.0;                          // 计算角速度值并返回
}float MPU6050_GetAngleZ(void)
{int16_t gyro;                                        // 用于存储陀螺仪数据uint8_t H, L;                                        // 用于存储高字节和低字节的数据H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_ZOUT_H); // 读取陀螺仪 Z 轴高字节L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_ZOUT_L); // 读取陀螺仪 Z 轴低字节gyro = (H << 8) | L;                                 // 将高字节和低字节合并为一个 16 位数据return (float)gyro / 131.0;                          // 计算角速度值并返回
}

MPU6050.h

#ifndef __MPU6050_H
#define __MPU6050_H#include "ti_msp_dl_config.h"// I2C引脚定义
#define SOFT_IIC_SCL_PORT GPIOA        // SCL端口
#define SOFT_IIC_SCL_PIN DL_GPIO_PIN_1 // SCL引脚
#define SOFT_IIC_SDA_PORT GPIOA        // SDA端口
#define SOFT_IIC_SDA_PIN DL_GPIO_PIN_0 // SDA引脚
#define MPU6050_SDA_input   IOMUX_PINCM1  // SDA引脚IOMUX配置// MPU6050寄存器地址定义
#define M_PI 3.14
#define SMPLRT_DIV 0x19   // 采样率分频,典型值:0x07(125Hz) */
#define CONFIG 0x1A       // 低通滤波频率,典型值:0x06(5Hz) */
#define GYRO_CONFIG 0x1B  // 陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s) */
#define ACCEL_CONFIG 0x1C // 加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz) */#define ACCEL_XOUT_H 0x3B // 存储最近的X轴、Y轴、Z轴加速度感应器的测量值 */
#define ACCEL_XOUT_L 0x3C
#define ACCEL_YOUT_H 0x3D
#define ACCEL_YOUT_L 0x3E
#define ACCEL_ZOUT_H 0x3F
#define ACCEL_ZOUT_L 0x40#define TEMP_OUT_H 0x41 // 存储的最近温度传感器的测量值 */
#define TEMP_OUT_L 0x42#define GYRO_XOUT_H 0x43 // 存储最近的X轴、Y轴、Z轴陀螺仪感应器的测量值 */
#define GYRO_XOUT_L 0x44
#define GYRO_YOUT_H 0x45
#define GYRO_YOUT_L 0x46
#define GYRO_ZOUT_H 0x47
#define GYRO_ZOUT_L 0x48#define PWR_MGMT_1 0x6B // 电源管理,典型值:0x00(正常启用) */
#define PWR_MGMT_2 0x6C // 电源管理,典型值:0x00(正常启用) */
#define WHO_AM_I 0x75   // IIC地址寄存器(默认数值0x68,只读) */// HAL库的读写只需要使用7位地址
#define MPU6050_ADDR_AD0_LOW 0x68 // AD0低电平时7位地址为0X68 iic写时时发送0XD0
#define MPU6050_ADDR_AD0_HIGH 0x69// 函数声明
uint8_t MPU6050_Init(void);
uint8_t MPU6050_GetDeviceID(void);
float MPU6050_GET_Tempure(void);
float MPU6050_GetAccelX(void);
float MPU6050_GetAccelY(void);
float MPU6050_GetAccelZ(void);
float MPU6050_GetAngleX(void);
float MPU6050_GetAngleY(void);
float MPU6050_GetAngleZ(void);#endif /* __MPU6050_H */

主函数测试

    uart_init();uart_send_string("=== MPU6050 Test Program ===\r\n");char buf[100];MPU6050_Init();uint8_t id = MPU6050_GetDeviceID();sprintf(buf, "MPU6050 ID: %x\r\n", id);uart_send_string(buf);while (1){//sprintf(buf, "Acc: %.2f, %.2f, %.2f,\r\n", MPU6050_GetAccelX(), MPU6050_GetAccelY(), MPU6050_GetAccelZ());// uart_send_string(buf);sprintf(buf, "Gyro: %.2f, %.2f, %.2f,\r\n",MPU6050_GetAngleX(), MPU6050_GetAngleY(), MPU6050_GetAngleZ());uart_send_string(buf);delay_ms(100);}

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

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

相关文章

spring-ai agent概念

目录agent 概念理解记忆能力工具计划agent 概念理解 agent 智能体&#xff0c;突出智能 大模型的感觉 告诉你怎么做&#xff08;也不一定正确&#xff09;不会帮你做 Agent的感觉 直接准确的帮你做完&#xff08;比如&#xff0c;告诉 AI Agent 帮忙下单一份外卖&#xff0c…

NO.4数据结构数组和矩阵|一维数组|二维数组|对称矩阵|三角矩阵|三对角矩阵|稀疏矩阵

数组的储存 【定义】 数组&#xff1a; 由 n&#xff08;≥1&#xff09; 个相同类型的数据元素构成的有限序列&#xff0c; 是线性表的推广。 一旦被定义&#xff0c; 维数和长度就不可再改变&#xff0c; 一般对其只有元素的存取和修改操作。 一维数组 Arr[a0,…,an−1] Arr[…

如何把Arduino IDE中ESP32程序bin文件通过乐鑫flsah_download_tool工具软件下载到ESP32中

目录前言获取Arduino IDE中ESP32程序bin文件flsah_download_tool工具软件下载程序bin文件到ESP32中总结前言 Arduino IDE丰富的驱动库给ESP32的开发带来了很多便利&#xff0c;当我们下载程序的时候&#xff0c;直选选择好ESP32开发板型号和端口号即可下载程序到开发板中&…

2025XYD Summer Camp 7.11 模考

T1TTT 组询问&#xff0c;每组询问给定 n,mn,mn,m&#xff0c;求 (nm)−1⋅∑i1n∑j1mlcm⁡(i,j) (nm)^{-1}\cdot\sum_{i1}^n\sum_{j1}^m\operatorname{lcm}(i,j) (nm)−1⋅i1∑n​j1∑m​lcm(i,j) 对 109710^971097 取模。 T≤20000T\le 20000T≤20000&#xff0c;n,m≤107n,m…

uniapp 微信小程序点击开始倒计时

一、示例 当点击按钮时就开始倒计时代码 <template><view class"sq_box"><button class"button" click"topay">按钮</button><u-modal v-model"modalShow" :show-cancel-button"true" :content&…

【网络】Linux 内核优化实战 - net.netfilter.nf_conntrack_tcp_timeout_established

目录一、核心概念1. **TCP 连接状态跟踪**2. **参数作用**二、默认值与典型场景1. **默认值**2. **典型场景**三、如何调整该参数1. **查看当前值**2. **临时修改&#xff08;重启后失效&#xff09;**3. **永久修改**四、相关参数与配合优化1. **其他 TCP 状态超时参数**2. **…

鸿蒙app 开发中的Record<string,string>的用法和含义

Record<string, string> 在鸿蒙 App 开发中的用法在 TypeScript 中&#xff0c;Record<string, string> 是一个映射类型&#xff08;Mapped Type&#xff09;&#xff0c;用于描述一个对象的结构。在鸿蒙 App 开发中&#xff0c;它常用于定义接口、组件属性或函数参…

Webpack、Vite配置技巧与CI/CD流程搭建全解析

Webpack、Vite配置技巧与CI/CD流程搭建全解析 在现代前端开发中&#xff0c;构建工具配置和自动化部署流程是提升开发效率和项目质量的关键环节。本文将深入探讨Webpack和Vite这两大构建工具的核心配置技巧&#xff0c;并详细介绍CI/CD流程的搭建方法。 一、Webpack核心配置技巧…

输入npm install后发生了什么

一、准备阶段&#xff1a;配置与环境检查读取配置优先级npm install 首先加载多层级的配置&#xff08;优先级从高到低&#xff09;4&#xff1a;项目级 .npmrc用户级 .npmrc&#xff08;如 ~/.npmrc&#xff09;全局 npmrcnpm 内置默认配置可通过 npm config ls -l 查看所有配…

SpringBoot集成Redis、SpringCache

1 Redis介绍 1.1 Redis作为缓存 由于Redis的存取效率非常高,在开发实践中,通常会将一些数据从关系型数据库(例如MySQL)中读取出来,并写入到Redis中,后续当需要访问相关数据时,将优先从Redis中读取所需的数据,以此,可以提高数据的读取效率,并且对一定程度的保护关系型…

静态路由综合配置实验报告

一、实验拓扑二、实验需求1.除了R5的环回地址固定5.5.5.0/24&#xff0c;其他网段基于192.168.1.0/24进行合理划分&#xff1b;2.R1-R4每个路由器存在两个环回接口&#xff0c;模拟PC&#xff0c;地址也在192.168.1.0/24网络内&#xff1b;3.R1-R4不能直接编写到达5.5.5.0/24的…

【一起来学AI大模型】PyTorch DataLoader 实战指南

DataLoader 是 PyTorch 中处理数据的核心组件&#xff0c;它提供了高效的数据加载、批处理和并行处理功能。下面是一个全面的 DataLoader 实战指南&#xff0c;包含代码示例和最佳实践。基础用法&#xff1a;简单数据加载import torch from torch.utils.data import Dataset, D…

SpringBoot单元测试类拿不到bean报空指针异常

原代码package com.atguigu.gulimall.product;import com.aliyun.oss.OSSClient; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; impo…

持续集成 简介环境搭建

1. 持续集成简介 1.1 持续集成的作用 随着互联网的蓬勃发展,软件生命周期模型也经历了几个比较大的阶段,从最初的瀑布模型,到 V 模型,再到现在的敏捷或者 devops,不论哪个阶段,项目从立项到交付几乎都离不开以下几个过程,开发、构建、测试和发布,而且一直都在致力于又…

关于 java:11. 项目结构、Maven、Gradle 构建系统

一、Java 项目目录结构标准1.1 Java 项目标准目录结构总览标准 Java 项目目录结构&#xff08;以 Maven / Gradle 通用结构为基础&#xff09;&#xff1a;project-root/ ├── src/ │ ├── main/ │ │ ├── java/ # 主业务逻辑代码&#xff08;核心…

大数据的安全挑战与应对

在大数据时代&#xff0c;大数据安全问题已成为开发者最为关注的核心议题之一。至少五年来&#xff0c;大数据已融入各类企业的运营体系&#xff0c;而采用先进数据分析解决方案的组织数量仍在持续增长。本文将明确当前市场中最关键的大数据安全问题与威胁&#xff0c;概述企业…

PostgreSQL ERROR: out of shared memory处理方式

系统允许的总锁数 SELECT (SELECT setting::int FROM pg_settings WHERE name max_locks_per_transaction) * (SELECT setting::int FROM pg_settings WHERE name max_connections) (SELECT setting::int FROM pg_settings WHERE name max_prepared_transactions);当锁大于…

Django 模型(Model)

1. 模型简介 ORM 简介 MVC 框架中一个重要的部分就是 ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库。即直接面向对象操作数据,无需考虑 sql 语句。 ORM 是“对象-关系-映射”的简称,主要任务是:…

深入解析Hadoop RPC:技术细节与推广应用

Hadoop RPC框架概述在分布式系统的核心架构中&#xff0c;远程过程调用&#xff08;RPC&#xff09;机制如同神经网络般连接着各个计算节点。Hadoop作为大数据处理的基石&#xff0c;其自主研发的RPC框架不仅支撑着内部组件的协同运作&#xff0c;更以独特的工程哲学诠释了分布…