MPU6050详解(含源码)

news2024/10/5 23:28:15

前言:MPU6050是一款强大的六轴传感器,需要理解MPU6050首先得有IIC的基础,MPU6050 内部整合了 3 轴陀螺仪和 3 轴加速度传感器,并且含有一个第二 IIC 接口,可用于连接外部磁力传感器,内部有硬件算法支持.

1.IO分配(MPU6050模块)

1. SCL 和 SDA 是连接 MCU 的 IIC 接口, MCU 通过这个 IIC 接口来控制 MPU6050,
另外还有一个 IIC 接口

2.AUX_CL 和 AUX_DA,这个接口可用来连接外部从设备,比如磁传感
器,这样就可以组成一个九轴传感器。

3.AD0 是从 IIC 接口(接 MCU)的地址控制引脚,该引脚控制 IIC 地址的最低位。如果接 GND,则 MPU6050 的 IIC 地址是: 0X68,如果接 VDD,则是 0X69.

2.MPU6050初始化(PA15 接 AD0 = GND)

注意:PA15默认是JTAG引脚,使用PA15时,需要使用IO的重映射功能。

(1)设置MPU6050的地址(AD0的电平) 


RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开辅助功能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;	 // 
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		
 GPIO_Init(GPIOA, &GPIO_InitStructure);					

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
	
MPU_AD0_CTRL=0;	//设置为低电平		

注:这里使用PA15是默认是JTAG引脚 ,需要重映射。

(2)完成IIC的初始化 

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//ÏÈʹÄÜÍâÉèIO PORTBʱÖÓ 
		
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;	 // ¶Ë¿ÚÅäÖÃ
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //ÍÆÍìÊä³ö
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO¿ÚËÙ¶ÈΪ50MHz
  GPIO_Init(GPIOB, &GPIO_InitStructure);					 //¸ù¾ÝÉ趨²ÎÊý³õʼ»¯GPIO 
	
  GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);						 //PB10,PB11 Êä³ö¸ß	

(3)配置MPU6050的设置

	MPU_IIC_Init();//初始化IIC总线
	MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);	//复位MPU6050
  delay_ms(100);
	MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);	//唤醒MPU6050 
	MPU_Set_Gyro_Fsr(3);					//陀螺仪传感器,±2000dps
	MPU_Set_Accel_Fsr(0);					//加速度传感器,±2g
	MPU_Set_Rate(50);						//设置采样率50Hz
	MPU_Write_Byte(MPU_INT_EN_REG,0X00);	//关闭所有中断
	MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);	//I2C主模式关闭
	MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);	//关闭FIFO
	MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);	//INT引脚低电平有效
	res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
	if(res==MPU_ADDR)//器件ID正确
	{
		MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);	//设置CLKSEL,PLL X轴为参考
		MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);	//加速度与陀螺仪都工作
		MPU_Set_Rate(50);						//设置采样率为50Hz
 	}

注:这里配置MPU6050的操作,都是通过IIC协议,直接对MPU6050的寄存器进行访问.

这里提供一个芯片初始化是否成功的小技巧,通常每个芯片都有自己的芯片ID,通常可以把初始化函数设置为u8类型,通过读取ID是否正确,返回不同类型的值(return 1或0),如:while(mpu_dmp_init())

 3.MPU6050通信协议分析

发送一个字节

(1)MCU发送一个起始信号。

(2)传输从机7位地址+读/写位,等待应答信号

(3)发送寄存器地址,等待应答

(4)发送1个字节数据,等待应答

(5)结束信号

使用IIC写一个字节数据,程序如下:

u8 MPU_Write_Byte(u8 reg,u8 data) 				 
{ 
    MPU_IIC_Start(); 
	MPU_IIC_Send_Byte((MPU_ADDR<<1)|0);//发送器件地址+写命令	
	if(MPU_IIC_Wait_Ack())	//等待应答
	{
		MPU_IIC_Stop();		 
		return 1;		
	}
    MPU_IIC_Send_Byte(reg);	//写寄存器地址
    MPU_IIC_Wait_Ack();		//等待应答 
	MPU_IIC_Send_Byte(data);//发送数据
	if(MPU_IIC_Wait_Ack())	//等待ACK
	{
		MPU_IIC_Stop();	 
		return 1;		 
	}		 
    MPU_IIC_Stop();	 
	return 0;
}

 读取IIC多个字节数据

