你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

F4-Discovery连接MPU9250【MD6.12 keil移植】 精华  

[复制链接]
watershade 发布时间:2015-8-8 14:46
阅读主题, 点击返回1楼
赞 1 收藏 12 评论117 发布时间:2015-8-8 14:46
117个回答
motianlun1111 回答时间:2015-8-22 02:04:16
又重新看了一晚上,才慢慢屡清楚思路了,这个mpl 原来是6.12新增的东西,它是用来做9轴融合的,然后它也能有3轴融合,6轴融合,当然3, 6轴的融合用dmp自己就能完成了,此外mpl提供了很多校准和补偿的应用函数api,这个是很生猛的,还有很关键的一点,提供了校准数据如何保持和重新下载的功能,这些都是很厉害的,望有意的朋友一起学习分享,,
anny 回答时间:2015-8-22 08:17:50
起初在的测试是在IAR上测试的,但是个人更喜欢keil上的全局搜索功能,就将工程一直到keil,以便后续工程的迁移% k# c4 \, h4 W* w7 X$ Q3 p
这里有错字
watershade 回答时间:2015-8-22 12:38:21
anny 发表于 2015-8-22 08:17
& ^% Z* I4 `1 U8 Y1 Q2 e7 ]起初在的测试是在IAR上测试的,但是个人更喜欢keil上的全局搜索功能,就将工程一直到keil,以便后续工程的 ...

, I7 }, D. P1 T/ M3 K谢谢,我就是个白字布袋。
党国特派员 回答时间:2015-8-22 14:59:40
没有任何问题。。。 null - 副本 - 副本 - 副本.png null - 副本 - 副本.png null - 副本 (3).png null.png null - 副本 - 副本 (2).png
Inc_brza 回答时间:2015-8-22 15:55:53
大师你好,请问有没有用SPI方式读过9250呢,IIC不是很难,关键是SPI,网上基本80%以上的人都没法用SPI读取磁力计,理所当然也没能运行他的DMP!
watershade 回答时间:2015-8-22 17:37:20
Inc_brza 发表于 2015-8-22 15:555 Q. I4 ^4 n) g% K) ?) }# k$ h5 v& `
大师你好,请问有没有用SPI方式读过9250呢,IIC不是很难,关键是SPI,网上基本80%以上的人都没法用SPI读取 ...

1 t* \' k  p9 I# S  Q# X如果是spi方式推荐你看看这里:http://hom.hackpad.com/SmartIMU-E9zzbSI7QyK。文件可以在这里下载:http://github.com/Hom-Wang/SmartIMU 我暂时没有试过它的算法。但是我看过他的调试记录,个人觉得,这朋友还是挺严谨的,应该可以读取。我可能忙完算法和测试之后,试试添加SPI。
  b1 H. U5 i4 H' k5 g% b9 B; Q! L' h1 G但问题是I2C融合之后的更新的速率能够达到200hz这还不够吗?当然有时候有利用使用SPI的。/ [7 F4 o/ F9 Z5 O* X
个人之见:SPI读取并不难,对于姿态传感器最难的是算法.
1 [4 v. v" a  t: d5 b9 j9 ?* ]+ z/ X5 {% B
8 p# Z0 P8 n+ m/ S
还有朋友,我才不是什么大师,我其实也只能算是beginner。我的帖子有问题你直接指正,谢谢、
Inc_brza 回答时间:2015-8-22 18:58:41
watershade 发表于 2015-8-22 17:37
' ]6 j  g# t2 N; `8 r9 y5 J4 u) C如果是spi方式推荐你看看这里:http://hom.hackpad.com/SmartIMU-E9zzbSI7QyK。文件可以在这里下载:http ...
5 `5 R/ L0 A" s4 J; X8 y
你好,这个我已经参考过了,同样没法读取磁力计的数据!7 D1 n7 V7 \  R8 p
虽然I2C可以完成,但是如果有SPI的方式,我觉得是SPI更好,毕竟读取
! ?; Z& e3 t: ~9 _速度比I2C要快。- h$ e6 T% ^% c+ ^
200hz是可以,不过如果通过SPI来加快单次的通信速率就更好了!
motianlun1111 回答时间:2015-8-22 22:19:33
不知道这里有没有仔细看过代码的人, 捕获.JPG ,这里写的要是把偏移值写到off set寄存器里面去的话,要转化成+-1000dps的格式,4 O: I) U# C  t9 o

% `' r% M3 p+ c, O
+ `$ ?5 x* M  w$ c& i' Q5 O但是在代码里面看,也确实是转成了这种模式,
  B* K1 W3 a; X( h5 b 捕获2.JPG
0 `6 ~) ~& c8 W( E& u8 b4 @, N9 b这个是写入到off set 寄存器里面去,但是如果是把这个偏移值带入到dmp中去,也就是, B: f7 k! K3 F) f  `) g" Q
dmp_set_gyro_bias(gyro_bias);dmp_set_accel_bias(accel_bias); 的时候,我看到的一个
- E; @, W1 c, B别的代码是0 g2 o- m$ y" N' V! d
int result;
5 y% Q1 B4 ^, D; a' W& |" ?        long gyro_bias[3], accel_bias[3]; * W' U4 _# c' Z$ ^6 S1 K1 u, U
        result = mpu_run_self_test(gyro_bias, accel_bias); 6 W$ u  K9 _- z+ ^8 ~- [* p
        if (result == 0x07) / P6 {, P- J1 o  V" Y. M
        {6 u1 L. k8 w0 E/ A# B
                /* Test passed. We can trust the gyro data here, so let's push it down to the DMP.*/         # a( P4 B2 W2 `# c" e+ E0 h
                float gyro_sens;4 p* X4 ]1 X, E2 _# S& J1 x1 ?$ {
                unsigned short accel_sens;
