weixin_46599323 2024-02-01 14:41 采纳率: 0%
浏览 52

mpu6050(关键词-返回值)

mpu6050初始化过程中,通过串口读出下面错误,换了同一家的两个芯片一个返回值是7,一个是3,很不理解。
找到源代码是这个部分

int mpu_init(void)
{
    unsigned char data[6], rev;

    /* Reset device. */
    data[0] = BIT_RESET;
    if (i2c_write(st.hw->addr, st.reg->pwr_mgmt_1, 1, data))
        return -1;
    delay_ms(100);

    /* Wake up chip. */
    data[0] = 0x00;
    if (i2c_write(st.hw->addr, st.reg->pwr_mgmt_1, 1, data))
        return -1;

#if defined MPU6050
    /* Check product revision. */
    if (i2c_read(st.hw->addr, st.reg->accel_offs, 6, data))
        return -1;
    rev = ((data[5] & 0x01) << 2) | ((data[3] & 0x01) << 1) |
        (data[1] & 0x01);

    if (rev) {
        /* Congrats, these parts are better. */
        if (rev == 1)
            st.chip_cfg.accel_half = 1;
        else if (rev == 2)
            st.chip_cfg.accel_half = 0;
        else {
            log_e("Unsupported software product rev %d.\n", rev);
            return -1;
        }
    } else {
        if (i2c_read(st.hw->addr, st.reg->prod_id, 1, data))
            return -1;
        rev = data[0] & 0x0F;
        if (!rev) {
            log_e("Product ID read as 0 indicates device is either "
               "incompatible or an MPU3050.\n");
            return -1;
        } else if (rev == 4) {
                             log_i("Half sensitivity part found.\n");
            st.chip_cfg.accel_half = 1;
        } else
            st.chip_cfg.accel_half = 0;
    }


img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2024-02-01 16:08
    关注

    【相关推荐】



    • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7705422
    • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:移植正点原子mpu6050代码,总是MPU6050初始化失败解决
    • 除此之外, 这篇博客: MPU6050原始数据计算加速度、角速度、倾斜角度中的 二、MPU6050初始化和寄存器配置 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

              一般在唤醒MPU6050之前都会用MCU读一下设备地址以检测设备以及通信是否正常:

      // !< WHO_AM_I register identifies the device. Expected value is 0x68.
      #define ADDRESS_WHO_AM_I          (0x75U) 
      
      bool mpu6050_verify_product_id(void)
      {
          uint8_t who_am_i;
      
          if (mpu6050_register_read(ADDRESS_WHO_AM_I, &who_am_i, 1))
          {
              if (who_am_i != MPU6050_WHO_AM_I)
              {
                  return false;
              }
              else
              {
                  return true;
              }
          }
          else
          {
              return false;
          }
      }

              上述函数返回true后,才可以开始配置寄存器:

      #define MPU_PWR_MGMT1_REG		  0x6B	//电源管理寄存器1
      #define MPU_SAMPLE_RATE_REG		  0x19	//采样频率分频器
      #define MPU_CFG_REG				  0x1A	//配置寄存器
      #define MPU_INT_EN_REG			  0x38	//中断使能寄存器
      #define MPU_GYRO_CFG_REG		  0x1B	//陀螺仪配置寄存器
      #define MPU_ACCEL_CFG_REG		  0x1C	//加速度计配置寄存器
      
      //唤醒MPU6050
      (void)mpu6050_register_write(MPU_PWR_MGMT1_REG , 0x00); 
        
      //设置采样率(Sample Rate = Gyroscope Output Rate / (1 + SMPLRT_DIV)):1KHz 
      (void)mpu6050_register_write(MPU_SAMPLE_RATE_REG , 0x07);
      //设置低通滤波器,截止频率是1K,带宽是5K 
      (void)mpu6050_register_write(MPU_CFG_REG , 0x06); 
      //关闭中断							
      (void)mpu6050_register_write(MPU_INT_EN_REG, 0x00); 	
      //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
      (void)mpu6050_register_write(MPU_GYRO_CFG_REG , 0x18); 
      //配置加速度传感器量程 +-2G s,不自检 
      (void)mpu6050_register_write(MPU_ACCEL_CFG_REG,0x00); 

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 2月1日