修改传感器错误条件,将超范围数据算作正确数据,限制范围,每个传感器每次采10遍避免单次采样错误判错
This commit is contained in:
parent
c6ec628b9f
commit
5bf6c8f995
|
@ -33,15 +33,24 @@ void MS56XX_Init(void)
|
|||
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 _cmd[] = {0x48};
|
||||
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);
|
||||
HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff);
|
||||
HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D1_Value_Buff, 3, 0xff);
|
||||
if(HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff) != HAL_OK)
|
||||
{
|
||||
return HAL_ERROR;
|
||||
}
|
||||
if(HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D1_Value_Buff, 3, 0xff) != HAL_OK)
|
||||
{
|
||||
return HAL_ERROR;
|
||||
}
|
||||
|
||||
uint32_t press;
|
||||
press = D1_Value_Buff[0];
|
||||
|
@ -49,18 +58,28 @@ static uint32_t MS56XX_ReadD1_Press(void)
|
|||
press += D1_Value_Buff[1];
|
||||
press <<= 8;
|
||||
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 _cmd[] = {0x58};
|
||||
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);
|
||||
HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff);
|
||||
HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D2_Value_Buff, 3, 0xff);
|
||||
if(HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff) != HAL_OK)
|
||||
{
|
||||
return HAL_ERROR;
|
||||
}
|
||||
if(HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D2_Value_Buff, 3, 0xff) != HAL_OK)
|
||||
{
|
||||
return HAL_ERROR;
|
||||
}
|
||||
|
||||
uint32_t Temp;
|
||||
Temp = D2_Value_Buff[0];
|
||||
|
@ -68,13 +87,17 @@ static uint32_t MS56XX_ReadD2_Temp(void)
|
|||
Temp += D2_Value_Buff[1];
|
||||
Temp <<= 8;
|
||||
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);
|
||||
|
||||
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);
|
||||
*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 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);//读取dT,Temp
|
||||
if(MS56XX_GetTemperature(&dT, &MS56XX_Temperature) != HAL_OK)//读取dT,Temp
|
||||
{
|
||||
return HAL_ERROR;
|
||||
}
|
||||
// term_printf("TEMP:%d\r\n", MS56XX_Temperature);
|
||||
|
||||
// term_printf("dT:%d\r\n", dT);
|
||||
|
@ -145,28 +176,55 @@ uint8_t MS56XX_GetPressureTemp (float *Temp, float *Press) //
|
|||
if(MS56XX_Temperature<-6000)
|
||||
{
|
||||
MS56XX_Temperature=-6000;
|
||||
*Temp = ((float)MS56XX_Temperature)/100;
|
||||
return 0;
|
||||
}
|
||||
if(MS56XX_Temperature>8500)
|
||||
{
|
||||
MS56XX_Temperature=8500;
|
||||
*Temp = ((float)MS56XX_Temperature)/100;
|
||||
return 0;
|
||||
}
|
||||
if(Tmp_Pressure<1000)
|
||||
{
|
||||
Tmp_Pressure=1000;
|
||||
*Press = ((float)Tmp_Pressure)/100;
|
||||
return 0;
|
||||
}
|
||||
if(Tmp_Pressure>120000)
|
||||
{
|
||||
Tmp_Pressure=120000;
|
||||
*Press = ((float)Tmp_Pressure)/100;
|
||||
return 0;
|
||||
}
|
||||
*Temp = ((float)MS56XX_Temperature)/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;
|
||||
}
|
|
@ -8,11 +8,12 @@ extern "C" {
|
|||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "main.h"
|
||||
#include "comm_types.h"
|
||||
#include "cmsis_os.h"
|
||||
|
||||
#define MS5607_ADDRESS 0x77<<1
|
||||
|
||||
void MS56XX_Init(void);
|
||||
uint8_t MS56XX_GetPressureTemp (float *Temp, float *Press);
|
||||
HAL_StatusTypeDef MS56XX_GetPressure(float *Press);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -170,19 +170,19 @@ static float calculateAverage(float arr[], int avgLength) {
|
|||
* @retval
|
||||
*/
|
||||
#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_humidata[COLLECT_DATA_NUM] = {0};
|
||||
float tmp_temdata,tmp_humidata;
|
||||
uint8_t ret_falt = 0;;
|
||||
uint8_t ret_falt = 0;
|
||||
|
||||
for(int i=0; i<COLLECT_DATA_NUM; i++){
|
||||
int ret = sht45_collect_data(g_stTempHumiSensor,&collect_temdata[i], &collect_humidata[i]);
|
||||
// AssertError(ret == HAL_OK, return FALSE, "sht30采样失败");
|
||||
if(ret == HAL_ERROR)
|
||||
if(sht45_collect_data(g_stTempHumiSensor,&collect_temdata[i], &collect_humidata[i]) == HAL_ERROR)
|
||||
{
|
||||
ret_falt++;
|
||||
collect_temdata[i] = 0;
|
||||
collect_humidata[i] = 0;
|
||||
}
|
||||
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_humidata = calculateAverage(collect_humidata,COLLECT_DATA_NUM - ret_falt);
|
||||
|
||||
// 断言有问题
|
||||
// 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)
|
||||
if(tmp_temdata < -50.0)
|
||||
{
|
||||
// tmp_temdata.fValue = -40;
|
||||
// term_printf("sht30温度值校验失败");
|
||||
// return FALSE;
|
||||
goto error_return;
|
||||
tmp_temdata = -50.0;
|
||||
}
|
||||
if(tmp_temdata > 125)
|
||||
if(tmp_temdata > 125.0)
|
||||
{
|
||||
// tmp_temdata.fValue = 125;
|
||||
// term_printf("sht30温度值校验失败");
|
||||
// return FALSE;
|
||||
goto error_return;
|
||||
tmp_temdata = 125.0;
|
||||
}
|
||||
if(tmp_humidata < 0)
|
||||
if(tmp_humidata < 0.0)
|
||||
{
|
||||
// tmp_humidata.fValue = 0;
|
||||
// term_printf("sht30湿度值校验失败");
|
||||
// return FALSE;
|
||||
goto error_return;
|
||||
tmp_humidata = 0.0;
|
||||
}
|
||||
if(tmp_humidata > 100)
|
||||
if(tmp_humidata > 100.0)
|
||||
{
|
||||
// tmp_humidata.fValue = 100;
|
||||
// term_printf("sht3湿度值校验失败");
|
||||
// return FALSE;
|
||||
goto error_return;
|
||||
tmp_humidata = 100.0;
|
||||
}
|
||||
|
||||
*temdata = tmp_temdata;
|
||||
*humidata = tmp_humidata;
|
||||
|
||||
//g_stTempHumiData.temp = tmp_temdata.fValue;
|
||||
//g_stTempHumiData.humi = tmp_humidata.fValue;
|
||||
return TRUE;
|
||||
return HAL_OK;
|
||||
|
||||
error_return:
|
||||
*temdata = 0;
|
||||
*humidata = 0;
|
||||
return FALSE;
|
||||
return HAL_ERROR;
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#define __SHT30_H_
|
||||
|
||||
#include "comm_types.h"
|
||||
#include "main.h"
|
||||
|
||||
#define SHT30 "SHT30"
|
||||
|
||||
|
@ -21,6 +22,6 @@ typedef struct _stTempHumiData{
|
|||
extern stTempHumiData g_stTempHumiData;
|
||||
|
||||
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();
|
||||
#endif
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include "tmp117.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);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
uint8_t raw_data[2] = {0};
|
||||
int16_t temp_raw;
|
||||
uint8_t ret_falt = 0;
|
||||
float ret_temp;
|
||||
float temp_temp[COLLECT_DATA_NUM] = {0};
|
||||
|
||||
if (HAL_OK == TMP117_Read(TMP117_TEMP_REG, raw_data)) {
|
||||
temp_raw = (raw_data[0] << 8) | raw_data[1];
|
||||
*temp = temp_raw * 0.0078125f;
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
if(ret_falt >= COLLECT_DATA_NUM)
|
||||
{
|
||||
*temp = 0;
|
||||
return HAL_ERROR;
|
||||
}
|
||||
if(*temp <= -60)
|
||||
|
||||
ret_temp = calculateAverage(temp_temp, COLLECT_DATA_NUM - ret_falt);
|
||||
|
||||
if(ret_temp <= -60)
|
||||
{
|
||||
*temp = -60;
|
||||
}
|
||||
if(*temp >= 150)
|
||||
}else if(ret_temp >= 150)
|
||||
{
|
||||
*temp = 150;
|
||||
}else
|
||||
{
|
||||
*temp = ret_temp;
|
||||
}
|
||||
return HAL_OK;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue