STM32F103RCT6——MPU6050使用

news/2024/11/18 16:57:41/

目录

一、MPU6050简介

1. 引脚介绍

2. 寻找SCL、SDA接口

3. 工作原理

​编辑

二、MPU6050实现

1.  STM32开发板接线

2. DMP移植 

A. 新建STM32CubeMX工程

B. 移植DMP

 C. 调用API

 D. 修改报错

3. 实现结果


一、MPU6050简介

1. 引脚介绍

只需要接4个引脚,即:VCC、GND、SCL、SDA
其余的引脚是用来接电磁传感器形成九轴传感器


SCL和SDA是连接MCU的IIC接口,MCU通过这个IIC接口来控制MPU6050,另外还有一个IIC接口:AXCL和 XDA,这个接口可用来连接外部从设备,比如磁传感 器,这样就可以组成一个九轴传感器。VLOGIC是IO口电压,该引脚最低可以到1.8V,我们 一般直接接VDD即可。AD0是从IIC接口(接MCU)的地址控制引脚,该引脚控制IIC地址 的最低位。如果接GND,则MPU6050的IIC地址是:0X68,如果接VDD,则是0X69,注意: 这里的地址是不包含数据传输的最低位的(最低位用来表示读写)

由此可知SCL、SDA必须接有IIC功能的引脚


2. 寻找SCL、SDA接口

1.  最快捷的方法就是以你的板子型号,去STM32CubeMX里面设置Connectivity的I2C1 / I2C2,去看他亮起的绿色引脚显示。

2. 看开发板的原理图。

3. 工作原理

(1)MPU6050是InvenSense公司推出的全球首款整合性6轴运动处理组件,内带3轴陀螺仪和3轴加速度传感器,并且含有一个第二IIC接口,可用于连接外部磁力传感器,利用自带数字运动处理器(DMP: Digital Motion Processor)硬件加速引擎,通过主IIC接口,可以向应用端输出完整的9轴姿态融合演算数据。有了DMP,我们可以使用InvenSense公司提供的运动处理资料库,非常方便的实现姿态解算,降低了运动处理运算对操作系统的负荷,同时大大降低了开发难度

三轴加速器是检测横向加速的,三轴陀螺仪是检测角度旋转和平衡的x轴向前,y轴在机器人左边,z轴向上

 (2)获得数据(我只需要加速度,所以只提供加速度的处理)

   G=aacx/16384    单位为  m/s^2

二、MPU6050实现

1.  STM32开发板接线


(1)所有STM32开发板都有专门的SCL、SDA接口,根据原理图既可以找到对应接口接上。这里以正点原子的精英STM32F103ZET6为例:

 (2)涉及到其他的应用,列如STM32小车,他的部分连接可能已经预设好了,不便更改就需要进行选择,例子如下(开发板型号为F103RCT6):

在我针对这款小车使用MPU6050时出现一些情况:

(a)根据原理图直接得知以PB14、PB15分别作为SCL、SDA接口

 但是当我进入STM32Cube初始化时电机PB14引脚时,它却没有对应的IIC接口功能(左图),正常有IIC接口功能应该如右图:

     

 遇到这个情况我选择还是根据开发板的原理图来,选择带有IIC功能的引脚连接,最后我选择用I2C2(PB10、PB11),因为I2C1对应的PB6、PB7是编码器接口:

 (b)在将MPU6050直接插入接口时发现,引脚顺序不对,所以直接用杜邦线引出控制。

这里SCL、SDA的顺序不能改变,来源于MPU6050的工作原理:

开始信号:

SCL 为高电平时, SDA 由高电平向低电平跳变,开始传送数据。

结束信号:

SCL 为高电平时, SDA 由低电平向高电平跳变,结束传送数据。

2. DMP移植 

DMP:InvenSense 提供了一个 MPU6050 的嵌入式运动驱动库,结合 MPU6050 的 DMP,可以将我们的原始数据,直接转换成四元数输出,而得到四元数之后,就可以很方便的计算出欧拉角,从而得到 yaw、roll 和 pitch。

A. 新建STM32CubeMX工程

(1)选择芯片型号

(2)SYS

(3)RCC

(4)I2C2

