mpu6050.cpp D:/gitt/MicrochipFor32/bsp_MPU6050/mpu6050.cpp 浏览该文件的文档.00001 00012 //---------------------------------------------------------------------------------------------------- 00013 // 头文件 00014 #include "bscpp_IIC_STM32.h" 00015 #include "mpu6050.h" 00016 #define delay_ms(var) HAL_Delay(var) 00017 bscpp_IIC_STM32 mpu6050IIC(IIC_SCK_GPIO_Port,IIC_SCK_Pin,IIC_SDA_GPIO_Port,IIC_SDA_Pin); 00019 //---------------------------------------------------------------------------------------------------- 00020 // 函数区 00025 u8 MPU_Init(void){ 00026 u8 res; 00027 //MPU_IIC_Init();//初始化IIC总线 00028 MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80); //复位MPU6050 00029 delay_ms(100); 00030 MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00); //唤醒MPU6050 00031 MPU_Set_Gyro_Fsr(3); //陀螺仪传感器,±2000dps 00032 MPU_Set_Accel_Fsr(0); //加速度传感器,±2g 00033 MPU_Set_Rate(50); //设置采样率50Hz 00034 MPU_Write_Byte(MPU_INT_EN_REG,0X00); //关闭所有中断 00035 MPU_Write_Byte(MPU_USER_CTRL_REG,0X00); //I2C主模式关闭 00036 MPU_Write_Byte(MPU_FIFO_EN_REG,0X00); //关闭FIFO 00037 MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80); //INT引脚低电平有效 00038 res=MPU_Read_Byte(MPU_DEVICE_ID_REG); 00039 if(res==MPU_ADDR)//器件ID正确 00040 { 00041 MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01); //设置CLKSEL,PLL X轴为参考 00042 MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00); //加速度与陀螺仪都工作 00043 MPU_Set_Rate(50); //设置采样率为50Hz 00044 }else return 1; 00045 return 0;} 00046 //---------------------------------------------------------------------------------------------------- 00055 u8 MPU_Set_Gyro_Fsr(u8 fsr){ 00056 return MPU_Write_Byte(MPU_GYRO_CFG_REG,fsr<<3);//设置陀螺仪满量程范围 00057 } 00058 //---------------------------------------------------------------------------------------------------- 00067 u8 MPU_Set_Accel_Fsr(u8 fsr){ 00068 return MPU_Write_Byte(MPU_ACCEL_CFG_REG,fsr<<3);//设置加速度传感器满量程范围 00069 } 00070 //---------------------------------------------------------------------------------------------------- 00076 u8 MPU_Set_LPF(u16 lpf){ 00077 u8 data=0; 00078 if(lpf>=188)data=1; 00079 else if(lpf>=98)data=2; 00080 else if(lpf>=42)data=3; 00081 else if(lpf>=20)data=4; 00082 else if(lpf>=10)data=5; 00083 else data=6; 00084 return MPU_Write_Byte(MPU_CFG_REG,data);//设置数字低通滤波器 00085 } 00086 //---------------------------------------------------------------------------------------------------- 00092 u8 MPU_Set_Rate(u16 rate){ 00093 u8 data; 00094 if(rate>1000)rate=1000; 00095 if(rate<4)rate=4; 00096 data=1000/rate-1; 00097 data=MPU_Write_Byte(MPU_SAMPLE_RATE_REG,data); //设置数字低通滤波器 00098 return MPU_Set_LPF(rate/2); //自动设置LPF为采样率的一半 00099 } 00100 //---------------------------------------------------------------------------------------------------- 00105 short MPU_Get_Temperature(void){ 00106 u8 buf[2]; 00107 short raw; 00108 float temp; 00109 MPU_Read_Len(MPU_ADDR,MPU_TEMP_OUTH_REG,2,buf); 00110 raw=((u16)buf[0]<<8)|buf[1]; 00111 temp=36.53+((double)raw)/340; 00112 return temp*100;} 00113 //---------------------------------------------------------------------------------------------------- 00121 u8 MPU_Get_Gyroscope(short *gx,short *gy,short *gz){ 00122 u8 buf[6],res; 00123 res=MPU_Read_Len(MPU_ADDR,MPU_GYRO_XOUTH_REG,6,buf); 00124 if(res==0){ 00125 *gx=((u16)buf[0]<<8)|buf[1]; 00126 *gy=((u16)buf[2]<<8)|buf[3]; 00127 *gz=((u16)buf[4]<<8)|buf[5];} 00128 return res;} 00129 //---------------------------------------------------------------------------------------------------- 00137 u8 MPU_Get_Accelerometer(short *ax,short *ay,short *az){ 00138 u8 buf[6],res; 00139 res=MPU_Read_Len(MPU_ADDR,MPU_ACCEL_XOUTH_REG,6,buf); 00140 if(res==0){ 00141 *ax=((u16)buf[0]<<8)|buf[1]; 00142 *ay=((u16)buf[2]<<8)|buf[3]; 00143 *az=((u16)buf[4]<<8)|buf[5];} 00144 return res;} 00146 //---------------------------------------------------------------------------------------------------- 00147 // 适配区 00156 u8 MPU_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf){ 00157 mpu6050IIC.IIC_Write(addr,reg,(u8*)buf,len); 00158 return 0;} 00159 //---------------------------------------------------------------------------------------------------- 00168 u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf){ 00169 mpu6050IIC.IIC_Read(addr,reg,(u8*)buf,len); 00170 return 0;} 00171 //---------------------------------------------------------------------------------------------------- 00178 u8 MPU_Write_Byte(u8 reg,u8 data){ 00179 mpu6050IIC.IIC_WriteOneByte(MPU_ADDR,reg,data); 00180 return 0;} 00181 //---------------------------------------------------------------------------------------------------- 00187 u8 MPU_Read_Byte(u8 reg){ 00188 return mpu6050IIC.IIC_ReadOneByte(MPU_ADDR,reg);} 00190