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的加速度计和陀螺仪的原始数据,可以对他做解算了,这个留到下一篇文章讲。