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

news2024/11/28 8:35:12

前言

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

平衡小车学习教程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轴)

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

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

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


五、总结

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/759472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

卖家如何做好独立站?这些要点要牢记!

随着跨境电商第三方平台的竞争压力越来越大&#xff0c;以及平台流量红利期迎来大幅缩水&#xff0c;使得越来越多的跨境卖家开始另寻出路&#xff0c;建设自己的品牌。而独立站的优势特点&#xff0c;在当下的市场竞争环境中优势更为突出&#xff0c;这也使得众多卖家涌入独立…

05-MySQL-基础篇-SQL之DQL语句

SQL之DQL语句 前言DQL准备数据基础语法基本查询条件查询集合函数分组查询排序查询分页查询执行顺序 前言 本篇来学习下SQL中的DQL语句 DQL 英文全称是Data Query Language(数据查询语言)&#xff0c;数据查询语言&#xff0c;用来查询数据库中表的记录。 准备数据 # 删除表…

Spring框架概述及核心设计思想

文章目录 一. Spring框架概述1. 什么是Spring框架2. 为什么要学习框架&#xff1f;3. Spring框架学习的难点 二. Spring核心设计思想1. 容器是什么&#xff1f;2. IoC是什么&#xff1f;3. Spring是IoC容器4. DI&#xff08;依赖注入&#xff09; 一. Spring框架概述 1. 什么是…

芜湖,埋点还可以这么做?这也太简单了

目录 前言 一个埋点的Demo 安装依赖 添加测试代码 编写入口文件 编写插件 运行Demo 处理_tracker的import 改进 给其他的函数类型添加埋点 处理埋点函数变量名 总结&#xff1a; 前言 在项目开发中通常会有埋点的需求&#xff0c;然而当项目过于庞大&#xff0c;给…

聚焦型光场相机基于立体视差的深度估计原理

聚焦型光场相机可以看作是主透镜将物面成了一个放大或者缩小的虚像&#xff0c;然后每个微透镜阵列对这个经过放大或者缩小的虚像进行二次成像后投影在了ccd平面&#xff0c;其中二次成像的过程可以比拟为一个虚拟阵列相机&#xff0c;利用MLA和主透镜的相关参数就可以以立体视…

Java开发基础系列(三):数据操作

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; Java开发基础系列(三):数据操作 ⏱️ 创作时间&#xff1a; 2023年07月…

Java线程池实现原理

随着计算机行业的飞速发展&#xff0c;摩尔定律逐渐失效&#xff0c;多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池&#xff1a;ThreadPoolExecutor类&#xff0c;帮助开发人员管理线程并方便地执行并行任务。了解并合理使…

x86架构ubuntu22下运行3DS模拟器Citra

0. 环境 i5 ubuntu22&#xff08;安装系统时候选择 自动上网下载第三方驱动软件&#xff0c;主要是显卡驱动opengl&#xff09; 1. apt安装依赖 1.1 SDL2 sudo apt install libsdl2-dev 1.2 OpenSSL (optional) sudo apt install libssl-dev 1.3 Qt 6.2 sudo apt install …

零基础学Python-必备工具安装

文章目录 1. Python 安装与卸载Python 安装包下载安装Python如何验证Python 安装成功扩展 电脑中其实可以装多个不同版本的python 卸载Python 2. Python 开发有哪些常用的IDEPyCharm 安装PyCharm 安装包下载安装PyCharm PyCharm 使用VScode 安装VScode 安装包下载安装VScodeVsc…

libbpf-bootstrap开发指南:网络包监测-tc

目录 前置知识 代码分析 BPF部分 功能说明 struct __sk_buff 说明 bpf_htons & bpf_ntohs 为什么有l2 1、l31 data 数据的排布 用户部分 功能说明 DECLARE_LIBBPF_OPTS 执行效果 前置知识 IP数据包的总长度指的是整个IP数据包的长度&#xff0c;包括IP头部和…

React(2)

