皓月当空 发表于 2013-9-21 17:12:50

MPU605的0陀螺仪输出在debug模式下和非debug模式下不一致的.....

本帖最后由 皓月当空 于 2013-9-22 01:25 编辑

    采用STM32F103VET6作为主控芯片,调试MPU6050,之前一直在debug模式下调试,一直很正常,四元素解算完美,加计和磁计的校正也不错。
    但是今天在debug模式下就乱了,查了一下发现陀螺仪输出大约是debug模式下的4倍,而加计输出是正常的,都是一个I2C读取命令读出来的,怎么会有这么奇怪的问题呢?鼓捣了一个下午还是没有思路,希望有高手来解答一下,欢迎讨论。
/**********************************************************************/
    以下是读取MPU6050六路数据的部分:
    I2C_ReadBytes(devAddr, MPU6050_RA_ACCEL_XOUT_H, 14, buffer);   
    MPU6050_Lastax=(((vs16)buffer) << 8) | buffer;   // 加计X轴 (输出正确)
    MPU6050_Lastay=(((vs16)buffer) << 8) | buffer;   // 加计Y轴(输出正确)
    MPU6050_Lastaz=(((vs16)buffer) << 8) | buffer;   // 加计Z轴(输出正确)
    //跳过温度ADC
    MPU6050_Lastgx=(((vs16)buffer) << 8) | buffer;   // 陀螺仪X轴(debug模式下输出正确,非debug模式下输出错误)
    MPU6050_Lastgy=(((vs16)buffer) << 8) | buffer; // 陀螺仪Y轴(debug模式下输出正确,非debug模式下输出错误)
    MPU6050_Lastgz=(((vs16)buffer) << 8) | buffer; // 陀螺仪Z轴(debug模式下输出正确,非debug模式下输出错误)
/***********************************************************************/
    以下是debug模式下的输出(无滤波):
加计X轴        加计Y轴        加计Z轴        陀螺X轴        陀螺Y轴        陀螺Z轴       
-232                832                14708        -83            -12           -13       
-320                736                14772        -81            -8              -12       
-312                896                14748        -82            -18            -2       
-324              860                14704        -80         -12                -10       
-200           840                14824        -82            -18            -9       
-216                804                14756        -76            -20            -7       
-300                868                14656        -73            -14           -10       
-232                888                14664        -81            -6              -9       
-296           824                14632        -82            -18           -12       
-220                816                14756        -76            -20           -12       
-356                864                14672        -76            -10           -9       
-328                828              14696        -78            -13            -15       
-252           872            14692        -83            -18            -8       
-332                844           14692        -73            -12            -5       
-300                772           14744        -81            -13            -7
    以下是非debug模式下的输出(无滤波):
加计X轴        加计Y轴        加计Z轴        陀螺X轴        陀螺Y轴        陀螺Z轴       
-272                772                14756        -294                -59                -33       
-160                804                14672        -304                -18                -19       
-324                832                14580        -316                -23                -30       
-264                816                14788        -325                -110                -24       
-200                792                14784        -321                -108                -29       
-264                844                14720        -343                -65                -36       
-172                764                14728        -321                -51                -23       
-292                896                14700        -308                -53                -20       
-276                800                14612        -308                -94                -36       
-312                908                14688        -293                -57                -43       
-308                816                14588        -305                -31                -38       
-300                852                14648        -321                -69                -34       
-248                824                14660        -326                -58                -36       
-264                820                14736        -289                -28                -21

/**********************************时间分割线*********************************/
    22:10
    吃过饭继续调程序,吃饭的时候想起来如果陀螺仪量程没有成功写入的话默认250°/s,正好是我设置的1000°/s的1/4,输出的值正好是4倍。于是在MPU6050初始化函数中做了点延时,结果还是不行。但是发现如果在非debug模式下,只要硬件重启一下STM32(不断电重启),输出值就正常了。而断电重启则输出不正常。还是很奇怪啊

