weixin_44849612 2019-10-08 14:54 采纳率: 100%
浏览 1882
已采纳

mpu9250读取磁力计数据不变

我用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条回答 默认 最新

  • weixin_43716859 2019-10-09 10:54
    关注

    读取磁力计数据后在设置磁力计为单次测量模式,顺序不要搞反了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