平衡小车学习教程2(软件篇)——MPU6050数据读取欧拉角,移植DMP读取Roll角、Pitch角、Yaw角

前言

上一篇,给大家介绍了平衡小车的硬件资源及其小车底层硬件介绍篇

平衡小车学习教程1——硬件资源及其小车底层硬件介绍篇

这篇来教大家如何快速的使用MPU6050自带的DMP库读取陀螺仪数据,读取翻滚角(Roll)、俯仰角(Pitch)、航向角(Yaw)这三个角的数据。

而我们平衡小车的直立环就是通过读取Roll角的数据

根据Roll角的变化,通过PID算法,得到实际值和期望值,从而得到所计算出的值传递给PWM。从而使小车达到直立状态。

所以,如何使用单片机读取陀螺仪的数据就是一个非常重要的点

本篇文章的教程采用的是STM32单片机,读取这三个角


一、认识MPU6050


1、基础认识

MPU6050,一般是下面这个小模块,通常来说,分为6脚和8脚的,6脚和8脚的区别就是8脚的有一个XDA和一个XCL接口,这两个接口可以外接磁力计。下图就是8脚的MPU6050。
在这里插入图片描述


2、引脚介绍

由于MPU6050是IIC通信的,所以要使用IIC通信初始化MPU6050,读取其内部的寄存器,从而获取小车的实时状态。

所以其重要的两个引脚就是SCL引脚和SDA引脚

此外,MPU6050还有一个中断引脚INT,可以配置寄存器,让其产生中断,读取陀螺仪数据可放在中断内部进行。

引脚引脚介绍
VCC3.3V/5V电源输入
GND接地
SDAIIC通信数据线
SCLIIC通信时钟线
XDAIIC外接通信数据线
XCLIIC外接通信时钟线
AD0IIC从机设置引脚(悬空或接GND时为0x68 / 接高电平为0x69)
INTMPU6050中断引脚

二、移植方法

在这里不深究MPU6050的内部寄存器的原理,这里其实我也没弄明白

大家可以先从实操出发,首先知道如何快速使用,其实太过深究其内部原理也没太大意义,后面想深入研究也是没问题的。

所以这里我将会带着大家一步一步的如何快速移植MPU6050其内部自带的DMP库,如何使用自带的数字运动处理器(DMP库)读取完整的 6轴或9 轴姿态融合演算数据。


1、什么是DMP

我们可以通过IIC通信读取MPU6050其内部的寄存器,从而得到加速度传感器数据或者角速度传感器数据

但是我们做平衡小车,不是要这六个数据,而是欧拉角,即Roll、Pitch、Yaw角这三个角度

要得到欧拉角,其实要进行姿态解算,自己来姿态解算有点困难,但是使用DMP就不一样了,使用DMP,可以将原始数据直接转换为四元数输出,得到四元数之后,就可以很方便的计算出欧拉角,从而得到Roll、Pitch、Yaw角。

2、如何移植DMP


下载原子的百度网盘资料

正点原子MPU6050资料下载

  1. 首先点击上方链接,点进去之后把这个资料下载下来
    在这里插入图片描述

  2. 然后下载下来捏 旧资料–>程序源码–>随便选一个压缩包文件解压

我这里选择(库函数版本,适合MiniSTM32开发板)扩展实验16 ATK-MPU6050六轴传感器实验


移植对应文件添加进我们自己的工程当中
  1. 这个工程里,我们需要的就是啥捏,需要的就只是

六轴传感器模块ATK-MPU6050资料(旧资料)\2,程序源码\移植\(库函数版本,适合MiniSTM32开发板)扩展实验16 ATK-MPU6050六轴传感器实验\HARDWARE

这个文件夹里的MPU6050文件夹
在这里插入图片描述

  1. 复制这整个文件到自己的工程文件夹里,然后在Keil里添加相应的文件,如何在keil里添加对应文件我就不多说了

然后,大家可以看见,最终我们需要的文件就是mpuiic.cmpu6050.cinv_mpu.cinv_mpu_dmp_motion_driver.c,将这四个文件添加进Keil里的驱动文件中,最终效果如下图

  1. 然后捏修改自己板子对应的引脚或者使用杜邦线来连接6050
  2. 然后Keil里项目文件如下图所示
    在这里插入图片描述
    就是这四个文件,我们需要的就是这四个文件

3、移植注意事项

1、mpuiic.cmpuiic.h

第一个要注意的地方,修改初始化引脚

找到

	void MPU_IIC_Init(void)

可以看到这是MPU6050对应的SCL和SDA的初始化引脚,MPU6050是使用IIC通信来获得欧拉角的

