191 lines
6.2 KiB
C++
191 lines
6.2 KiB
C++
|
|
/**
|
|||
|
|
* @file mpu6050
|
|||
|
|
* @brief ʵ<EFBFBD><EFBFBD>mpu6050<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @mainpage <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>Ϣ
|
|||
|
|
* @author Yuankang Liang(XerolySkinner)
|
|||
|
|
* @email zabbcccbbaz@163.com
|
|||
|
|
* @version V1.0.0
|
|||
|
|
* @date 2022-11-08 01:09
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
// ͷ<>ļ<EFBFBD>
|
|||
|
|
#include "bscpp_IIC_STM32.h"
|
|||
|
|
#include "mpu6050.h"
|
|||
|
|
#define delay_ms(var) HAL_Delay(var)
|
|||
|
|
bscpp_IIC_STM32 mpu6050IIC(IIC_SCK_GPIO_Port,IIC_SCK_Pin,IIC_SDA_GPIO_Port,IIC_SDA_Pin);
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>MPU6050
|
|||
|
|
* @return 0,<EFBFBD>ɹ<EFBFBD>
|
|||
|
|
*/
|
|||
|
|
u8 MPU_Init(void){
|
|||
|
|
u8 res;
|
|||
|
|
//MPU_IIC_Init();//<2F><>ʼ<EFBFBD><CABC>IIC<49><43><EFBFBD><EFBFBD>
|
|||
|
|
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80); //<2F><>λMPU6050
|
|||
|
|
delay_ms(100);
|
|||
|
|
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00); //<2F><><EFBFBD><EFBFBD>MPU6050
|
|||
|
|
MPU_Set_Gyro_Fsr(3); //<2F><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD><EFBFBD><EFBFBD>,<2C><>2000dps
|
|||
|
|
MPU_Set_Accel_Fsr(0); //<2F><><EFBFBD>ٶȴ<D9B6><C8B4><EFBFBD><EFBFBD><EFBFBD>,<2C><>2g
|
|||
|
|
MPU_Set_Rate(50); //<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>50Hz
|
|||
|
|
MPU_Write_Byte(MPU_INT_EN_REG,0X00); //<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
MPU_Write_Byte(MPU_USER_CTRL_REG,0X00); //I2C<32><43>ģʽ<C4A3>ر<EFBFBD>
|
|||
|
|
MPU_Write_Byte(MPU_FIFO_EN_REG,0X00); //<2F>ر<EFBFBD>FIFO
|
|||
|
|
MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80); //INT<4E><54><EFBFBD>ŵ͵<C5B5>ƽ<EFBFBD><C6BD>Ч
|
|||
|
|
res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
|
|||
|
|
if(res==MPU_ADDR)//<2F><><EFBFBD><EFBFBD>ID<49><44>ȷ
|
|||
|
|
{
|
|||
|
|
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01); //<2F><><EFBFBD><EFBFBD>CLKSEL,PLL X<><58>Ϊ<EFBFBD>ο<EFBFBD>
|
|||
|
|
MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00); //<2F><><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
MPU_Set_Rate(50); //<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>Ϊ50Hz
|
|||
|
|
}else return 1;
|
|||
|
|
return 0;}
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>MPU6050<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̷<EFBFBD>Χ
|
|||
|
|
* @param fsr 0,<EFBFBD><EFBFBD>250dps
|
|||
|
|
* 1,<EFBFBD><EFBFBD>500dps
|
|||
|
|
* 2,<EFBFBD><EFBFBD>1000dps
|
|||
|
|
* 3,<EFBFBD><EFBFBD>2000dps
|
|||
|
|
* @return 0,<EFBFBD><EFBFBD><EFBFBD>óɹ<EFBFBD>
|
|||
|
|
*/
|
|||
|
|
u8 MPU_Set_Gyro_Fsr(u8 fsr){
|
|||
|
|
return MPU_Write_Byte(MPU_GYRO_CFG_REG,fsr<<3);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̷<EFBFBD>Χ
|
|||
|
|
}
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>MPU6050<EFBFBD><EFBFBD><EFBFBD>ٶȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̷<EFBFBD>Χ
|
|||
|
|
* @param fsr 0,<EFBFBD><EFBFBD>2g
|
|||
|
|
* 1,<EFBFBD><EFBFBD>4g
|
|||
|
|
* 2,<EFBFBD><EFBFBD>8g
|
|||
|
|
* 3,<EFBFBD><EFBFBD>16g
|
|||
|
|
* @return 0,<EFBFBD><EFBFBD><EFBFBD>óɹ<EFBFBD>
|
|||
|
|
*/
|
|||
|
|
u8 MPU_Set_Accel_Fsr(u8 fsr){
|
|||
|
|
return MPU_Write_Byte(MPU_ACCEL_CFG_REG,fsr<<3);//<2F><><EFBFBD>ü<EFBFBD><C3BC>ٶȴ<D9B6><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̷<EFBFBD>Χ
|
|||
|
|
}
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>MPU6050<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ͨ<EFBFBD>˲<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param lpf <EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ͨ<EFBFBD>˲<EFBFBD>Ƶ<EFBFBD><EFBFBD>(Hz)
|
|||
|
|
* @return 0,<EFBFBD><EFBFBD><EFBFBD>óɹ<EFBFBD>
|
|||
|
|
*/
|
|||
|
|
u8 MPU_Set_LPF(u16 lpf){
|
|||
|
|
u8 data=0;
|
|||
|
|
if(lpf>=188)data=1;
|
|||
|
|
else if(lpf>=98)data=2;
|
|||
|
|
else if(lpf>=42)data=3;
|
|||
|
|
else if(lpf>=20)data=4;
|
|||
|
|
else if(lpf>=10)data=5;
|
|||
|
|
else data=6;
|
|||
|
|
return MPU_Write_Byte(MPU_CFG_REG,data);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ͨ<EFBFBD>˲<EFBFBD><CBB2><EFBFBD>
|
|||
|
|
}
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>MPU6050<EFBFBD>IJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD>ٶ<EFBFBD>Fs=1KHz)
|
|||
|
|
* @param rate 4~1000(Hz)
|
|||
|
|
* @return 0,<EFBFBD><EFBFBD><EFBFBD>óɹ<EFBFBD>
|
|||
|
|
*/
|
|||
|
|
u8 MPU_Set_Rate(u16 rate){
|
|||
|
|
u8 data;
|
|||
|
|
if(rate>1000)rate=1000;
|
|||
|
|
if(rate<4)rate=4;
|
|||
|
|
data=1000/rate-1;
|
|||
|
|
data=MPU_Write_Byte(MPU_SAMPLE_RATE_REG,data); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ͨ<EFBFBD>˲<EFBFBD><CBB2><EFBFBD>
|
|||
|
|
return MPU_Set_LPF(rate/2); //<2F>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>LPFΪ<46><CEAA><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>һ<EFBFBD><D2BB>
|
|||
|
|
}
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD>õ<EFBFBD><EFBFBD>¶<EFBFBD>ֵ
|
|||
|
|
* @return <EFBFBD>¶<EFBFBD>ֵ(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>100<EFBFBD><EFBFBD>)
|
|||
|
|
*/
|
|||
|
|
short MPU_Get_Temperature(void){
|
|||
|
|
u8 buf[2];
|
|||
|
|
short raw;
|
|||
|
|
float temp;
|
|||
|
|
MPU_Read_Len(MPU_ADDR,MPU_TEMP_OUTH_REG,2,buf);
|
|||
|
|
raw=((u16)buf[0]<<8)|buf[1];
|
|||
|
|
temp=36.53+((double)raw)/340;
|
|||
|
|
return temp*100;}
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ(ԭʼֵ)
|
|||
|
|
* @param gx <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>x<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|||
|
|
* @param gy <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>y<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|||
|
|
* @param gx <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>z<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|||
|
|
* @return 0,<EFBFBD><EFBFBD><EFBFBD>óɹ<EFBFBD>
|
|||
|
|
*/
|
|||
|
|
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;}
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>ֵ(ԭʼֵ)
|
|||
|
|
* @param ax <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>a<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|||
|
|
* @param ay <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>a<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|||
|
|
* @param ax <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>a<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|||
|
|
* @return 0,<EFBFBD><EFBFBD><EFBFBD>óɹ<EFBFBD>
|
|||
|
|
*/
|
|||
|
|
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;}
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/**
|
|||
|
|
* @brief IIC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д
|
|||
|
|
* @param addr <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
|
* @param reg <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
|
* @param len д<EFBFBD>볤<EFBFBD><EFBFBD>
|
|||
|
|
* @param *buf <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @return 0,<EFBFBD><EFBFBD><EFBFBD>óɹ<EFBFBD>
|
|||
|
|
*/
|
|||
|
|
u8 MPU_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf){
|
|||
|
|
mpu6050IIC.IIC_Write(addr,reg,(u8*)buf,len);
|
|||
|
|
return 0;}
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
/**
|
|||
|
|
* @brief IIC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param addr <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
|
* @param reg <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
|
* @param len <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param *buf <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @return 0,<EFBFBD><EFBFBD><EFBFBD>óɹ<EFBFBD>
|
|||
|
|
*/
|
|||
|
|
u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf){
|
|||
|
|
mpu6050IIC.IIC_Read(addr,reg,(u8*)buf,len);
|
|||
|
|
return 0;}
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
/**
|
|||
|
|
* @brief IICдһ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
|
|||
|
|
* @param reg <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
|
* @param data <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @return 0,<EFBFBD><EFBFBD><EFBFBD>óɹ<EFBFBD>
|
|||
|
|
*/
|
|||
|
|
u8 MPU_Write_Byte(u8 reg,u8 data){
|
|||
|
|
mpu6050IIC.IIC_WriteOneByte(MPU_ADDR,reg,data);
|
|||
|
|
return 0;}
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
/**
|
|||
|
|
* @brief IIC<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
|
|||
|
|
* @param reg <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
|
* @return 0,<EFBFBD><EFBFBD><EFBFBD>óɹ<EFBFBD>
|
|||
|
|
*/
|
|||
|
|
u8 MPU_Read_Byte(u8 reg){
|
|||
|
|
return mpu6050IIC.IIC_ReadOneByte(MPU_ADDR,reg);}
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|