u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{ 
 	MPU_IIC_Start(); 
	MPU_IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令	
	if(MPU_IIC_Wait_Ack())	//等待应答
	{
		MPU_IIC_Stop();		 
		return 1;		
	}
    MPU_IIC_Send_Byte(reg);	//写寄存器地址
    MPU_IIC_Wait_Ack();		//等待应答
    MPU_IIC_Start();
	MPU_IIC_Send_Byte((addr<<1)|1);//发送器件地址+读命令	
    MPU_IIC_Wait_Ack();		//等待应答 
	while(len)
	{
		if(len==1)*buf=MPU_IIC_Read_Byte(0);//读数据,发送nACK 
		else *buf=MPU_IIC_Read_Byte(1);		//读数据,发送ACK  
		len--;
		buf++; 
	}    
    MPU_IIC_Stop();	//产生一个停止条件 
	return 0;	
}

代码连接: 

 链接:https://pan.baidu.com/s/1SKYUonB0yKy9iG6hjabvGQ?pwd=a81l 
提取码:a81l

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

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

相关文章

JumpServer Harbor

Jumpserver是一款开源的堡垒机&#xff0c;可使系统的管理员和开发人员安全的连接到企业内部服务器上执行操作&#xff0c;并且支持大部分操作系统&#xff0c;是一款非常安全的远程连接工具 安装JumpServer jumpserver.org官网去下载安装&#xff0c;有一键安装&#xff08;里…

【回溯篇(3)---最少城市数】

1、最少城市数 【题目】 下图表示的是从城市A到城市H的交通图。从图中可以看出&#xff0c;从城市A到城市H要经过若干个城市。现要找出一条经过城市最少的一条路线。 【算法分析】 看到这图很容易想到用邻接距阵来表示&#xff0c;0表示能走&#xff0c;1表示不能走。如图。…

BM14 链表的奇偶重排

链表的奇偶重排_牛客题霸_牛客网 (nowcoder.com) 双指针解决 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#x…

Android 9.0 系统systemui状态栏下拉左滑显示通知栏右滑显示控制中心模块的流程分析

1.前言 在android9.0的系统rom定制化开发中,在系统原生systemui进行自定义下拉状态栏布局的定制的时候,需要在systemui下拉状态栏下滑的时候,根据下滑坐标来 判断当前是滑出通知栏还是滑出控制中心模块,所以就需要根据屏幕宽度,来区分x坐标值为多少是左滑出通知栏或者右…

Linux_红帽8学习笔记分享_9(文件系统管理FS Management与swap交换分区管理)

Linux_红帽8学习笔记分享_9(文件系统管理FS Management与swap交换分区管理) 文章目录 Linux_红帽8学习笔记分享_9(**文件系统管理FS Management与swap交换分区管理**)1.fdisk分区命令的使用技巧1.1 创建大小为100M,200M,300M,400M,500M的5个磁盘分区(MBR分区表类型)1.2创建大小…

固态继电器的优点

固态继电器的优点包括紧凑性、抗冲击性和长寿命。以下是这些 SSR 优势中最重要的优势&#xff0c;让您了解为什么这项技术最适合您的应用&#xff1a; 开关速度快 固态继电器器件的主要优点之一是其开关速度。由于无需移动机械部件&#xff0c;SSR 可以在几微秒内切换。这是对…

详解MySQL慢SQL定位、分析

目录 1.概述 2.慢SQL定位 3.SQL性能分析 3.1.例子 3.2.SQL性能分析 3.3.参数说明 3.3.1.id 3.3.2.select_type 3.3.3.key_len 3.3.4.rows 3.3.5.type 3.3.6.extra 1.概述 解决慢SQL的问题无非散步&#xff0c;定位慢SQL、分析慢SQL、优化慢SQL&#xff0c;本文将按…

高效提升计算质量!瑞典量子计算机首次应用于化学

​ &#xff08;图片来源&#xff1a;网络&#xff09; 量子计算机可以模拟化学过程&#xff0c;从新药开发到新材料的方方面面&#xff0c;它都能带来重大影响&#xff0c;人们对此寄予厚望。在瑞典&#xff0c;查尔姆斯理工大学的研究人员首次使用量子计算机在实际化学中进行…

PyQt5桌面应用开发(9):经典布局QMainWindow

