126 lines
2.8 KiB
C
126 lines
2.8 KiB
C
|
#include "./mpu6050/mpu6050.h"
|
|||
|
#include "./usart/bsp_debug_usart.h"
|
|||
|
#include "./i2c/i2c.h"
|
|||
|
|
|||
|
|
|||
|
#define MPU_ERROR I2C_ERROR
|
|||
|
#define MPU_INFO I2C_INFO
|
|||
|
/**
|
|||
|
* @brief д<EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>MPU6050<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param reg_add:<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
* @param reg_data:Ҫд<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @retval
|
|||
|
*/
|
|||
|
void MPU6050_WriteReg(uint8_t reg_add,uint8_t reg_dat)
|
|||
|
{
|
|||
|
Sensors_I2C_WriteRegister(MPU6050_ADDRESS,reg_add,1,®_dat);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD>MPU6050<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param reg_add:<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
* @param Read<EFBFBD><EFBFBD><EFBFBD>洢<EFBFBD><EFBFBD><EFBFBD>ݵĻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param num<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @retval
|
|||
|
*/
|
|||
|
void MPU6050_ReadData(uint8_t reg_add,unsigned char* Read,uint8_t num)
|
|||
|
{
|
|||
|
Sensors_I2C_ReadRegister(MPU6050_ADDRESS,reg_add,num,Read);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>MPU6050оƬ
|
|||
|
* @param
|
|||
|
* @retval
|
|||
|
*/
|
|||
|
void MPU6050_Init(void)
|
|||
|
{
|
|||
|
//<2F>ڳ<EFBFBD>ʼ<EFBFBD><CABC>֮ǰҪ<C7B0><D2AA>ʱһ<CAB1><D2BB>ʱ<EFBFBD>䣬<EFBFBD><E4A3AC>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF>ܻ<EFBFBD><DCBB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
Delay(100);
|
|||
|
MPU6050_WriteReg(MPU6050_RA_PWR_MGMT_1, 0x00); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
|
|||
|
MPU6050_WriteReg(MPU6050_RA_SMPLRT_DIV , 0x07); //<2F><><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
MPU6050_WriteReg(MPU6050_RA_CONFIG , 0x06);
|
|||
|
MPU6050_WriteReg(MPU6050_RA_ACCEL_CONFIG , 0x01); //<2F><><EFBFBD>ü<EFBFBD><C3BC>ٶȴ<D9B6><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16Gģʽ
|
|||
|
MPU6050_WriteReg(MPU6050_RA_GYRO_CONFIG, 0x18); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ켰<D4BC><ECBCB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>0x18(<28><><EFBFBD>Լ죬2000deg/s)
|
|||
|
Delay(200);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD>ȡMPU6050<EFBFBD><EFBFBD>ID
|
|||
|
* @param
|
|||
|
* @retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD>쳣<EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
|
|||
|
*/
|
|||
|
uint8_t MPU6050ReadID(void)
|
|||
|
{
|
|||
|
unsigned char Re = 0;
|
|||
|
MPU6050_ReadData(MPU6050_RA_WHO_AM_I,&Re,1); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
if(Re != 0x68)
|
|||
|
{
|
|||
|
MPU_ERROR("MPU6050 dectected error!\r\n<EFBFBD><EFBFBD><EFBFBD>ⲻ<EFBFBD><EFBFBD>MPU6050ģ<EFBFBD>飬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD>뿪<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD><EFBFBD><EFBFBD>");
|
|||
|
return 0;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
MPU_INFO("MPU6050 ID = %d\r\n",Re);
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD>ȡMPU6050<EFBFBD>ļ<EFBFBD><EFBFBD>ٶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param
|
|||
|
* @retval
|
|||
|
*/
|
|||
|
void MPU6050ReadAcc(short *accData)
|
|||
|
{
|
|||
|
uint8_t buf[6];
|
|||
|
MPU6050_ReadData(MPU6050_ACC_OUT, buf, 6);
|
|||
|
accData[0] = (buf[0] << 8) | buf[1];
|
|||
|
accData[1] = (buf[2] << 8) | buf[3];
|
|||
|
accData[2] = (buf[4] << 8) | buf[5];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD>ȡMPU6050<EFBFBD>ĽǼ<EFBFBD><EFBFBD>ٶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param
|
|||
|
* @retval
|
|||
|
*/
|
|||
|
void MPU6050ReadGyro(short *gyroData)
|
|||
|
{
|
|||
|
uint8_t buf[6];
|
|||
|
MPU6050_ReadData(MPU6050_GYRO_OUT,buf,6);
|
|||
|
gyroData[0] = (buf[0] << 8) | buf[1];
|
|||
|
gyroData[1] = (buf[2] << 8) | buf[3];
|
|||
|
gyroData[2] = (buf[4] << 8) | buf[5];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD>ȡMPU6050<EFBFBD><EFBFBD>ԭʼ<EFBFBD>¶<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param
|
|||
|
* @retval
|
|||
|
*/
|
|||
|
void MPU6050ReadTemp(short *tempData)
|
|||
|
{
|
|||
|
uint8_t buf[2];
|
|||
|
MPU6050_ReadData(MPU6050_RA_TEMP_OUT_H,buf,2); //<2F><>ȡ<EFBFBD>¶<EFBFBD>ֵ
|
|||
|
*tempData = (buf[0] << 8) | buf[1];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD>ȡMPU6050<EFBFBD><EFBFBD><EFBFBD>¶<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD>
|
|||
|
* @param
|
|||
|
* @retval
|
|||
|
*/
|
|||
|
void MPU6050_ReturnTemp(float *Temperature)
|
|||
|
{
|
|||
|
short temp3;
|
|||
|
uint8_t buf[2];
|
|||
|
|
|||
|
MPU6050_ReadData(MPU6050_RA_TEMP_OUT_H,buf,2); //<2F><>ȡ<EFBFBD>¶<EFBFBD>ֵ
|
|||
|
temp3= (buf[0] << 8) | buf[1];
|
|||
|
*Temperature=((double) temp3/340.0)+36.53;
|
|||
|
|
|||
|
}
|