如何通过软件IIC使用MPU6050陀螺仪

news2024/11/24 19:53:16

目录

1.  MPU6050简介

2.  MPU6050参数

3.  MPU6050硬件电路

4.  代码编写

4.1  MPU6050写寄存器

4.2  MPU6050读寄存器

4.3  初始化

4.4  MPU6050获取ID号

4.5  MPU6050获取数据


1.  MPU6050简介

        MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景。

3轴加速度计(Accelerometer) :测量X、Y、Z轴的加速度

3轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度

2.  MPU6050参数

16位ADC采集传感器的模拟信号,量化范围:-32768~32767

加速度计满量程选择:±2、±4、±8、±16(g)

陀螺仪满量程选择: ±250、±500、±1000、±2000(°/sec)

可配置的数字低通滤波器:数字低通滤波器用于去除信号中的高频噪声,保留信号中的低频成分。这对于在嘈杂的环境中准确测量传感器数据非常重要。

可配置的时钟源:时钟源可以是内部时钟或外部时钟,用于同步传感器的采样和数据传输。

可配置的采样分频:采样分频确定了采样率,即每秒钟进行多少次数据采样。较低的采样率可能会降低功耗,但也可能导致数据分辨率的损失。

I2C从机地址:1101000(AD0=0)             1101001(AD0=1)

3.  MPU6050硬件电路

4.  代码编写

对于软件IIC的代码参考:

STM32F1之I2C通信·软件I2C代码编写-CSDN博客

        对于MPU6050的代码,首先我们先创建一个宏定义,用于存放从机地址,便于以后修改:

#define MPU6050_ADDRESS		0xD0		//MPU6050的I2C从机地址

        然后我们基于上述链接给出的IIC的代码,初始化MPU6050:

void MPU6050_Init(void)
{
	MyI2C_Init();									//先初始化底层的I2C
	
}

4.1  MPU6050写寄存器

        根据上图时序进行代码编写:

void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data)
{
	MyI2C_Start();						//I2C起始
	MyI2C_SendByte(MPU6050_ADDRESS);	//发送从机地址,读写位为0,表示即将写入
	MyI2C_ReceiveAck();					//接收应答
	MyI2C_SendByte(RegAddress);			//发送寄存器地址
	MyI2C_ReceiveAck();					//接收应答
	MyI2C_SendByte(Data);				//发送要写入寄存器的数据
	MyI2C_ReceiveAck();					//接收应答
	MyI2C_Stop();						//I2C终止
}

        以上是写入单个数据,要想写入多个数据可以使用for循环来进行实现:

void MPU6050_WriteReg(uint8_t RegAddress, uint8_t *Data, uint8_t Length)
{
    MyI2C_Start();                      //I2C起始
    MyI2C_SendByte(MPU6050_ADDRESS);    //发送从机地址,读写位为0,表示即将写入
    MyI2C_ReceiveAck();                 //接收应答
    MyI2C_SendByte(RegAddress);         //发送寄存器地址
    MyI2C_ReceiveAck();                 //接收应答
    
    for (uint8_t i = 0; i < Length; i++) {
        MyI2C_SendByte(Data[i]);        //发送要写入寄存器的数据
        MyI2C_ReceiveAck();             //接收应答
    }
    
    MyI2C_Stop();                       //I2C终止
}

4.2  MPU6050读寄存器

        根据上图时序进行代码编写:

uint8_t MPU6050_ReadReg(uint8_t RegAddress)
{
	uint8_t Data;
	
	MyI2C_Start();						//I2C起始
	MyI2C_SendByte(MPU6050_ADDRESS);	//发送从机地址,读写位为0,表示即将写入
	MyI2C_ReceiveAck();					//接收应答
	MyI2C_SendByte(RegAddress);			//发送寄存器地址
	MyI2C_ReceiveAck();					//接收应答
	
	MyI2C_Start();						//I2C重复起始
	MyI2C_SendByte(MPU6050_ADDRESS | 0x01);	//发送从机地址,读写位为1,表示即将读取
	MyI2C_ReceiveAck();					//接收应答
	Data = MyI2C_ReceiveByte();			//接收指定寄存器的数据
	MyI2C_SendAck(1);					//发送应答,给从机非应答,终止从机的数据输出
	MyI2C_Stop();						//I2C终止
	
	return Data;
}

