修改传感器错误条件,将超范围数据算作正确数据,限制范围,每个传感器每次采10遍避免单次采样错误判错
This commit is contained in:
parent
c6ec628b9f
commit
5bf6c8f995
|
@ -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);//读取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("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;
|
||||||
|
}
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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};
|
||||||
|
|
||||||
if (HAL_OK == TMP117_Read(TMP117_TEMP_REG, raw_data)) {
|
for(int i = 0; i<COLLECT_DATA_NUM; i++)
|
||||||
temp_raw = (raw_data[0] << 8) | raw_data[1];
|
{
|
||||||
*temp = temp_raw * 0.0078125f;
|
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;
|
*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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue