OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
楼主: 小白来学习

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

  [复制链接]
Hysen 该用户已被删除
发表于 2016-12-26 20:19:02 | 显示全部楼层
正点原子逻辑分析仪DL16劲爆上市
回复 支持 反对

使用道具 举报

3

主题

84

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2871
金钱
2871
注册时间
2016-6-17
在线时间
320 小时
发表于 2017-1-1 13:39:01 | 显示全部楼层
回复 支持 反对

使用道具 举报

源先生 该用户已被删除
发表于 2017-1-12 16:56:30 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

281

主题

310

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3436
金钱
3436
注册时间
2017-1-13
在线时间
274 小时
发表于 2017-1-14 12:18:04 | 显示全部楼层
感谢分享,好东西!
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-5-16
在线时间
4 小时
发表于 2017-1-20 21:22:43 | 显示全部楼层
hjw 发表于 2016-8-30 10:55
我现在读出原始数据了,但是想9轴数据融合,使偏航角不飘,但是融合这方面处理问题,单位也不知道怎么换 ...

你好,你磁力计的数据是怎么读出来的呢?我摸索了好久还是不行,加速度计和陀螺仪都是可以的。磁力计数据为零。麻烦帮忙解答?
回复 支持 反对

使用道具 举报

3

主题

18

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2016-7-23
在线时间
31 小时
 楼主| 发表于 2017-2-14 01:13:06 | 显示全部楼层
源先生 发表于 2017-1-12 16:56
楼主我在你的程序中发现一个问题
mpu_value.Mag[0]=((BUF[1]8)+1);                //灵敏度纠正 公式见/RM-MPU-9250A-00 ...

感谢指正错误,零漂问题手册上的是解决不了的,也不是用来解决零漂的,这个问题你百度就能解决
回复 支持 反对

使用道具 举报

3

主题

18

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2016-7-23
在线时间
31 小时
 楼主| 发表于 2017-2-14 01:15:25 | 显示全部楼层
Hysen 发表于 2016-12-26 20:19
lz,get了你的程序以后,磁力计的数据有时可以读出,有时读不出,遇到读不出的情况复位一下STM32可以解决( ...

没出现过,我猜是程序结构的问题
回复 支持 反对

使用道具 举报

3

主题

18

帖子

1

精华

中级会员

Rank: 3Rank: 3

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

这,一般芯片都有控制寄存器的,配置一下就可以选择模式
回复 支持 反对

使用道具 举报

guanyuanzi 该用户已被删除
发表于 2017-3-22 19:17:06 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

蓝色布丁 该用户已被删除
发表于 2017-4-9 00:33:22 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

33

主题

310

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2016-12-31
在线时间
63 小时
发表于 2017-4-9 09:14:53 | 显示全部楼层
hjw 发表于 2016-8-30 10:55
我现在读出原始数据了,但是想9轴数据融合,使偏航角不飘,但是融合这方面处理问题,单位也不知道怎么换 ...

同求,现在那个陀螺仪和加速度计是用的DMP得到的,但是外接一个磁力计,怎样将这些融合在一起呀
回复 支持 反对

使用道具 举报

33

主题

310

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2016-12-31
在线时间
63 小时
发表于 2017-4-9 09:33:58 | 显示全部楼层
小白来学习 发表于 2016-9-4 14:46
1;不要用原始数据参与融合。2;单位换算问题我觉得解释到这种地步,真的没啥可说的的了。发的工程里也有da ...

楼主厉害
回复 支持 反对

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
发表于 2017-4-9 09:41:08 | 显示全部楼层
mark!学习!
电子人生!
回复 支持 反对

使用道具 举报

源先生 该用户已被删除
发表于 2017-4-10 17:34:25 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

19

主题

80

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1189
金钱
1189
注册时间
2016-7-23
在线时间
180 小时
发表于 2017-4-11 15:10:04 | 显示全部楼层
顶,66666666,
回复 支持 反对

使用道具 举报

3

主题

18

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2016-7-23
在线时间
31 小时
 楼主| 发表于 2017-4-13 14:41:24 | 显示全部楼层
源先生 发表于 2017-4-10 17:34
楼主,虽然我的问题基本得到解决,但是用DMP读出来Z轴的旋转角度会一直在飘,请问楼主有遇到过吗?

还没用过dmp,不清楚
回复 支持 反对

使用道具 举报

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

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2016-9-27
在线时间
2 小时
发表于 2017-5-18 13:15:16 | 显示全部楼层
楼主的呢个,延时等待 MPU9250读取磁力计的做法,实在是我没法忍受
回复 支持 反对

使用道具 举报

5

主题

14

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2017-3-24
在线时间
12 小时
发表于 2017-8-14 11:36:46 | 显示全部楼层
你好,源码能给我发一遍吗?下载不了515548725@qq.com
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2018-1-17
在线时间
1 小时
发表于 2018-1-17 20:48:29 | 显示全部楼层
楼主,有个问题想请教一下,我用了你的程序在F103上成功用SPI读出了地磁计,但是移植到F405上就只能读出陀螺仪和加速度计,不能读出地磁计了,你知道是什么原因吗?我已经试过加大地磁计读取的延迟时间了,还是没读出来
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

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

你好!我使用这个程序读磁力计的地址也都是0.你是怎么解决的,能跟我说一说么!
回复 支持 反对

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3447
金钱
3447
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-1-21 22:09:57 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2018-1-20
在线时间
3 小时
发表于 2018-1-24 17:00:15 | 显示全部楼层
非常感谢您的无私分享!请问,在处理加速度跟陀螺数据时,为什么一个要除以16.4,一个除以164呢。
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2018-7-5
在线时间
5 小时
发表于 2018-7-5 16:20:48 | 显示全部楼层
ahzhanghuaiyu 发表于 2016-12-7 22:36
**** 作者被禁止或删除 内容自动屏蔽 ****

你好,请问你最后解决问题了吗?可否请教一下?
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2018-7-5
在线时间
5 小时
发表于 2018-7-5 16:24:21 | 显示全部楼层
HCY19960917 发表于 2018-1-17 20:48
楼主,有个问题想请教一下,我用了你的程序在F103上成功用SPI读出了地磁计,但是移植到F405上就只能读出陀 ...

你好,请问现在这个问题你解决了吗?我也是这个问题,用F405取数据,只能读出来加速度和陀螺仪的,读不出来磁力计的
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2018-3-29
在线时间
8 小时
发表于 2018-8-1 11:00:21 | 显示全部楼层
zhaidandan 发表于 2018-7-5 16:24
你好,请问现在这个问题你解决了吗?我也是这个问题,用F405取数据,只能读出来加速度和陀螺仪的,读不出 ...

请问您的问题解决了吗,我用的是F407,目前情况是陀螺仪和加速度都有数据出来,但是磁力计的什么数据都没有,都是0
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2018-7-5
在线时间
5 小时
发表于 2018-8-15 09:08:48 | 显示全部楼层
三秋桂子 发表于 2018-8-1 11:00
请问您的问题解决了吗,我用的是F407,目前情况是陀螺仪和加速度都有数据出来,但是磁力计的什么数据都没 ...

解决了,在读磁力计接口里面加大了延时
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2018-10-28
在线时间
1 小时
发表于 2018-10-30 08:13:36 | 显示全部楼层
楼主你好,小白请教一下,我把这个程序用keil5烤进STM32的开发板里了,MPU9250也连上开发板了,然后怎么查看读出来的数据?在keil的watch2窗口看每一项都是零,都读不出来,用串口助手看了也没有输出值,求教
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2018-12-7
在线时间
11 小时
发表于 2018-12-10 16:35:10 来自手机 | 显示全部楼层
楼主你好,我用的磁力计是mag3110的,读出的数据,全是正的,且y轴变化的幅度总是不大,这是什么原因?求大家帮帮忙
回复 支持 反对

使用道具 举报

50

主题

385

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1126
金钱
1126
注册时间
2014-8-24
在线时间
146 小时
发表于 2018-12-17 23:18:45 | 显示全部楼层
mark一下,最近正好在搞
找一份喜欢的工作,这样每天工作的8个小时是快乐的。 找一个喜欢的人,这样每天工作之外的16个小时也是快乐的。
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2018-2-28
在线时间
1 小时
发表于 2018-12-18 11:10:47 | 显示全部楼层
资料经典
回复 支持 反对

使用道具 举报

15

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
837
金钱
837
注册时间
2015-2-12
在线时间
348 小时
发表于 2018-12-18 13:35:54 | 显示全部楼层
先下载,待有空再研究。谢谢楼主!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2018-7-29
在线时间
2 小时
发表于 2019-1-10 14:28:09 | 显示全部楼层
你好,我把这个程序移植到了F407上面,我只是仅仅读取加速度和陀螺仪速度都很慢,这是为什么?您那边的读取1s大约能循环读取多少次数据呢?我这儿我估计1s也就能够把ACCEL和GYRO读取两次出来,太慢了
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2018-4-5
在线时间
20 小时
发表于 2019-1-29 20:04:41 | 显示全部楼层
233366
回复 支持 反对

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2019-4-2
在线时间
33 小时
发表于 2019-4-4 08:26:51 | 显示全部楼层
本帖最后由 openhui 于 2019-4-4 08:43 编辑

非常感谢楼主  可以成功的读出九个轴的数据了 有几点疑问麻烦还请指教一下
1.看到您说的姿态解算的流程,我在对数据 进行了均值滤波,去除一下噪声。在MATLAB上看下曲线变化,当变化的幅度不大时候,还是可以取得不错的效果,但是变化幅度大了后,有时候会把数据峰值直接减少很多。您是用的那种滤波方法呢?

中间那块 就是动作幅度很快

中间那块 就是动作幅度很快


2.加速度数据的计算
mpu_value.Accel[1]/=164;
这个164是怎么得来的呢?如果量程选择是16g 是不是 分辨率等于32768/16?
但是 我用mpu_value.Accel[1]/=31768/16; 得出的加速度有感觉不是很对.....

3.最重要的一点

我试着用Mahony融合算法 对换算后数据 进行了下姿态解算
得到的三个角度度数的值 特别小
下面是某一组角度值
roll=0.109
pitch=0.063
yaw=-0.165
劳烦您可以看一下吗    非常 非常感谢
[mw_shl_code=c,true]#include "MahonyAHRS.h"
#include "math.h"

float Angle[3];


//-------------------------------------------------------------------------------------------
// Definitions

#define sampleFreq     125.0f          // sample frequency in Hz
#define twoKpDef       (2.0f * 0.5f) // 2 * proportional gain
#define twoKiDef       (2.0f * 0.0f) // 2 * integral gain


//============================================================================================
// Functions

//-------------------------------------------------------------------------------------------
// AHRS algorithm update

//Mahony::Mahony() {
float  invSampleFreq = 1.0f/sampleFreq;
float        twoKp = twoKpDef;
float  twoKi = twoKiDef;
float        q0 = 1.0f;
float        q1 = 0.0f;
float        q2 = 0.0f;
float        q3 = 0.0f;
float roll = 0.0f;
float pitch = 0.0f;
float yaw = 0.0f;
float        integralFBx = 0.0f;  
float        integralFBy = 0.0f;
float        integralFBz = 0.0f;
//        anglesComputed = 0;
//}

void Mahony_update(float gx, float gy, float gz, float ax, float ay, float az, float mx, float my, float mz) {
  float recipNorm;
  float q0q0, q0q1, q0q2, q0q3, q1q1, q1q2, q1q3, q2q2, q2q3, q3q3;  
  float hx, hy, bx, bz;
  float halfvx, halfvy, halfvz, halfwx, halfwy, halfwz;
  float halfex, halfey, halfez;
  float qa, qb, qc;

  // Use IMU algorithm if magnetometer measurement invalid (avoids NaN in magnetometer normalisation)
  if((mx == 0.0f) && (my == 0.0f) && (mz == 0.0f)) {
   Mahony_updateIMU(gx, gy, gz, ax, ay, az);
    return;
  }

  // Convert gyroscope degrees/sec to radians/sec
  gx *= 0.0174533f;
  gy *= 0.0174533f;
  gz *= 0.0174533f;
  
  // Compute feedback only if accelerometer measurement valid (avoids NaN in accelerometer normalisation)
  if(!((ax == 0.0f) && (ay == 0.0f) && (az == 0.0f))) {

    // Normalise accelerometer measurement
    recipNorm = invSqrt(ax * ax + ay * ay + az * az);
    ax *= recipNorm;
    ay *= recipNorm;
    az *= recipNorm;     

    // Normalise magnetometer measurement
    recipNorm = invSqrt(mx * mx + my * my + mz * mz);
    mx *= recipNorm;
    my *= recipNorm;
    mz *= recipNorm;   

    // Auxiliary variables to avoid repeated arithmetic
    q0q0 = q0 * q0;
    q0q1 = q0 * q1;
    q0q2 = q0 * q2;
    q0q3 = q0 * q3;
    q1q1 = q1 * q1;
    q1q2 = q1 * q2;
    q1q3 = q1 * q3;
    q2q2 = q2 * q2;
    q2q3 = q2 * q3;
    q3q3 = q3 * q3;   

    // Reference direction of Earth's magnetic field
    hx = 2.0f * (mx * (0.5f - q2q2 - q3q3) + my * (q1q2 - q0q3) + mz * (q1q3 + q0q2));
    hy = 2.0f * (mx * (q1q2 + q0q3) + my * (0.5f - q1q1 - q3q3) + mz * (q2q3 - q0q1));
    bx = sqrt(hx * hx + hy * hy);
    bz = 2.0f * (mx * (q1q3 - q0q2) + my * (q2q3 + q0q1) + mz * (0.5f - q1q1 - q2q2));

    // Estimated direction of gravity and magnetic field
    halfvx = q1q3 - q0q2;
    halfvy = q0q1 + q2q3;
    halfvz = q0q0 - 0.5f + q3q3;
   
    halfwx = bx * (0.5f - q2q2 - q3q3) + bz * (q1q3 - q0q2);
    halfwy = bx * (q1q2 - q0q3) + bz * (q0q1 + q2q3);
    halfwz = bx * (q0q2 + q1q3) + bz * (0.5f - q1q1 - q2q2);  
  
    // Error is sum of cross product between estimated direction and measured direction of field vectors
    halfex = (ay * halfvz - az * halfvy) + (my * halfwz - mz * halfwy);
    halfey = (az * halfvx - ax * halfvz) + (mz * halfwx - mx * halfwz);
    halfez = (ax * halfvy - ay * halfvx) + (mx * halfwy - my * halfwx);

    // Compute and apply integral feedback if enabled
    if(twoKi > 0.0f) {
      integralFBx += twoKi * halfex * invSampleFreq;  // integral error scaled by Ki
      integralFBy += twoKi * halfey * invSampleFreq;
      integralFBz += twoKi * halfez * invSampleFreq;
      gx += integralFBx;  // apply integral feedback
      gy += integralFBy;
      gz += integralFBz;
    }
    else {
      integralFBx = 0.0f; // prevent integral windup
      integralFBy = 0.0f;
      integralFBz = 0.0f;
    }

    // Apply proportional feedback
    gx += twoKp * halfex;
    gy += twoKp * halfey;
    gz += twoKp * halfez;
  }
  
  // Integrate rate of change of quaternion
  gx *= (0.5f * invSampleFreq);   // pre-multiply common factors
  gy *= (0.5f * invSampleFreq);
  gz *= (0.5f * invSampleFreq);
  qa = q0;
  qb = q1;
  qc = q2;
  q0 += (-qb * gx - qc * gy - q3 * gz);
  q1 += (qa * gx + qc * gz - q3 * gy);
  q2 += (qa * gy - qb * gz + q3 * gx);
  q3 += (qa * gz + qb * gy - qc * gx);
  
  // Normalise quaternion
  recipNorm = invSqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);
  q0 *= recipNorm;
  q1 *= recipNorm;
  q2 *= recipNorm;
  q3 *= recipNorm;
        
        Mahony_computeAngles(q0,q1,q2,q3);
}

