ttsky138 发表于 2013-7-31 15:15:34

STM32 I2C中断 MPU6050 DMP库 源码 还有问题 嘿嘿!

本帖最后由 ttsky138 于 2013-7-31 15:18 编辑

接触MPU6050和四轴还是最近因为一个项目。 四元数,欧拉角,PID啥都不懂啊唉!!!

废话不多说。 我也忘记在那里弄的STM32 DMP库了, 反正是网上。

修改了点点,I2C移植了 “crazyflie四轴飞行器软件部分”的 I2C中断其他没怎么变化, 其实也想把“crazyflie四轴飞行器软件部分”他的数据处理部分移植过来,但是移植完之后发现不太好,很多地方和rtos联系在一起了。PID的系数之类的,而现实又没时间让我 慢慢移植他的系统,以后有时间在弄把

上位机用的是”匿名科技“的   DMP库 读取四元数 转换欧拉角补偿之后 水平很准。 垂直有问题



垂直的角度就是到不了90°啊 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊





平时也不抖动   Algorithm 这个文件夹里面都是移植的“crazyflie四轴飞行器软件部分” 源码 有兴趣的可以看看

工程文件:

crazyflie四轴飞行器软件部分 源码传不上来容量没了。论坛里面就有


那位高手帮我 瞧瞧呐!!!!

另外 请问下 DMP   是不是只有200HZ ??? 我1s最多也就读过188次正确的数值。

ttsky138 发表于 2013-7-31 15:18:12

自己占楼留待编辑!

ttsky138 发表于 2013-7-31 17:18:07

static void run_self_test(void)
{
    int result;
//    char test_packet = {0};
    long gyro, accel;

    result = mpu_run_self_test(gyro, accel);
    if (result == 0x3) {
      /* Test passed. We can trust the gyro data here, so let's push it down
         * to the DMP.
         */
      float sens;
      unsigned short accel_sens;
      mpu_get_gyro_sens(&sens);
      gyro = (long)(gyro * sens);
      gyro = (long)(gyro * sens);
      gyro = (long)(gyro * sens);
      dmp_set_gyro_bias(gyro);
      mpu_get_accel_sens(&accel_sens);
      accel *= accel_sens;
      accel *= accel_sens;
      accel *= accel_sens;
      dmp_set_accel_bias(accel);
                PrintChar("setting bias succesfully ......\n");
    }
        else
        {
                PrintChar("bias has not been modified ......\n");
        }

}

07 该03

yzaka 发表于 2013-8-6 14:24:33

我的到现在还没成功,i2c那里就有问题。帮顶

breakor 发表于 2013-8-6 14:45:41

顶个!!!!!

ttsky138 发表于 2013-8-6 15:21:47

已经好了,90°也正常了,void run_self_test 的result 是3 不应该是7。 不然补偿就没用了{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}

qinkaiabc 发表于 2013-8-6 15:33:54

收藏参考了

hzqlz 发表于 2013-8-6 17:35:29

自己移植到stm32上,模拟I2C,完了mpu_run_self_test(gyro, accel);返回值为0,不进入校准代码段,数据似乎不对,一直在纠结

ttsky138 发表于 2013-8-7 10:14:57

hzqlz 发表于 2013-8-6 17:35 static/image/common/back.gif
自己移植到stm32上,模拟I2C,完了mpu_run_self_test(gyro, accel);返回值为0,不进入校准代码段,数据似乎 ...

佩服,竟然自己移植了

#elif defined MPU6500
    /* For now, this function will return a "pass" result for all three sensors
   * for compatibility with current test applications.
   */
        /*ÏÖÔÚÕâ¸öº¯Êý»á·µ»ØÒ»¸ö²âÊÔͨ¹ýµÄÖµ£¬À´È·±£Ó¦¸Ã³ÌÐòµÄ¼æÈÝÐÔ
        * (¸Ð¾õ¾ÍÊDz¹³¥)       
        */
    get_st_biases(gyro, accel, 0);
    result = 0x7;
