OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 75323|回复: 105

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

  [复制链接]

3

主题

18

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2016-7-23
在线时间
31 小时
发表于 2016-7-28 17:42:31 | 显示全部楼层 |阅读模式
本帖最后由 小白来学习 于 2016-7-28 17:45 编辑

众所众知,SPI的读写速度非常诱人,对于MPU9250而言,除了加速度、陀螺仪外,新增了磁力计模块,但是磁力计模块只支持I2C的读写,

为了能够利用起SPI的优势,此时MPU 内部的i2c Master功能为此提供了方便


楼主不才,花了一些功夫,仔细研读了MPU9250 datasheet 整理出SPI读取MPU9250全套工程源码,亲测可用。
楼主觉得有需要注意之处,都配有详细注释(若有不对之处请多多包涵)

希望能提供给大家一些参考价值(工程已打包附件,内附MPU datasheet资料及i2c源码) MPU9250.rar (9.73 MB, 下载次数: 190430)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

18

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2016-7-23
在线时间
31 小时
 楼主| 发表于 2016-8-30 13:18:49 | 显示全部楼层
本帖最后由 小白来学习 于 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, 下载次数: 2986)
回复 支持 3 反对 0

使用道具 举报

3

主题

18

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2016-7-23
在线时间
31 小时
 楼主| 发表于 2016-9-4 14:46:21 | 显示全部楼层
hjw 发表于 2016-9-3 22:10
楼主,我现在独处原始数据了,用AHRS算法融合9轴数据,虽然偏航角飘的不厉害了,但是我发现测出的偏航角量 ...

1;不要用原始数据参与融合。2;单位换算问题我觉得解释到这种地步,真的没啥可说的的了。发的工程里也有datasheet,很清晰很清晰的解释了传感器的各种问题,耐心看。

3;四元数可以做到全姿态解算,yaw角出现问题,先考虑传入数据的正确性,在考虑算法中参数的影响。
4:姿态解算代码网上的都大同小异,没有什么太大的出入,我用的也是AHRS的算法,大家用的都是同一种算法,没有必要问我要代码,不要做伸手党。学会自己思考。上面推荐文档已经很详细的讲解了算法原理等,就差没有手把手的教你了,还请认真阅读。
看资料,自己摸索,不会就百度,不懂就多看几遍,技术这东西只有自己去理解,楼主也是这么从无到有过来的。别人的终归是别人的。

回复 支持 2 反对 0

使用道具 举报

3

主题

18

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2016-7-23
在线时间
31 小时
 楼主| 发表于 2016-8-29 16:17:48 | 显示全部楼层
hjw 发表于 2016-8-23 14:12
你好,你确定你发的这个是可以读取磁力计的数据吗?我试了一下,不行呀。陀螺仪和加速度都有数据出来,但是 ...

恩,这是我亲测的,现在正常使用中。请这位朋友描述的准确一点,最好贴出你的配置代码。我看看
回复 支持 1 反对 0

使用道具 举报

3

主题

18

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2016-7-23
在线时间
31 小时
 楼主| 发表于 2016-10-14 21:04:24 | 显示全部楼层
本帖最后由 小白来学习 于 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的优势确实是读数快,但只是读数快。可是在内部芯片限定了采样频率的情况下,读数再快也是没办法的。
回复 支持 1 反对 0

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2016-9-27
在线时间
2 小时
发表于 2017-5-18 13:14:31 | 显示全部楼层
我有个想法,MPU9250 这个实际上是MPU6500 + 三轴磁力计, 前者支持SPI通讯,而后者不支持。后者挂载在 MPU9250的扩展I2C上, 我猜想是否可以,使用SPI与MPU6500通讯,高速读取,并且同时 关闭 MPU9250的扩展I2C主控制器,关闭旁路模式,然后将STM32的I2C接到 MPU9250的扩展I2C接口上,通过I2C来单独设置磁力计或者读取磁力计。这样就实现了SPI,I2C双通道读取MPU9250的数据。是不是很有意思。具体还得试试。
回复 支持 1 反对 0

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-8-6
在线时间
12 小时
发表于 2016-9-3 22:10:04 | 显示全部楼层
楼主,我现在独处原始数据了,用AHRS算法融合9轴数据,虽然偏航角飘的不厉害了,但是我发现测出的偏航角量程只有80度,一旦超过了,就重新回到原来的数据了。楼主有出现这样的问题吗?可以把你怎么融合的程序跟我交流交流吗?
回复 支持 1 反对 0

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-5-1
在线时间
5 小时
发表于 2016-7-28 19:10:31 | 显示全部楼层
好帖,顶。
回复 支持 反对

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-7-29 12:24:39 | 显示全部楼层
不错,多谢分享,想用SPI读取MPU9250的人还是不少的
回复 支持 反对

使用道具 举报

306

主题

1426

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
7871
金钱
7871
注册时间
2015-10-15
在线时间
2874 小时
发表于 2016-7-29 12:48:43 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

3

主题

18

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2016-7-23
在线时间
31 小时
 楼主| 发表于 2016-7-29 17:11:39 | 显示全部楼层
第一次被加酷了!!!受宠若惊
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2015-1-28
在线时间
4 小时
发表于 2016-8-1 22:07:05 | 显示全部楼层
顶,66666
回复 支持 反对

使用道具 举报

7

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2016-4-10
在线时间
48 小时
发表于 2016-8-1 23:11:49 | 显示全部楼层
顶   楼主好人
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-8-6
在线时间
12 小时
发表于 2016-8-23 14:12:49 | 显示全部楼层
你好,你确定你发的这个是可以读取磁力计的数据吗?我试了一下,不行呀。陀螺仪和加速度都有数据出来,但是磁力计的什么数据都没有,都是0.
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-8-6
在线时间
12 小时
发表于 2016-8-23 14:14:30 | 显示全部楼层
求大家帮忙呀
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-8-6
在线时间
12 小时
发表于 2016-8-30 10:55:34 | 显示全部楼层
小白来学习 发表于 2016-8-29 16:17
恩,这是我亲测的,现在正常使用中。请这位朋友描述的准确一点,最好贴出你的配置代码。我看看