//-------------------------------------------------------------------------------------------
// IMU algorithm update

void Mahony_updateIMU(float gx, float gy, float gz, float ax, float ay, float az) {
  float recipNorm;
  float halfvx, halfvy, halfvz;
  float halfex, halfey, halfez;
  float qa, qb, qc;

  // Convert gyroscope degrees/sec to radians/sec  将陀螺仪 度数/秒转换为弧度/秒
  gx *= 0.0174533f;
  gy *= 0.0174533f;
  gz *= 0.0174533f;
  
  // Compute feedback only if accelerometer measurement valid (avoids NaN in accelerometer normalisation) 仅当加速度计测量有效时才计算反馈(避免加速度计归一化中的NaN)
  if(!((ax == 0.0f) && (ay == 0.0f) && (az == 0.0f))) {

    // Normalise accelerometer measurement
    recipNorm = invSqrt(ax * ax + ay * ay + az * az); // invSqrt(value) =1.0/sqrt(value)  归一化
    ax *= recipNorm;
    ay *= recipNorm;
    az *= recipNorm;        

    // Estimated direction of gravity and vector perpendicular to magnetic flux  垂直于磁通量的重力和矢量的估计方向 这里有疑问 用四元数表示的旋转矩阵和重力【 0 0 1】相乘后
    halfvx = q1 * q3 - q0 * q2;
    halfvy = q0 * q1 + q2 * q3;
    halfvz = q0 * q0 - 0.5f + q3 * q3;
    //halfvz = q0 * q0 - q1 * q1 - q2 * q2 + q3 * q3;
  
    // Error is sum of cross product between estimated and measured direction of gravity 误差是估计和测量重力方向之间的交叉积之和。
    halfex = (ay * halfvz - az * halfvy);
    halfey = (az * halfvx - ax * halfvz);
    halfez = (ax * halfvy - ay * halfvx);

    // Compute and apply integral feedback if enabled 计算并应用积分反馈(如果启用)
    if(twoKi > 0.0f) {
      integralFBx += twoKi * halfex * invSampleFreq;  // integral error scaled by Ki 用ki表示的积分误差
      integralFBy += twoKi * halfey * invSampleFreq;
      integralFBz += twoKi * halfez * invSampleFreq;
      gx += integralFBx;  // apply integral feedback
      gy += integralFBy;
      gz += integralFBz;
    }
    else {
      integralFBx = 0.0f; // prevent integral windup
      integralFBy = 0.0f;
      integralFBz = 0.0f;
    }

    // Apply proportional feedback 应用比例反馈
    gx += twoKp * halfex;
    gy += twoKp * halfey;
    gz += twoKp * halfez;
  }
  
  // Integrate rate of change of quaternion 四元数积分变化率
  gx *= (0.5f * invSampleFreq);   // pre-multiply common factors 预乘公因式
  gy *= (0.5f * invSampleFreq);
  gz *= (0.5f * invSampleFreq);
  qa = q0;
  qb = q1;
  qc = q2;
  q0 += (- qb * gx - qc * gy - q3 * gz);
  q1 += (qa * gx + qc * gz - q3 * gy);
  q2 += (qa * gy - qb * gz + q3 * gx);
  q3 += (qa * gz + qb * gy - qc * gx);
  
  // Normalise quaternion
  recipNorm = invSqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3); //又对四元数做归一化
  q0 *= recipNorm;
  q1 *= recipNorm;
  q2 *= recipNorm;
  q3 *= recipNorm;
  Mahony_computeAngles(q0,q1,q2,q3);
  //anglesComputed = 1;
}

