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

在这里插入图片描述

  • 42
    点赞
  • 221
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学工科的皮皮志^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值