OpenEdv-开源电子网

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

MPU6050 DMP移植问题

[复制链接]

7

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2016-2-28
在线时间
48 小时
发表于 2016-7-25 22:54:40 | 显示全部楼层 |阅读模式
5金钱
移植完原子的DMP之后串口打印pitch、roll、yaw,发现全部为0,然后用串口打印mpu_dmp_get_data()的值,发现返回值是1,也就是说dmp_read_fifo()函数返回值不为0,接着打印dmp_read_fifo()的返回值,发现返回值为-1,此函数内有两处返回值都是-1,再往上找就懵逼了,到底是怎么回事?求教DMP怎么移植,下面是上述几个函数的函数体[mw_shl_code=c,true]u8 mpu_dmp_get_data(float *pitch,float *roll,float *yaw)
{
        float q0=1.0f,q1=0.0f,q2=0.0f,q3=0.0f;
        unsigned long sensor_timestamp;
        short gyro[3], accel[3], sensors;
        unsigned char more;
        long quat[4];
        if(dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors,&more))
                return 1;         
        /* Gyro and accel data are written to the FIFO by the DMP in chip frame and hardware units.
         * This behavior is convenient because it keeps the gyro and accel outputs of dmp_read_fifo and mpu_read_fifo consistent.
        **/
        /*if (sensors & INV_XYZ_GYRO )
        send_packet(PACKET_TYPE_GYRO, gyro);
        if (sensors & INV_XYZ_ACCEL)
        send_packet(PACKET_TYPE_ACCEL, accel); */
        /* Unlike gyro and accel, quaternions are written to the FIFO in the body frame, q30.
         * The orientation is set by the scalar passed to dmp_set_orientation during initialization.
        **/
        if(sensors&INV_WXYZ_QUAT)
        {
                q0 = quat[0] / q30;        //q30¸ñê½×a»»Îa¸¡μãêy
                q1 = quat[1] / q30;
                q2 = quat[2] / q30;
                q3 = quat[3] / q30;
                //¼ÆËãμÃμ½¸©Ñö½Ç/oá1ö½Ç/o½Ïò½Ç
                *pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3;        // pitch
                *roll  = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3;        // roll
                *yaw   = atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3;        //yaw
        }
        else
                return 2;
        return 0;
}
[/mw_shl_code]

[mw_shl_code=c,true]int dmp_read_fifo(short *gyro, short *accel, long *quat,
    unsigned long *timestamp, short *sensors, unsigned char *more)
{
    unsigned char fifo_data[MAX_PACKET_LENGTH];
    unsigned char ii = 0;

    /* TODO: sensors[0] only changes when dmp_enable_feature is called. We can
     * cache this value and save some cycles.
     */
    sensors[0] = 0;

    /* Get a packet. */
    if (mpu_read_fifo_stream(dmp.packet_length, fifo_data, more))
        return -1;

    /* Parse DMP packet. */
    if (dmp.feature_mask & (DMP_FEATURE_LP_QUAT | DMP_FEATURE_6X_LP_QUAT)) {
#ifdef FIFO_CORRUPTION_CHECK
        long quat_q14[4], quat_mag_sq;
#endif
        quat[0] = ((long)fifo_data[0] << 24) | ((long)fifo_data[1] << 16) |
            ((long)fifo_data[2] << 8) | fifo_data[3];
        quat[1] = ((long)fifo_data[4] << 24) | ((long)fifo_data[5] << 16) |
            ((long)fifo_data[6] << 8) | fifo_data[7];
        quat[2] = ((long)fifo_data[8] << 24) | ((long)fifo_data[9] << 16) |
            ((long)fifo_data[10] << 8) | fifo_data[11];
        quat[3] = ((long)fifo_data[12] << 24) | ((long)fifo_data[13] << 16) |
            ((long)fifo_data[14] << 8) | fifo_data[15];
        ii += 16;
#ifdef FIFO_CORRUPTION_CHECK
        /* We can detect a corrupted FIFO by monitoring the quaternion data and
         * ensuring that the magnitude is always normalized to one. This
         * shouldn't happen in normal operation, but if an I2C error occurs,
         * the FIFO reads might become misaligned.
         *
         * Let's start by scaling down the quaternion data to avoid long long
         * math.
         */
        quat_q14[0] = quat[0] >> 16;
        quat_q14[1] = quat[1] >> 16;
        quat_q14[2] = quat[2] >> 16;
        quat_q14[3] = quat[3] >> 16;
        quat_mag_sq = quat_q14[0] * quat_q14[0] + quat_q14[1] * quat_q14[1] +
            quat_q14[2] * quat_q14[2] + quat_q14[3] * quat_q14[3];
        if ((quat_mag_sq < QUAT_MAG_SQ_MIN) ||
            (quat_mag_sq > QUAT_MAG_SQ_MAX)) {
            /* Quaternion is outside of the acceptable threshold. */
            mpu_reset_fifo();
            sensors[0] = 0;
            return -1;
        }
        sensors[0] |= INV_WXYZ_QUAT;
#endif
    }

    if (dmp.feature_mask & DMP_FEATURE_SEND_RAW_ACCEL) {
        accel[0] = ((short)fifo_data[ii+0] << 8) | fifo_data[ii+1];
        accel[1] = ((short)fifo_data[ii+2] << 8) | fifo_data[ii+3];
        accel[2] = ((short)fifo_data[ii+4] << 8) | fifo_data[ii+5];
        ii += 6;
        sensors[0] |= INV_XYZ_ACCEL;
    }

    if (dmp.feature_mask & DMP_FEATURE_SEND_ANY_GYRO) {
        gyro[0] = ((short)fifo_data[ii+0] << 8) | fifo_data[ii+1];
        gyro[1] = ((short)fifo_data[ii+2] << 8) | fifo_data[ii+3];
        gyro[2] = ((short)fifo_data[ii+4] << 8) | fifo_data[ii+5];
        ii += 6;
        sensors[0] |= INV_XYZ_GYRO;
    }

    /* Gesture data is at the end of the DMP packet. Parse it and call
     * the gesture callbacks (if registered).
     */
    if (dmp.feature_mask & (DMP_FEATURE_TAP | DMP_FEATURE_ANDROID_ORIENT))
        decode_gesture(fifo_data + ii);

    get_ms(timestamp);
    return 0;
}[/mw_shl_code]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

