本帖最后由 小白来学习 于 2016-7-28 17:45 编辑
众所众知,SPI的读写速度非常诱人,对于MPU9250而言,除了加速度、陀螺仪外,新增了磁力计模块,但是磁力计模块只支持I2C的读写,
为了能够利用起SPI的优势,此时MPU 内部的i2c Master功能为此提供了方便
楼主不才,花了一些功夫,仔细研读了MPU9250 datasheet 整理出SPI读取MPU9250全套工程源码,亲测可用。
楼主觉得有需要注意之处,都配有详细注释(若有不对之处请多多包涵)
希望能提供给大家一些参考价值(工程已打包附件,内附MPU datasheet资料及i2c源码)
MPU9250.rar
(9.73 MB, 下载次数: 179484)
2016-7-28 17:27 上传
点击文件名下载附件
下图为楼主SPI读取9轴数据——Jlink仿真结果
file:///C:UsersAdministratorAppDataRoamingTencentUsers312485168QQWinTempRichOleCG]XJ9D7$UK%PI00)8D90R0.png
先说单位换算问题:
1.陀螺仪原始数据的换算:
举例说明:假设你现在配置的是±2000dps(单位dps意思为degree per second,度每秒),16位ADC采样。则陀螺仪量程为4000dps(±2000dps),原始数据最大值为2^16,则最小分辨率为2^16/4000=16.384,意思就是原始数据每增加16.384,真正陀螺仪数据增加1dps。(鉴于嵌入式对浮点数运算的效率我们取16.4)所以 陀螺仪真值=原始数据/16.4
以上数据单位为度,还需转化为弧度制,然后在参与姿态解算。
2.加速度计算同上,只不过量程不同而已(因为加速度量程太小缘故,程序如果使用float类型来进行姿态融合,很有可能出现数据溢出等错误,可以把分辨率缩小100倍计算)
3磁力计
从他的datasheet可以看出量程为-32760~32760(65520而非65536),同时也标有分辨率为0.15 uT,则真实数据=原始数据*0.15
/------------------------分割线---------------------------------/
理论基础:
思路:陀螺仪是主角,加速度,磁力计只是起到辅助作用(理论上只需要陀螺仪即可,如果它没有温飘、积分累计误差的话,后面的数据融合部分都可以省掉,可惜。。)对陀螺仪的测量起到修正作用。
姿态解算流程为:获取九轴数据->对数据先进行滤波,去噪,得到比较准确的数据(常见有均值滤波,加权均值滤波、滑动滤波、中值滤波等等)->姿态解算(常用四元数,方向余弦(实时性较差,计算参量多,计算量大,楼主原本用的就是这个,后来改为四元数了)、欧拉角(存在死锁问题))->数据融合,利用加表和 磁力计补偿(常用互补滤波,高级点卡尔曼滤波等)
互补滤波算法请参考:
捷联惯导基础:
/----------------------------------------------------------------/
实际代码:
九轴数据融合部分参考经典的mahony算法的AHRS姿态解算 请参阅 http://www.07net01.com/2016/03/1398642.html
姿态解算详细讲解:
以上是楼主参看许多文献后,觉得很有指导意义的几篇文章,特此推荐
你的这个问题我之前也碰到过,说说我的理解:spi读取磁力计中间经过了两个过程,spi ->master register ->iic->AK8963 ->iic->master->spi,spi驱动iic去读取磁力计,相比直接用iic读取要麻烦得多,还有在磁力计读取函数里的一些灵敏度的矫正,判读数据是否正确等你可以删掉,这些函数也是需要去读取ak8963的,删掉的话影响不大,可以提高读取速度。同时我们我们回过头来看看磁力计的手册,既使是设置磁力计连续测量频率最大也就是100hz(我记得是)。磁力计10ms采集一次,也就是说磁力计的采样不能像加表,陀螺仪一样频繁采样。10ms,20ms采一次足以。这个延时5000实际上是为了等待芯片采样完成而为。实际应用中,你可以在等待芯片内部采样过程中去完成其他任务,用定时器固定10ms去读数就可以,spi的优势确实是读数快,但只是读数快。可是在内部芯片限定了采样频率的情况下,读数再快也是没办法的。
一周热门 更多>