OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 1679|回复: 6
打印 上一主题 下一主题

求解--移植MPU6050,自检始终失败

[复制链接]

  离线 

1

主题

6

帖子

0

精华

新手上路

Rank: 1

积分
26
金钱
26
注册时间
2016-7-30
在线时间
3 小时
跳转到指定楼层
楼主
发表于 2016-8-5 00:10:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1金钱
移植MPU6050,发现在初始化时自检始终失败
[AppleScript] 纯文本查看 复制代码
res=run_self_test();		//自检
printf("自检--res---%d\r\n",res);
if(res)return 8;    
res=mpu_set_dmp_state(1);	//使能DMP
printf("使能DMP--res---%d\r\n",res);


发现在函数 run_self_test检测,需要result=0x03;
[AppleScript] 纯文本查看 复制代码
uint8_t run_self_test(void)
{
	int result;
	//char test_packet[4] = {0};
	long gyro[3], accel[3]; 
	result = mpu_run_self_test(gyro, accel);
	printf("result %d\r\n",result);
	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);
		return 0;
	}else return 1;
}


但是在mpu_run_self_test函数中,根本没有等于result=0x03的值
int mpu_run_self_test(long *gyro, long *accel)
{
#ifdef MPU6050
    const unsigned char tries = 2;
    long gyro_st[3], accel_st[3];
    unsigned char accel_result, gyro_result;
#ifdef AK89xx_SECONDARY
    unsigned char compass_result;
#endif
    int ii;
#endif
    int result;
    unsigned char accel_fsr, fifo_sensors, sensors_on;
    unsigned short gyro_fsr, sample_rate, lpf;
    unsigned char dmp_was_on;

    if (st.chip_cfg.dmp_on) {
        mpu_set_dmp_state(0);
        dmp_was_on = 1;
    } else
        dmp_was_on = 0;
        printf("dmp_was_on =%d \r\n",dmp_was_on);
    /* Get initial settings. */
    mpu_get_gyro_fsr(&gyro_fsr);
        printf("gyro_fsr = %X \r\n",gyro_fsr);
    mpu_get_accel_fsr(&accel_fsr);
        printf("accel_fsr = %X \r\n",accel_fsr);
    mpu_get_lpf(&lpf);
        printf("lpf = %X \r\n",lpf);
    mpu_get_sample_rate(&sample_rate);
        printf("sample_rate = %X \r\n",sample_rate);
    sensors_on = st.chip_cfg.sensors;
        printf("sensors_on = %X \r\n",sensors_on);
    mpu_get_fifo_config(&fifo_sensors);
        printf("fifo_sensors = %X \r\n",fifo_sensors);
       
    /* For older chips, the self-test will be different. */
#if defined MPU6050
    for (ii = 0; ii < tries; ii++)
        if (!get_st_biases(gyro, accel, 0))
            break;
    if (ii == tries) {
        /* If we reach this point, we most likely encountered an I2C error.
         * We'll just report an error for all three sensors.
         */
        result = 0;
        goto restore;
    }
    for (ii = 0; ii < tries; ii++)
        if (!get_st_biases(gyro_st, accel_st, 1))
            break;
    if (ii == tries) {
        /* Again, probably an I2C error. */
        result = 0;
        goto restore;
    }
    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;

#ifdef AK89xx_SECONDARY
    compass_result = compass_self_test();
    if (!compass_result)
        result |= 0x04;
#endif
restore:
#elif defined MPU6500
    /* For now, this function will return a "pass" result for all three sensors
     * for compatibility with current test applications.
     */
    get_st_biases(gyro, accel, 0);
    result = 0x7;
#endif
    /* Set to invalid values to ensure no I2C writes are skipped. */
    st.chip_cfg.gyro_fsr = 0xFF;
    st.chip_cfg.accel_fsr = 0xFF;
    st.chip_cfg.lpf = 0xFF;
    st.chip_cfg.sample_rate = 0xFFFF;
    st.chip_cfg.sensors = 0xFF;
    st.chip_cfg.fifo_enable = 0xFF;
    st.chip_cfg.clk_src = INV_CLK_PLL;
    mpu_set_gyro_fsr(gyro_fsr);
    mpu_set_accel_fsr(accel_fsr);
    mpu_set_lpf(lpf);
    mpu_set_sample_rate(sample_rate);
    mpu_set_sensors(sensors_on);
    mpu_configure_fifo(fifo_sensors);

    if (dmp_was_on)
        mpu_set_dmp_state(1);

    return result;
}



原子哥,帮忙看下是否我移植的有问题




1.PNG (11.92 KB, 下载次数: 0)

1.PNG

回复

使用道具 举报

  离线 

482

主题

8万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
117267
金钱
117267
注册时间
2010-12-1
在线时间
901 小时
2#
发表于 2016-8-6 20:17:18 | 只看该作者
这个看不出问题。你看是不是模块没放平导致的?
回复

使用道具 举报

  离线 

3

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2015-2-28
在线时间
26 小时
3#
发表于 2016-10-27 10:47:11 | 只看该作者
我也是自测没通过,accel_result = accel_self_test(accel, accel_st);    gyro_result = gyro_self_test(gyro, gyro_st);,这两个数都为7;
回复

使用道具 举报

  离线 

1

主题

6

帖子

0

精华

新手上路

Rank: 1

积分
26
金钱
26
注册时间
2016-7-30
在线时间
3 小时
4#
 楼主| 发表于 2017-1-25 11:15:18 | 只看该作者
这部分我是直接将自检部分代码给屏蔽掉了
回复

使用道具 举报

  离线 

0

主题

2

帖子

0

精华

新手上路

Rank: 1

积分
8
金钱
8
注册时间
2017-3-16
在线时间
0 小时
5#
发表于 2017-3-16 13:39:39 | 只看该作者
我也是自检出了问题,跟你遇到的一模一样,怎么解决啊?你解决了么?
回复

使用道具 举报

  离线 

0

主题

2

帖子

0

精华

新手上路

Rank: 1

积分
8
金钱
8
注册时间
2017-3-16
在线时间
0 小时
6#
发表于 2017-3-16 14:25:24 | 只看该作者
正点原子 发表于 2016-8-6 20:17
这个看不出问题。你看是不是模块没放平导致的?

我也出现了这样的问题,我把自检注释掉后,数据就出来了。但是数据不准确。求解!!
回复

使用道具 举报

  离线 

0

主题

1

帖子

0

精华

新手上路

Rank: 1

积分
31
金钱
31
注册时间
2017-7-4
在线时间
9 小时
7#
发表于 2017-11-13 20:07:55 | 只看该作者
当然没有result=3的程序,3就是0x11呗,这段程序是吧每个位用来检测一个功能,说明gyro_result出问题了,但是具体什么问题就不清楚了,我也出了这个问题
回复

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2017-11-22 18:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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