一、器件&结果
采用单片机为:stm32f103c8t6,陀螺仪为:mpu9150
mpu9150实际上为:mpu6050和AK8975C
测量结果:
二、开发记录
MPU6050开发用了4天,期间主要做了:
(1)基于互补滤波的陀螺仪和加速度的融合,参考了Mahony互补滤波、四轴飞行器DIY。
(2)基于北航全权的多旋翼飞行器设计与控制校准了陀螺仪
(3)参考飞行器入门、电子酷、DR_CAN做了卡尔曼的融合
AK8975的开发了近三天:
MPU6050的原始数据获取直接调库很容易,AK8975的程序则比较少,大多基于DMP库,或者ST的库,看了半天也不知道写的啥。 没有办法有点强迫症,开始翻MPU9150A,8975C的技术手册,从IIC到每个寄存器的作用都看了一遍。能够用上的直接上图:
可以看出寄存器的地址完全一样
(1)单次测量模式下,每一次测量数据的输出后,发送模式自动进入Power_DOWN(所有内部电路的电源已关闭,除保险丝ROM外,所有寄存器均可在电源关闭模式下访问,存储在读/写寄存器中的数据被保留),意味着ADC采集不能使用,所以必须单次测量后要进入CNTL寄存器重新设置0x01,重新单次测量。
(2)这里要吐槽一下,单次测量看了几个不同的demo,后面才明白,测量一次相当于XYZ三个方向全部测量出,不需要每读一次数据,重新测量一遍哈哈,直接被那份51的历程带翻车了。
(3)不同的代码,IIC都一样好久没看底层的我详细的看了一下,都一样,标准的MUP6050的地址0x68(接地,或者挂空),有几份直接写成0xD0 ;AK8975的标准地址为:ox0c,有的也会出现0x18这种情况。这用问题,大多与IIC的写法相关。
(4)最后,一直得不到AK8975数据的原因找到了,要配置MPU6050, z真的没想到;
三 、后续
代码开源!最近没想法了,后续接着做融合算法,还有滤波。 D0915