//-------------------------------------------------------------------------------------------
// Fast inverse square-root
// See: http://en.wikipedia.org/wiki/Fast_inverse_square_root

float invSqrt(float x) {
  float halfx = 0.5f * x;
  float y = x;
  long i = *(long*)&y;
  i = 0x5f3759df - (i>>1);
  y = *(float*)&i;
  y = y * (1.5f - (halfx * y * y));
  return y;
}

//-------------------------------------------------------------------------------------------

void Mahony_computeAngles(float q0,float q1,float q2,float q3)
{
        roll = atan2f(q0*q1 + q2*q3, 0.5f - q1*q1 - q2*q2)*57.29578f;
        pitch = asinf(-2.0f * (q1*q3 - q0*q2))*57.29578f;
        yaw = atan2f(q1*q2 + q0*q3, 0.5f - q2*q2 - q3*q3)*57.29578f;
        //anglesComputed = 1;
        Angle[0]=roll;
        Angle[1]=pitch;
        Angle[2]=yaw;
        
}
[/mw_shl_code]
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2019-4-2
在线时间
1 小时
发表于 2019-4-5 09:25:59 | 显示全部楼层

楼主厉害谢谢分享!好好学习一下
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2019-5-7
在线时间
1 小时
发表于 2019-5-7 15:09:46 | 显示全部楼层
想知道怎么连接的  能告知我吗?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2019-5-7
在线时间
1 小时
发表于 2019-5-7 15:12:01 | 显示全部楼层
因为不是很明白SPI  一直都是适用于IIC的  还有我这边使用IIC读取磁力计的数据旋转Z轴的话,X方向的数据变化范围【-120,65】,这个是正常的吗,为啥我看到网上很多软件显示他们读取出来的数据范围是【-580,490】,为啥我的范围这么小 ,是我哪个地方设置错了吗
回复 支持 反对

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2018-6-24
在线时间
8 小时
发表于 2019-8-22 11:28:26 | 显示全部楼层
厉害了,代码简洁有力,虽然还没有验证
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手入门

