热度 1|
市面上很多陀螺仪加速度计,而mpu6050绝对是超值的一款,陀螺仪与加速度计集成在一个芯片上,而且芯片带DMP,可以直接得出四元素然后再转化为欧拉角。如果不用DMP通常的做法是用Z轴的加速度与Y轴的陀螺仪利用卡尔曼滤波然后得出Z轴的角度。两种方法都试过,比较如下:用DMP优点:不需要调卡尔曼参数,数据稳定准确。缺点:最短周期为5ms才能读一次数,且无法调。用卡尔曼滤波优点:读取数据周期短,数据手册上说1ms就可读一次新数据。缺点:需要调节卡尔曼参数。关于两者的运算复杂度我觉得差不多,DMP需要将四元数转化为欧拉角,有三角函数需要运算,而卡尔曼滤波运算复杂。所以对于需要频繁控制的对象,用DMP可能吃不消,5ms时间还是挺长的。
Mpu6050数据的读取,这里先飞思卡尔的K60芯片,先是直接用I2c读取。这个简单。这里又存在一个问题了,用硬件I2C还是模拟,结果是我很惊讶的发现用模拟I2C的速度远远高于用硬件I2C,因为硬件I2C有一个等待回馈信号的过程,没有收到ACK就一直等着,而模拟I2C则不需要确定收到ACK,稍微执行几个nop就可以了。用硬件I2c要消耗掉我2ms时间,模拟的也要近1ms,要我说用哪个好,我说都不用,用mpu9250通过SPI读取,官方说SPI操作寄存器为1M,读取数据可为20M。
然后是DMP数据的读取,这个官方是有例程的,然后还有许多大神也都有自己的DMP库,反正用官方的motion_driver库我是没弄出来,然后代码也相当复杂,因此我用的其他人的库然提取有用东西,自己弄成的一个库,十分小巧只有一个.h文件。而且库里面还有SPI与IIC两种模式的切换,文件里面有详细的解释,十分方便。
运用这个库我成功的运用到K60与msp430G2553两款芯片上,都实现了硬件SPI与IIC的数据读取,也都十分准确,先是移植K60,这个十分方便,可是移植到msp430G2553中这个就出现了一些问题,首先是内存问题,这个可以通过在大数组前面添加const解决,可是还是RAM不够,这个不科学啊,以前用G2553来做显示那数组可比这个大多了,后来发现是函数asin出现问题,这个函数会占用大量的RAM,可以说整个G2553的内存都不够它调用一个asin函数的,没办法那就先不调用这个函数吧,这个函数是在将四元数化为欧拉角的时候用到的,而且只有一个欧拉角需要用到,没什么关系。要是能够自己写一个asin函数那是最好的。
然后还有一个地方需要主要,那就是在mpu芯片上电后需要延时几十毫秒,然后在给它初始化操作。
虚拟示波器下载javascript:;注意:首次使用将兼容性改为windows98
K60工程文件下载:https://download.eeworld.com.cn/detail/lb8820265/552856
Msp430G2553工程文件下载:https://download.eeworld.com.cn/detail/lb8820265/552857