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);
} 检查一下是不是配置改了?比如说量程设置不一样了 本帖最后由 皓月当空 于 2013-9-22 01:28 编辑
lukefan2008 发表于 2013-9-21 19:02 static/image/common/back.gif
检查一下是不是配置改了?比如说量程设置不一样了
谢谢你,我也想到这个问题了,应该就是陀螺仪量程没有写入进去,但是很奇怪啊,为什么其他几个设置都输入正常,就陀螺仪量程设置不行呢,我尝试在各个设置之间加入短延时,也没用。刚才有发现:只要硬件重启STM32就能输出正常,而断电重启则输出不正常……请问还有什么想法么?
lukefan2008 发表于 2013-9-21 19:02 static/image/common/back.gif
检查一下是不是配置改了?比如说量程设置不一样了
问题解决了,但是搞不懂原因,请看更新过的帖子 因为你的电 包括mpu6050的电。不断电复位,相当于初始化2次。哈哈 qwe2231695 发表于 2013-9-22 01:45 static/image/common/back.gif
因为你的电 包括mpu6050的电。不断电复位,相当于初始化2次。哈哈
哦,有道理啊,谢谢了。那为什么要初始化两次才正常工作呢,而且在debug模式下就不会出现这个情况,不知道你有什么想法么?
页:
[1]