#include "hp203b.h" #include "i2c.h" #include "filter.h" #include "anemometer_dev.h" /**************************** *名称:set_mode *功能:配置从机模式,设置通道及采样率 *参数:无 * * *返回:无 *****************************/ void hp203_set_mode() { uint8_t cmd[1] = {HP20X_CONVERT_OSR1024}; HAL_I2C_Master_Transmit(&hi2c3, HP20X_ADDRESSCMD, cmd, 1, 0xff); } /**************************** *名称:Hp203bReadPressure *功能:获取气压数据 *参数: * * *返回:气压 *****************************/ BOOL Hp203bReadPressure(float *press) { long Hp203b_Pressure = 0; uint8_t Hp203bPressure_Temp[3] = {0}; uint8_t read_command[1] = {HP20X_READ_P}; HAL_I2C_Master_Transmit(&hi2c3, HP20X_ADDRESSCMD, read_command, 1, 0xff); HAL_I2C_Master_Receive(&hi2c3, HP20X_ADDRESSCMD, Hp203bPressure_Temp, 3, 0xff); Hp203b_Pressure = Hp203bPressure_Temp[0]; Hp203b_Pressure <<= 8; Hp203b_Pressure |= Hp203bPressure_Temp[1]; Hp203b_Pressure <<= 8; Hp203b_Pressure |= Hp203bPressure_Temp[2]; *press = (float)Hp203b_Pressure / 100.0f; if(*press < 300 || *press > 1200) { *press = 0; return FALSE; } return TRUE; } /**************************** *名称:Hp203bReadTempture *功能:获取温度数据 *参数: * * *返回:温度 *****************************/ BOOL Hp203bReadTempture(float *press) { uint32_t Hp203b_tempture = 0; uint8_t Hp203bPressure_Temp[3] = {0}; uint8_t read_command[1] = {0x32}; HAL_I2C_Master_Transmit(&hi2c3, HP20X_ADDRESSCMD, read_command, 1, 0xff); HAL_I2C_Master_Receive(&hi2c3, HP20X_ADDRESSCMD, Hp203bPressure_Temp, 3, 0xff); Hp203b_tempture = (Hp203bPressure_Temp[0] & 0x0F)<<16; Hp203b_tempture |= Hp203bPressure_Temp[1]<<8; Hp203b_tempture |= Hp203bPressure_Temp[2]; if((Hp203b_tempture>>19) & 1){ Hp203b_tempture = (((~Hp203b_tempture) + 1) & 0xFFFFF); *press = -(float)Hp203b_tempture / 100.0f; } else{ *press = (float)Hp203b_tempture / 100.0f; } if(*press<-50||*press>95){ *press = 0; return FALSE; } return TRUE; } /**************************** *名称:get_press_data *功能:获取气压与备用温度数据 *参数:Press--气压值 * * *返回:无 *****************************/ #define COLLECT_HB203_DATA_NUM 10 BOOL get_HP203_data(float* tempdata, float* press) { uint8_t ret; uint8_t temp_falt = 0; uint8_t press_falt = 0; // 压强 U_DataType collect_pressure[COLLECT_HB203_DATA_NUM]={0x00}; for(int i=0; i= COLLECT_HB203_DATA_NUM) { goto error_return; } U_DataType tmp_press = filter_middle(collect_pressure, COLLECT_HB203_DATA_NUM - press_falt, FILTER_DATA_TYPE_FLOAT); if(tmp_press.fValue < 300) { // return FALSE; goto error_return; } if(tmp_press.fValue > 1200) { // return FALSE; goto error_return; } // 温度 U_DataType collect_tempture[COLLECT_HB203_DATA_NUM]={0x00}; for(int i=0; i= COLLECT_HB203_DATA_NUM) { goto error_return; } U_DataType tmp_tempture = filter_middle(collect_tempture, COLLECT_HB203_DATA_NUM - temp_falt, FILTER_DATA_TYPE_FLOAT); if(tmp_tempture.fValue < -50) { // return FALSE; goto error_return; } if(tmp_tempture.fValue > 95) { // return FALSE; goto error_return; } *tempdata = tmp_tempture.fValue; *press = tmp_press.fValue; return TRUE; error_return: *tempdata = 0; *press = 0; return FALSE; }