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

这篇具有很好参考价值的文章主要介绍了平衡小车学习教程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数据读取欧拉角,移植DMP读取Roll角、Pitch角、Yaw角,平衡小车,学习,单片机,stm32,MPU6050,小项目,c语言


2、引脚介绍

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

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

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

引脚 引脚介绍
VCC 3.3V/5V电源输入
GND 接地
SDA IIC通信数据线
SCL IIC通信时钟线
XDA IIC外接通信数据线
XCL IIC外接通信时钟线
AD0 IIC从机设置引脚(悬空或接GND时为0x68 / 接高电平为0x69)
INT MPU6050中断引脚

二、移植方法

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

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

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


1、什么是DMP

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

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

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

2、如何移植DMP


下载原子的百度网盘资料

正点原子MPU6050资料下载

  1. 首先点击上方链接,点进去之后把这个资料下载下来
    平衡小车学习教程2(软件篇)——MPU6050数据读取欧拉角,移植DMP读取Roll角、Pitch角、Yaw角,平衡小车,学习,单片机,stm32,MPU6050,小项目,c语言

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

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


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

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

这个文件夹里的MPU6050文件夹
平衡小车学习教程2(软件篇)——MPU6050数据读取欧拉角,移植DMP读取Roll角、Pitch角、Yaw角,平衡小车,学习,单片机,stm32,MPU6050,小项目,c语言

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

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

  1. 然后捏修改自己板子对应的引脚或者使用杜邦线来连接6050
  2. 然后Keil里项目文件如下图所示
    平衡小车学习教程2(软件篇)——MPU6050数据读取欧拉角,移植DMP读取Roll角、Pitch角、Yaw角,平衡小车,学习,单片机,stm32,MPU6050,小项目,c语言
    就是这四个文件,我们需要的就是这四个文件

3、移植注意事项

1、mpuiic.cmpuiic.h

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

找到

	void MPU_IIC_Init(void)

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

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

下方是源文件中的初始化

平衡小车学习教程2(软件篇)——MPU6050数据读取欧拉角,移植DMP读取Roll角、Pitch角、Yaw角,平衡小车,学习,单片机,stm32,MPU6050,小项目,c语言

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

引脚 对应GPIO
AD0 GND
INT PB5
SCL PB4
SDA PB3

平衡小车学习教程2(软件篇)——MPU6050数据读取欧拉角,移植DMP读取Roll角、Pitch角、Yaw角,平衡小车,学习,单片机,stm32,MPU6050,小项目,c语言

做出以下修改

// 初始化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呢?
平衡小车学习教程2(软件篇)——MPU6050数据读取欧拉角,移植DMP读取Roll角、Pitch角、Yaw角,平衡小车,学习,单片机,stm32,MPU6050,小项目,c语言
可以看引脚对应的功能,PB3和PB4是JTAG试端口,我们需要失能JTAG端口才可以把这两个IO当作GPIO使用


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

打开mpuiic.h文件

可以看到这里定义了很多宏定义,这是源程序
平衡小车学习教程2(软件篇)——MPU6050数据读取欧拉角,移植DMP读取Roll角、Pitch角、Yaw角,平衡小车,学习,单片机,stm32,MPU6050,小项目,c语言
第一个IO设置是啥意思呢?
我们知道IIC通信中,SDA是数据线,肯定是有输入和输出的,这里的IO方向设置,就是设置SDA的输入模式和输出模式,大家可以看库函数手册,如下图,这是对应的引脚数高八位的端口的寄存器 端口配置高寄存器(GPIOx_CRH) (x=A..E)
平衡小车学习教程2(软件篇)——MPU6050数据读取欧拉角,移植DMP读取Roll角、Pitch角、Yaw角,平衡小车,学习,单片机,stm32,MPU6050,小项目,c语言
平衡小车学习教程2(软件篇)——MPU6050数据读取欧拉角,移植DMP读取Roll角、Pitch角、Yaw角,平衡小车,学习,单片机,stm32,MPU6050,小项目,c语言
我们先根据源程序,分析一下,首先他使用的是
SCL-->PC12
SDA-->PC11
IO方向,就是对端口的寄存器进行操作,所以

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

这一句前面就是重新清零PC11的端口模式位,后面就是再把PC11的端口寄存器的第15-12位设置为1000
平衡小车学习教程2(软件篇)——MPU6050数据读取欧拉角,移植DMP读取Roll角、Pitch角、Yaw角,平衡小车,学习,单片机,stm32,MPU6050,小项目,c语言
这个图好理解了叭,总结能力满分

我们做出以下修改

#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初始化成功!

然后使用串口查看数据

可以看到,读取数据成功,三个角都成功的被读取,我们的目的实现
平衡小车学习教程2(软件篇)——MPU6050数据读取欧拉角,移植DMP读取Roll角、Pitch角、Yaw角,平衡小车,学习,单片机,stm32,MPU6050,小项目,c语言


四、Roll、Pitch、Yaw角的区分

1、手动旋转MPU6050进行区分

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

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

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

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

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

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


2023-7-31更新

实现VOFA+,控件直观显示陀螺仪姿态
平衡小车学习教程2(软件篇)——MPU6050数据读取欧拉角,移植DMP读取Roll角、Pitch角、Yaw角,平衡小车,学习,单片机,stm32,MPU6050,小项目,c语言
平衡小车学习教程2(软件篇)——MPU6050数据读取欧拉角,移植DMP读取Roll角、Pitch角、Yaw角,平衡小车,学习,单片机,stm32,MPU6050,小项目,c语言

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

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