25

主题

281

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2504
金钱
2504
注册时间
2015-8-17
在线时间
383 小时
发表于 2016-7-25 23:37:14 | 显示全部楼层
直接复制DMP相关的.c和.h,我就是这样干的,因为我懒。
做事的原则:
1.每个问题重复三遍、研究三遍后再提问,直接得到答案的人什么都没学会。
2.做事要有始有终,感谢那些帮助自己解决问题的人,把解决的方法总结起来。
回复

使用道具 举报

7

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2016-2-28
在线时间
48 小时
 楼主| 发表于 2016-7-26 10:29:52 | 显示全部楼层
本帖最后由 橘子先生 于 2016-7-26 10:32 编辑
wszdxmh 发表于 2016-7-25 23:37
直接复制DMP相关的.c和.h,我就是这样干的,因为我懒。

dmpKey.h   dmpmap.h   inv_mpu.c   inv_mpu.h   inv_mpu_dmp_motion_driver.c    inv_mpu_dmp_motion_driver.h 都是直接复制过来的,然后里面的一些相关的函数,像Delay_ms(),I2C_write()什么的都是自己写完之后改了的,fifo我也使能了,然后就不能用。。。
回复

使用道具 举报

25

主题

281

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2504
金钱
2504
注册时间
2015-8-17
在线时间
383 小时
发表于 2016-7-26 11:04:36 | 显示全部楼层
橘子先生 发表于 2016-7-26 10:29
dmpKey.h   dmpmap.h   inv_mpu.c   inv_mpu.h   inv_mpu_dmp_motion_driver.c    inv_mpu_dmp_motion_dr ...

我没改过,我都是直接移植的,就改了一点点,一些耦合性太高的地方我是不会改的,因为这会浪费很多时间。
做事的原则:
1.每个问题重复三遍、研究三遍后再提问,直接得到答案的人什么都没学会。
2.做事要有始有终,感谢那些帮助自己解决问题的人,把解决的方法总结起来。
回复

使用道具 举报

7

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2016-2-28
在线时间
48 小时
 楼主| 发表于 2016-7-26 11:14:36 | 显示全部楼层
wszdxmh 发表于 2016-7-26 11:04
我没改过,我都是直接移植的,就改了一点点,一些耦合性太高的地方我是不会改的,因为这会浪费很多时间。

怎么看出耦合度高不高?我看程序里面用到其他部分的程序就这里有联系 360截图20160726111023997.jpg 另外在mpu_dmp_init()里面还用到了I2C初始化函数,其他的找不到有什么联系了
回复

使用道具 举报

25

主题

281

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2504
金钱
2504
注册时间
2015-8-17
在线时间
383 小时
发表于 2016-7-26 12:49:47 | 显示全部楼层
橘子先生 发表于 2016-7-26 11:14
怎么看出耦合度高不高?我看程序里面用到其他部分的程序就这里有联系另外在mpu_dmp_init()里面还用到了I2 ...

这种初始化代码我一般是不会改的,人家本来就是那样,你改了还能比别人写得更好?没bug也要创造bug
做事的原则:
1.每个问题重复三遍、研究三遍后再提问,直接得到答案的人什么都没学会。
2.做事要有始有终,感谢那些帮助自己解决问题的人,把解决的方法总结起来。
回复

使用道具 举报

7

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2016-2-28
在线时间
48 小时
 楼主| 发表于 2016-7-26 20:35:15 | 显示全部楼层
wszdxmh 发表于 2016-7-26 12:49
这种初始化代码我一般是不会改的,人家本来就是那样,你改了还能比别人写得更好?没bug也要创造bug

那也不能全复制吧?把I2C,usart delay全都复制了,那我程序就基本上啥也没了,我倒不如直接复制工程,而且我一些函数的路径跟例程里面的路径不一样,当然需要改了
回复

使用道具 举报

25

主题

281

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2504
金钱
2504
注册时间
2015-8-17
在线时间
383 小时
发表于 2016-7-26 20:36:43 | 显示全部楼层
橘子先生 发表于 2016-7-26 20:35
那也不能全复制吧?把I2C,usart delay全都复制了,那我程序就基本上啥也没了,我倒不如直接复制工程

你只做这一个功能肯定像复制工程啊,但是我有其他的东西在里面啊
做事的原则:
1.每个问题重复三遍、研究三遍后再提问,直接得到答案的人什么都没学会。
2.做事要有始有终,感谢那些帮助自己解决问题的人,把解决的方法总结起来。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-2 14:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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