修改传感器错误条件,将超范围数据算作正确数据,限制范围,每个传感器每次采10遍避免单次采样错误判错

This commit is contained in:
95384 2025-03-07 17:09:42 +08:00
parent c6ec628b9f
commit 5bf6c8f995
5 changed files with 142 additions and 66 deletions

View File

@ -33,15 +33,24 @@ void MS56XX_Init(void)
MS56XX_Read_PromData(MS56XX_C_Value); MS56XX_Read_PromData(MS56XX_C_Value);
} }
static uint32_t MS56XX_ReadD1_Press(void) static HAL_StatusTypeDef MS56XX_ReadD1_Press(uint32_t *D1_Value)
{ {
uint8_t D1_Value_Buff[3] = {0xFF, 0xFF, 0xFF}; uint8_t D1_Value_Buff[3] = {0xFF, 0xFF, 0xFF};
uint8_t _cmd[] = {0x48}; uint8_t _cmd[] = {0x48};
uint8_t _addr[] = {0x00}; uint8_t _addr[] = {0x00};
HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff); if(HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff) != HAL_OK)
{
return HAL_ERROR;
}
osDelay(20); osDelay(20);
HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff); if(HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff) != HAL_OK)
HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D1_Value_Buff, 3, 0xff); {
return HAL_ERROR;
}
if(HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D1_Value_Buff, 3, 0xff) != HAL_OK)
{
return HAL_ERROR;
}
uint32_t press; uint32_t press;
press = D1_Value_Buff[0]; press = D1_Value_Buff[0];
@ -49,18 +58,28 @@ static uint32_t MS56XX_ReadD1_Press(void)
press += D1_Value_Buff[1]; press += D1_Value_Buff[1];
press <<= 8; press <<= 8;
press += D1_Value_Buff[2]; press += D1_Value_Buff[2];
return press; *D1_Value = press;
return HAL_OK;
} }
static uint32_t MS56XX_ReadD2_Temp(void) static HAL_StatusTypeDef MS56XX_ReadD2_Temp(uint32_t *D2_Value_)
{ {
uint8_t D2_Value_Buff[3] = {0x00, 0x00, 0x00}; uint8_t D2_Value_Buff[3] = {0x00, 0x00, 0x00};
uint8_t _cmd[] = {0x58}; uint8_t _cmd[] = {0x58};
uint8_t _addr[] = {0x00}; uint8_t _addr[] = {0x00};
HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff); if(HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff) != HAL_OK)
{
return HAL_ERROR;
}
osDelay(20); osDelay(20);
HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff); if(HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff) != HAL_OK)
HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D2_Value_Buff, 3, 0xff); {
return HAL_ERROR;
}
if(HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D2_Value_Buff, 3, 0xff) != HAL_OK)
{
return HAL_ERROR;
}
uint32_t Temp; uint32_t Temp;
Temp = D2_Value_Buff[0]; Temp = D2_Value_Buff[0];
@ -68,13 +87,17 @@ static uint32_t MS56XX_ReadD2_Temp(void)
Temp += D2_Value_Buff[1]; Temp += D2_Value_Buff[1];
Temp <<= 8; Temp <<= 8;
Temp += D2_Value_Buff[2]; Temp += D2_Value_Buff[2];
return Temp; *D2_Value_ = Temp;
return HAL_OK;
} }
static void MS56XX_GetTemperature (int32_t *dT, int32_t *MS56XX_Temp) //计算温度 static HAL_StatusTypeDef MS56XX_GetTemperature (int32_t *dT, int32_t *MS56XX_Temp) //计算温度
{ {
uint32_t D2_Value = MS56XX_ReadD2_Temp(); //循环读取 D2 uint32_t D2_Value;
if(MS56XX_ReadD2_Temp(&D2_Value) != HAL_OK) //循环读取 D2
{
return HAL_ERROR;
}
// term_printf("D2:%d\r\n", D2_Value); // term_printf("D2:%d\r\n", D2_Value);
if(D2_Value > (MS56XX_C_Value[5] * 256)) if(D2_Value > (MS56XX_C_Value[5] * 256))
@ -88,15 +111,23 @@ static void MS56XX_GetTemperature (int32_t *dT, int32_t *MS56XX_Temp) //
// term_printf("dT:%d\r\n", *dT); // term_printf("dT:%d\r\n", *dT);
*MS56XX_Temp = 2000 + *dT * ((int32_t)MS56XX_C_Value[6]/8388608.0); //算出温度值的100倍2001表示20.01° 公式TEMP =20°C + dT * TEMPSENS =2000 + dT * C6 / 2^23 *MS56XX_Temp = 2000 + *dT * ((int32_t)MS56XX_C_Value[6]/8388608.0); //算出温度值的100倍2001表示20.01° 公式TEMP =20°C + dT * TEMPSENS =2000 + dT * C6 / 2^23
return HAL_OK;
} }
uint8_t MS56XX_GetPressureTemp (float *Temp, float *Press) //计算温度补偿压力 static HAL_StatusTypeDef MS56XX_GetPressureTemp(float *Temp, float *Press) //计算温度补偿压力
{ {
int32_t dT; int32_t dT;
int32_t MS56XX_Temperature; int32_t MS56XX_Temperature;
uint32_t D1_Value = MS56XX_ReadD1_Press(); //循环读取 D1 uint32_t D1_Value;
if(MS56XX_ReadD1_Press(&D1_Value) != HAL_OK) //循环读取 D1
{
return HAL_ERROR;
}
MS56XX_GetTemperature(&dT, &MS56XX_Temperature);//读取dTTemp if(MS56XX_GetTemperature(&dT, &MS56XX_Temperature) != HAL_OK)//读取dTTemp
{
return HAL_ERROR;
}
// term_printf("TEMP:%d\r\n", MS56XX_Temperature); // term_printf("TEMP:%d\r\n", MS56XX_Temperature);
// term_printf("dT:%d\r\n", dT); // term_printf("dT:%d\r\n", dT);
@ -145,28 +176,55 @@ uint8_t MS56XX_GetPressureTemp (float *Temp, float *Press) //
if(MS56XX_Temperature<-6000) if(MS56XX_Temperature<-6000)
{ {
MS56XX_Temperature=-6000; MS56XX_Temperature=-6000;
*Temp = ((float)MS56XX_Temperature)/100;
return 0;
} }
if(MS56XX_Temperature>8500) if(MS56XX_Temperature>8500)
{ {
MS56XX_Temperature=8500; MS56XX_Temperature=8500;
*Temp = ((float)MS56XX_Temperature)/100;
return 0;
} }
if(Tmp_Pressure<1000) if(Tmp_Pressure<1000)
{ {
Tmp_Pressure=1000; Tmp_Pressure=1000;
*Press = ((float)Tmp_Pressure)/100;
return 0;
} }
if(Tmp_Pressure>120000) if(Tmp_Pressure>120000)
{ {
Tmp_Pressure=120000; Tmp_Pressure=120000;
*Press = ((float)Tmp_Pressure)/100;
return 0;
} }
*Temp = ((float)MS56XX_Temperature)/100; *Temp = ((float)MS56XX_Temperature)/100;
*Press = ((float)Tmp_Pressure)/100; *Press = ((float)Tmp_Pressure)/100;
return 1; return HAL_OK;
}
static float calculateAverage(float arr[], int avgLength) {
float sum = 0;
// 遍历数组最多10个元素收集非零值直到达到指定数量
for (int i = 0; i < 10; ++i) {
sum += arr[i];
}
// 计算平均值并限制最大值
float average = sum / avgLength;
return average;
}
#define COLLECT_DATA_NUM 10
HAL_StatusTypeDef MS56XX_GetPressure(float *Press)
{
float temp_buff;
float pressure_buff[COLLECT_DATA_NUM] = {0};
uint8_t ret_falt = 0;
for(uint8_t i = 0;i<COLLECT_DATA_NUM;i++)
{
if(MS56XX_GetPressureTemp(&temp_buff, &pressure_buff[i]) != HAL_OK)
{
ret_falt++;
pressure_buff[i] = 0;
}
}
if(ret_falt >= COLLECT_DATA_NUM)
{
return HAL_ERROR;
}
*Press = calculateAverage( pressure_buff,COLLECT_DATA_NUM - ret_falt);
return HAL_OK;
} }