/**********************************时间分割线*********************************/
    1:08
    问题被神奇的解决了……太神奇了,我完全无法理解……只需要把对陀螺量程的I2C写入程序换个地方就好了……没道理啊……没天理啊……
    发现硬件重启STM32能够解决问题后,我把问题定位在系统初始上电这个过程中,由于我的电路是USB与外部电源切换的,我怀疑是由于电源切换导致复位电路没有足够的低电平延时,所以我修改了复位电路,但还是没有解决问题。又参考了“求助!STM32上电后不自动运行程序,需要按一下复位才运行”这个帖子(http://www.amobbs.com/thread-5534125-1-1.html)各种修改,完败……折腾了半天排除了上电过程的问题。
    无奈之下,回到I2C写入陀螺仪量程这个地方来(4倍输出误差太吻合这个问题了),实在没什么想法了,就在程序的好多个地方重复写入陀螺仪量程,一运行,居然没问题了!!!瞬间满血复活啊!!逐个删减重复的I2C写入语句,最后发现只要把写陀螺仪量程的语句移动到开启MPU6050工作状态的语句之后就可以解决问题了,至于原因嘛……真搞不懂,明天继续研究一下,好诡异的事情啊。
/****************************************************************/
    以下是原来的MPU6050的初始化语句:
void MPU6050_Init(void)
{
      MPU6050_setClockSource(MPU6050_CLOCK_PLL_XGYRO); //设置时钟
        Delay1ms(2);
      MPU6050_setFullScaleGyroRange(MPU6050_GYRO_FS_1000);//陀螺仪最大量程 +-1000度每秒
        Delay1ms(2);
      MPU6050_setFullScaleAccelRange(MPU6050_ACCEL_FS_2);        //加速度度最大量程 +-2G
        Delay1ms(2);
      MPU6050_setSleepEnabled(0); //进入工作状态
        Delay1ms(2);
        MPU6050_setI2CMasterModeEnabled(0);       //不让MPU6050 控制AUXI2C
        Delay1ms(2);
        MPU6050_setI2CBypassEnabled(1);       //主控制器的I2C与MPU6050的AUXI2C直通。控制器可以直接访问HMC5883L
      Delay1ms(2);
}
    以下是修改过的MPU6050的初始化语句:
void MPU6050_Init(void)
{
      MPU6050_setClockSource(MPU6050_CLOCK_PLL_XGYRO); //设置时钟
        Delay1ms(2);
      MPU6050_setFullScaleAccelRange(MPU6050_ACCEL_FS_2);        //加速度度最大量程 +-2G
        Delay1ms(2);
      MPU6050_setSleepEnabled(0); //进入工作状态
        Delay1ms(2);
        MPU6050_setI2CMasterModeEnabled(0);       //不让MPU6050 控制AUXI2C
        Delay1ms(2);
        MPU6050_setI2CBypassEnabled(1);       //主控制器的I2C与MPU6050的AUXI2C直通。控制器可以直接访问HMC5883L
        Delay1ms(2);
      MPU6050_setFullScaleGyroRange(MPU6050_GYRO_FS_1000);//陀螺仪最大量程 +-1000度每秒
      Delay1ms(2);
}

lukefan2008 发表于 2013-9-21 19:02:51

检查一下是不是配置改了?比如说量程设置不一样了

皓月当空 发表于 2013-9-21 22:12:48

本帖最后由 皓月当空 于 2013-9-22 01:28 编辑

lukefan2008 发表于 2013-9-21 19:02 static/image/common/back.gif
检查一下是不是配置改了?比如说量程设置不一样了

谢谢你,我也想到这个问题了,应该就是陀螺仪量程没有写入进去,但是很奇怪啊,为什么其他几个设置都输入正常,就陀螺仪量程设置不行呢,我尝试在各个设置之间加入短延时,也没用。刚才有发现:只要硬件重启STM32就能输出正常,而断电重启则输出不正常……请问还有什么想法么?

皓月当空 发表于 2013-9-22 01:29:56

lukefan2008 发表于 2013-9-21 19:02 static/image/common/back.gif
检查一下是不是配置改了?比如说量程设置不一样了

问题解决了,但是搞不懂原因,请看更新过的帖子

qwe2231695 发表于 2013-9-22 01:45:22

因为你的电 包括mpu6050的电。不断电复位,相当于初始化2次。哈哈

皓月当空 发表于 2013-9-22 12:54:08

qwe2231695 发表于 2013-9-22 01:45 static/image/common/back.gif
因为你的电 包括mpu6050的电。不断电复位,相当于初始化2次。哈哈

哦,有道理啊,谢谢了。那为什么要初始化两次才正常工作呢,而且在debug模式下就不会出现这个情况,不知道你有什么想法么?
页: [1]
查看完整版本: MPU605的0陀螺仪输出在debug模式下和非debug模式下不一致的.....