搜索
bottom↓
回复: 37

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

[复制链接]

出0入0汤圆

发表于 2013-7-31 15:15:34 | 显示全部楼层 |阅读模式
本帖最后由 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次正确的数值。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2013-7-31 15:18:12 | 显示全部楼层
自己占楼  留待编辑!

出0入0汤圆

 楼主| 发表于 2013-7-31 17:18:07 | 显示全部楼层
static void run_self_test(void)
{
    int result;
//    char test_packet[4] = {0};
    long gyro[3], accel[3];

    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[0] = (long)(gyro[0] * sens);
        gyro[1] = (long)(gyro[1] * sens);
        gyro[2] = (long)(gyro[2] * sens);
        dmp_set_gyro_bias(gyro);
        mpu_get_accel_sens(&accel_sens);
        accel[0] *= accel_sens;
        accel[1] *= accel_sens;
        accel[2] *= accel_sens;
        dmp_set_accel_bias(accel);
                PrintChar("setting bias succesfully ......\n");
    }
        else
        {
                PrintChar("bias has not been modified ......\n");
        }

}

07 该03

出0入0汤圆

发表于 2013-8-6 14:24:33 | 显示全部楼层
我的到现在还没成功,i2c那里就有问题。帮顶

出0入0汤圆

发表于 2013-8-6 14:45:41 | 显示全部楼层
顶个!!!!!

出0入0汤圆

 楼主| 发表于 2013-8-6 15:21:47 | 显示全部楼层
已经好了,90°也正常了,void run_self_test 的result 是3 不应该是7。 不然补偿就没用了

出0入0汤圆

发表于 2013-8-6 15:33:54 | 显示全部楼层
收藏参考了

出0入0汤圆

发表于 2013-8-6 17:35:29 | 显示全部楼层
自己移植到stm32上,模拟I2C,完了mpu_run_self_test(gyro, accel);返回值为0,不进入校准代码段,数据似乎不对,一直在纠结

出0入0汤圆

 楼主| 发表于 2013-8-7 10:14:57 | 显示全部楼层
hzqlz 发表于 2013-8-6 17:35
自己移植到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 的话就是角度和和加速度没自检到。

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

出0入0汤圆

发表于 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[3];
    float st_shift, st_shift_cust, st_shift_var;

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

    tmp[0] &= 0x1F;
    tmp[1] &= 0x1F;
    tmp[2] &= 0x1F;

    for (jj = 0; jj < 3; jj++) {
        st_shift_cust = labs(bias_regular[jj] - bias_st[jj]) / 65536.f;
        if (tmp[jj]) {
            st_shift = 3275.f / test.gyro_sens;
            while (--tmp[jj])
                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,他们之间有什么差异?

出0入0汤圆

发表于 2013-8-7 13:15:28 | 显示全部楼层
以上函数i2c_read(st.hw->addr, 0x0D, 3, tmp)读取寄存器的值每次都是tmp = {0x50,0x4f,0xb7}不知道各位什么情况?

出0入0汤圆

发表于 2013-8-7 17:43:26 | 显示全部楼层
NB的大神啊。,,,

出0入0汤圆

发表于 2013-8-7 17:49:51 | 显示全部楼层
纠结了好长时间,完了发现用mpu6050c正常,用mpu6050就过不了自检校准

出0入0汤圆

 楼主| 发表于 2013-8-8 16:04:26 | 显示全部楼层
hzqlz 发表于 2013-8-7 17:49
纠结了好长时间,完了发现用mpu6050c正常,用mpu6050就过不了自检校准

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

出0入0汤圆

 楼主| 发表于 2013-8-8 16:12:34 | 显示全部楼层
找遍工程的0x0d 只有这句有点作用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-8-8 16:24:31 | 显示全部楼层
更正下之前的说法:今天仔细对比了下,发现mpu6050也是可以通过自检,之前不能是因为电容C3手上没有大小合适的,最后选用了1.5nf(dataasheet上要求用2.2nf)。

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2013-8-8 19:34:52 | 显示全部楼层
hzqlz 发表于 2013-8-8 17:14
请教下楼主:
     1.横向转动芯片的时候本该是倾斜角变化可实际上是俯仰角的数据在变化,两个数据调换了位 ...

我也不会,刚刚接触的。

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

你可以试试我的工程。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-8-10 16:51:44 | 显示全部楼层
帮顶啊!!

出0入0汤圆

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-8-13 20:39:49 来自手机 | 显示全部楼层
mark……
顶一个…

出0入0汤圆

 楼主| 发表于 2013-8-15 17:51:27 | 显示全部楼层
hzqlz 发表于 2013-8-13 18:35
楼主,求帮忙:
      附件是我的工程,用我的工程在你的硬件平台上跑下。看是否出现上面的现象——由水平 ...

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

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

出0入0汤圆

发表于 2013-8-16 08:28:25 | 显示全部楼层
跑了下楼主的程序,貌似是一样的,真心没办法了

出0入0汤圆

发表于 2013-9-23 11:13:46 | 显示全部楼层
还请楼主帮忙验证:当pitch角在90度左右小幅度摇摆时,roll角是否大幅度的变化。一直在纠结这个问题,先谢谢了

出0入0汤圆

发表于 2013-10-3 12:29:11 | 显示全部楼层
留个脚印先

出0入0汤圆

发表于 2013-10-17 23:26:59 | 显示全部楼层
怎么用KEIL无法编译通过啊?

出0入0汤圆

发表于 2013-10-19 22:03:13 | 显示全部楼层
顶一个



出0入0汤圆

发表于 2013-10-23 16:59:34 | 显示全部楼层
先把串口改下

出0入0汤圆

发表于 2014-1-24 21:50:27 | 显示全部楼层
都是牛人啊:)

出0入0汤圆

发表于 2014-2-26 15:23:43 | 显示全部楼层
是不是const struct test_s test = {}里面的.reg_lpf        = 1,    /* 188Hz. */的原因

出0入0汤圆

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

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

出0入0汤圆

发表于 2014-3-4 09:37:19 | 显示全部楼层
silence2455 发表于 2014-3-3 16:18
兄台,我遇到了和你一样的问题,也是result=0,你的问题解决了吗?

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

出0入0汤圆

发表于 2014-3-4 15:58:09 | 显示全部楼层
哎,我买的是一个9150模块,打算放弃DMP了

出0入0汤圆

发表于 2014-3-4 18:37:20 | 显示全部楼层
给你顶上去了!!

出0入0汤圆

发表于 2014-4-14 17:24:01 | 显示全部楼层
楼主,我读数据的时候,自检都没有问题,就是最后读FIFO读出来的数据一直是空的。可以帮忙分析下么?

出0入0汤圆

发表于 2014-5-23 15:49:06 | 显示全部楼层
赞一个,最近我在读取6050的数据,在无线传输,学习学习

出0入0汤圆

发表于 2014-5-26 12:58:52 | 显示全部楼层
IIC stm32 mark 谢谢分享

出0入0汤圆

发表于 2014-8-26 21:13:39 | 显示全部楼层
mpu6050 mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-3 12:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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