所以我们要对这个IO进行修改

下方是源文件中的初始化

在这里插入图片描述

我们根据PCB中引出的GPIO,进行修改,由于我们板载引脚是

引脚对应GPIO
AD0GND
INTPB5
SCLPB4
SDAPB3

在这里插入图片描述

做出以下修改

// 初始化IIC  SCL PB4	SDA PB3
void MPU_IIC_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 先使能外设IO PORTC时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  // 使能AFIO 复用时钟
	
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // 失能JTAG调试端口  这样PB3 pB4 就是作为一个普通的IO口使用

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4; // 端口配置
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	   // 推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	   // IO口速度为50MHz
	GPIO_Init(GPIOB, &GPIO_InitStructure);				   // 根据设定参数初始化GPIO

	GPIO_SetBits(GPIOB, GPIO_Pin_3 | GPIO_Pin_4); // PB3 PB4 输出高
}

至于为什么在初始化的过程中会失能JTAG呢?
在这里插入图片描述
可以看引脚对应的功能,PB3和PB4是JTAG试端口,我们需要失能JTAG端口才可以把这两个IO当作GPIO使用


第二个要注意的地方,修改SCL和SDA的宏定义

打开mpuiic.h文件

可以看到这里定义了很多宏定义,这是源程序
在这里插入图片描述
第一个IO设置是啥意思呢?
我们知道IIC通信中,SDA是数据线,肯定是有输入和输出的,这里的IO方向设置,就是设置SDA的输入模式和输出模式,大家可以看库函数手册,如下图,这是对应的引脚数高八位的端口的寄存器 端口配置高寄存器(GPIOx_CRH) (x=A..E)
在这里插入图片描述
在这里插入图片描述
我们先根据源程序,分析一下,首先他使用的是
SCL-->PC12
SDA-->PC11
IO方向,就是对端口的寄存器进行操作,所以

#define MPU_SDA_IN()  {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}

这一句前面就是重新清零PC11的端口模式位,后面就是再把PC11的端口寄存器的第15-12位设置为1000
在这里插入图片描述
这个图好理解了叭,总结能力满分

我们做出以下修改

#define MPU_SDA_IN()              \
    {                             \
        GPIOB->CRL &= 0XFFFF0FFF; \
        GPIOB->CRL |= 8 << 12;    \
    }
#define MPU_SDA_OUT()             \
    {                             \
        GPIOB->CRL &= 0XFFFF0FFF; \
        GPIOB->CRL |= 3 << 12;    \
    }

// IO操作函数
#define MPU_IIC_SCL PBout(4) // SCL
#define MPU_IIC_SDA PBout(3) // SDA
#define MPU_READ_SDA PBin(3) // 输入SDA
2、查看一下,自己移植的正点原子的代码,有没有用到INT引脚

如果用到了INT引脚,一般是中断读取欧拉角,肯定初始化了IO,把那部分去掉,我们并没有使用到INT引脚(使用的是主程序中循环读取)

他初始化的IO可能会导致程序错误

所以还请注释掉,保证后面操作的正确性


4.在主程序中初始化MPU6050

1、在主程序中初始化MPU6050
    delay_ms(500); // 延时0.5s 使MPU6050初始化稳定
	MPU_Init();    // 初始化MPU6050
	mpu_dmp_init();

2、在主程序中不断获取DMP处理后的数据
  while( mpu_dmp_get_data(&pitch, &roll, &yaw)!=0 ){}//返回值:0,正常	//    其他,失败1
  u1_printf("\n\r pitch=%0.2f roll=%0.2f yaw=%0.2f \n\r", pitch, roll, yaw);

3、连接串口查看角度变化

一般要等个几秒钟,等待MPU6050初始化成功!

然后使用串口查看数据

可以看到,读取数据成功,三个角都成功的被读取,我们的目的实现
在这里插入图片描述


四、Roll、Pitch、Yaw角的区分

1、手动旋转MPU6050进行区分

这个呢,大家可以根据自己读取到的角度进行区分,把MPU6050进行旋转,查看角度的变化

左右就是偏航角(沿X轴)
上下就是俯仰角(沿Z轴)
左侧右侧偏就是翻滚角(沿Y轴)

这里有点不准确,不同的参考系下对这三个角的定义不同,大家可以使用
VOFA+,直观查看这三个角的区别,并且查看第三点,参考理解

大家可以去找大佬讲的,网上有很多资料的

2、使用vofa+控件进行区分(已实现)

本来想用vofa+,来直观的显示一下角度的变换的,可是没搞出来,这个控件不知道咋玩,等啥时候弄出来了补上