# E1 N/ B5 |8 R" W! b' [1 A                mpu_get_gyro_sens(&gyro_sens);   $ ~3 w- t$ q  Z% V8 K
                                                   . H$ w: N" W4 D# C
                gyro_bias[0] = (long)(gyro_bias[0] * gyro_sens);# t# j( o4 r$ C
                gyro_bias[1] = (long)(gyro_bias[1] * gyro_sens);% J- I4 C0 Z5 G2 t. X
                gyro_bias[2] = (long)(gyro_bias[2] * gyro_sens);
+ i8 `+ |5 b& Z8 a5 S* r- a                dmp_set_gyro_bias(gyro_bias);   - A' q8 d; a9 Y0 i, \8 F' i/ P' X1 O0 p
                mpu_get_accel_sens(&accel_sens);
9 `( X$ B3 [: m) K* e) X: @                accel_bias[0] *= accel_sens;& |+ W$ j) f2 p, U
                accel_bias[1] *= accel_sens;
$ n$ H7 h1 S) f! c5 I                accel_bias[2] *= accel_sens;
9 Q2 M3 e( q) ]$ J* O" X                dmp_set_accel_bias(accel_bias); 9 O( B( [1 n( D, k: H9 y

+ }; O) |! w, d- V" b+ d                return 0;- M7 U3 U! [. q4 J. G
        }
1 ~0 o( A5 a* z$ N8 E0 N        else! C2 q3 m( h5 ]) ]$ S
                return 1;0 _  z' z0 c: p/ I, v! {8 k' W
1 i/ U6 \- k* O. Z) R8 M0 c& T
我比较愚笨,我反复比较了这个函数,在mpu_run_self_test(gyro_bias, accel_bias); 中获得的gyro_bias, accel_bias是q16格式的,然后那个+ M' O  s& F( x; J; n( n# y4 l
dmp_set_gyro_bias(gyro_bias);dmp_set_accel_bias(accel_bias); 要求输入的参数也是q16,而且我实在想不明白那里获得偏移的时候,获得的q16格式的数,乘以一个范围值做什么用,费解这里,,还是说人家这里就是错的,,上面的代码是原子的开发板里面的一段截取的代码,我没用,给注释掉了,换成把偏移存进去off set寄存器里面了,
/ f0 d* a! _/ y4 W0 N3 F! t$ P  D
motianlun1111 回答时间:2015-8-22 23:22:40
刚刚试着如果用上面的代码,不乘以那个范围值,会发现z轴飘的很厉害,漂移了24度之多才会稳定住,这个又是为啥,但是上面的代码实在感觉不到理由来着,,," W" C! c  [, @5 w! K
watershade 回答时间:2015-8-23 01:41:07
Inc_brza 发表于 2015-8-22 18:582 L! w9 h0 y& G# @1 g( u0 i7 ^
你好,这个我已经参考过了,同样没法读取磁力计的数据!# h6 r& R2 X% g( o1 o
虽然I2C可以完成,但是如果有SPI的方式,我觉得 ...

' J$ G. D2 k. w6 p8 O我没有测试过hom的方案,但是我记忆中他的硬件连接的的确是SPI。我又看了一般片子的PS,MPU9250内部集成的是AK8963。AK8963是I2C的,但是不知道Invensense在封装的时候是怎么处理的。6 m) S4 M2 ?/ |% L3 y2 M* J
但是请看下面的图,它让我似乎明白了些东西。但还需要实验验证。 MPU9250结构.PNG
. H2 l" @5 q9 \& u; F: V- c5 b) u+ N8 n' m& y- n
注意看图中ACC和Gyro与compass的区别。Got it?
: F% \/ y  q6 j, J% t) B实际上访问Acc和Gyro读取的直接是内部寄存器,用SPI和I2C都行。但是Compass却不是。它使用的I2C的辅助接口来连接的。在SPI当作通讯接口时,MPU内部实际上是通过I2C来和Compass通讯的。但是是否是自动的呐?读取的数据写到了哪里呐?必须再深入了解。今天有些累了,先这样。回头在看文档做实验。- w4 D2 b) Z" W7 B2 D
ppprrr 回答时间:2015-8-24 11:39:04
楼主您好,我想问一下 使用matster i2c模式读取地磁数据 你有尝试过吗
ppprrr 回答时间:2015-8-24 12:10:40
Inc_brza 发表于 2015-8-22 18:58
" }* p3 P% o5 p4 t' B4 H# t* m你好,这个我已经参考过了,同样没法读取磁力计的数据!
' a/ D/ {; o: `1 c" J0 w9 @虽然I2C可以完成,但是如果有SPI的方式,我觉得 ...