积分
0
金钱
0
注册时间
2019-8-8
在线时间
1 小时
发表于 2019-8-22 15:25:14 | 显示全部楼层
6666666666
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手入门

积分
0
金钱
0
注册时间
2019-8-8
在线时间
1 小时
发表于 2019-8-22 15:25:35 | 显示全部楼层
999990000
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2019-6-15
在线时间
7 小时
发表于 2019-9-4 08:54:32 | 显示全部楼层
谢谢!楼主
回复 支持 反对

使用道具 举报

7

主题

39

帖子

0

精华

初级会员

Rank: 2

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

是的,mpu没有引脚区分通信方式,事实上你同样的电路iic和spi都读的出来…… 不过config寄存器有一个位可以用来禁用iic通信方式。
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2019-8-12
在线时间
19 小时
发表于 2020-1-3 18:07:18 | 显示全部楼层
不错的资料,学习一下
回复 支持 反对

使用道具 举报

0

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2019-9-24
在线时间
33 小时
发表于 2020-1-4 08:06:37 来自手机 | 显示全部楼层
mark 谢谢   
回复 支持 反对

使用道具 举报

0

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2019-9-24
在线时间
33 小时
发表于 2020-1-4 08:08:31 来自手机 | 显示全部楼层
mark 谢谢
回复 支持 反对

