mpu6050.cpp bscpp_IIC_STM32.h mpu6050.h delay_ms var HAL_Delay(var) bscpp_IIC_STM32 bscpp_IIC_STM32 mpu6050IIC (IIC_SCK_GPIO_Port, IIC_SCK_Pin, IIC_SDA_GPIO_Port, IIC_SDA_Pin) mpu6050IIC IIC_SCK_GPIO_Port IIC_SCK_Pin IIC_SDA_GPIO_Port IIC_SDA_Pin MPU_Read_Byte MPU_Read_Len MPU_Write_Byte MPU_Write_Len u8 u8 MPU_Init (void) MPU_Init void 初始化MPU6050 0,成功 delay_ms MPU_ADDR MPU_DEVICE_ID_REG MPU_FIFO_EN_REG MPU_INT_EN_REG MPU_INTBP_CFG_REG MPU_PWR_MGMT1_REG MPU_PWR_MGMT2_REG MPU_Read_Byte MPU_Set_Accel_Fsr MPU_Set_Gyro_Fsr MPU_Set_Rate MPU_USER_CTRL_REG MPU_Write_Byte u8 u8 MPU_Set_Gyro_Fsr (u8 fsr) MPU_Set_Gyro_Fsr u8 fsr 设置MPU6050陀螺仪传感器满量程范围 fsr 0,±250dps 1,±500dps 2,±1000dps 3,±2000dps 0,设置成功 MPU_GYRO_CFG_REG MPU_Write_Byte MPU_Init u8 u8 MPU_Set_Accel_Fsr (u8 fsr) MPU_Set_Accel_Fsr u8 fsr 设置MPU6050加速度传感器满量程范围 fsr 0,±2g 1,±4g 2,±8g 3,±16g 0,设置成功 MPU_ACCEL_CFG_REG MPU_Write_Byte MPU_Init u8 u8 MPU_Set_LPF (u16 lpf) MPU_Set_LPF u16 lpf 设置MPU6050的数字低通滤波器 lpf 数字低通滤波频率(Hz) 0,设置成功 MPU_CFG_REG MPU_Write_Byte MPU_Set_Rate u8 u8 MPU_Set_Rate (u16 rate) MPU_Set_Rate u16 rate 设置MPU6050的采样率(假定Fs=1KHz) rate 4~1000(Hz) 0,设置成功 MPU_SAMPLE_RATE_REG MPU_Set_LPF MPU_Write_Byte MPU_Init short short MPU_Get_Temperature (void) MPU_Get_Temperature void 得到温度值 温度值(扩大了100倍) MPU_ADDR MPU_Read_Len MPU_TEMP_OUTH_REG u8 u8 MPU_Get_Gyroscope (short *gx, short *gy, short *gz) MPU_Get_Gyroscope short * gx short * gy short * gz 得到陀螺仪值(原始值) gx 陀螺仪x轴的原始读数(带符号) gy 陀螺仪y轴的原始读数(带符号) gx 陀螺仪z轴的原始读数(带符号) 0,设置成功 MPU_ADDR MPU_GYRO_XOUTH_REG MPU_Read_Len u8 u8 MPU_Get_Accelerometer (short *ax, short *ay, short *az) MPU_Get_Accelerometer short * ax short * ay short * az 得到加速度值(原始值) ax 陀螺仪a轴的原始读数(带符号) ay 陀螺仪a轴的原始读数(带符号) ax 陀螺仪a轴的原始读数(带符号) 0,设置成功 MPU_ACCEL_XOUTH_REG MPU_ADDR MPU_Read_Len u8 u8 MPU_Write_Len (u8 addr, u8 reg, u8 len, u8 *buf) MPU_Write_Len u8 addr u8 reg u8 len u8 * buf IIC连续写 addr 器件地址 reg 寄存器地址 len 写入长度 *buf 数据区 0,设置成功 mpu6050IIC u8 u8 MPU_Read_Len (u8 addr, u8 reg, u8 len, u8 *buf) MPU_Read_Len u8 addr u8 reg u8 len u8 * buf IIC连续读 addr 器件地址 reg 寄存器地址 len 读取长度 *buf 读取数据区 0,设置成功 mpu6050IIC MPU_Get_Accelerometer MPU_Get_Gyroscope MPU_Get_Temperature u8 u8 MPU_Write_Byte (u8 reg, u8 data) MPU_Write_Byte u8 reg u8 data IIC写一个字节 reg 寄存器地址 data 数据 0,设置成功 mpu6050IIC MPU_ADDR MPU_Init MPU_Set_Accel_Fsr MPU_Set_Gyro_Fsr MPU_Set_LPF MPU_Set_Rate u8 u8 MPU_Read_Byte (u8 reg) MPU_Read_Byte u8 reg IIC读一个字节 reg 寄存器地址 0,设置成功 mpu6050IIC MPU_ADDR MPU_Init //---------------------------------------------------------------------------------------------------- //头文件 #include"bscpp_IIC_STM32.h" #include"mpu6050.h" #definedelay_ms(var)HAL_Delay(var) bscpp_IIC_STM32mpu6050IIC(IIC_SCK_GPIO_Port,IIC_SCK_Pin,IIC_SDA_GPIO_Port,IIC_SDA_Pin); //---------------------------------------------------------------------------------------------------- //函数区 u8MPU_Init(void){ u8res; //MPU_IIC_Init();//初始化IIC总线 MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);//复位MPU6050 delay_ms(100); MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);//唤醒MPU6050 MPU_Set_Gyro_Fsr(3);//陀螺仪传感器,±2000dps MPU_Set_Accel_Fsr(0);//加速度传感器,±2g MPU_Set_Rate(50);//设置采样率50Hz MPU_Write_Byte(MPU_INT_EN_REG,0X00);//关闭所有中断 MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);//I2C主模式关闭 MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);//关闭FIFO MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);//INT引脚低电平有效 res=MPU_Read_Byte(MPU_DEVICE_ID_REG); if(res==MPU_ADDR)//器件ID正确 { MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);//设置CLKSEL,PLLX轴为参考 MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);//加速度与陀螺仪都工作 MPU_Set_Rate(50);//设置采样率为50Hz }elsereturn1; return0;} //---------------------------------------------------------------------------------------------------- u8MPU_Set_Gyro_Fsr(u8fsr){ returnMPU_Write_Byte(MPU_GYRO_CFG_REG,fsr<<3);//设置陀螺仪满量程范围 } //---------------------------------------------------------------------------------------------------- u8MPU_Set_Accel_Fsr(u8fsr){ returnMPU_Write_Byte(MPU_ACCEL_CFG_REG,fsr<<3);//设置加速度传感器满量程范围 } //---------------------------------------------------------------------------------------------------- u8MPU_Set_LPF(u16lpf){ u8data=0; if(lpf>=188)data=1; elseif(lpf>=98)data=2; elseif(lpf>=42)data=3; elseif(lpf>=20)data=4; elseif(lpf>=10)data=5; elsedata=6; returnMPU_Write_Byte(MPU_CFG_REG,data);//设置数字低通滤波器 } //---------------------------------------------------------------------------------------------------- u8MPU_Set_Rate(u16rate){ u8data; if(rate>1000)rate=1000; if(rate<4)rate=4; data=1000/rate-1; data=MPU_Write_Byte(MPU_SAMPLE_RATE_REG,data);//设置数字低通滤波器 returnMPU_Set_LPF(rate/2);//自动设置LPF为采样率的一半 } //---------------------------------------------------------------------------------------------------- shortMPU_Get_Temperature(void){ u8buf[2]; shortraw; floattemp; MPU_Read_Len(MPU_ADDR,MPU_TEMP_OUTH_REG,2,buf); raw=((u16)buf[0]<<8)|buf[1]; temp=36.53+((double)raw)/340; returntemp*100;} //---------------------------------------------------------------------------------------------------- u8MPU_Get_Gyroscope(short*gx,short*gy,short*gz){ u8buf[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];} returnres;} //---------------------------------------------------------------------------------------------------- u8MPU_Get_Accelerometer(short*ax,short*ay,short*az){ u8buf[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];} returnres;} //---------------------------------------------------------------------------------------------------- //适配区 u8MPU_Write_Len(u8addr,u8reg,u8len,u8*buf){ mpu6050IIC.IIC_Write(addr,reg,(u8*)buf,len); return0;} //---------------------------------------------------------------------------------------------------- u8MPU_Read_Len(u8addr,u8reg,u8len,u8*buf){ mpu6050IIC.IIC_Read(addr,reg,(u8*)buf,len); return0;} //---------------------------------------------------------------------------------------------------- u8MPU_Write_Byte(u8reg,u8data){ mpu6050IIC.IIC_WriteOneByte(MPU_ADDR,reg,data); return0;} //---------------------------------------------------------------------------------------------------- u8MPU_Read_Byte(u8reg){ returnmpu6050IIC.IIC_ReadOneByte(MPU_ADDR,reg);}