(5)设置串口

 (6)时钟树

 (7)生成代码

B. 移植DMP

(1)在生成的项目中新建文件夹: Hardware

 (2)下载MPU6050配置文件并复制在Hardware里面

 MPU6050-DMP移植https://download.csdn.net/download/northern_light_/87813248

 (3)

 (4)

 (5)在usart.c文件的用户代码0段添加重定向代码,便于使用printf进行调试,代码如下:

/* USER CODE BEGIN 0 */
#define USE_PRINT
#ifdef USE_PRINT
//编译器不使用MicroLib库
#pragma import(__use_no_semihosting)
//定义 _sys_exit() 避免使用半主机
void _sys_exit(int x)
{x = x;
}
struct __FILE
{int handle;
};
FILE __stdout;
//重映射fputc
int fputc(int ch, FILE *stream)
{//判断串口是否发送完成 //不同芯片的串口标志位不一定相同,具体查手册while((USART1->SR & 0X40) == 0);//如果串口已经发送完成,发送下一个字符USART1->DR = (uint8_t) ch;return ch;
}
#endif
/* USER CODE END 0 */

20210606164526

(6)在usart.h加入printf的库

#include <stdio.h>

20210811222834

 C. 调用API

(1)在main.c的用户环境包含内添加使用到的头文件

#include <stdio.h>
#include "../../../Hardware/MPU6050/mpu6050.h"
#include "../../../Hardware/MPU6050/delay.h"
#include "../../../Hardware/MPU6050/eMPL/inv_mpu.h"
#include "../../../Hardware/MPU6050/eMPL/inv_mpu_dmp_motion_driver.h" 

 20210606165027

 (2)在用户变量代码段添加如下变量,用于存放MPU6050的各项数据;

float pitch,roll,yaw; 		//欧拉角
short aacx,aacy,aacz;		//加速度传感器原始数据
short gyrox,gyroy,gyroz;	//陀螺仪原始数据
short temp;					//温度

 20210606165159

(3)用户初始代码段2插入6050和dmp初始化代码

	while(MPU_Init());					//初始化MPU6050printf("%s\r\n","jeck666");while(mpu_dmp_init()){delay_ms(200);printf("%s\r\n","Mpu6050 Init Wrong!");}printf("%s\r\n","Mpu6050 Init OK!");

 20210606165343

