文章目录[隐藏]
前言
今天来学习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
暂无评论