关于MPU6050读数一直是0的一种解决办法
本帖最后由 samo110 于 2013-11-14 19:35 编辑现在好像用mpu6050的人越来越多了,确实也比较方便,之前我一直用单独的加速度计和陀螺仪,现在也换成这个了。
关于标题中的问题,一周之内看到有两位网友发帖求解决办法了,问题的显著特征是可以确定i2c总线没有问题,但是读数就是一直是0,其实很多情况下都是因为没有对器件进行复位造成的(我也没有深入去考虑为什么需要先复位,可能通过某些配置可以不用先复位也没准)。
下面是mpu6050手册上的截图,可以看到PWR_MGMT_1寄存器有一位是DEVICE_RESET,对他写入1就行了。
不保证所有读数为0的情况都可用,但是大家可以试试这种方法,说不定正好能解决。
顺便贴出我的初始化代码:void device_init(void)
{
unsigned char dat;
//MPU6050
dat = 0x80 ;
i2c_write(Slave_MPU6050, PWR_MGMT_1,1,&dat) ;
rt_thread_delay(60);
dat = 0x00 ;
i2c_write(Slave_MPU6050, PWR_MGMT_1,1,&dat) ;
rt_thread_delay(60);
i2c_write(Slave_MPU6050, PWR_MGMT_1,1,&dat) ;
dat = 0x09;
i2c_write(Slave_MPU6050, SMPLRT_DIV,1,&dat) ;
dat = 0x04;
i2c_write(Slave_MPU6050, CONFIG,1,&dat) ;
dat = 0x00;
i2c_write(Slave_MPU6050, GYRO_CONFIG,1,&dat) ;
dat = 0x08;
i2c_write(Slave_MPU6050, ACCEL_CONFIG,1,&dat) ;
}PS:另一种常见问题是读数全为-1,一般是i2c总线出了问题,自己写软膜你的i2c驱动的话最容易出错的就是发送和接收的时序,我以前折腾了好长时间后来发现只是ack时机把握不对,可以着重检查一下。 对了我读出来的数据就是0,原本以为配置不对,原来是没有完全解除睡眠... 我的程序有时候管用,有时候都是0和-1,这是不是时序不对啊? mahengyu 发表于 2013-11-16 14:48 static/image/common/back.gif
我的程序有时候管用,有时候都是0和-1,这是不是时序不对啊?
如果一次启动出现这种情况我就不知道了,如果重启后分别可能出现其中一种情况,那你试试初始化代码里面每次写入加入几十毫秒延时试试 初始化后,加足够时间的延时,确定是这个问题后,再把时间改小。 我要好好看看我的时序,昨晚还有ACK呢,今天没有了,纠结中!谢谢提醒! 请问楼主,我的程序可以读出T,但是x,y,z都是0,怎么回事啊,急求谢谢 SZHjy 发表于 2014-5-27 15:57
请问楼主,我的程序可以读出T,但是x,y,z都是0,怎么回事啊,急求谢谢
你试试用手按住芯片,看温度变化吗
最好贴上读数部分的代码,这样也不好说啊 本帖最后由 SZHjy 于 2014-5-27 22:05 编辑
samo110 发表于 2014-5-27 20:56
你试试用手按住芯片,看温度变化吗
最好贴上读数部分的代码,这样也不好说啊 ...
先谢谢楼主了
温度没有变化,代码见图(就是楼主的代码,改了读数的函数) SZHjy 发表于 2014-5-27 22:04
先谢谢楼主了
温度没有变化,代码见图(就是楼主的代码,改了读数的函数) ...
你这个看起来不对啊,你能把 mpu6050_register_read(xx,xx,xx);的具体函数内容发上来吗 用K60的孩纸伤不起,IIC是个坑。 samo110 发表于 2014-5-27 23:22
你这个看起来不对啊,你能把 mpu6050_register_read(xx,xx,xx);的具体函数内容发上来吗 ...
谢谢了,我再研究一下吧{:smile:} SZHjy 发表于 2014-5-28 08:40
谢谢了,我再研究一下吧
给你一个参考吧, 我用的这个可以读取,你那个函数参数里面&OUT是寄存器? 16又是什么?
i2c_read(Slave_MPU6050,ACCEL_XOUT_H,6,&BUF) ;
i2c_read(Slave_MPU6050,TEMP_OUT_H,2,&BUF) ;
i2c_read(Slave_MPU6050,GYRO_XOUT_H, 6,&BUF) ;
mpu = (short)((BUF<<8) + BUF); //ax
mpu = (short)((BUF<<8) + BUF);//ay
mpu = (short)((BUF<<8) + BUF);//az
mpu = (short)((BUF<<8) + BUF);//gx
mpu = (short)((BUF<<8) + BUF);//gy
mpu = (short)((BUF<<8) + BUF);//gz
unsigned char i2c_read(unsigned char dev,
unsigned char reg,
unsigned char length,
unsigned char * data)
{
unsigned char i ;
i2c_start() ;
i2c_send_byte(dev) ;
i2c_send_byte(reg) ;
i2c_start() ;
i2c_send_byte(dev + 1) ;
for(i = 0; i < length; i ++)
{
data = i2c_recv_byte() ;
if(i == length-1)
i2c_send_ack(_NACK) ;
else
i2c_send_ack(_ACK) ;
}
i2c_stop() ;
return 0 ;
} samo110 发表于 2014-5-28 09:18
给你一个参考吧, 我用的这个可以读取,你那个函数参数里面&OUT是寄存器? 16又是什么?
嗯,谢谢了 请问一下,我的数据不是0,也不是-1,但是不会变化,是什么原因啊?
页:
[1]