MPU6050模块是块好东西大伙都知道,围绕这个几块钱的东西就可以做很多很好玩的东西,什么四翼飞行器、平衡车等。当然要完全使用这块模块不是那么容易。

解析说明

  • 其实我们主要是想通过6050得到欧拉角和四元数
  • 要通过6050得到四元数和欧拉角,这个过程有两种办法,一种是用原始数据(三轴加速度、三轴角速度),通过一些(卡尔曼、积分运算、减少误差零点漂移等)姿态融合运算转化即可
  • 另一种是直接用MPU6050 内部的自带的数字运动处理器(即DMP),我们要用这个DMP功能的话,就要实现加载固件
  • 那么这个DMP怎么拿呢,Invensense公司有提供了一个MPU6050的嵌入式运动驱动库,进而我们可以通过这个库移植很方便得出欧拉角
  • 不过Invensense公司提供的6050运动驱动库是基于MSP430的,需要将其移植到其他芯片上(比如:STM32F1系列),当然就要移植改代码啦

移植:

官方原版驱动下载地址:
http://drivers.softpedia.com/get/Other-DRIVERS-TOOLS/Others/InvenSense-Embedded-Motion-Tracker-Driver-51.shtml
下载后分析一下
其实要移植的驱动代码就这6个文件

该驱动重点就是两个c文件:inv_mu.c和inv_mpu_dmp_motion_driver.c其中,inv_mu.c中添加了几个函数,方便读者使用。我们要做的是怎么操作上面两个文件里面的函数,方便我们得出我们想要的结果,重点介绍两个函数:
初始化DMP_Init()函数如下