本文目录 PyQt5桌面应用系列桌面程序基本布局QMainWindow概况与使用主窗体菜单栏工具栏停靠窗状态栏 代码编辑器的例子总结 PyQt5桌面应用系列 PyQt5桌面应用开发&#xff08;1&#xff09;&#xff1a;需求分析 PyQt5桌面应用开发&#xff08;2&#xff09;&#xff1a;事件循…

113-Linux_安装c/c++开发库及连接mysql数据库

文章目录 一.安装c/c开发库二.连接mysql数据库三.用户的管理与授权 mysql数据库的安装 一.安装c/c开发库 安装开发c/c的库&#xff0c;命令&#xff1a;apt install libmysqlclient-dev 二.连接mysql数据库 #include<stdio.h> #include<mysql/mysql.h>void fun…

JAVA13新特性

JAVA13新特性 概述 2019年9月17日&#xff0c;国际知名的OpenJDK开源社区发布了Java编程语言环境的最新版本OpenJDK13。 Features&#xff1a;总共有5个新的JEP(JDK Enhancement Proposals): http://openjdk.java.net/projects/jdk/13/Features 350:Dynamic CDS Archives 动…

C++ STL之vector基础

文章目录 前言STL之vector基础1. What&#xff1a;什么是 vector&#xff1f;2. Why&#xff1a;为什么使用 vector&#xff1f;3. How&#xff1a;怎么使用vector?3.1 vector的定义演示&#xff1a;输出&#xff1a; 3.2 vector iterator 的使用演示&#xff1a;输出&#xf…

网络基础学习:什么是tcp/ip协议

什么是tcp/ip协议 TCP/ip协议是什么东西&#xff1f;tcp/ip四层模型一、应用层二、传输层三、网络层四、网络接口层 TCP/ip协议是什么东西&#xff1f; TCP/IP是一种网络协议套件&#xff0c;它由传输控制协议&#xff08;TCP&#xff09;和互联网协议&#xff08;IP&#xff…

最大网络流算法之dinic算法详解

1、题目描述 On the Internet, machines (nodes) are richly interconnected, and many paths may exist between a given pair of nodes. The total message-carrying capacity (bandwidth) between two given nodes is the maximal amount of data per unit time that can b…

2016年上半年软件设计师下午试题

试题四 【说明】 模式匹配是指给定主串t和子串s&#xff0c;在主串 t 中寻找子串s的过程&#xff0c;其中s称为模式。如果匹配成功&#xff0c;返回s在t中的位置&#xff0c;否则返回-1 。 KMP算法用next数组对匹配过程进行了优化。KMP算法的伪代码描述如下&#xff1a; 在串…

【Python入门】Python的判断语句(if语句的基本格式)

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Python零基础入门系列&#xff0c;本专栏主要内容为Python基础语法、判断、循环语句、函…

如何使用SpringMVC之常用注解

❣️关注专栏&#xff1a;JavaEE Spring MVC ⌛️ 1. Spring MVC 创建和连接⌛️ 1.1 RequestMapping⌛️ 1.2 GetMapping⌛️ 1.3 PostMapping ⌛️ 2. 获取参数⌛️ 2.1 传递/获取单个参数⌛️ 2.2 传递/获取多个参数⌛️ 2.3 传递/获取对象⌛️ 2.4 参数重命名⌛️ 2.4.1 …

【链表OJ题 5】牛客 CM11 链表分割

目录 题目来源&#xff1a; 代码实现&#xff1a; 1.带哨兵位的头结点 2.不带哨兵位的头结点 思路分析&#xff1a; 1.带哨兵位的头结点 实现过程&#xff1a; 易错点&#xff1a; 2.不带哨兵位的头结点 实现过程&#xff1a; 易错点&#xff1a; 题目来源&#xff…

【图神经网络】GNNExplainer代码解读及其PyG实现

GNNExplainer代码解读及其PyG实现 使用GNNExplainerGNNExplainer源码速读前向传播损失函数 基于GNNExplainer图分类解释的PyG代码示例参考资料 接上一篇博客图神经网络的可解释性方法及GNNexplainer代码示例&#xff0c;我们这里简单分析GNNExplainer源码&#xff0c;并用PyTor…

2023年中职组“网络空间安全”赛项XX市竞赛任务书

2023年中职组“网络空间安全”赛项 XX市竞赛任务书 一、竞赛时间 共计&#xff1a;180分钟 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段单兵模式系统渗透测试 任务一 SSH弱口令渗透测试 100分钟 100 任务二 Linux操作系统渗透测试 100 任…