(4)代码主循环插入如下代码,用于将获取的数据通过串口上传给上位机

		if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0){temp=MPU_Get_Temperature();								//得到温度值MPU_Get_Accelerometer(&aacx,&aacy,&aacz);	//得到加速度传感器数据MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);	//得到陀螺仪数据printf("三轴角度:%f-%f-%f\r\n",pitch,roll,yaw);printf("三轴加速度:%d-%d-%d\r\n",aacx,aacy,aacz);printf("三轴角角度:%d-%d-%d\r\n",gyrox,gyroy,gyroz);}delay_ms(100);

 20210606170314

 D. 修改报错

我们设置的是I2C2但是配置文件是I2C1,所以报错,将hi2c1全部替换为hi2c2

 

3. 实现结果

因为我们设置了串口1,所以利用串口调试助手观察结果

串口调试助手安装包下载:https://download.csdn.net/download/northern_light_/87813330https://download.csdn.net/download/northern_light_/87813330

 

参考链接:

MPU6050_mpu6050初始化_K11mvp的博客-CSDN博客STM32 MPU6050 通过数据反馈的点灯实验https://blog.csdn.net/K11mvp/article/details/126658550MPU6050加速度、角速度的解算以及互补滤波使用_mpu6050角速度_黄白戈的博客-CSDN博客MPU6050加速度的解算先根据两张图建立各个角度的关系RollRollRoll(横滚角)以xxx轴为旋转轴的旋转角度YawYawYaw(偏航角)以zzz轴为旋转轴的旋转角度PitchPitchPitch(俯仰角)以yyy轴为旋转轴的旋转角度我们先了解加速度的单位及量程方便进行解算在MPU初始化函数中找到,初始化加速度传感器的函数//设置MPU6050加速度传感器满量程范围//fsr:0,±2g;1,±4g;2,±8g;3,±16g//返回值:0,设置成功https://blog.csdn.net/qq_49979053/article/details/117395838

MPU6050加速度、角速度的解算以及互补滤波使用_mpu6050角速度_黄白戈的博客-CSDN博客MPU6050加速度的解算先根据两张图建立各个角度的关系RollRollRoll(横滚角)以xxx轴为旋转轴的旋转角度YawYawYaw(偏航角)以zzz轴为旋转轴的旋转角度PitchPitchPitch(俯仰角)以yyy轴为旋转轴的旋转角度我们先了解加速度的单位及量程方便进行解算在MPU初始化函数中找到,初始化加速度传感器的函数//设置MPU6050加速度传感器满量程范围//fsr:0,±2g;1,±4g;2,±8g;3,±16g//返回值:0,设置成功https://blog.csdn.net/qq_49979053/article/details/117395838


http://www.ppmy.cn/news/894768.html

相关文章

DS1302/GC1302/1302系列时钟芯片驱动程序注意事项解析数据手册

DS1302/GC1302/1302系列时钟芯片驱动程序&注意事项&解析数据手册 一、简介 概述 工作原理 二、硬件连接三、驱动程序 1、引脚配置&初始化 2、命令&寄存器 3、写入一个字节 4、读出一个字节 5、其他应用函数 BCD转换 写入默认时间 读出时间 main.c 结…

STM32F103硬件I2C

I2C通信协议是比较常见且常用的一种串行同步半双工通信协议&#xff1b;在单片机开发中&#xff0c;很多独立的功能模块采用I2C通信协议&#xff0c;其通信原理及过程这里就不过多的介绍。 在学习I2C的过程中&#xff0c;通常都会根据其时序图&#xff0c;编写代码通过软件方式…

使用stm32f103驱动lcd1602

1. 项目需求 使用上位机发送ASCII字符&#xff0c;在LCD1602上能够实时显示 2. 使用到的软件和硬件 野火指南者开发板 - LCD1602液晶屏 杜邦线DAP仿真器KEIL5 3. 连线说明 4. 代码 LCD驱动代码 头文件:#ifndef __LCD_H #define __LCD_H#include "stm32f10x.h"t…

Arduino—— SSD1306 OLED IIC

Zimo3InstallFULL.zip-电信其他资源-CSDN下载https://download.csdn.net/download/u012308586/12476953 这是下载链接&#xff0c;上传时CSDN自动设置5个积分&#xff0c;没有积分的话请私信我并留下邮箱&#xff0c;同时把这个地址也发给我 https://download.csdn.net/downloa…

STM32f103 驱动之I2C

目录 一、简介。 &#xff08;1&#xff09;数据有效性 &#xff08;2&#xff09;开始信号和结束信号 &#xff08;3&#xff09;应答信号 &#xff08;4&#xff09;传输时序 &#xff08;5&#xff09;字节写模式时序 &#xff08;6&#xff09;页写模式时序 &#xff…

STM32F103和DS1302时钟

STM32F103和DS1302时钟 DS1302模块讲解源文件演示源文件下载链接 最近在写了一些关于STM32F103C8T6对于模块的时候方面的代码的整合&#xff0c;想把之前用到的代码全部都整合成一个一个的例程来&#xff0c;以后要用直接拖进来改头文件的引脚口就好了。现在也开启第一章关于DS…

STM32利用I2C驱动SSD1306代码

前言&#xff1a; 之前购买了一款SSD1306驱动的0.96inchOLED显示屏幕&#xff0c;采用ESP8266使用u8g2库成功驱动。如今想自己摸索一下如何利用I2C驱动SSD1306. I2C协议 I2C开始 SCL为高电平期间&#xff0c;SDA由高到低 void IIC_START()//IIC_SCL高电平时候 IIC_SDA拉低 {I…

GD32E103/F303系列替换STM32F103

注&#xff1a;本文档仅针对GD32E103/F303系列替代STM32F103系列 版权&#xff1a;威尔健科技有限公司 联系方式&#xff1a;18816824119&#xff08;微信同号&#xff09; 本人&#xff1a;GD技术支持 明&#xff1a;GD32E103/GD32F10x/GD32F30x都是和STM32F10x系列是完全P…