【开源】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条回答
小白来学习
1楼-- · 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 上传 点击文件名下载附件 (四元数)

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




小白来学习
2楼-- · 2019-07-21 08:10
本帖最后由 小白来学习 于 2016-10-14 21:10 编辑
踏雪sunnyboy 发表于 2016-10-14 08:46
谢谢楼主!程序的确可用很强大!
有个问题想要请教,就是spi读取磁力计的延时问题。看程序中是5000次循环 ...

你的这个问题我之前也碰到过,说说我的理解:spi读取磁力计中间经过了两个过程,spi ->master register ->iic->AK8963 ->iic->master->spi,spi驱动iic去读取磁力计,相比直接用iic读取要麻烦得多,还有在磁力计读取函数里的一些灵敏度的矫正,判读数据是否正确等你可以删掉,这些函数也是需要去读取ak8963的,删掉的话影响不大,可以提高读取速度。同时我们我们回过头来看看磁力计的手册,既使是设置磁力计连续测量频率最大也就是100hz(我记得是)。磁力计10ms采集一次,也就是说磁力计的采样不能像加表,陀螺仪一样频繁采样。10ms,20ms采一次足以。这个延时5000实际上是为了等待芯片采样完成而为。实际应用中,你可以在等待芯片内部采样过程中去完成其他任务,用定时器固定10ms去读数就可以,spi的优势确实是读数快,但只是读数快。可是在内部芯片限定了采样频率的情况下,读数再快也是没办法的。
trzhongty
3楼-- · 2019-07-21 14:08
 精彩回答 2  元偷偷看……
hjw
4楼-- · 2019-07-21 19:18
 精彩回答 2  元偷偷看……
memorizal
5楼-- · 2019-07-21 22:50
好帖,顶。
taizonglai
6楼-- · 2019-07-22 02:32
不错,多谢分享,想用SPI读取MPU9250的人还是不少的

一周热门 更多>