void DMP_Init(void)
{ if(!mpu_init())     //mpu初始化{if(!mpu_set_sensors(INV_XYZ_GYRO | INV_XYZ_ACCEL))    //设置需要的传感器printf("mpu_set_sensor complete ......\r\n");if(!mpu_configure_fifo(INV_XYZ_GYRO | INV_XYZ_ACCEL)) //设置fifoprintf("mpu_configure_fifo complete ......\r\n");if(!mpu_set_sample_rate(DEFAULT_MPU_HZ))              //设置采集样率printf("mpu_set_sample_rate complete ......\r\n");if(!dmp_load_motion_driver_firmware())                //加载dmp固件printf("dmp_load_motion_driver_firmware complete ......\r\n");if(!dmp_set_orientation(inv_orientation_matrix_to_scalar(gyro_orientation)))printf("dmp_set_orientation complete ......\r\n"); //设置陀螺仪方向if(!dmp_enable_feature(DMP_FEATURE_6X_LP_QUAT | DMP_FEATURE_TAP |DMP_FEATURE_ANDROID_ORIENT | DMP_FEATURE_SEND_RAW_ACCEL | DMP_FEATURE_SEND_CAL_GYRO |DMP_FEATURE_GYRO_CAL))printf("dmp_enable_feature complete ......\r\n");if(!dmp_set_fifo_rate(DEFAULT_MPU_HZ))    //设置速率printf("dmp_set_fifo_rate complete ......\r\n");run_self_test();                          //自检if(!mpu_set_dmp_state(1))                 //使能printf("mpu_set_dmp_state complete ......\r\n");}}

DMP_Init的作用就是初始化,再设置mpu里面各种参数,然后就可以通过
Read_DMP()函数读取姿态结算数据了。
初始化Read_DMP()函数如下

uint8_t Read_DMP(float* Pitch,float* Roll,float* Yaw)
{   short gyro[3], accel[3], sensors;float q0=1.0f,q1=0.0f,q2=0.0f,q3=0.0f;unsigned long sensor_timestamp;unsigned char more;long quat[4];if(dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors, &more)) return 1;      if (sensors & INV_WXYZ_QUAT){    q0=quat[0] / q30;q1=quat[1] / q30;q2=quat[2] / q30;q3=quat[3] / q30;*Pitch = (float)asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3;     *Roll = (float)atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // roll*Yaw = (float)atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3;return 0;}   else return 2;}

ps: 使用MPU6050的DMP输出的四元数是q30格式的,也就是浮点数放大了2^30倍。在换算成欧拉角之前,必须先将其转换为浮点数,也就是除以2^30,然后在计算。

然后到主函数里,初始化后,直接调用Read_DMP即可。

    DMP_Init();while(1){printf("Read_DMP Return is %d\n",Read_DMP(&Pitch,&Roll,&Yaw));printf("Pitch is:%f,Roll is:%f,Yaw is:%f\n",Pitch,Roll,Yaw);}


注意:Return_DMP函数的返回值,0成功,1失败,说明不是每次都能成功读出欧拉角,所以延时一段时间后再读(比如一秒读一次数据)很有可能失败!!!

还有一点
因为IIC函数我们提供,注意inv_mpu.c文件实现MPU6050和IIC接口连接的声明

#define i2c_write   i2cwrite
#define i2c_read    i2cread
#define delay_ms    delay_ms
#define get_ms      get_ms

工程文件:https://pan.baidu.com/s/1jIp5ZaY
工程环境:Keil4.7
芯片:STM32F103
PS:一年前尝试做平衡小车被各种姿态公式打败了,最近隔壁宿舍有位同学做辆平衡小车通过dmp获取欧拉角,遂再研究一下。接下来有时间的话再尝试平衡车。

本人理解不深,有问题希望能和大伙一起探讨。

MPU6050内部DMP固件移植解析,STM32获取欧拉角串口显示相关推荐

  1. MPU6050的dmp代码移植的过程--转

    让自己别忘了大学里学的东西,那么就把它记录下下来,效率会比忘记然后重新再去找资料再重头学高的多 一开始自己死命的去网上找现成的代码,但是发现大多都是打着dmp的幌子,给的是得出原始数据的代码,或者确实 ...

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

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

  3. 六轴加速度传感器MPU6050官方DMP库到瑞萨RL78/G13的移植

    2015年的电赛已经结束了.赛前接到器件清单的时候,看到带防护圈的多旋翼飞行器赫然在列,又给了一个瑞萨RL78/G13的MCU,于是自然联想到13年的电赛,觉得多半是拿RL78/G13做四旋翼的主控, ...

  4. STM32获取GY-25A倾角传感器串口输出数据

    STM32获取GY-25A倾角传感器串口输出数据 GY-25A模块是新型的倾角传感器模块,具有X和Y两轴模拟角度输出和串口角度输出的功能.这里介绍STM32获取GY-25A串口输出的角度数据.(获取模 ...

  5. Ros 与 STM32 之Ros串口同设备USB固定

    研究后发现Ros与STM32 都是通过串口 TTL转USB 的方式连接到USB A:有两种形式 一种 使用 ros-kinetic-serial 中的py  包用的ROS的serial功能包 B:另一 ...

  6. 移植DMP到MPU6050获取欧拉角

    文章目录 1.较浅显的姿态解算介绍 2.姿态解算是怎么来的 1.加速度反求 2.角速度积分 3.DMP介绍 4.DMP移植 5.源码 经过上一节的介绍,我们可以读出 MPU6050的加速度传感器和角速 ...

  7. 六轴加速陀螺仪MPU6500/MPU6050使用及DMP库移植,含记步器功能

    本篇博客为博主学习使用MPU6500完成后的学习记录,故在这只做主要讲解,如有博友看完后仍不知如何使用,可在下方留言问我,或发邮件问我(dayou1024@qq.com),因邮件有QQ和微信提示,故我 ...

  8. esp32系列(11):ESP32 IDF平台 mpu6050 DMP 驱动移植及测试上位机开发

    目录 1 DMP 官方库介绍 1.1 DMP与MPL(Motion Processing Libraries)功能 1.2 运行MPL的硬件要求 1.3 Motion Driver 6.12 的架构 ...

  9. 【51单片机快速入门指南】4.3.1: MPU6050调用DMP库获取四元数和欧拉角

    目录 相关介绍 DMP库相关 DMP加载步骤: DMP设置数据写入 更新DMP DMP数据包结构 程序实现 DMP.c DMP.h 测试程序 四元数 实验现象 欧拉角的获取 普中51-单核-A2 ST ...

最新文章

  1. 皮一皮:太像了....
  2. php项目使用xdebug远程调试
  3. cleanmymac能够很方便的清理mac上面没用的软件,尤其是这个清理大文件的功能
  4. [html] 请说说<script>、<script async>和<script defer>的区别
  5. HBase 配置详解
  6. Redis哨兵主从配置(半自动)
  7. java中REST_Java——Restful风格
  8. CentOS 关闭防火墙和selinux
  9. [Ogre][地形][原创]基于OgreTerrain的地形实现
  10. linux基础网络设置及使用DHCP动态配置主机地址
  11. Java面试题附答案(面试必会)
  12. 《Linux程序设计(第4版)》阅读心得
  13. Java instead of 用法_实例讲解instance of 运算符用法
  14. JMeter 安装教程
  15. 任务卡_05-数据库_-MySql 高级任务
  16. 字体图标的svg导入及寻找
  17. IE浏览器登录Tomcat报错
  18. CANoe.DiVa 操作指南 - 预期响应设置
  19. Eureka健康机制检查问题之一创建EurekaDiscoveryClientConfiguration$EurekaHealthCheckHandlerConfiguration错误
  20. centos安装vscode启动报错(libnss3.so: version `NSS_3.22' not found)

热门文章

  1. 【饼干控最不能错过的成就感美味——燕麦提子饼干】
  2. wept开发微信小程序
  3. EMR 系统集成公司信息化解决方案
  4. Python基础算法
  5. win10+python3.6下安装fastText+fastText原理和使用
  6. webpack 打包(初学打包运行)
  7. 结算测试-日终文件-还款计划文件、扣款顺序相关
  8. 如何获取微信用户的Openid详解(微信网页授权)
  9. 绥化学院计算机科学技术,绥化学院本科计算机科学与技术_绥化学院本科计算机科学与技术简介-查字典学校网...
  10. 【渝偲医药】实验室关于核磁共振波谱NMR的知识(原理、用途、分析、问题)