第一篇——概述和MPU6050及其自带的DMP输出四元数

概述

  InvenSense(国内一般译为应美盛)公司产的数字运动传感器在国内非常流行,我用过它的两款,9250和6050。出于被国产芯片惯坏的习惯,我自然而然地认为其封装引脚和寄存器都是兼容的,所以这成功地让我打废两次板,这两款芯片的封装并不是一样的,MPU9250的要小很多,而两者都引脚也不一样,虽然他们都是24pin的,可能是出于MPU9250多一个地磁传感器,AK8963。

所以两者的差异点主要在于:

1,封装(塑体大小);

2,管脚功能;

3,MPU9250较MPU6050多一个三轴地磁传感器AK8963;

4,部分寄存器(待补充);

  MPU6050是款加速度和角速度传感器,有人也将因为其角速度传感器的功能将其称为陀螺仪,我其实并不能理解,我觉得能直接输出姿态数据比如欧拉角或者四元数的传感器才是陀螺仪。多年以前我刚进入大学时听过一个东大微电子学院教授的讲座,讲的是MEMS技术,我只记得中间陈提出了一个MEMS能否用来制造晶振的问题,让我记住了这个大二的。后来也有同事说过MEMS技术中封装也是很重要的,我一想也有道理,能把AK8963封装进去肯定不简单啊。MPU6050能测三轴加速度和三轴加速度,加速度的量程为±2/4/6/8/16g,角速度量程为±250/500/1000/2000角度每秒,16位ADC,输出速率好像能达到几千赫兹,当然6050只支持IIC,时钟最快400KHz。3.3V供电,几个毫安的功耗。带一个IIC主机接口,用来外挂其他的IIC传感器比如GNSS或者地磁传感器。

MPU6050的DMP

  一般运动传感器都是要靠处理器跑算法来进行角度融合以得到最终能直接使用的表示当前自身姿态的欧拉角或者四元数的。我之前用的是卡尔曼滤波。要自己写代码大家自然会觉得多个流程,当然有时也会觉得自己算的才靠谱,其实也是,靠6050自带的DMP算的并不比单片机算的准,而且DMP算得慢,有时是不够用的。但单片机根据原始的加速度和角速度算四元数逃不过要写数字信号处理算法要用到大量的乘法或者FPU,有时并不能算过来,所以使用DMP算出来的数据也未尝不可。DMP,数字运动处理器,MPU6050/9250内部的一个组成部分,可以用来直接向外部吐四元数。

  DMP的使用我并不想去深究,设备并不重要,数据才重要。应美盛针对6050提供了一套代码和文档,加一个跑在MSP430上的例程。例程资源链接如下:

  官方提供的代码需要实现其中的延时,IIC序列读和序列写函数。移植起来对于各位来说,只要1,C语言合格,2,对IDE使用熟练,3了解IIC时序,那么应该是非常简单的。

IIC驱动代码

  而我使用的是STM32F103C8T6和CH32V103C8T6,后者是RISC-V核的前者兼容MCU。我遇到的三个问题中,IIC的时序确实搞了我一下,写软件的IIC没啥,问题有二,1,速度上到100K后就提不上去了,2,收发会被中断打断,这点很头疼。写单片机程序最头疼的是你要时刻提醒自己你的业务逻辑流程可能在任意时刻被中断打断。所以我还是使用硬件的IIC,32的IIC设计得没必要得复杂,我需要推一个数据到数据寄存器里,然后等相应的标志位被置位,事实上这些标志位总是莫名其妙地等不到被置位,但是CPU刻意去读时它又是置位的,就很神奇。

  这里放下初始化代码:

  序列读取:

  序列写入:

实物操作:

  原理图直接照抄的官方的。注意电容容值。32侧我随意找了个IIC口。

MPU9250/MPU6050与运动数据处理与卡尔曼滤波(1)_四元数

 

PCB图没啥好放的,简单的连线。

这里放个CH32V103C8T6的工程,读取四元数然后由单片机转成欧拉角。晶振用8MHz的。链接如下。

输出的打印就像这样。