使用道具 举报

0

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2019-9-24
在线时间
33 小时
发表于 2020-1-4 08:08:57 来自手机 | 显示全部楼层
mark   
回复 支持 反对

使用道具 举报

0

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2019-9-24
在线时间
33 小时
发表于 2020-1-4 17:15:54 | 显示全部楼层
赞           
回复 支持 反对

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2019-5-23
在线时间
44 小时
发表于 2020-3-24 17:40:57 | 显示全部楼层
zhaidandan 发表于 2018-8-15 09:08
解决了,在读磁力计接口里面加大了延时

你好能具体说一下那个函数后面加延时吗?我也遇到了磁力读数为0的问题。分别在IIC读字节函数后头加了1到10毫秒的延时都没用
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2020-5-15
在线时间
10 小时
发表于 2020-6-7 15:10:14 | 显示全部楼层
SPI读取磁力计时,可以使用旁路模式(bypass)?在“void Init_MPU9250(void)”函数中 "MPU9250_Write_Reg(INT_PIN_CFG ,0x30);// INT Pin / Bypass Enable Configuration "。可是我理解的旁路模式是MCU通过I2C直接访问磁力计啊,但是目前的大背景是MCU通过SPI与MPU9250进行通信。所以这里的寄存器设置是不是有问题?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 01:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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