电机启动后mpu6050读数不准确

stm32电机启动以后mpu6050读取的数不正确且飘得厉害

可能电机振动对传感器产生影响了

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7650385
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:基于stm32的mpu6050传感器实验
  • 除此之外, 这篇博客: 用STM32实现MPU6050原始数据的读取中的 传感器初始化 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • u8 MPU_Init(void)//采用带返回值的函数,是因为采用杜邦线连接,干扰比较大,容易初始化失败,所以根据返回值判断是否初始化成功
    { 
      u8 res;
      GPIO_InitTypeDef  GPIO_InitStructure;
      
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
      
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; 
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
    
      GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
      
      MPU_AD0_CTRL=0;//AD0为低电平,地址为0x68
      
      MPU_IIC_Init();
      MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80); 
      delay_ms(100);
      MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);  
      MPU_Set_Gyro_Fsr(3); //设置陀螺仪量程
      MPU_Set_Accel_Fsr(0); //设置加速度计量程
      MPU_Set_Rate(50); 
      MPU_Write_Byte(MPU_INT_EN_REG,0X00); //关中断
      MPU_Write_Byte(MPU_USER_CTRL_REG,0X00); //IIC主模式关闭
      MPU_Write_Byte(MPU_FIFO_EN_REG,0X00)/; //清空FIFO
      MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80); //INT低有效
      MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);
      res=MPU_Read_Byte(MPU_DEVICE_ID_REG);//都工作加速度计与陀螺仪都工作
      MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);
      MPU_Set_Rate(50); 
      MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);
      MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);
      MPU_Set_Rate(50); 
      if(res==MPU_ADDR)//判断模块地址正确(0x68)
     {
      MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01); 
      MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00); //再次使能加速度计与陀螺仪
      MPU_Set_Rate(50); 
      }else return 1;
     return 0;

    传感器初始化之后就可以读取数据了。

    u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
    { 
      MPU_IIC_Start(); 
     MPU_IIC_Send_Byte((addr<<1)|0);//发送地址+写命令
     if(MPU_IIC_Wait_Ack()) //等待应答
     {
      MPU_IIC_Stop();   
      return 1;  
     }
        MPU_IIC_Send_Byte(reg); //写寄存器地址
        MPU_IIC_Wait_Ack();  //等待应答
        MPU_IIC_Start();
     MPU_IIC_Send_Byte((addr<<1)|1);//发送器件地址+读命令
        MPU_IIC_Wait_Ack();  //等待应答
     while(len)
     {
      if(len==1)*buf=MPU_IIC_Read_Byte(0);//读数据 
      else *buf=MPU_IIC_Read_Byte(1);  //发送应答信号
      len--;
      buf++; 
     }    
        MPU_IIC_Stop(); //发送停止信号
     return 0; 
    }

    通过读不同的地址,可以获取到加速度计和陀螺仪的原始数据。

    u8 MPU_Get_Gyroscope(short *gx,short *gy,short *gz)//读陀螺仪
    {
     u8 buf[6],res;  
     res=MPU_Read_Len(MPU_ADDR,MPU_GYRO_XOUTH_REG,6,buf);
     if(res==0)
     {
      *gx=((u16)buf[0]<<8)|buf[1];  
      *gy=((u16)buf[2]<<8)|buf[3];  
      *gz=((u16)buf[4]<<8)|buf[5];
     }  
     return res;;
    }
    
    u8 MPU_Get_Accelerometer(short *ax,short *ay,short *az)//读加速度计
    {
     u8 buf[6],res;  
     res=MPU_Read_Len(MPU_ADDR,MPU_ACCEL_XOUTH_REG,6,buf);
     if(res==0)
     {
      *ax=((u16)buf[0]<<8)|buf[1];  
      *ay=((u16)buf[2]<<8)|buf[3];  
      *az=((u16)buf[4]<<8)|buf[5];
     }  
     return res;;
    }

    到此我们就读出了MPU6050的加速度计和陀螺仪的原始数据,可以对他做解算了,这个留到下一篇文章讲。