STM32H750XB_RT-THREAD/44-MPU6050(包含程序+上位机)/程序/1.MPU6050基本数据读取_(软件I2C)/User/mpu6050/mpu6050.c

126 lines
2.7 KiB
C
Raw Normal View History

2025-07-21 06:34:29 +00:00
#include "./mpu6050/mpu6050.h"
#include "./usart/bsp_debug_usart.h"
#include "./i2c/i2c.h"
#include "stm32h7xx_hal.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)
{
Sensor_write(reg_add, reg_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)
{
Sensor_Read(reg_add,Read,num);
}
/**
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>MPU6050оƬ
* @param
* @retval
*/
void MPU6050_Init(void)
{
MPU6050_WriteReg(MPU6050_RA_PWR_MGMT_1, 0x80); //<2F><>λMPU6050
HAL_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)
HAL_Delay(50);
}
/**
* @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;
}