2023-7-31更新

实现VOFA+,控件直观显示陀螺仪姿态
在这里插入图片描述
在这里插入图片描述

1、选择相应协议,使用串口回传三个角数据

可以选择,三个协议中的任何一个,这里使用FireWater

在这里插入图片描述

2、选择欧拉角模式,将三个角模式和X、Y、Z轴绑定

在这里插入图片描述

3、旋转陀螺仪,查看角度变化

这样就很直观啦

绿色的就是Z轴,Yaw角

在这里插入图片描述

3、参考理解

什么是欧拉角/姿态角?
在这里插入图片描述


五、总结

这一篇主要是软件篇,教大家如何移植并且读取到MPU6050的数据,毕竟平衡小车的所有都是基于角度来实现直立的,这是软件篇的第一步。

大家在学会这个之后,就可以快速移植官方文件,得到自己想要的功能

文章还是有很多没有讲的很清楚的地方,我也是粗略的将移植步骤交给大家,有一些原理还是不够深入

希望大家,还是要先了解原理,再深入,再做项目,在项目中二次深入理解

好啦,下一节将会给大家带来
小车的底层驱动的软件篇——小车底层驱动(电机、编码器)

大家可以再次期待一下下,嘿嘿,加油加油!


2023-7-31更新

实现VOFA+,控件直观显示陀螺仪姿态

  • 51
    点赞
  • 429
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
### 回答1: MPU6050是一种常见的三轴陀螺仪和三轴加速度计传感器,DMP(数字运动处理器)是其内部的处理单元,可用于读取和处理MPU6050数据。 要利用DMP读取MPU6050的四元数和pitchrollyaw(俯仰、横滚和偏航),可以按照以下步骤进行: 1. 初始化MPU6050DMP:首先,需要连接MPU6050传感器到微控制器或单片机上,并通过相应的接口初始化MPU6050DMP。这可以通过使用合适的库或驱动程序来实现。 2. 启用DMP功能:通过在代码中调用相应的功能函数或设置相应的参数,启用DMP功能。这将使DMP开始读取和处理MPU6050的原始数据。 3. 获取四元数数据:使用MPU6050DMP功能,可以通过调用相应的函数或方法来获取当前的四元数数据。四元数表示空间中物体的旋转姿态,可以通过计算来得到。将四元数的四个分量(通常是w、x、y、z)保存在适当的变量中。 4. 计算俯仰、横滚和偏航:根据得到的四元数数据,可以通过相应的计算公式计算出俯仰、横滚和偏航。具体的计算方法可以在MPU6050的文档或相关资料中找到。这些度表示物体相对于参考坐标系的旋转姿态。 5. 数据处理和应用:根据需要,可以进一步处理或应用这些数据。例如,可以将这些数据用于自动平衡机器人或其他姿态控制应用中。 总结起来,要利用DMP读取MPU6050的四元数和俯仰、横滚和偏航,需要初始化MPU6050DMP,并通过调用相应的函数获取数据,然后根据计算公式得到所需的度信息。这些数据可以用于各种姿态控制和导航应用中。 ### 回答2: MPU6050是一种常用的六轴惯性测量单元,可以通过数字运动处理器(DMP读取四元数(四维向量)和姿态pitchrollyaw)。MPU6050的四元数提供了物体在三维空间中的旋转姿态信息,通过四元数可以计算出姿态。为了读取MPU6050的四元数和姿态,可以按照以下步骤进行操作: 1. 连接MPU6050模块:将MPU6050模块的SDA和SCL引脚分别连接到微控制器(例如Arduino)的对应引脚,同时连接模块的VCC和GND引脚到电源。 2. 初始化I2C通信:使用微控制器上的I2C库函数初始化I2C通信,设置MPU6050的I2C地址和传输速率。 3. 设置MPU6050DMP功能:使用MPU6050库函数设置MPU6050DMP功能,使其可以自动计算四元数和姿态。 4. 读取四元数值:使用MPU6050库函数读取MPU6050模块的四元数值,存储到相应的变量中。 5. 计算姿态:根据四元数的值,使用相关的数学公式计算出姿态,例如使用欧拉角pitchrollyaw)或其他旋转矩阵的方法。 6. 输出数据:将计算得到的四元数和姿态值输出到需要的地方,例如通过串口发送给计算机进行显示或保存。 需要注意的是,读取MPU6050的四元数和姿态的准确性和平滑度取决于DMP的配置和采样率,以及硬件设备的准确性。在实际应用中,可能需要根据具体情况进行一些调试和优化,以获得更精确和稳定的姿态数据

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值