目录
一、MPU6050简介
1. 引脚介绍
2. 寻找SCL、SDA接口
3. 工作原理
编辑
二、MPU6050实现
1. STM32开发板接线
2. DMP移植
A. 新建STM32CubeMX工程
B. 移植DMP
C. 调用API
D. 修改报错
3. 实现结果
只需要接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功能的引脚
1. 最快捷的方法就是以你的板子型号,去STM32CubeMX里面设置Connectivity的I2C1 / I2C2,去看他亮起的绿色引脚显示。
2. 看开发板的原理图。
(1)MPU6050是InvenSense公司推出的全球首款整合性6轴运动处理组件,内带3轴陀螺仪和3轴加速度传感器,并且含有一个第二IIC接口,可用于连接外部磁力传感器,利用自带数字运动处理器(DMP: Digital Motion Processor)硬件加速引擎,通过主IIC接口,可以向应用端输出完整的9轴姿态融合演算数据。有了DMP,我们可以使用InvenSense公司提供的运动处理资料库,非常方便的实现姿态解算,降低了运动处理运算对操作系统的负荷,同时大大降低了开发难度 。
三轴加速器是检测横向加速的,三轴陀螺仪是检测角度旋转和平衡的
x轴向前,y轴在机器人左边,z轴向上
(2)获得数据(我只需要加速度,所以只提供加速度的处理)
单位为
(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 由低电平向高电平跳变,结束传送数据。
DMP:InvenSense 提供了一个 MPU6050 的嵌入式运动驱动库,结合 MPU6050 的 DMP,可以将我们的原始数据,直接转换成四元数输出,而得到四元数之后,就可以很方便的计算出欧拉角,从而得到 yaw、roll 和 pitch。
(1)选择芯片型号
(2)SYS
(3)RCC
(4)I2C2
(5)设置串口
(6)时钟树
(7)生成代码
(1)在生成的项目中新建文件夹: Hardware
(2)下载MPU6050配置文件并复制在Hardware里面
MPU6050-DMP移植https://download.csdn.net/download/northern_light_/87813248
(3)
(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 */
(6)在usart.h加入printf的库
#include
(1)在main.c的用户环境包含内添加使用到的头文件
#include
#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"
(2)在用户变量代码段添加如下变量,用于存放MPU6050的各项数据;
float pitch,roll,yaw; //欧拉角
short aacx,aacy,aacz; //加速度传感器原始数据
short gyrox,gyroy,gyroz; //陀螺仪原始数据
short temp; //温度
(3)用户初始代码段2插入6050和dmp初始化代码
while(MPU_Init()); //初始化MPU6050
printf("%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!");
(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);
我们设置的是I2C2但是配置文件是I2C1,所以报错,将hi2c1全部替换为hi2c2
因为我们设置了串口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