% ^) k: `  d) q: W我也看过,官方库i2c是读取了地磁数据的,地磁数据是通过bypass模式,把ak8xxx磁力计直接当作另一个器件,通过它的地址来读取的,而使用spi模式 只能通过内部i2c matster模块来读取,我试过无数方法,从来没有读过正常值,唯一有一次只能读到了ID号,其他数据都不行
watershade 回答时间:2015-8-24 13:49:22
priestyoyo 发表于 2015-8-24 12:10
- M8 ?# K! [0 Y# l. A我也看过,官方库i2c是读取了地磁数据的,地磁数据是通过bypass模式,把ak8xxx磁力计直接当作另一个器件 ...
6 c  u8 f/ K1 U. \% t/ r  z
那我回头试试,按道理SPI比I2C更容易读取。先读一下生数据试试。hom wang的就是通过SPI读取的。
ppprrr 回答时间:2015-8-24 15:13:23
watershade 发表于 2015-8-24 13:49
8 F& N" X' r3 i2 [* l( R2 f+ t+ \" n那我回头试试,按道理SPI比I2C更容易读取。先读一下生数据试试。hom wang的就是通过SPI读取的。 ...
# `  O' U- s/ w3 H  m# \% k
我参考过他的做过一版PCB,因为这个问题没解决,我换用了MPU6500+HMC5983,后来陀螺仪和加表我改用了MAX21105,正在打样
watershade 回答时间:2015-8-24 22:31:52
priestyoyo 发表于 2015-8-24 15:13( n7 W7 O: R7 x6 E$ |
我参考过他的做过一版PCB,因为这个问题没解决,我换用了MPU6500+HMC5983,后来陀螺仪和加表我改用了MAX21 ...

6 a% J' h5 Q9 ]现在还是不清楚你遇到的具体是什么问题?是通过SPI不能读取原始数据吧? Hom Wang 提供的程序不能工作吗?
  E8 {* m0 k9 k, T- P7 V还是说你需要利用SPI读取原始数据后,再使用别的算法不能实现fusionn?
( t( L' x$ W9 u/ t" ?7 e; {# z* ^  Q  R2 ~
如果是SPI读取不了原始数据的话,这个周末我做一下试验。但是可以提供你一个方法,你先做一个UART转SPI的小程序。通过UART发送指令,然后由SPI把指令转发到传感器上。然后传感器通过SPI读回的指令再由UARTg返回。这样你就可以用串口控制程序来模拟SPI收发。这样你也可以一天一天的指令测试了。
7 P  h, I$ Q6 z, v2 F
3 M% p) Q1 o1 w还有你说的SPI读取不了地址,这样的话我觉得你的连线有没有问题?Hom Wang的板子采用的那种那种连接方式似乎很有创意,但是将板子固定上而且固定紧是个大问题。
; d; |- C& P6 j8 Q  ^( Y
! j; n2 M/ o$ B  ^% i我啰里啰唆这么多,请别烦。因为我有些搞不清状况,见谅!

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版