上一节我们使I2C总线获取了MPU6050的三轴加速度、三轴角速度,并且介绍了一种简单的初始状态校准方法;这一节我们继续,在已有的底层驱动基础上,移植MPU6050芯片官方的DMP库,来获取角度信息。

1)姿态角计算的一些基础知识

在上一节中,我们初始化时约定了Z轴向上,也即知道了初始的角度;再加上后续获取的实时的角速度,利用角速度进行积分,就可以获取姿态角信息。

在实际编程实现时,积分就是累加和,随着时间的增加,积分(累加)的数据越来越多,误差也会越来越大。因此,单独使用陀螺仪的角速度去计算得到姿态角是不行的,误差会越来越大,需要使用加速度计的值来修正。

为什么加速度计的值可以来修正角度呢?我们知道,加速度计能测到重力加速度的方向,只要飞行器的运动不算太剧烈,就能近似地认为在一段时间里,加速度计的测量值只有重力,而且姿态角的变化只转过了很小的一个角。

我们仍以下图为例,假定初始时Z轴向上,绕X轴旋转的角度为滚转角;绕Y轴旋转的角度为俯仰角,绕Z轴旋转的角度为偏航角。

那么,滚转角(绕X轴转)和俯仰角(绕Y轴转)发生变化时,MPU6050测出来的重力加速度g的方向也会发送变化。而加速度计测出来的重力加速度g的方向是实时的,不会受长时间计算累加的影响。所以,我们可以用加速度计测到的g的方向,来修正陀螺仪积分得到的滚转角和俯仰角。

而偏航角(绕Z轴转)变化时,MPU6050测到的重力加速度g方向是不会变化的,所以g的方向不能用来修正偏航角。要想修正偏航角,需要测量地磁偏角的传感器信息。

这个用加速度计或磁力计来修正姿态角的过程,一般称为数据融合,有多种方法实现,如果想要自己写算法实现,有互补滤波、卡尔曼滤波等方法,或者直接使用MPU6050官方提供的DMP库。

DMP全称Digital Motion Processor,是Invensense公司针对其产品推出的软件包,能直接输出四元数,可以减轻外围微处理器的工作负担且避免了繁琐的滤波和数据融合,适用于MPU6050、MPU6500、MPU9150、MPU9250等传感器。本文就是重点介绍DMP库的移植和使用。

这里再提一点浅显的四元数的知识,四元数是一种表示姿态角的方法,可以认为四元数等价为滚转角、俯仰角、偏航角。在姿态解算时,之所以要使用四元数,是因为它可以简化姿态更新的计算过程。

MPU6050的DMP库能直接输出四元数,是将陀螺仪的角速度、加速度计的加速度融合之后的结果,由该输出的四元数表示的姿态角是经过加速度计修正过的。

2)MPU6050官方DMP库的移植

MPU6050官方的DMP库是适用于MSP430的,我们使用时,需要简单地移植一下。

小白白使用的是5.1版本的库,官方库一共只有下面这几个文件:

另外官方库中有一个适用于MSP430单片机的app程序,就是motion_driver_test.c文件,但是这个文件里有比较多的和上位机通信用的测试代码,实际需要的很少,我们可以参考它写自己的应用程序。

下面我们就开始移植DMP库。

首先将上图的文件都拷贝到已有的MPU6050工程目录下,添加到keil工程中。

打开inv_mpu.c文件,可以看到文件起始有一串宏定义,这是我们需要移植的主要部分。

文件中可以看到定义了几种处理器类型,以MSP430为例,定义了I2C读写函数i2c_write、i2c_read,延时函数delay_ms、get_ms,打印log函数、取绝对值函数、比较大小函数等等。我们仿照它编写适用于STM32的函数如下:

I2C的读写适用HAL库的读写函数实现,延时函数也使用HAL已有的HAL_Delay和HAL_GetTick实现。

找到inv_mpu.c文件中的mpu_init函数,将其中下面几行注释掉:

在inv_mpu.h文件中找到struct int_param_s{}结构体定义的地方,在里面增加一个成员void *temp,否则编译会报错,因为我们没有定义结构体中的宏,会导致结构体内是空的:

(使用其他的修改方式也行,只要没有语法错误,能编译通过就行)

在inv_mpu_dmp_motion_driver.c这个文件中,开始处添加宏定义,与inv_mpu.c中的实现是一样的:

做完上面这些,编译可以通过,MPU6050官方的DMP库就移植好了。

3)MPU6050的DMP库使用

移植完以后,我们可以参照官方的例子motion_driver_test.c,来编写我们自己的应用程序。主要就是两步:初始化和循环获取数据。

首先我们看初始化,就是mpu_dmp_init这个函数,具体的实现如下:

具体每个步骤的含义注释都有,函数实现也是官方例子里都有的,就不一一解释了。

需要注意的是,执行run_self_test()这一步时,调用了mpu_run_self_test这个函数,官方的函数说明中,要求自行自检时,Z轴竖直向上或者竖直向下:

获取数据的函数如下:

就是调用dmp_read_fifo函数,获取融合后的四元数,放在quat数组中;然后将四元数,除以1073741824.0f(q30)的系数,再计算反三角函数得到俯仰角、滚转角、偏航角:

整个测试函数如下所示,先调用mpu_dmp_init初始化,然后主循环中周期性地调用mpu_dmp_get_data获取姿态角:

这个程序运行如下:

可以看到,初始时输出的姿态角:

运动中输出的姿态角:

长时间运行,也能保持较高的准确度,姿态角不会产生误差累积,说明DMP库起到了融合陀螺仪和加速度计数据的作用。

好了,本节关于MPU6050的DMP库的移植和使用就讲到这里了。

欢迎关注我的公众号“小白白学电子”,可留言“资料”获取所有源码和参考资料:

【STM32+cubemx】0028 HAL库开发:MPU6050官方DMP的移植和使用(续上节)相关推荐

  1. STM32系列之HAL库开发

    STM32系列文章目录 文章目录 STM32系列文章目录 前言 一.HAL库之串口收发 1.配置STM32CUBEID 2.使用串口中断收发 2.1 配置串口中断 2.2 HAL库中断处理逻辑 3 测 ...

  2. STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)

    参考: 某宝HC-SR04 超声波测距模块商品详情页 STM32L051C8T6 HAL库 输入捕获进行超声波测距 案例 STM32CubeMX学习笔记3--TIM2输入捕获(SR-04测距) cub ...

  3. 清泉HAL库开发STM32之基础概念

    文章目录 前言 一.STM32标准库和HAL库分别是什么? 二.HAL库开发 cubemx新建工程 1.选择 CPU 型号 2.确认时钟源 3. 配置 IO 口 4. 配置系统时钟 5. 进一步配置 ...

  4. stm32 IOT_基于STM32平台的cubeMX和HAL库详解

    课程简介: <朱有鹏老师单片机完全学习系列课程>总共5季,其中第1.2季是51单片机学习,第3.4.5季是STM32单片机与RTOS学习.整个课程时长约250小时,是一套零基础.全面系统. ...

  5. 配置CLion进行嵌入式STM32的HAL库开发

    前言 时不可以苟遇,道不可以虚行. 一.准备 1.软件 CLion-2020:百度网盘提取链接放在文章最后. STM32CubeMX:使用 6.5.0 版本的,不要使用最新版本的 CubeMX,不然没 ...

  6. STM32+RS485+Modbus-RTU(主机模式+从机模式)-标准库/HAL库开发

    modbus协议 完成modbus协议的编程之后,设备可以分别作为modbus协议的主机或者从机进行测试,使用模拟软件测试完毕后,完整代码以三个版本的形式进行介绍 1.版本一:使用串口接收数据超时完成 ...

  7. 【08】STM32·HAL库开发-HAL库介绍 | STM32Cube固件库介绍 | HAL库框架结构 | 如何使用HAL库及使用注意事项

    目录 1.初识HAL库(了解) 1.1CMSIS简介 1.2HAL库简介 2.STM32Cube固件包浅析(了解) 2.1如何获取STM32Cube固件包? 2.2STM32Cube固件包文件夹简介 ...

  8. STM32 HAL库开发学习笔记: USART1串口通讯(中断方式) IDE-STM32CubeIDE

    STM32串口通讯有三种方式,分别为阻塞(轮询).中断.DMA.这里将用中断的方式开发. 笔者也是刚入门STM32 HAL库开发,该笔记致希望于能帮到初学者,文中配置步骤.代码.实验现象均是笔者实践可 ...

  9. STM32 HAL库开发转固件库开发杂谈

    前言 本文使用代码工程 STM32HAL库开发转固件库开发杂谈-嵌入式文档类资源-CSDN文库 STM32 最早提供固件库开发,在当时也是一个很大的创新.导致大量攻城狮熟悉了固件库开发,后面STM32 ...

最新文章

  1. meta常用标签总结
  2. android 刷卡布局,刷卡布局效果-开源AndroidSwipeLayout使用解析(二)
  3. 嵌入式成长轨迹11 【嵌入式环境及基础】【Linux shell深入】【深入讨论】
  4. python3读取excel数据-python3读取Excel表格数据的代码分享
  5. junit 测试遇上java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing 错误
  6. c++中获取蓝图组件_蓝图C++混合编程
  7. POJ 3087 Shuffle'm Up 线性同余,暴力 难度:2
  8. 实训说明书 在线音乐平台项目规格说明书
  9. ASP.NET 实现登录界面(生成验证码)
  10. java 并行_在使用Java并行流之前要三思而后行
  11. 多进程和多线程的区别_关于多进程和多线程的那些事儿
  12. 使用FFMPEG类库分离出多媒体文件中的H.264码流
  13. DNS迭代查询与递归查询的区别
  14. 中国磷肥市场发展分析与产能需求调研报告2022版
  15. [译]概率论沉思录——第一章合情推理
  16. linux屏幕截图之滚动截屏
  17. mysql基础命令语句以及使用方法:
  18. 从程序员到项目经理(九):程序员加油站 — 再牛也要合群
  19. elasticsearch知识库
  20. 使用计算机怎样制表格,如何在电脑上制作简单的表格?

热门文章

  1. 觉醒、探索和自律:线下数据三部曲
  2. 《Android开发高手课》学习笔记
  3. 单词统计 SDUT
  4. 操作系统引导过程探究
  5. 学习笔记 | SpringBoot微信点餐系统实战课程笔记(一)、数据库设计与创建
  6. 中文分词比较困难的句子
  7. 华为上半年营收增长30%!美国对华为禁令宣告彻底破产
  8. 基于Spring Boot+vue的停车场管理系统 idea mysql
  9. oracledatabase11gr2怎么打开_Oracle Database 11gR2性能调整与优化 PDF 下载
  10. OpenLayers 3地图添加图标