weixin_44849612
weixin_44849612
2019-10-08 14:54

mpu9250读取磁力计数据不变

280
  • c++
  • c语言

我用stm32读取mpu9250中的磁力计数据,但是发现其数值一直不会改变。我进行了一下尝试:1.将scl和sda线的GPIO口改为开漏输出 2.每读一次磁力计数据都经过如下流程(先开启bypass,再开启单次测量模式,然后读磁力计数据,再关闭bypass) 3.在开启bypass和开启单次测量模式后都加上了延时。 但是,试过了以上做法,读出来的磁力计数据还是不会改变,我实在不知道该怎么做了,不知道有没有大佬能指导一下
这是我读取mpu9250原始数据的程序

void data_to_computer(void)                //上位机版本:4.34
{
        uint8_t accbuf[6],grobuf[6],data_to_send[18];
      uint8_t magbuf[6];

        MPU_Read_Len(MPU9250_ADDR,MPU_ACCEL_XOUTH_REG,6,accbuf);
        MPU_Read_Len(MPU9250_ADDR,MPU_GYRO_XOUTH_REG,6,grobuf);
        //开通bypass
      MPU_Write_Byte(MPU9250_ADDR,MPU_INTBP_CFG_REG,0X82);
     delay_ms(6);
      //AK8963每次读完以后都需要重新设置为单次测量模式
    MPU_Write_Byte(AK8963_ADDR,MAG_CNTL1,0X11); 
      delay_ms(6);
        MPU_Read_Len(AK8963_ADDR,MAG_XOUT_L,6,magbuf);
        mpu_set_bypass(0);
      delay_ms(6);

        data_to_send[0] = accbuf[0];
    data_to_send[1] = accbuf[1];
    data_to_send[2] = accbuf[2];
    data_to_send[3] = accbuf[3];
    data_to_send[4] = accbuf[4];
    data_to_send[5] = accbuf[5];

    data_to_send[6] = grobuf[0];//取data[0]数据的高字节,
    data_to_send[7] = grobuf[1];
    data_to_send[8] = grobuf[2];
    data_to_send[9] = grobuf[3];
    data_to_send[10] = grobuf[4];
    data_to_send[11] = grobuf[5];

    data_to_send[12] = magbuf[0];
    data_to_send[13] = magbuf[1];
    data_to_send[14] = magbuf[2];
    data_to_send[15] = magbuf[3];
    data_to_send[16] = magbuf[4];
    data_to_send[17] = magbuf[5];


        for(int i = 0; i < 18; i ++)
        {
        Usart_SendByte(USART1,data_to_send[i]);  //发送18个u8数据
        }

}

这是初始化的代码

u8 MPU9250_Init(void)
{
    u8 res=0;
    //IIC_Init();    
    MPU_Write_Byte(MPU9250_ADDR,MPU_PWR_MGMT1_REG,0X80);       //复位MPU9250
    delay_ms(100);  
    MPU_Write_Byte(MPU9250_ADDR,MPU_PWR_MGMT1_REG,0X00);       //唤醒MPU9250
    MPU_Set_Gyro_Fsr(3);                                       //陀螺仪传感器,±2000dps (人体姿态捕捉最好设置为2000dps,8g)
    MPU_Set_Accel_Fsr(2);                                      //加速度传感器,±8g 
    MPU_Set_Rate(500);                                         //设置采样率500Hz
    MPU_Write_Byte(MPU9250_ADDR,MPU_INT_EN_REG,0X00);          //关闭所有中断
    MPU_Write_Byte(MPU9250_ADDR,MPU_USER_CTRL_REG,0X00);       //I2C主模式关闭
    delay_ms(2);
    MPU_Write_Byte(MPU9250_ADDR,MPU_FIFO_EN_REG,0X00);         //关闭FIFO
    MPU_Write_Byte(MPU9250_ADDR,MPU_INTBP_CFG_REG,0X82);       //INT引脚低电平有效,开启bypass模式,可以直接读取磁力计
    delay_ms(2);
    res=MPU_Read_Byte(MPU9250_ADDR,MPU_DEVICE_ID_REG);         //读取MPU6500的ID
    if(res==MPU6500_ID)                                        //器件ID正确
    {
        MPU_Write_Byte(MPU9250_ADDR,MPU_PWR_MGMT1_REG,0X01);   //设置CLKSEL,PLL X轴为参考
        MPU_Write_Byte(MPU9250_ADDR,MPU_PWR_MGMT2_REG,0X00);   //加速度与陀螺仪都工作
            MPU_Set_Rate(500);                                 //设置采样率为500Hz   
    }else return 1;

    res=MPU_Read_Byte(AK8963_ADDR,MAG_WIA);                    //读取AK8963 ID
    if(res==AK8963_ID)
    {
        MPU_Write_Byte(AK8963_ADDR,MAG_CNTL1,0X11);            //设置AK8963为单次测量模式
            delay_ms(2);
    }else return 1;

    return 0;
}

反正现在就是除了磁力计其他数据都是好的,还恳请大佬指点一下

  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

3条回答