【开源】SPI读取MPU9250 9轴加速度,陀螺仪,磁力计

2019-07-21 01:51发布

本帖最后由 小白来学习 于 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仿真结果

CG]XJ9D7$UK%PI00)8D90R0.png
file:///C:UsersAdministratorAppDataRoamingTencentUsers312485168QQWinTempRichOleCG]XJ9D7$UK%PI00)8D90R0.png






友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
50条回答
小白来学习
2019-07-21 04:29
本帖最后由 小白来学习 于 2016-8-30 13:21 编辑
hjw 发表于 2016-8-30 10:55
我现在读出原始数据了,但是想9轴数据融合,使偏航角不飘,但是融合这方面处理问题,单位也不知道怎么换 ...

先说单位换算问题:
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磁力计 }2WX{WT(HCHFM~5CJ%$W220.png
从他的datasheet可以看出量程为-32760~32760(65520而非65536),同时也标有分辨率为0.15 uT,则真实数据=原始数据*0.15


/------------------------分割线---------------------------------/
理论基础:
思路:陀螺仪是主角,加速度,磁力计只是起到辅助作用(理论上只需要陀螺仪即可,如果它没有温飘、积分累计误差的话,后面的数据融合部分都可以省掉,可惜。。)对陀螺仪的测量起到修正作用。

姿态解算流程为:获取九轴数据->对数据先进行滤波,去噪,得到比较准确的数据(常见有均值滤波,加权均值滤波、滑动滤波、中值滤波等等)->姿态解算(常用四元数,方向余弦(实时性较差,计算参量多,计算量大,楼主原本用的就是这个,后来改为四元数了)、欧拉角(存在死锁问题))->数据融合,利用加表和 磁力计补偿(常用互补滤波,高级点卡尔曼滤波等)


互补滤波算法请参考: 基于互补滤波器的四旋翼飞行器姿态解算 (1).pdf (531.02 KB, 下载次数: 2675) 2016-8-30 13:04 上传 点击文件名下载附件 虽然是方向余弦版,但思想可以借鉴,加入了PI积分,效果好很多
捷联惯导基础: 捷联式惯性导航系统.pdf (3.39 MB, 下载次数: 4977) 2016-8-30 12:47 上传 点击文件名下载附件 (如果对导航系统不甚了解,请先参阅此篇文章)
/----------------------------------------------------------------/
实际代码:
九轴数据融合部分参考经典的mahony算法的AHRS姿态解算     请参阅 http://www.07net01.com/2016/03/1398642.html   
姿态解算详细讲解: 姿态解算理解(网络参考).pdf (1.29 MB, 下载次数: 4503) 2016-8-30 12:46 上传 点击文件名下载附件 (四元数)

以上是楼主参看许多文献后,觉得很有指导意义的几篇文章,特此推荐




一周热门 更多>