STM32MP1 自举程序编程:USB DFU/USART 协议全解析
实战经验 | 如何配置STM32MP257的RMII Switch
OpenSTLinux 6.1发布:M33-TD加持+安全升级,STM32MPU开发效率翻倍!
STM32MP135 MP157 MP257 CoreMark移植&&跑分对比&&多核心负载不均衡问题排查与解决
实战经验 | 1小时在STM32MPU上运行YOLOv8——训练篇
实战经验 | 1小时在STM32MPU上运行YOLOv8——训练篇
利用STM32MP1和STM32MP2为嵌入式Linux提供有效的安全措施:供当今决策者参考的3条宝贵经验
有奖直播 | STM32MP2x 资源隔离架构 (RIF) 介绍与使用
白皮书下载|边缘 AI 变革:MCU集成 NPU 的破局与领航
OpenSTLinux:为STM32 MPU生态系统带来超强助力
微信公众号
手机版
1 P6 y* S; K: A) q6 \! v2 w
这里有错字
谢谢,我就是个白字布袋。
如果是spi方式推荐你看看这里:http://hom.hackpad.com/SmartIMU-E9zzbSI7QyK。文件可以在这里下载:http://github.com/Hom-Wang/SmartIMU 我暂时没有试过它的算法。但是我看过他的调试记录,个人觉得,这朋友还是挺严谨的,应该可以读取。我可能忙完算法和测试之后,试试添加SPI。+ E2 ^( N- d8 x! a9 {7 J, g
但问题是I2C融合之后的更新的速率能够达到200hz这还不够吗?当然有时候有利用使用SPI的。$ q- i2 g* b3 c' j7 ]
个人之见:SPI读取并不难,对于姿态传感器最难的是算法.0 B! O2 O. f. B3 t$ ?
9 b3 c$ V7 e! t' J. n5 `$ u c/ ~5 w
|, V4 {% R# V6 l' n# W: c
还有朋友,我才不是什么大师,我其实也只能算是beginner。我的帖子有问题你直接指正,谢谢、
你好,这个我已经参考过了,同样没法读取磁力计的数据!
虽然I2C可以完成,但是如果有SPI的方式,我觉得是SPI更好,毕竟读取' Q/ b- \# z. z( u$ N
速度比I2C要快。5 K9 ~- U( H' ?" V. ?
200hz是可以,不过如果通过SPI来加快单次的通信速率就更好了!
但是在代码里面看,也确实是转成了这种模式," W" Q) z: `+ r" j! A' \+ _/ X
这个是写入到off set 寄存器里面去,但是如果是把这个偏移值带入到dmp中去,也就是8 k" a1 h' F) Q
dmp_set_gyro_bias(gyro_bias);dmp_set_accel_bias(accel_bias); 的时候,我看到的一个% l s" F( }; O7 L# {
别的代码是+ _$ I* Q% Z- A4 R4 T. p$ R
int result;
long gyro_bias[3], accel_bias[3]; % `! l9 C6 l% i, V, ?) e; j
result = mpu_run_self_test(gyro_bias, accel_bias);
if (result == 0x07) D1 `( L: y# _. L0 T. C
{
/* Test passed. We can trust the gyro data here, so let's push it down to the DMP.*/
float gyro_sens;4 N$ Q8 ?" ]8 O: I1 L% E
unsigned short accel_sens;6 b* Q+ } e# }, A9 U1 H: ]* f
mpu_get_gyro_sens(&gyro_sens);
gyro_bias[0] = (long)(gyro_bias[0] * gyro_sens);9 q# P; J8 x6 w) D, e# `
gyro_bias[1] = (long)(gyro_bias[1] * gyro_sens);$ D) O0 R7 ~' H4 N6 \& ]8 v9 ?/ p* q
gyro_bias[2] = (long)(gyro_bias[2] * gyro_sens);
dmp_set_gyro_bias(gyro_bias); * x/ S2 |5 d/ t0 B8 \! ~7 l
mpu_get_accel_sens(&accel_sens);1 T, L* A0 b8 f& [
accel_bias[0] *= accel_sens;" H; U1 \7 T! ^7 z7 ~& @
accel_bias[1] *= accel_sens;
accel_bias[2] *= accel_sens;6 i' @% ]6 o" ]# o+ s/ q, r/ {
dmp_set_accel_bias(accel_bias);
return 0;7 u3 q" a( v2 g2 e9 l
}
else, s! S [; t( M! |0 D' q
return 1;- B7 g6 u; C" j' L; O w% a# L
我比较愚笨,我反复比较了这个函数,在mpu_run_self_test(gyro_bias, accel_bias); 中获得的gyro_bias, accel_bias是q16格式的,然后那个
dmp_set_gyro_bias(gyro_bias);dmp_set_accel_bias(accel_bias); 要求输入的参数也是q16,而且我实在想不明白那里获得偏移的时候,获得的q16格式的数,乘以一个范围值做什么用,费解这里,,还是说人家这里就是错的,,上面的代码是原子的开发板里面的一段截取的代码,我没用,给注释掉了,换成把偏移存进去off set寄存器里面了,
我没有测试过hom的方案,但是我记忆中他的硬件连接的的确是SPI。我又看了一般片子的PS,MPU9250内部集成的是AK8963。AK8963是I2C的,但是不知道Invensense在封装的时候是怎么处理的。7 K3 d; J p% ?* }/ m
但是请看下面的图,它让我似乎明白了些东西。但还需要实验验证。
注意看图中ACC和Gyro与compass的区别。Got it?
实际上访问Acc和Gyro读取的直接是内部寄存器,用SPI和I2C都行。但是Compass却不是。它使用的I2C的辅助接口来连接的。在SPI当作通讯接口时,MPU内部实际上是通过I2C来和Compass通讯的。但是是否是自动的呐?读取的数据写到了哪里呐?必须再深入了解。今天有些累了,先这样。回头在看文档做实验。/ F7 ^7 h8 _/ n2 H. {) ^
我也看过,官方库i2c是读取了地磁数据的,地磁数据是通过bypass模式,把ak8xxx磁力计直接当作另一个器件,通过它的地址来读取的,而使用spi模式 只能通过内部i2c matster模块来读取,我试过无数方法,从来没有读过正常值,唯一有一次只能读到了ID号,其他数据都不行
那我回头试试,按道理SPI比I2C更容易读取。先读一下生数据试试。hom wang的就是通过SPI读取的。
我参考过他的做过一版PCB,因为这个问题没解决,我换用了MPU6500+HMC5983,后来陀螺仪和加表我改用了MAX21105,正在打样