注释与语言的极大更新
使用了Doxygen注释风格, 使用了C++混合编程
This commit is contained in:
190
bscpp_Device/bscpp_MPU6050/mpu6050.cpp
Normal file
190
bscpp_Device/bscpp_MPU6050/mpu6050.cpp
Normal file
@@ -0,0 +1,190 @@
|
||||
/**
|
||||
* @file mpu6050
|
||||
* @brief 实现mpu6050功能
|
||||
* @mainpage 主要信息
|
||||
* @author Yuankang Liang(XerolySkinner)
|
||||
* @email zabbcccbbaz@163.com
|
||||
* @version V1.0.0
|
||||
* @date 2022-11-08 01:09
|
||||
*/
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// 头文件
|
||||
#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);
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// 函数区
|
||||
/**
|
||||
* @brief 初始化MPU6050
|
||||
* @return 0,成功
|
||||
*/
|
||||
u8 MPU_Init(void){
|
||||
u8 res;
|
||||
//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,PLL X轴为参考
|
||||
MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00); //加速度与陀螺仪都工作
|
||||
MPU_Set_Rate(50); //设置采样率为50Hz
|
||||
}else return 1;
|
||||
return 0;}
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
/**
|
||||
* @brief 设置MPU6050陀螺仪传感器满量程范围
|
||||
* @param fsr 0,±250dps
|
||||
* 1,±500dps
|
||||
* 2,±1000dps
|
||||
* 3,±2000dps
|
||||
* @return 0,设置成功
|
||||
*/
|
||||
u8 MPU_Set_Gyro_Fsr(u8 fsr){
|
||||
return MPU_Write_Byte(MPU_GYRO_CFG_REG,fsr<<3);//设置陀螺仪满量程范围
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
/**
|
||||
* @brief 设置MPU6050加速度传感器满量程范围
|
||||
* @param fsr 0,±2g
|
||||
* 1,±4g
|
||||
* 2,±8g
|
||||
* 3,±16g
|
||||
* @return 0,设置成功
|
||||
*/
|
||||
u8 MPU_Set_Accel_Fsr(u8 fsr){
|
||||
return MPU_Write_Byte(MPU_ACCEL_CFG_REG,fsr<<3);//设置加速度传感器满量程范围
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
/**
|
||||
* @brief 设置MPU6050的数字低通滤波器
|
||||
* @param lpf 数字低通滤波频率(Hz)
|
||||
* @return 0,设置成功
|
||||
*/
|
||||
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);//设置数字低通滤波器
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
/**
|
||||
* @brief 设置MPU6050的采样率(假定Fs=1KHz)
|
||||
* @param rate 4~1000(Hz)
|
||||
* @return 0,设置成功
|
||||
*/
|
||||
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); //设置数字低通滤波器
|
||||
return MPU_Set_LPF(rate/2); //自动设置LPF为采样率的一半
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
/**
|
||||
* @brief 得到温度值
|
||||
* @return 温度值(扩大了100倍)
|
||||
*/
|
||||
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 得到陀螺仪值(原始值)
|
||||
* @param gx 陀螺仪x轴的原始读数(带符号)
|
||||
* @param gy 陀螺仪y轴的原始读数(带符号)
|
||||
* @param gx 陀螺仪z轴的原始读数(带符号)
|
||||
* @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;}
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
/**
|
||||
* @brief 得到加速度值(原始值)
|
||||
* @param ax 陀螺仪a轴的原始读数(带符号)
|
||||
* @param ay 陀螺仪a轴的原始读数(带符号)
|
||||
* @param ax 陀螺仪a轴的原始读数(带符号)
|
||||
* @return 0,设置成功
|
||||
*/
|
||||
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;}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// 适配区
|
||||
/**
|
||||
* @brief IIC连续写
|
||||
* @param addr 器件地址
|
||||
* @param reg 寄存器地址
|
||||
* @param len 写入长度
|
||||
* @param *buf 数据区
|
||||
* @return 0,设置成功
|
||||
*/
|
||||
u8 MPU_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf){
|
||||
mpu6050IIC.IIC_Write(addr,reg,(u8*)buf,len);
|
||||
return 0;}
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
/**
|
||||
* @brief IIC连续读
|
||||
* @param addr 器件地址
|
||||
* @param reg 寄存器地址
|
||||
* @param len 读取长度
|
||||
* @param *buf 读取数据区
|
||||
* @return 0,设置成功
|
||||
*/
|
||||
u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf){
|
||||
mpu6050IIC.IIC_Read(addr,reg,(u8*)buf,len);
|
||||
return 0;}
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
/**
|
||||
* @brief IIC写一个字节
|
||||
* @param reg 寄存器地址
|
||||
* @param data 数据
|
||||
* @return 0,设置成功
|
||||
*/
|
||||
u8 MPU_Write_Byte(u8 reg,u8 data){
|
||||
mpu6050IIC.IIC_WriteOneByte(MPU_ADDR,reg,data);
|
||||
return 0;}
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
/**
|
||||
* @brief IIC读一个字节
|
||||
* @param reg 寄存器地址
|
||||
* @return 0,设置成功
|
||||
*/
|
||||
u8 MPU_Read_Byte(u8 reg){
|
||||
return mpu6050IIC.IIC_ReadOneByte(MPU_ADDR,reg);}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Reference in New Issue
Block a user