题外话&#xff1a;vscode有个插件可以很方便的快速写代码 输入rcc回车 1.组件嵌套 import React, { Component } from reactclass Navbar extends Component{render(){return <div>Navbar</div>} }const Swiper()>{return <div>Swiper</div> }cons…

学习babylon.js --- [2] 项目工程搭建

本文讲述如何搭建babylonjs的项目工程。 一 准备 首先创建一个目录叫MyProject&#xff0c;然后在这个目录里再创建三个目录&#xff1a;dist&#xff0c;public和src&#xff0c;如下&#xff0c; 接着在src目录里添加一个文件叫app.ts&#xff0c;本文使用typescript&#…

论文笔记--PTR: Prompt Tuning with Rules for Text Classification

论文笔记--PTR: Prompt Tuning with Rules for Text Classification 1. 文章简介2. 文章概括3 文章重点技术3.1 Pre-training & Fine-tuning & Prompt-based Fine Tuning3.2 PTR(Prompt Tuning with Rules)3.3 task decomposition3.4 Sub-prompts composition3.5 多个l…

平衡二叉搜索树--AVL详解剖析

目录 一、什么是AVL树 二、AVL树的作用 三、树节点的定义 四、节点的插入 五、旋转 1.左单旋 2.右单旋 左右双旋代码 &#xff1a; 4.右左双旋 一、什么是AVL树 AVL树就是二叉搜索树的进一步的优化&#xff0c;二叉搜索树虽可以缩短查找的效率&#xff0c;但是当数据有…

SDN系统方法 | 1. 概述

随着互联网和数据中心流量的爆炸式增长&#xff0c;SDN已经逐步取代静态路由交换设备成为构建网络的主流方式&#xff0c;本系列是免费电子书《Software-Defined Networks: A Systems Approach》的中文版&#xff0c;完整介绍了SDN的概念、原理、架构和实现方式。原文: Softwar…

SpringFactoriesLoader解析

一、SpringFactoriesLoader 介绍 1.1 SpringFactoriesLoader 简介 SpringFactoriesLoader 工厂加载机制是 Spring 内部提供的一个约定俗成的加载方式&#xff0c;与 java spi 类似&#xff0c;只需要在模块的 META-INF/spring.factories 文件中&#xff0c;以 Properties 类型…

DOT slam论文翻译

DOT:视觉SLAM的动态目标跟踪 摘要 - 在本文中&#xff0c;我们提出了DOT(动态目标跟踪)&#xff0c;这是一个添加到现有SLAM系统中的前端&#xff0c;可以显着提高其在高动态环境中的鲁棒性和准确性。DOT结合实例分割和多视图几何来生成动态对象的掩模&#xff0c;以允许基于刚…

实现 Rollup 插件alias 并使用单元测试提高开发效率

本篇文章是对 实现 Rollup 插件 alias | 使用 TypeScript 实现库的基本流程 | 使用单元测试提高开发效率 的总结。其中涉及到开发一个组件库的诸多知识点。 实现一个经常用的 rollup 插件 alias 首先执行npm init命令初始化一个package.json文件&#xff0c;因为插件使用了ty…

DevOps系列文章之Argo CD 使用

一、什么是 argo cd Argo CD 是用于 Kubernetes 的声明性 GitOps 连续交付工具。 二、为什么使用 argo cd Argo CD 可在指定的目标环境中自动部署所需的应用程序状态&#xff0c;应用程序部署可以在 Git 提交时跟踪对分支&#xff0c;标签的更新&#xff0c;或固定到清单的特…

测试开发之路 ---- 可读性,可维护性,可扩展性

目录 前言 测试框架与测试脚本的目标&#xff08;部分&#xff09; 分层 使用类似 xml 这种可扩展性强的语义存储数据 代码复用&#xff1a;抽象一切可抽象的&#xff0c;减少一切可能的代码相似与重复 活用 java 注解和反射&#xff08;python 中应该也有相关的机制&…