#endif

7是不回返回的

    accel_result = accel_self_test(accel, accel_st);
    gyro_result = gyro_self_test(gyro, gyro_st);

    result = 0;
    if (!gyro_result)
      result |= 0x01;
    if (!accel_result)
      result |= 0x02;

0 的话就是角度和和加速度没自检到。

调试看看是那一步 试试??

hzqlz 发表于 2013-8-7 12:59:42

之前已调试过,accel_self_test(accel, accel_st)和gyro_self_test(gyro, gyro_st)返回值都为非零,既陀螺仪与加速度都没过自检。单步调试发现gyro_self_test中如下红色字体的函数读取的寄存器值为非零,即数组tmp非零,继续往下执行,就看不懂他的算法了,也不清楚数组tmp的含义。不知道哪位高手能解答下。
static int gyro_self_test(long *bias_regular, long *bias_st)
{
    int jj, result = 0;
    unsigned char tmp;
    float st_shift, st_shift_cust, st_shift_var;

    if (i2c_read(st.hw->addr, 0x0D, 3, tmp))
      return 0x07;

    tmp &= 0x1F;
    tmp &= 0x1F;
    tmp &= 0x1F;

    for (jj = 0; jj < 3; jj++) {
      st_shift_cust = labs(bias_regular - bias_st) / 65536.f;
      if (tmp) {
            st_shift = 3275.f / test.gyro_sens;
            while (--tmp)
                st_shift *= 1.046f;
            st_shift_var = st_shift_cust / st_shift - 1.f;
            if (fabs(st_shift_var) > test.max_gyro_var)
                result |= 1 << jj;
      } else if ((st_shift_cust < test.min_dps) ||
            (st_shift_cust > test.max_dps))
            result |= 1 << jj;
    }
    return result;
}


另外想问下各位大侠:我现在手上有mpu6050以及mpu6050c两个型号,是否有谁用过mpu6050c,他们之间有什么差异?

hzqlz 发表于 2013-8-7 13:15:28

以上函数i2c_read(st.hw->addr, 0x0D, 3, tmp)读取寄存器的值每次都是tmp = {0x50,0x4f,0xb7}不知道各位什么情况?

seeyou2013 发表于 2013-8-7 17:43:26

NB的大神啊。,,,

hzqlz 发表于 2013-8-7 17:49:51

纠结了好长时间,完了发现用mpu6050c正常,用mpu6050就过不了自检校准

ttsky138 发表于 2013-8-8 16:04:26

hzqlz 发表于 2013-8-7 17:49 static/image/common/back.gif
纠结了好长时间,完了发现用mpu6050c正常,用mpu6050就过不了自检校准

今天看了下我的芯片型号,用的也是MPU6050C

ttsky138 发表于 2013-8-8 16:12:34

找遍工程的0x0d 只有这句有点作用

hzqlz 发表于 2013-8-8 16:24:31

更正下之前的说法:今天仔细对比了下,发现mpu6050也是可以通过自检,之前不能是因为电容C3手上没有大小合适的,最后选用了1.5nf(dataasheet上要求用2.2nf)。

hzqlz 发表于 2013-8-8 17:14:30

请教下楼主:
   1.横向转动芯片的时候本该是倾斜角变化可实际上是俯仰角的数据在变化,两个数据调换了位置,是不是通过四元数解算时搞反了,楼主的情况是怎么样的?
   2.由水平状态,横向转动到接近垂直的时候,俯仰角数据本该在0左右,可实际的现象是俯仰角数据连续快速的变化,且变化的幅度很大。楼主是否清楚是什么原因

ttsky138 发表于 2013-8-8 19:34:52

hzqlz 发表于 2013-8-8 17:14 static/image/common/back.gif
请教下楼主:
   1.横向转动芯片的时候本该是倾斜角变化可实际上是俯仰角的数据在变化,两个数据调换了位 ...

我也不会,刚刚接触的。

我四元数的是这个你可以对照看看              q0=quat / q30;
               q1=quat / q30;
               q2=quat / q30;
               q3=quat / q30;
               
               *EulerPitch= asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; // pitch
               *EulerRoll         = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // roll
               *EulerYaw         = atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3;
       至于你说的问题,我的不会有那样的情况。 什么引起的爱莫能助啊!!!

你可以试试我的工程。

breakor 发表于 2013-8-10 16:51:44

帮顶啊!!

hzqlz 发表于 2013-8-13 18:35:22

楼主,求帮忙:
      附件是我的工程,用我的工程在你的硬件平台上跑下。看是否出现上面的现象——由水平状态横向转动到接近垂直的时候,俯仰角数据本该在0左右,可实际的现象是俯仰角数据连续快速的变化,且变化的幅度很大。一直找不到问题,我怀疑是我硬件的问题,想验证下。
    上位机用的跟你一样的匿名四轴(还得谢谢那位无私开源的大侠),不甚感激!!

xiefy21 发表于 2013-8-13 20:39:49

mark……
顶一个…

ttsky138 发表于 2013-8-15 17:51:27

hzqlz 发表于 2013-8-13 18:35 static/image/common/back.gif
楼主,求帮忙:
      附件是我的工程,用我的工程在你的硬件平台上跑下。看是否出现上面的现象——由水平 ...

行,可能要过几天,硬件今天被拿走 写上位机去了。

你可以跑我代码 测试下你硬件哦, 不一样的么!

hzqlz 发表于 2013-8-16 08:28:25

跑了下楼主的程序,貌似是一样的,真心没办法了

hzqlz 发表于 2013-9-23 11:13:46

还请楼主帮忙验证:当pitch角在90度左右小幅度摇摆时,roll角是否大幅度的变化。一直在纠结这个问题,先谢谢了

jacen梁 发表于 2013-10-3 12:29:11

留个脚印先

yuyu7226974 发表于 2013-10-17 23:26:59

怎么用KEIL无法编译通过啊?

fcq0900 发表于 2013-10-19 22:03:13

顶一个



kuailesyj 发表于 2013-10-23 16:59:34

先把串口改下

watermelon_ok 发表于 2014-1-24 21:50:27

都是牛人啊:)

silence2455 发表于 2014-2-26 15:23:43

是不是const struct test_s test = {}里面的.reg_lpf      = 1,    /* 188Hz. */的原因

silence2455 发表于 2014-3-3 16:18:29

hzqlz 发表于 2013-8-6 17:35
自己移植到stm32上,模拟I2C,完了mpu_run_self_test(gyro, accel);返回值为0,不进入校准代码段,数据似乎 ...

兄台,我遇到了和你一样的问题,也是result=0,你的问题解决了吗?

hzqlz 发表于 2014-3-4 09:37:19

silence2455 发表于 2014-3-3 16:18
兄台,我遇到了和你一样的问题,也是result=0,你的问题解决了吗?

硬件的问题,同事帮我把焊的板子,外围电路的电容值有误。请问有解决万向节锁死的问题吗?

silence2455 发表于 2014-3-4 15:58:09

哎,我买的是一个9150模块,打算放弃DMP了

情迷MJ比莉珍 发表于 2014-3-4 18:37:20

给你顶上去了!!

asdcxzvfbg 发表于 2014-4-14 17:24:01

楼主,我读数据的时候,自检都没有问题,就是最后读FIFO读出来的数据一直是空的。可以帮忙分析下么?

zhang3lu 发表于 2014-5-23 15:49:06

赞一个,最近我在读取6050的数据,在无线传输,学习学习

FlandreUNX 发表于 2014-5-26 12:58:52

IIC stm32 mark 谢谢分享

yclwsz 发表于 2014-8-26 21:13:39

mpu6050 mark
页: [1]
查看完整版本: STM32 I2C中断 MPU6050 DMP库 源码 还有问题 嘿嘿!