平衡小车学习教程2(软件篇)——MPU6050数据读取欧拉角,移植DMP读取Roll角、Pitch角、Yaw角,平衡小车,学习,单片机,stm32,MPU6050,小项目,c语言

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

平衡小车学习教程2(软件篇)——MPU6050数据读取欧拉角,移植DMP读取Roll角、Pitch角、Yaw角,平衡小车,学习,单片机,stm32,MPU6050,小项目,c语言

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

这样就很直观啦

绿色的就是Z轴,Yaw角

平衡小车学习教程2(软件篇)——MPU6050数据读取欧拉角,移植DMP读取Roll角、Pitch角、Yaw角,平衡小车,学习,单片机,stm32,MPU6050,小项目,c语言

3、参考理解

什么是欧拉角/姿态角?
平衡小车学习教程2(软件篇)——MPU6050数据读取欧拉角,移植DMP读取Roll角、Pitch角、Yaw角,平衡小车,学习,单片机,stm32,MPU6050,小项目,c语言


五、总结

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

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

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

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

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

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


2023-7-31更新

实现VOFA+,控件直观显示陀螺仪姿态文章来源地址https://www.toymoban.com/news/detail-554973.html

到了这里,关于平衡小车学习教程2(软件篇)——MPU6050数据读取欧拉角,移植DMP读取Roll角、Pitch角、Yaw角的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32学习】——I2C通信协议&MPU6050姿态传感器&软件I2C读写MPU6050

    ​   目录 前言 一、I2C通信协议 1.简介 2.硬件电路设计 3.I2C时序(软件)

    2024年02月16日
    浏览(22)
  • 【STM32】STM32学习笔记-软件I2C读写MPU6050(33)

    I2C(Inter-Integrated Circuit)总线 是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。 串行的 8 位双向数据传输位速率在标准模式下可

    2024年01月21日
    浏览(20)
  • 【机器人学习】MPU6050数据的换算

    由于近期在搞IMU的姿态解算,需要用一个IMU传感器去进行角度的获取,因此采用了最实惠的MPU6050!通过IIC读取MPU6050后的数据只是简单的数值,并没有物理意义,因此本文主要记录下如何将MPU6050的数据换算成有意义的物理值。 要得到MPU6050的具体参数,那必须是官方的datashe

    2024年02月14日
    浏览(18)
  • 一起玩儿物联网人工智能小车(ESP32)——71 姿态传感器MPU6050的使用方法

    摘要:本文介绍姿态传感器MPU6050的使用方法 姿态传感器是一种用于测量物体姿态的传感器,它可以检测物体的加速度和角速度,并计算出物体的方向和角度。前边介绍的RPI-1031只能定性的得到物体的倾斜情况,而姿态传感器则可以定量的得到物体倾斜的方向和角度。 MPU6050是

    2024年04月28日
    浏览(16)
  • STM32 软件IIC配置(MPU6050演示)

    IIC说明: IIC是一种通信协议,IIC 总线是一种用于IC器件之间连接的二线制总线,有主机和从机,二者可以互相通信,可以一主多从也可以多主多从,有时钟线(SCL)和数据线(SDA),SDA线既可以被主机控制也可以被从机控制,但SCL线只能由主机控制。 软件IIC配置: 总体操作

    2024年02月07日
    浏览(20)
  • 【无人机/平衡车/机器人】详解STM32+MPU6050姿态解算—卡尔曼滤波+四元数法+互补滤波(文末附3个算法源码)

     效果: MPU6050姿态解算-卡尔曼滤波+四元数+互补滤波 目录 基础知识详解 欧拉角

    2024年04月14日
    浏览(43)
  • 【stm32】软件I2C读写MPU6050

    概况 首先建立通信层的.c和.h模块 在通信层里写好I2C底层的GPIO初始化 以及6个时序基本单元 起始、终值、发送一个字节、接收一个字节、发送应答、接收应答 写好I2C通信层之后,再建立MPU6050的.c和.h模块 基于I2C通信的模块,来实现指定地址读、指定地址写 再实现写寄存器对

    2024年04月26日
    浏览(22)
  • STM32软件I2C驱动MPU6050

    这里没有什么复杂的地方,采用MPU6050的现成模块.模块的SCL接B10,SDA接B11,这里连接了一个OLED显示屏,用于显示获取到的数据. 注意:这里使用的模块自带上拉电阻 首先在工程目录里创建: \\\"MyI2C.h\\\"和\\\"MyI2C.c\\\"文件,用于软件驱动I2C. \\\"MPU6050.h\\\",\\\"MPU6050.c\\\"和\\\"MPU6050Reg.h\\\"文件,用于MPU6050的驱动. 在

    2024年02月15日
    浏览(18)
  • 模块学习(二)——MPU6050

    去年电赛备赛期间,学的STM32标准库,那一整个繁琐直接给我劝退了,当时学习MPU6050时就非常痛苦,代码也看不懂,无非抄来抄去,然后就是编译,改错,编译无穷尽也。最近参考野火的MPU6050代码,将其移植到了MSP430f5529之上,今天分享出来。 1.重要性 MPU6050模块对于不论平

    2024年02月16日
    浏览(20)
  • 学习记录之STM32F103C8T6最小系统板驱动MPU6050串口打印数据

    1.使用到的工具介绍 2.MPU6050和整体和简单介绍 3.程序的介绍 1.使用到的工具介绍 硬件方面:STM32F103C8T6最小系统板核心板,MPU6050模块三维角度传感器,经典的CH340烧写和串口作用,和若干个杜邦线。 软件方面:keil5编写程序软件,烧写软件FlyMcu.exe烧写工具,sscom.exe串口调试工

    2023年04月09日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包