我现在读出原始数据了,但是想9轴数据融合,使偏航角不飘,但是融合这方面处理问题,单位也不知道怎么换算?您能把你融合的程序或思路说一下吗?
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-8-6
在线时间
12 小时
发表于 2016-8-31 10:43:43 | 显示全部楼层
小白来学习 发表于 2016-8-30 13:18
先说单位换算问题:
1.陀螺仪原始数据的换算:
举例说明:假设你现在配置的是±2000dps(单位dps意思为 ...

楼主强大,非常感谢
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-2-25
在线时间
1 小时
发表于 2016-9-1 17:43:36 | 显示全部楼层
多谢楼主,我用你的方法实现了加速度计与陀螺仪的数据读取,看你的芯片连接电路图还是使用了I2C连接的,我这边磁力计是没有数据的,待我再细细研究一下。
之前没有配置好SPI一度连WHO_AM_I都读错,废了一番功夫。多谢
回复 支持 反对

使用道具 举报

3

主题

18

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2016-7-23
在线时间
31 小时
 楼主| 发表于 2016-9-2 09:57:22 | 显示全部楼层
FantasyJXF 发表于 2016-9-1 17:43
多谢楼主,我用你的方法实现了加速度计与陀螺仪的数据读取,看你的芯片连接电路图还是使用了I2C连接的,我 ...

电路图同时引出了i2c和spi,方便选择。调试磁力计,先调通它的who am i ,在调数据读取。祝你你早日成功。
回复 支持 反对

使用道具 举报

1

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2016-8-9
在线时间
29 小时
发表于 2016-9-2 16:36:23 | 显示全部楼层
高手,支持了
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-8-6
在线时间
12 小时
发表于 2016-9-3 14:43:10 | 显示全部楼层
小白来学习 发表于 2016-8-30 13:18
先说单位换算问题:
1.陀螺仪原始数据的换算:
举例说明:假设你现在配置的是±2000dps(单位dps意思为 ...

你能告诉我你得到原始数据时陀螺仪和加速度计,磁力计的寄存器是怎么配置吗?有程序更好。感激不尽
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-8-6
在线时间
12 小时
发表于 2016-9-3 15:12:06 | 显示全部楼层
小白来学习 发表于 2016-8-30 13:18
先说单位换算问题:
1.陀螺仪原始数据的换算:
举例说明:假设你现在配置的是±2000dps(单位dps意思为 ...

我还是不懂单位换算,你能贴出程序让我看看吗?
回复 支持 反对

使用道具 举报

3

主题

18

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2016-7-23
在线时间
31 小时
 楼主| 发表于 2016-9-4 14:12:13 | 显示全部楼层
hjw 发表于 2016-9-3 14:43
你能告诉我你得到原始数据时陀螺仪和加速度计,磁力计的寄存器是怎么配置吗?有程序更好。感激不尽

配置信息全在datasheet里,请先阅读,datasheet比任何代码都要详细。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
34
金钱
34
注册时间
2015-10-10
在线时间
3 小时
发表于 2016-9-5 16:01:06 | 显示全部楼层
楼主用过SPI调配置dmp吗 怎么搞
回复 支持 反对

使用道具 举报

6

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
513
金钱
513
注册时间
2016-3-16
在线时间
166 小时
发表于 2016-9-5 17:10:13 | 显示全部楼层
mark一下,后面试一下~
回复 支持 反对

使用道具 举报

0

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
359
金钱
359
注册时间
2016-9-5
在线时间
62 小时
发表于 2016-9-9 17:47:42 | 显示全部楼层
mark 一下,马上就用到
回复 支持 反对

使用道具 举报

16

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2013-11-24
在线时间
7 小时
发表于 2016-9-14 17:11:15 | 显示全部楼层
楼主您好,我又问题想要请教您,我仔细看了您的代码,并没有发现操作AK8963的语句,才疏学浅,能否指教下如何配置9250的寄存器,来操作AK8963的寄存器?
回复 支持 反对

使用道具 举报

3

主题

18

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2016-7-23
在线时间
31 小时
 楼主| 发表于 2016-9-15 00:42:29 | 显示全部楼层
kurohard 发表于 2016-9-14 17:11
楼主您好,我又问题想要请教您,我仔细看了您的代码,并没有发现操作AK8963的语句,才疏学浅,能否指教下如 ...

646DS04R@HR2QBN6B8F}`Y9.png 这一段就是在初始化MPU的master模式,将slove的寄存器与master进行映射,通过操作master的寄存器的达到操作slave的效果。具体配置,照着初始化的代码,在数据手册里找相应寄存器的说明。
回复 支持 反对

使用道具 举报

7

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-7-9
在线时间
9 小时
发表于 2016-9-17 14:51:05 | 显示全部楼层
小白来学习 发表于 2016-8-30 13:18
先说单位换算问题:
1.陀螺仪原始数据的换算:
举例说明:假设你现在配置的是±2000dps(单位dps意思为 ...

楼主,你好,非常感谢你的帖子。
不过,我还有一点疑问?陀螺仪的分辨率是16.4,则真实值=原始数据/16.4;
                                      而磁力计中分辨率是0.15,则真实值=原始数据*0.15;
                                    这两个分辨率不是一个意思吗?为什么真实值一个是乘,一个是除啊?
回复 支持 反对

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2770
金钱
2770
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-9-18 18:11:59 | 显示全部楼层
星空仰望 发表于 2016-9-17 14:51
楼主,你好,非常感谢你的帖子。
不过,我还有一点疑问?陀螺仪的分辨率是16.4,则真实值=原始数据/16.4 ...

两个分辨率(手册里称为灵敏度)说的都没问题,你仔细看16.4和0.15的单位是不一样的。
16.4的单位是LSB/(度/s),意思是“每(度/s)占16.4个最低有效位”。
0.15的单位是uT/LSB,意思是“每个最低有效位可表示0.15uT”。
您仔细看一下分子和分母,所以一个是乘一个是除。
自在随心
回复 支持 反对

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2770
金钱
2770
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-9-18 18:13:01 | 显示全部楼层
星空仰望 发表于 2016-9-17 14:51
楼主,你好,非常感谢你的帖子。
不过,我还有一点疑问?陀螺仪的分辨率是16.4,则真实值=原始数据/16.4 ...

所谓的“最低有效位”就是原始数据的1
自在随心
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2016-1-22
在线时间
4 小时
发表于 2016-9-22 14:35:11 | 显示全部楼层
楼主:您好! 正好继续MPU9250 的资料参考!感谢楼主的无私分享!我有两个问题请您帮助解答!1. 您资料中“STM32串口输出MPU-9250测试过”这个文件中的程序就是您说的经过测试好用的是吗?2. 您能分享一下您的原理图吗?
回复 支持 反对

使用道具 举报

7

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-7-9
在线时间
9 小时
发表于 2016-9-25 20:02:10 | 显示全部楼层
yuzeyuan1 发表于 2016-9-18 18:11
两个分辨率(手册里称为灵敏度)说的都没问题,你仔细看16.4和0.15的单位是不一样的。
16.4的单位是LSB/ ...

嗯,这样啊!懂了,谢谢!
回复 支持 反对

使用道具 举报

7

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2015-8-10
在线时间
39 小时
发表于 2016-9-26 12:31:58 | 显示全部楼层
楼主很厉害,马一下慢慢看
回复 支持 反对

使用道具 举报

3

主题

18

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2016-7-23
在线时间
31 小时
 楼主| 发表于 2016-9-26 13:10:33 | 显示全部楼层
zhaochuanyuAVR 发表于 2016-9-22 14:35
楼主:您好! 正好继续MPU9250 的资料参考!感谢楼主的无私分享!我有两个问题请您帮助解答!1. 您资料中“ ...

1,不是那个,那个是别人 应用iic的测试代码。有一个独立的工程在文件外。
2,打包文件里包含了MPU9250 的原理图,你仔细找找。
回复 支持 反对

使用道具 举报

2

主题

394

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2093
金钱
2093
注册时间
2012-5-8
在线时间
312 小时
发表于 2016-9-26 16:44:43 | 显示全部楼层
不错又多了一种玩法!
回复 支持 反对

使用道具 举报

12

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
288
金钱
288
注册时间
2016-7-20
在线时间
33 小时
发表于 2016-9-29 21:21:21 | 显示全部楼层
很不错哦,程序精简有力
回复 支持 反对

使用道具 举报

0

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2016-7-5
在线时间
43 小时
发表于 2016-10-11 11:46:47 | 显示全部楼层
楼主厉害谢谢分享!好好学习一下
回复 支持 反对

使用道具 举报

3

主题

21

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2014-8-14
在线时间
14 小时
发表于 2016-10-14 08:46:52 | 显示全部楼层
本帖最后由 踏雪sunnyboy 于 2016-10-14 09:05 编辑

谢谢楼主!程序的确可用很强大!
有个问题想要请教,就是spi读取磁力计的延时问题。看程序中是5000次循环等待内部I2C转发完成,发送一个字节竟然耗时2ms多,减小循环次数为3000出错,磁力计数据传回来的为0。而我用模拟I2C读取磁力计6个字节才用时2ms, 那这样的话spi读取就没有太大优势了,是设置问题?[mw_shl_code=applescript,true]/***************************************************************/
// MPU9250读取磁力计
//I2C_SLVx_ADDR:  MPU9250_AK8963_ADDR
//I2C_SLVx_REG:   reg
//return value:   EXT_SENS_DATA_00 register value
/***************************************************************/
static u8 i2c_Mag_read(u8 reg)
{
        u16 j=5000;
        MPU9250_Write_Reg(I2C_SLV0_ADDR ,MPU9250_AK8963_ADDR|0x80); //磁力计地址,读操作
        MPU9250_Write_Reg(I2C_SLV0_REG ,reg);// set reg addr
        MPU9250_Write_Reg(I2C_SLV0_DO ,0xff);//read
        while(j--);//等待内部I2C转发完成
        return MPU9250_Read_Reg(EXT_SENS_DATA_00);
}[/mw_shl_code]
回复 支持 反对

使用道具 举报

13

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2016-5-25
在线时间
101 小时
发表于 2016-10-15 09:19:38 | 显示全部楼层
小白来学习 发表于 2016-10-14 21:04
你的这个问题我之前也碰到过,说说我的理解:spi读取磁力计中间经过了两个过程,spi ->master register - ...

在内部芯片限定了采样频率的情况下,读数再快也是没办法的。   
非常的赞同这句话
回复 支持 反对

使用道具 举报

3

主题

21

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2014-8-14
在线时间
14 小时
发表于 2016-10-15 20:15:48 | 显示全部楼层
本帖最后由 踏雪sunnyboy 于 2016-10-15 20:24 编辑
小白来学习 发表于 2016-10-14 21:04
你的这个问题我之前也碰到过,说说我的理解:spi读取磁力计中间经过了两个过程,spi ->master register - ...

感谢回复!最后我设置了加速度陀螺仪200hz,磁力计60几hz读取,就是说检测磁力计数据没准备好的话,就直接跳过不更新(磁力计循环采样是100hz) // i2c_Mag_write(AK8963_CNTL1_REG,0x01);
        flag1 = i2c_Mag_read(AK8963_ST1_REG);
        flag2 = i2c_Mag_read(AK8963_ST2_REG);
        if(!(flag1 & AK8963_STATUS_DRDY) || (flag1 & AK8963_STATUS_DOR) || (flag2 & AK8963_STATUS_HOFL))
     return;

回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-5-3
在线时间
42 小时
发表于 2016-10-29 09:32:01 | 显示全部楼层
以后有机会学习。
回复 支持 反对

使用道具 举报

20

主题

138

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2012-10-11
在线时间
134 小时
发表于 2016-10-29 10:30:56 | 显示全部楼层
谢楼主分享!
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2016-10-8
在线时间
16 小时
发表于 2016-10-29 12:13:10 | 显示全部楼层
谢谢楼主
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-12-7
在线时间
1 小时
发表于 2016-12-7 22:36:40 | 显示全部楼层
楼主的程序里好像有个Bug,“ if((i2c_Mag_read(AK8963_ST2_REG)&AK8963_ST2_HOFL)==1) ”,其中 AK8963_ST2_HOFL=0x80,那么无论I2C读出什么样的数,都不会跳进判断里的吧?
回复 支持 反对

使用道具 举报

0

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2016-11-25
在线时间
28 小时
发表于 2016-12-7 23:14:11 | 显示全部楼层
mark一下
回复 支持 反对

使用道具 举报

3

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2016-8-13
在线时间
14 小时
发表于 2016-12-8 00:15:54 | 显示全部楼层
MARK~!谢谢楼主~~
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2014-8-8
在线时间
11 小时
发表于 2016-12-12 17:09:22 | 显示全部楼层
感谢楼主,解释的很到位!
回复 支持 反对

使用道具 举报

0

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
288
金钱
288
注册时间
2016-4-8
在线时间
51 小时
发表于 2016-12-16 14:45:17 | 显示全部楼层
非常感谢!!正好遇上需要用到。
回复 支持 反对

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-7-14
在线时间
44 小时
发表于 2016-12-18 22:48:46 | 显示全部楼层
楼主你好,我看到mpu9250的数据手册中说mpu9250有两种通讯方式I2C与SPI,但是我有一个疑问。在芯片的引脚定义中没有定义哪个引脚用于区分什么时候使用I2C通讯,因为我看到一般同时支持I2C与SPI通讯的芯片,一般会有一个引脚用于区分某一时刻芯片使用哪种协议进行通讯,比如当为为高电平时使用I2C,当为低电平时使用SPI。但是MPU9250没有这个引脚,那么什么时候使用SPI通讯,什么时候使用I2C如何进行区分。那么怎么才能确保不发生混乱,及在使用I2C时确保芯片不同时使用SPI,或者在使用SPI时芯片不同时使用I2C。谢谢
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2016-10-20
在线时间
35 小时
发表于 2016-12-20 00:22:21 | 显示全部楼层
aimjoe 发表于 2016-12-18 22:48
楼主你好,我看到mpu9250的数据手册中说mpu9250有两种通讯方式I2C与SPI,但是我有一个疑问。在芯片的引脚定 ...

仔细看看PDF,上面写得很详细的
I2C.jpg
I2C1.jpg
SPI.jpg
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 00:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表