4.3  初始化

        首先我们先创建一些宏定义,将其归类了解一下:

#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

// 加速度计X轴输出高字节
#define MPU6050_ACCEL_XOUT_H    0x3B
// 加速度计X轴输出低字节
#define MPU6050_ACCEL_XOUT_L    0x3C
// 加速度计Y轴输出高字节
#define MPU6050_ACCEL_YOUT_H    0x3D
// 加速度计Y轴输出低字节
#define MPU6050_ACCEL_YOUT_L    0x3E
// 加速度计Z轴输出高字节
#define MPU6050_ACCEL_ZOUT_H    0x3F
// 加速度计Z轴输出低字节
#define MPU6050_ACCEL_ZOUT_L    0x40
// 温度输出高字节
#define MPU6050_TEMP_OUT_H      0x41
// 温度输出低字节
#define MPU6050_TEMP_OUT_L      0x42
// 陀螺仪X轴输出高字节
#define MPU6050_GYRO_XOUT_H     0x43
// 陀螺仪X轴输出低字节
#define MPU6050_GYRO_XOUT_L     0x44
// 陀螺仪Y轴输出高字节
#define MPU6050_GYRO_YOUT_H     0x45
// 陀螺仪Y轴输出低字节
#define MPU6050_GYRO_YOUT_L     0x46
// 陀螺仪Z轴输出高字节
#define MPU6050_GYRO_ZOUT_H     0x47
// 陀螺仪Z轴输出低字节
#define MPU6050_GYRO_ZOUT_L     0x48

// 电源管理1寄存器
#define MPU6050_PWR_MGMT_1      0x6B
// 电源管理2寄存器
#define MPU6050_PWR_MGMT_2      0x6C
// WHO_AM_I寄存器
#define MPU6050_WHO_AM_I        0x75

#endif

        对于这些,我们初始化需要调用:

void MPU6050_Init(void)
{
	MyI2C_Init();									//先初始化底层的I2C
	
	/*MPU6050寄存器初始化,需要对照MPU6050手册的寄存器描述配置,此处仅配置了部分重要的寄存器*/
	MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x01);		//电源管理寄存器1,取消睡眠模式,选择时钟源为X轴陀螺仪
	MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0x00);		//电源管理寄存器2,保持默认值0,所有轴均不待机
	MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x09);		//采样率分频寄存器,配置采样率
	MPU6050_WriteReg(MPU6050_CONFIG, 0x06);			//配置寄存器,配置DLPF
	MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18);	//陀螺仪配置寄存器,选择满量程为±2000°/s
	MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18);	//加速度计配置寄存器,选择满量程为±16g
}

4.4  MPU6050获取ID号

uint8_t MPU6050_GetID(void)
{
	return MPU6050_ReadReg(MPU6050_WHO_AM_I);		//返回WHO_AM_I寄存器的值
}

