STM32CubeMX(05) 移植陀螺仪MPU6050的DMP库读取三轴角度,加速度

在这里插入图片描述


前言

今天来学习mpu6050这款陀螺仪,并用MPU6050的DMP库来读取三轴角度,加速度,什么是DMP库,就是自带数字运动处理(DMP: Digital Motion Processing)引擎可减少 MCU 复杂的融合演算数据、感测器同步化、姿势感应等的负荷。也就是说什么时序和函数都封装好了,你只要调用就好了。懒人福音。只要我们在cubeMX初始化好IIC的引脚就好了。

硬件条件:STM32F407ZGT6,USB转TTL,mpu6050模块
软件条件:STM32CubeMX,keil5

一、MPU6050是什么?

MPU6050是一款性价比很高的陀螺仪,可以读取X Y Z 三轴角度,X Y Z 三轴加速度,还有内置的温度传感器,在姿态解析方面应用非常广泛。
某宝上的卖的也非常多。介绍也是很全面,我这里就不介绍了。
在这里插入图片描述

二、STM32CubeMX配置

由于我们用的是串口打印调试信息,所以我们接上一篇文章串口中断实验
的基础上继续配置。我们打开我们的cubeMX工程
在这里插入图片描述

2.1.IIC配置

在这里插入图片描述

2.2.开启中断

同时看cubeMX上的引脚配置和实际原理图是否一致。同时使能IIC的中断
在这里插入图片描述
在这里插入图片描述

串口在上一节已经重复过了,这里啥也不变。

2.3 硬件连接

由于采用IIC通信,最基本的只需要采用四根线就可以了。分别VCC,GND,SCL,SDA
连接到单片机
即SCL-----PB6
SDA-----PB7
VCC接3V或者5V都行。
在这里插入图片描述
在这里插入图片描述

2.4 软件编写

参考博文:jackxu
上述配置完后,生成工程。
由于需要用到printf函数,所以需要在usatr.c函数中添加重定向函数。

//printf重定向代码,修改其底层fputc
#if 1
#include <stdio.h>

/* 告知连接器不从C库链接使用半主机的函数 */
#pragma import(__use_no_semihosting)

/* 定义 _sys_exit() 以避免使用半主机模式 */
void _sys_exit(int x)
{
    x = x;
}

/* 标准库需要的支持类型 */
struct __FILE
{
    int handle;
};

FILE __stdout;

/*  */
int fputc(int ch, FILE *stream)
{
    /* 堵塞判断串口是否发送完成 */
	/* 不同芯片的串口标志位不一定相同! */
    while((USART1->SR & 0X40) == 0);

    /* 串口发送完成,将该字符发送 */
    USART1->DR = (uint8_t) ch;

    return ch;
}

#endif

添加位置
在这里插入图片描述

三、导入DMP库

进入CubeMX生成的代码工程,在工程文件夹下新建一个Hardware文件夹
老经典了,在学标准库的时候
在这里插入图片描述
下载jackxu博主的驱动代码,0积分的
下载DMP库的驱动代码
下载好后解压放到我们刚才的文件夹里面
在这里插入图片描述

3.1 keil配置

点击我们这个品字,这个方块,把mpu6050文件夹里面.c文件添加进来。
在这里插入图片描述
在这里插入图片描述

3.2 添加头文件路径

点击我们的魔术棒,C++,选择路径。
在这里插入图片描述
在这里插入图片描述

3.3 添加头文件

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#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" 

/* USER CODE END Includes */

插入位置
在这里插入图片描述
添加用户变量

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


/* USER CODE END PV */

插入位置
在这里插入图片描述

3.4 添加初始化代码

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

添加位置
在这里插入图片描述

3.5 主循环添加代码

调用我们的函数

/* USER CODE BEGIN 3 */

    
    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);

    
  }
  /* USER CODE END 3 */

插入位置
在这里插入图片描述
到这里就结束了,我们可以烧录程序到单片机观察现象了。

四、测试结果

硬件连接好
然后打开串口调试助手就可以看到传感器传回来的数据了,然后摇一摇,晃一晃我们的传感器,就可以发现我们传感器发生变化了。
在这里插入图片描述

在这里插入图片描述

总结

参考博文1:STM32CubeMX移植MPU6050的DMP库读取角度信息
参考博文2 : MPU6050学习
可能会出现的问题,就是u8 u16 可能未定义
那我们就自己定义成一个头文件就行了,一个common.h

#ifndef __COMMON_H
#define __COMMON_H	


typedef   signed          char int8_t;
typedef   signed short     int int16_t;
typedef   signed           int int32_t;
typedef   signed       __int64 int64_t;
typedef unsigned          char uint8_t;
typedef unsigned short     int uint16_t;
typedef unsigned           int uint32_t;
typedef unsigned       __int64 uint64_t;


typedef uint32_t  u32;
typedef uint16_t u16;
typedef uint8_t  u8;


#endif

在这里插入图片描述

版权声明:本文为CSDN博主「学工科的皮皮志^_^」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_45138815/article/details/119513199

生成海报
点赞 0

学工科的皮皮志^_^

我还没有学会写个人说明!

暂无评论

相关推荐

STM32基于HAL库的DS18B20实现

开发板:野火挑战者_V2 GPIO:PE2 创建工程 使能USART1 用来通过串口打印温度值 配置GPIO 代码编写 我们先打开 DS18B20 的手册 1、DS18B20 复位与存在脉冲 复位 /*