samo110 发表于 2013-11-14 19:34:02

关于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时机把握不对,可以着重检查一下。

小小怪 发表于 2013-11-16 11:12:55

对了我读出来的数据就是0,原本以为配置不对,原来是没有完全解除睡眠...

mahengyu 发表于 2013-11-16 14:48:20

我的程序有时候管用,有时候都是0和-1,这是不是时序不对啊?

samo110 发表于 2013-11-16 16:49:57

mahengyu 发表于 2013-11-16 14:48 static/image/common/back.gif
我的程序有时候管用,有时候都是0和-1,这是不是时序不对啊?

如果一次启动出现这种情况我就不知道了,如果重启后分别可能出现其中一种情况,那你试试初始化代码里面每次写入加入几十毫秒延时试试

gswgcc 发表于 2013-11-16 19:11:19

初始化后,加足够时间的延时,确定是这个问题后,再把时间改小。

jiang887786 发表于 2014-5-15 16:26:19

我要好好看看我的时序,昨晚还有ACK呢,今天没有了,纠结中!谢谢提醒!

SZHjy 发表于 2014-5-27 15:57:30

请问楼主,我的程序可以读出T,但是x,y,z都是0,怎么回事啊,急求谢谢

samo110 发表于 2014-5-27 20:56:20

SZHjy 发表于 2014-5-27 15:57
请问楼主,我的程序可以读出T,但是x,y,z都是0,怎么回事啊,急求谢谢

你试试用手按住芯片,看温度变化吗
最好贴上读数部分的代码,这样也不好说啊

SZHjy 发表于 2014-5-27 22:04:06

本帖最后由 SZHjy 于 2014-5-27 22:05 编辑

samo110 发表于 2014-5-27 20:56
你试试用手按住芯片,看温度变化吗
最好贴上读数部分的代码,这样也不好说啊 ...

先谢谢楼主了
温度没有变化,代码见图(就是楼主的代码,改了读数的函数)

samo110 发表于 2014-5-27 23:22:34

SZHjy 发表于 2014-5-27 22:04
先谢谢楼主了
温度没有变化,代码见图(就是楼主的代码,改了读数的函数) ...

你这个看起来不对啊,你能把 mpu6050_register_read(xx,xx,xx);的具体函数内容发上来吗

sylarwcy 发表于 2014-5-28 00:22:02

用K60的孩纸伤不起,IIC是个坑。

SZHjy 发表于 2014-5-28 08:40:42

samo110 发表于 2014-5-27 23:22
你这个看起来不对啊,你能把 mpu6050_register_read(xx,xx,xx);的具体函数内容发上来吗 ...

谢谢了,我再研究一下吧{:smile:}

samo110 发表于 2014-5-28 09:18:10

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 ;
}

SZHjy 发表于 2014-5-29 08:48:39

samo110 发表于 2014-5-28 09:18
给你一个参考吧, 我用的这个可以读取,你那个函数参数里面&OUT是寄存器? 16又是什么?




嗯,谢谢了

CandD 发表于 2014-6-25 15:52:00

请问一下,我的数据不是0,也不是-1,但是不会变化,是什么原因啊?
页: [1]
查看完整版本: 关于MPU6050读数一直是0的一种解决办法