4.5  MPU6050获取数据

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;								//定义数据高8位和低8位的变量
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);		//读取加速度计X轴的高8位数据
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);		//读取加速度计X轴的低8位数据
	*AccX = (DataH << 8) | DataL;						//数据拼接,通过输出参数返回
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);		//读取加速度计Y轴的高8位数据
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);		//读取加速度计Y轴的低8位数据
	*AccY = (DataH << 8) | DataL;						//数据拼接,通过输出参数返回
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);		//读取加速度计Z轴的高8位数据
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);		//读取加速度计Z轴的低8位数据
	*AccZ = (DataH << 8) | DataL;						//数据拼接,通过输出参数返回
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);		//读取陀螺仪X轴的高8位数据
	DataL = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);		//读取陀螺仪X轴的低8位数据
	*GyroX = (DataH << 8) | DataL;						//数据拼接,通过输出参数返回
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);		//读取陀螺仪Y轴的高8位数据
	DataL = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);		//读取陀螺仪Y轴的低8位数据
	*GyroY = (DataH << 8) | DataL;						//数据拼接,通过输出参数返回
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);		//读取陀螺仪Z轴的高8位数据
	DataL = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);		//读取陀螺仪Z轴的低8位数据
	*GyroZ = (DataH << 8) | DataL;						//数据拼接,通过输出参数返回
}

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

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

相关文章

AWTK实现汽车仪表Cluster/DashBoard嵌入式GUI开发(七):快启

前言: 汽车仪表是人们了解汽车状况的窗口,而仪表中的大部分信息都是以指示灯形式显示给驾驶者。仪表指示灯图案都较为抽象,对驾驶不熟悉的人在理解仪表指示灯含义方面存在不同程度的困难,尤其对于驾驶新手,如果对指示灯的含义不求甚解,有可能影响驾驶的安全性。即使是对…

关于新配置的adb,设备管理器找不到此设备问题

上面页面中一开始没有找到此android设备&#xff0c; 可能是因为我重新配置的adb和设备驱动&#xff0c; 只把adb配置了环境变量&#xff0c;驱动没有更新到电脑中&#xff0c; 点击添加驱动&#xff0c; 选择路径&#xff0c;我安装时都放在了SDK下面&#xff0c;可以尝试…

怎么查看公网IP?

在网络通信中&#xff0c;每个设备都会被分配一个IP地址&#xff0c;用于在互联网上进行唯一标识和通信。公网IP是指可以被公开访问的IP地址&#xff0c;可以用来建立远程连接或者进行网络访问等操作。怎么查看公网IP呢&#xff1f;下面将介绍几种常用的方法。 使用命令行查询公…

mainwindow.ui和mainwindow.h和ui_mainwindow.h这几个文件之间的联系是什么

在Qt应用程序开发中&#xff0c;mainwindow.ui, mainwindow.h, 和 ui_mainwindow.h 这三个文件之间有着紧密的联系&#xff0c;共同构成了使用Qt Designer设计的图形用户界面&#xff08;GUI&#xff09;应用程序的基础。下面是这三个文件各自的作用及它们之间的关联&#xff1…

linux day7 wget,curl

wget下载命令 curl [-O] 网址 不写-O表示请求网址&#xff0c;会返回网页html代码 写-O表示请求下载网页文件

基于因果图的灰度故障定位

简 介 本文介绍由南开大学、华为技术有限公司、清华大学共同合作的论文&#xff1a;面向服务器操作系统的非侵入式灰度故障定位。该论文已被The ESEC/FSE Conference 2024&#xff08;The ACM Joint European Software Engineering Conference and Symposium on the Foundatio…

【易生支付官网注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

mybatisPlus-DB静态工具

方法跟mybatisplus的service接口非常像&#xff0c;静态工具可以避免依赖循环注入。

异步爬虫学习实战项目:水效标识网

大家好&#xff0c;我是南枫&#xff0c;今天一起来学习异步爬虫。 文章开始之前&#xff0c;我们先搞清楚为什么要学异步爬虫&#xff1f;我们之后在工作中会遇到爬大量数据&#xff0c;比如百万数据采集&#xff0c;用平常的方法爬取的效率会比较低&#xff0c;所以要学习异…

React 其他 Hooks

其他 Hooks useRef 可用于获取 DOM 元素 const ScrollRef useRef(null)ScrollRef.current useContext &#xff08;先回顾一下之前的 Context 知识&#xff0c;借用之前 ppt 和源码&#xff09; Hooks 中使用 useContext 来获取 context 的值 // 父组件创建 contextexpor…