View File

@ -8,11 +8,12 @@ extern "C" {
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include "main.h" #include "main.h"
#include "comm_types.h" #include "comm_types.h"
#include "cmsis_os.h"
#define MS5607_ADDRESS 0x77<<1 #define MS5607_ADDRESS 0x77<<1
void MS56XX_Init(void); void MS56XX_Init(void);
uint8_t MS56XX_GetPressureTemp (float *Temp, float *Press); HAL_StatusTypeDef MS56XX_GetPressure(float *Press);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -170,19 +170,19 @@ static float calculateAverage(float arr[], int avgLength) {
* @retval * @retval
*/ */
#define COLLECT_DATA_NUM 10 #define COLLECT_DATA_NUM 10
BOOL get_temp_humi_data(float* temdata, float* humidata) HAL_StatusTypeDef get_temp_humi_data(float* temdata, float* humidata)
{ {
float collect_temdata[COLLECT_DATA_NUM] = {0}; float collect_temdata[COLLECT_DATA_NUM] = {0};
float collect_humidata[COLLECT_DATA_NUM] = {0}; float collect_humidata[COLLECT_DATA_NUM] = {0};
float tmp_temdata,tmp_humidata; float tmp_temdata,tmp_humidata;
uint8_t ret_falt = 0;; uint8_t ret_falt = 0;
for(int i=0; i<COLLECT_DATA_NUM; i++){ for(int i=0; i<COLLECT_DATA_NUM; i++){
int ret = sht45_collect_data(g_stTempHumiSensor,&collect_temdata[i], &collect_humidata[i]); if(sht45_collect_data(g_stTempHumiSensor,&collect_temdata[i], &collect_humidata[i]) == HAL_ERROR)
// AssertError(ret == HAL_OK, return FALSE, "sht30采样失败");
if(ret == HAL_ERROR)
{ {
ret_falt++; ret_falt++;
collect_temdata[i] = 0;
collect_humidata[i] = 0;
} }
osDelay(1); osDelay(1);
} }
@ -194,49 +194,32 @@ BOOL get_temp_humi_data(float* temdata, float* humidata)
tmp_temdata = calculateAverage(collect_temdata,COLLECT_DATA_NUM - ret_falt); tmp_temdata = calculateAverage(collect_temdata,COLLECT_DATA_NUM - ret_falt);
tmp_humidata = calculateAverage(collect_humidata,COLLECT_DATA_NUM - ret_falt); tmp_humidata = calculateAverage(collect_humidata,COLLECT_DATA_NUM - ret_falt);
// 断言有问题 if(tmp_temdata < -50.0)
// AssertError((tmp_temdata.fValue >= -40) && (tmp_temdata.fValue <= 85), return FALSE, "sht30温度值校验失败");
// AssertError((tmp_humidata.fValue >= 0) && (tmp_humidata.fValue <= 100), return FALSE, "sht30湿度值校验失败");
if(tmp_temdata < -50)
{ {
// tmp_temdata.fValue = -40; tmp_temdata = -50.0;
// term_printf("sht30温度值校验失败");
// return FALSE;
goto error_return;
} }
if(tmp_temdata > 125) if(tmp_temdata > 125.0)
{ {
// tmp_temdata.fValue = 125; tmp_temdata = 125.0;
// term_printf("sht30温度值校验失败");
// return FALSE;
goto error_return;
} }
if(tmp_humidata < 0) if(tmp_humidata < 0.0)
{ {
// tmp_humidata.fValue = 0; tmp_humidata = 0.0;
// term_printf("sht30湿度值校验失败");
// return FALSE;
goto error_return;
} }
if(tmp_humidata > 100) if(tmp_humidata > 100.0)
{ {
// tmp_humidata.fValue = 100; tmp_humidata = 100.0;
// term_printf("sht3湿度值校验失败");
// return FALSE;
goto error_return;
} }
*temdata = tmp_temdata; *temdata = tmp_temdata;
*humidata = tmp_humidata; *humidata = tmp_humidata;
//g_stTempHumiData.temp = tmp_temdata.fValue; return HAL_OK;
//g_stTempHumiData.humi = tmp_humidata.fValue;
return TRUE;
error_return: error_return:
*temdata = 0; *temdata = 0;
*humidata = 0; *humidata = 0;
return FALSE; return HAL_ERROR;
} }
#if 0 #if 0

View File

@ -2,6 +2,7 @@
#define __SHT30_H_ #define __SHT30_H_
#include "comm_types.h" #include "comm_types.h"
#include "main.h"
#define SHT30 "SHT30" #define SHT30 "SHT30"
@ -21,6 +22,6 @@ typedef struct _stTempHumiData{
extern stTempHumiData g_stTempHumiData; extern stTempHumiData g_stTempHumiData;
u_int8_t sht30_init(); u_int8_t sht30_init();
BOOL get_temp_humi_data(float* temdata, float* humidata); HAL_StatusTypeDef get_temp_humi_data(float* temdata, float* humidata);
//void TEST_read_sht30_value(); //void TEST_read_sht30_value();
#endif #endif

View File

@ -1,5 +1,6 @@
#include "tmp117.h" #include "tmp117.h"
#include "i2c.h" #include "i2c.h"
#include "cmsis_os.h"
// 初始化温度传感器 // 初始化温度传感器
@ -17,28 +18,60 @@ HAL_StatusTypeDef TMP117_Read(uint8_t reg, uint8_t *buffer) {
I2C_MEMADD_SIZE_8BIT, buffer, 2, 100); I2C_MEMADD_SIZE_8BIT, buffer, 2, 100);
} }
static float calculateAverage(float arr[], int avgLength) {
float sum = 0;
// 遍历数组最多10个元素收集非零值直到达到指定数量
for (int i = 0; i < 10; ++i) {
sum += arr[i];
}
// 计算平均值并限制最大值
float average = sum / avgLength;
return average;
}
// 获取温度值(单位:℃) // 获取温度值(单位:℃)
#define COLLECT_DATA_NUM 10
HAL_StatusTypeDef TMP117_Get_Temp(float *temp) HAL_StatusTypeDef TMP117_Get_Temp(float *temp)
{ {
uint8_t raw_data[2] = {0}; uint8_t raw_data[2] = {0};
int16_t temp_raw; int16_t temp_raw;
uint8_t ret_falt = 0;
float ret_temp;
float temp_temp[COLLECT_DATA_NUM] = {0};
for(int i = 0; i<COLLECT_DATA_NUM; i++)
{
TMP117_Init();
osDelay(20);
if(TMP117_Read(TMP117_TEMP_REG, raw_data) != HAL_OK)
{
ret_falt++;
temp_temp[i] = 0;
}else
{
temp_raw = (raw_data[0] << 8) | raw_data[1];
temp_temp[i] = temp_raw * 0.0078125f;
}
if (HAL_OK == TMP117_Read(TMP117_TEMP_REG, raw_data)) {
temp_raw = (raw_data[0] << 8) | raw_data[1];
*temp = temp_raw * 0.0078125f;
} }
else if(ret_falt >= COLLECT_DATA_NUM)
{ {
*temp = 0; *temp = 0;
return HAL_ERROR; return HAL_ERROR;
} }
if(*temp <= -60)
ret_temp = calculateAverage(temp_temp, COLLECT_DATA_NUM - ret_falt);
if(ret_temp <= -60)
{ {
*temp = -60; *temp = -60;
} }else if(ret_temp >= 150)
if(*temp >= 150)
{ {
*temp = 150; *temp = 150;
}else
{
*temp = ret_temp;
} }
return HAL_OK; return HAL_OK;
} }