在MySQL数据库中的视图和事务。

视图 view 临时表 作用&#xff1a;优化多表查询的效率 可以将经常使用的连接查询结果使用视图进行保存&#xff0c;避免多次重复的笛卡尔积运算 MySQL数据库在多表查询的时候会自动进行笛卡尔积运算。 如果将来经常要用到某一个多表查询的结果就可以使用视图将这个结果…

Android 观察者模式(OBSERVER)应用详解

文章目录 1、观察者模式设计初衷1.1. 解耦对象之间的依赖关系1.2. 允许动态的依赖关系1.3. 自动通知和更新1.4 设计初衷的详细说明1. 对象之间的解耦2. 动态依赖关系3. 自动更新 2、实现细节2.1. Subject 接口和实现2.2. Observer 接口和实现2.3. 主类 3、主要角色4、关系示意图…

Nginx - Stream 日志模块不完全指北

文章目录 Pre官网Nginx Stream模块基础功能Nginx Stream访问日志的缺陷解决方案或替代方案安装和配置nginx-log-enhancement模块1. 下载nginx-log-enhancement模块源代码2. 解压源代码3. 配置Nginx源代码4. 编译和安装Nginx5. 配置nginx-log-enhancement模块6. 重启Nginx7. 测试…

I/O '24|学习资源焕新,技术灵感升级

2024 年 5 月 15 日凌晨举行的 Google I/O 大会为各地的开发者们带来了新的灵感。面对技术革新&#xff0c;相信各位开发者们都迫不及待想要自己上手试一试。 别急&#xff0c;Google 谷歌今年为中国的开发者们准备了一份特别的学习资源&#xff0c;让开发者们自由探索新知。 G…

RedisTemplate操作Redis, 看这一篇文章就够了

文章目录 1. String 命令1.1 添加缓存1.2 设置过期时间(单独设置)1.3 获取缓存值1.4 删除key1.5 顺序递增1.6 顺序递减1.7 常用的 2. Hash命令2.1 添加缓存2.2 设置过期时间(单独设置)2.3 添加一个Map集合2.4 提取所有的小key2.5 提取所有的value值2.6 根据key提取value值2.7 获…

【VTKExamples::Texture】第六期 TextureThreshold

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例TextureThreshold,并解析接口vtkTexture,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~Y…

20240524每日后端---------聊聊编写简历

简历 简历就是你的名片。 生活中很多朋友却不拿简历当一回事。 最近看了几十份应聘简历&#xff0c;我不得不佩服有些老哥&#xff0c;工作十来年&#xff0c;简历还是表格的格式&#xff0c;不仅看着不好看&#xff0c;而且排版还贼差。 第一感官就很差好吧。。。 好的简历 …

二叉树(详解)

在了解二叉树之前呢我们先来了解一下树形结构&#xff0c;因为二叉树就是树形结构的一种特殊情况&#xff0c;它有这非常好的性质&#xff0c;是很常用的一种结构。 目录 一.什么是树形结构&#xff1f; 二.树形结构常见的名词 三.树的存储 四.二叉树 1.二叉树的概念 2.…

python web自动化(Pytest实战)

1.UnitTest框架与Pytest框架对⽐ 1&#xff09; unittest框架介绍 Unittest则是Python语⾔的标准单元测试框架。 Unittest⽀持⾃动化测试&#xff0c;测试⽤例的初 始化、关闭和测试⽤例的聚合等功能&#xff0c;它有⼀个很重要的特性&#xff…

勒索病毒的策略与建议

随着网络技术的快速发展&#xff0c;勒索病毒攻击成为全球范围内日益严重的网络安全威胁。勒索病毒通过加密用户文件或锁定系统来勒索赎金&#xff0c;给个人和企业带来了巨大的损失。因此&#xff0c;了解如何应对勒索病毒攻击至关重要。本文将概述一些有效的防范措施和应对策…