Merge branch 'master' into rain
# Conflicts: # App/Src/anemometer_dev.c # App/Src/frt_protocol.c # EWARM/micro_climate.ewp # EWARM/micro_climate.ewt
This commit is contained in:
commit
a44cfc0cc6
|
@ -20,6 +20,8 @@
|
|||
|
||||
|
||||
|
||||
#define ADC_GAIN_ENABLE 190
|
||||
#define ADC_GAIN_DISABLE 1900
|
||||
|
||||
#define K_128 0xA12EE1FE
|
||||
// 延时REV_MUTE_DELAY us启动ADC采集数据
|
||||
|
|
|
@ -58,32 +58,33 @@ typedef enum
|
|||
FRT_REGISTER_COEFFICIENT = 34, /* 粘度修正系数 */
|
||||
FRT_REGISTER_DISTANCE_NS = 35, /* 南北换能器表面距离 */
|
||||
FRT_REGISTER_DISTANCE_WE = 36, /* 东西换能器表面距离 */
|
||||
FRT_REGISTER_ERROR_LOG = 37, /* 错误日志 */
|
||||
FRT_REGISTER_WIND_C_NS = 38, /* 计算得到的南北风速 */
|
||||
FRT_REGISTER_WIND_C_WE = 39, /* 计算得到的东西风速 */
|
||||
FRT_REGISTER_LINEAR_POINT_X_1 = 40, /* 线性插值原始点1 */
|
||||
FRT_REGISTER_LINEAR_POINT_X_2 = 41, /* 线性插值原始点2 */
|
||||
FRT_REGISTER_LINEAR_POINT_X_3 = 42, /* 线性插值原始点3 */
|
||||
FRT_REGISTER_LINEAR_POINT_X_4 = 43, /* 线性插值原始点4 */
|
||||
FRT_REGISTER_LINEAR_POINT_X_5 = 44, /* 线性插值原始点5 */
|
||||
FRT_REGISTER_LINEAR_POINT_Y_1 = 45, /* 线性插值校准点1 */
|
||||
FRT_REGISTER_LINEAR_POINT_Y_2 = 46, /* 线性插值校准点2 */
|
||||
FRT_REGISTER_LINEAR_POINT_Y_3 = 47, /* 线性插值校准点3 */
|
||||
FRT_REGISTER_LINEAR_POINT_Y_4 = 48, /* 线性插值校准点4 */
|
||||
FRT_REGISTER_LINEAR_POINT_Y_5 = 49, /* 线性插值校准点5 */
|
||||
FRT_REGISTER_LINEAR_ENABLE = 50, /* 线性插值使能 */
|
||||
FRT_REGISTER_MAX_WAVE_1 = 51, /* 换能器最大波形 */
|
||||
FRT_REGISTER_MAX_WAVE_2 = 52, /* 换能器最大波形 */
|
||||
FRT_REGISTER_MAX_WAVE_3 = 53, /* 换能器最大波形 */
|
||||
FRT_REGISTER_MAX_WAVE_4 = 54, /* 换能器最大波形 */
|
||||
FRT_REGISTER_ID_1 = 55, /* ID16 */
|
||||
FRT_REGISTER_ID_2 = 56, /* ID32 */
|
||||
FRT_REGISTER_ID_3 = 57, /* ID48 */
|
||||
FRT_REGISTER_ID_4 = 58, /* ID64 */
|
||||
FRT_REGISTER_ENCRYPT_1 = 59, /* 密文16 */
|
||||
FRT_REGISTER_ENCRYPT_2 = 60, /* 密文32 */
|
||||
FRT_REGISTER_ENCRYPT_3 = 61, /* 密文48 */
|
||||
FRT_REGISTER_ENCRYPT_4 = 62, /* 密文64 */
|
||||
FRT_REGISTER_ANEMOMETER_DELAY = 37, /* 换能器匹配层延时 */
|
||||
FRT_REGISTER_ERROR_LOG = 38, /* 错误日志 */
|
||||
FRT_REGISTER_WIND_C_NS = 39, /* 计算得到的南北风速 */
|
||||
FRT_REGISTER_WIND_C_WE = 40, /* 计算得到的东西风速 */
|
||||
FRT_REGISTER_LINEAR_POINT_X_1 = 41, /* 线性插值原始点1 */
|
||||
FRT_REGISTER_LINEAR_POINT_X_2 = 42, /* 线性插值原始点2 */
|
||||
FRT_REGISTER_LINEAR_POINT_X_3 = 43, /* 线性插值原始点3 */
|
||||
FRT_REGISTER_LINEAR_POINT_X_4 = 44, /* 线性插值原始点4 */
|
||||
FRT_REGISTER_LINEAR_POINT_X_5 = 45, /* 线性插值原始点5 */
|
||||
FRT_REGISTER_LINEAR_POINT_Y_1 = 46, /* 线性插值校准点1 */
|
||||
FRT_REGISTER_LINEAR_POINT_Y_2 = 47, /* 线性插值校准点2 */
|
||||
FRT_REGISTER_LINEAR_POINT_Y_3 = 48, /* 线性插值校准点3 */
|
||||
FRT_REGISTER_LINEAR_POINT_Y_4 = 49, /* 线性插值校准点4 */
|
||||
FRT_REGISTER_LINEAR_POINT_Y_5 = 50, /* 线性插值校准点5 */
|
||||
FRT_REGISTER_LINEAR_ENABLE = 51, /* 线性插值使能 */
|
||||
FRT_REGISTER_MAX_WAVE_1 = 52, /* 换能器最大波形 */
|
||||
FRT_REGISTER_MAX_WAVE_2 = 53, /* 换能器最大波形 */
|
||||
FRT_REGISTER_MAX_WAVE_3 = 54, /* 换能器最大波形 */
|
||||
FRT_REGISTER_MAX_WAVE_4 = 55, /* 换能器最大波形 */
|
||||
FRT_REGISTER_ID_1 = 56, /* ID16 */
|
||||
FRT_REGISTER_ID_2 = 57, /* ID32 */
|
||||
FRT_REGISTER_ID_3 = 58, /* ID48 */
|
||||
FRT_REGISTER_ID_4 = 59, /* ID64 */
|
||||
FRT_REGISTER_ENCRYPT_1 = 60, /* 密文16 */
|
||||
FRT_REGISTER_ENCRYPT_2 = 61, /* 密文32 */
|
||||
FRT_REGISTER_ENCRYPT_3 = 62, /* 密文48 */
|
||||
FRT_REGISTER_ENCRYPT_4 = 63, /* 密文64 */
|
||||
}FRT_MsgRegister;
|
||||
|
||||
#pragma pack(push,1)
|
||||
|
|
|
@ -68,6 +68,7 @@ typedef struct _factory_config_info{
|
|||
u_int16_t linear_point_5_y; /* 线性插值点5Y */
|
||||
u_int16_t linear_enable; /* 线性插值使能 */
|
||||
u_int32_t encrypt_1; /* 后32位密文 */
|
||||
u_int16_t anemometerDelayTime; /* 换能器匹配层延时us */
|
||||
u_int16_t temp0; /* 占位留待升级 */
|
||||
u_int16_t temp1; /* 占位留待升级 */
|
||||
u_int16_t temp2; /* 占位留待升级 */
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include "LowPassFilter.h"
|
||||
#include "encrypt.h"
|
||||
#include "rain.h"
|
||||
#include "ms5607.h"
|
||||
|
||||
#define AVE_TIME 600 //滑动平均时间,秒,最大600
|
||||
#define COVER_TINE 10 //探头遮挡后导致的接收次数过小的报错临界次数
|
||||
|
@ -94,30 +95,30 @@ void config_adc_gain(uint8_t channel, uint16_t max_val)
|
|||
switch(channel)
|
||||
{
|
||||
case 0x01:
|
||||
if(max_val <= 180)
|
||||
if(max_val <= ADC_GAIN_ENABLE)
|
||||
gain_status.gain_status_s = 1;
|
||||
else if(max_val >= 1900)
|
||||
else if(max_val >= ADC_GAIN_DISABLE)
|
||||
gain_status.gain_status_s = 0;
|
||||
break;
|
||||
|
||||
case 0x02:
|
||||
if(max_val <= 180)
|
||||
if(max_val <= ADC_GAIN_ENABLE)
|
||||
gain_status.gain_status_n = 1;
|
||||
else if(max_val >= 1900)
|
||||
else if(max_val >= ADC_GAIN_DISABLE)
|
||||
gain_status.gain_status_n = 0;
|
||||
break;
|
||||
|
||||
case 0x03:
|
||||
if(max_val <= 180)
|
||||
if(max_val <= ADC_GAIN_ENABLE)
|
||||
gain_status.gain_status_e = 1;
|
||||
else if(max_val >= 1900)
|
||||
else if(max_val >= ADC_GAIN_DISABLE)
|
||||
gain_status.gain_status_e = 0;
|
||||
break;
|
||||
|
||||
case 0x04:
|
||||
if(max_val <= 180)
|
||||
if(max_val <= ADC_GAIN_ENABLE)
|
||||
gain_status.gain_status_w = 1;
|
||||
else if(max_val >= 1900)
|
||||
else if(max_val >= ADC_GAIN_DISABLE)
|
||||
gain_status.gain_status_w = 0;
|
||||
break;
|
||||
|
||||
|
@ -554,8 +555,8 @@ void wind_task(void const * argument)
|
|||
tof_error_log_NS = 0;
|
||||
g_error_log.tof_error_NS = 0;
|
||||
// 计算成us
|
||||
tofx = ((tofx-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.0001f - 2.0f;
|
||||
tofy = ((tofy-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.0001f - 2.0f;
|
||||
tofx = ((tofx-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.0001f - g_stConfigInfo.anemometerDelayTime*1.0f;
|
||||
tofy = ((tofy-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.0001f - g_stConfigInfo.anemometerDelayTime*1.0f;
|
||||
// 通过各通道渡越时间求时间差
|
||||
dtof = tofx-tofy;
|
||||
|
||||
|
@ -623,8 +624,8 @@ void wind_task(void const * argument)
|
|||
tof_error_log_WE = 0;
|
||||
g_error_log.tof_error_WE = 0;
|
||||
// 计算成us
|
||||
tofx = ((tofx-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.000001f - 2.0f;
|
||||
tofy = ((tofy-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.000001f - 2.0f;
|
||||
tofx = ((tofx-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.000001f - g_stConfigInfo.anemometerDelayTime*1.0f;
|
||||
tofy = ((tofy-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.000001f - g_stConfigInfo.anemometerDelayTime*1.0f;
|
||||
// 通过各通道渡越时间求时间差
|
||||
dtof = tofx-tofy;
|
||||
|
||||
|
@ -1065,25 +1066,57 @@ void my_update_mcs_param(float new_wind_speed, float new_wind_dirction)
|
|||
win_10min.index = (win_10min.index + 1) % g_usrConfigInfo.speed_average_time;//更新索引
|
||||
}
|
||||
|
||||
|
||||
uint8_t SHT45_ERR_NUM = 0;
|
||||
//采集温度,湿度,大气压
|
||||
static void getTempHumiPress(void)
|
||||
{
|
||||
//采集备用温度与大气压
|
||||
float backupTemperature1;
|
||||
float backupTemperature2;
|
||||
uint8_t hp203_ret = get_HP203_data(&backupTemperature1, &g_stMcs_Para.pressure);
|
||||
uint8_t sht30_ret = get_temp_humi_data(&backupTemperature2, &g_stMcs_Para.humidity);
|
||||
#if TEMP_SENSOR == SHT30_SENSOR
|
||||
g_stMcs_Para.temperature = backupTemperature2;
|
||||
#endif /*TEMP_SENSOR == SHT30_SENSOR*/
|
||||
|
||||
#if TEMP_SENSOR == TMP117_SENSOR
|
||||
TMP117_Init();
|
||||
osDelay(20);
|
||||
uint8_t tmp117_ret = TMP117_Get_Temp(&g_stMcs_Para.temperature);
|
||||
|
||||
// TMP117出问题
|
||||
if(tmp117_ret != HAL_OK)
|
||||
float temp;
|
||||
//采集MS5607并判错
|
||||
if(get_HP203_data(&temp, &g_stMcs_Para.pressure) != HAL_OK)
|
||||
{
|
||||
//置错误标志位
|
||||
g_error_log.temp_error_HP203B = 1;
|
||||
//错误处理
|
||||
}
|
||||
else
|
||||
{
|
||||
//恢复错误标志位
|
||||
g_error_log.temp_error_HP203B = 0;
|
||||
}
|
||||
//采集SHT45并判错
|
||||
if(get_temp_humi_data(&backupTemperature1, &g_stMcs_Para.humidity) != HAL_OK)
|
||||
{
|
||||
//错误处理
|
||||
//断电重启,本次关电,下次上电,下下次返回正常数据
|
||||
if(g_error_log.temp_error_SHT30 == 0)
|
||||
{
|
||||
HAL_GPIO_WritePin(GPIOB, GPIO_SHT_PWR_EN_Pin, GPIO_PIN_RESET);
|
||||
HAL_I2C_DeInit(&hi2c1);
|
||||
SHT45_ERR_NUM = 1;
|
||||
}else
|
||||
{
|
||||
//确保只执行一次重新初始化程序
|
||||
if(SHT45_ERR_NUM == 1)
|
||||
{
|
||||
HAL_GPIO_WritePin(GPIOB, GPIO_SHT_PWR_EN_Pin, GPIO_PIN_SET);
|
||||
osDelay(1);
|
||||
MX_I2C1_Init();
|
||||
TMP117_Init();//TMP117是同一个电源,重新上电需要初始化
|
||||
SHT45_ERR_NUM = 0;
|
||||
}
|
||||
}
|
||||
//置错误标志位
|
||||
g_error_log.temp_error_SHT30 = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
//恢复错误标志位
|
||||
g_error_log.temp_error_SHT30 = 0;
|
||||
}
|
||||
//采集TMP117并判错
|
||||
if(TMP117_Get_Temp(&g_stMcs_Para.temperature) != HAL_OK)
|
||||
{
|
||||
//置错误标志位
|
||||
g_error_log.temp_error_TMP117 = 1;
|
||||
|
@ -1095,36 +1128,6 @@ static void getTempHumiPress(void)
|
|||
//恢复错误标志位
|
||||
g_error_log.temp_error_TMP117 = 0;
|
||||
}
|
||||
#endif /*TEMP_SENSOR == TMP117_SENSOR*/
|
||||
|
||||
// SHT30出问题
|
||||
if(sht30_ret == FALSE)
|
||||
{
|
||||
//置错误标志位
|
||||
g_error_log.temp_error_SHT30 = 1;
|
||||
//错误处理
|
||||
#if TEMP_SENSOR == SHT30_SENSOR
|
||||
g_stMcs_Para.temperature = backupTemperature1;
|
||||
#endif /*TEMP_SENSOR == SHT30_SENSOR*/
|
||||
}
|
||||
else
|
||||
{
|
||||
//恢复错误标志位
|
||||
g_error_log.temp_error_SHT30 = 0;
|
||||
}
|
||||
|
||||
//HP203B出问题
|
||||
if(hp203_ret == FALSE)
|
||||
{
|
||||
//置错误标志位
|
||||
g_error_log.temp_error_HP203B = 1;
|
||||
//错误处理
|
||||
}
|
||||
else
|
||||
{
|
||||
//恢复错误标志位
|
||||
g_error_log.temp_error_HP203B = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void tem_hum_update_task(void const * argument)
|
||||
|
@ -1133,9 +1136,11 @@ void tem_hum_update_task(void const * argument)
|
|||
|
||||
uint16_t time_s_temp_humi = 0;//1秒计时,温湿度更新
|
||||
// 开机先采集一次大气压温湿度
|
||||
MS56XX_Init();
|
||||
if(tem_hun_check_flag)
|
||||
{
|
||||
//采集温湿度与大气压
|
||||
// osDelay(10);//等待传感器初始化
|
||||
getTempHumiPress();
|
||||
}
|
||||
|
||||
|
|
|
@ -57,6 +57,7 @@ static u_int16_t FRT_ReadRegRSSIRange(void *pMsg);
|
|||
static u_int16_t FRT_ReadRegCoefficient(void *pMsg);
|
||||
static u_int16_t FRT_ReadRegDISTANCE_NS(void *pMsg);
|
||||
static u_int16_t FRT_ReadRegDISTANCE_WE(void *pMsg);
|
||||
static u_int16_t FRT_ReadRegANEMOMETER_Delay(void *pMsg);
|
||||
static u_int16_t FRT_ReadRegErrorData(void *pMsg);
|
||||
static u_int16_t FRT_ReadRegWindC_NS(void *pMsg);
|
||||
static u_int16_t FRT_ReadRegWindC_WE(void *pMsg);
|
||||
|
@ -88,6 +89,7 @@ static u_int16_t FRT_WriteRegRSSIRange(void *pMsg);
|
|||
static u_int16_t FRT_WriteRegCoefficient(void *pMsg);
|
||||
static u_int16_t FRT_WriteRegDISTANCE_NS(void *pMsg);
|
||||
static u_int16_t FRT_WriteRegDISTANCE_WE(void *pMsg);
|
||||
static u_int16_t FRT_WriteRegANEMOMETER_Delay(void *pMsg);
|
||||
static u_int16_t FRT_WriteRegPoint_1Y(void *pMsg);
|
||||
static u_int16_t FRT_WriteRegPoint_2Y(void *pMsg);
|
||||
static u_int16_t FRT_WriteRegPoint_3Y(void *pMsg);
|
||||
|
@ -143,6 +145,7 @@ FRT_RegProcTable_s g_RegTbl[] =
|
|||
{ FRT_REGISTER_COEFFICIENT, FRT_ReadRegCoefficient }, /* 读粘度修正系数 */
|
||||
{ FRT_REGISTER_DISTANCE_NS, FRT_ReadRegDISTANCE_NS }, /* 读南北探头表面有效距离 */
|
||||
{ FRT_REGISTER_DISTANCE_WE, FRT_ReadRegDISTANCE_WE }, /* 读东西探头表面有效距离 */
|
||||
{ FRT_REGISTER_ANEMOMETER_DELAY, FRT_ReadRegANEMOMETER_Delay }, /* 读换能器匹配层延时 */
|
||||
{ FRT_REGISTER_ERROR_LOG, FRT_ReadRegErrorData }, /* 读错误日志 */
|
||||
{ FRT_REGISTER_WIND_C_NS, FRT_ReadRegWindC_NS }, /* 读计算得到的南北风速 */
|
||||
{ FRT_REGISTER_WIND_C_WE, FRT_ReadRegWindC_WE }, /* 读计算得到的东西风速 */
|
||||
|
@ -185,6 +188,7 @@ FRT_RegProcTable_s g_Write_RegTbl[] =
|
|||
{ FRT_REGISTER_COEFFICIENT, FRT_WriteRegCoefficient }, /* 写粘度修正系数 */
|
||||
{ FRT_REGISTER_DISTANCE_NS, FRT_WriteRegDISTANCE_NS }, /* 写南北探头表面有效距离 */
|
||||
{ FRT_REGISTER_DISTANCE_WE, FRT_WriteRegDISTANCE_WE }, /* 写东西探头表面有效距离 */
|
||||
{ FRT_REGISTER_ANEMOMETER_DELAY, FRT_WriteRegANEMOMETER_Delay }, /* 写换能器匹配层延时 */
|
||||
{ FRT_REGISTER_LINEAR_POINT_Y_1, FRT_WriteRegPoint_1Y }, /* 线性插值校准点1 */
|
||||
{ FRT_REGISTER_LINEAR_POINT_Y_2, FRT_WriteRegPoint_2Y }, /* 线性插值校准点2 */
|
||||
{ FRT_REGISTER_LINEAR_POINT_Y_3, FRT_WriteRegPoint_3Y }, /* 线性插值校准点3 */
|
||||
|
@ -736,6 +740,18 @@ static u_int16_t FRT_ReadRegDISTANCE_WE(void *pMsg)
|
|||
return FRT_swap_endian_16(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 读换能器匹配延时
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
static u_int16_t FRT_ReadRegANEMOMETER_Delay(void *pMsg)
|
||||
{
|
||||
read_config_info();
|
||||
u_int16_t value=g_stConfigInfo.anemometerDelayTime;
|
||||
return FRT_swap_endian_16(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 读错误日志
|
||||
* @param
|
||||
|
@ -1098,6 +1114,22 @@ static u_int16_t FRT_WriteRegDISTANCE_WE(void *pMsg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 写换能器匹配延时
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
static u_int16_t FRT_WriteRegANEMOMETER_Delay(void *pMsg)
|
||||
{
|
||||
uint16_t *pMsgAddr = (uint16_t *)pMsg;
|
||||
uint16_t data = *pMsgAddr;
|
||||
|
||||
g_stConfigInfo.anemometerDelayTime = data;
|
||||
save_factory_config_info(g_stConfigInfo);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 写线性插值矫正点1
|
||||
* @param
|
||||
|
@ -1422,8 +1454,8 @@ void FRT_MsgProc_WriteRegister(device_handle device, void *pMsg)
|
|||
// 校验
|
||||
if (start_reg_addr < FRT_REGISTER_DEVICE_ADDR ||\
|
||||
(start_reg_addr > FRT_REGISTER_REST_DEFAULT_SETTING && start_reg_addr < FRT_REGISTER_TRANSDUCER_CFG_1R5) ||\
|
||||
(start_reg_addr > FRT_REGISTER_DISTANCE_WE && start_reg_addr < FRT_REGISTER_LINEAR_POINT_Y_1) ||\
|
||||
(start_reg_addr > FRT_REGISTER_LINEAR_ENABLE) && (start_reg_addr < FRT_REGISTER_ENCRYPT_1) ||\
|
||||
(start_reg_addr > FRT_REGISTER_ANEMOMETER_DELAY && start_reg_addr < FRT_REGISTER_LINEAR_POINT_Y_1) ||\
|
||||
(start_reg_addr > FRT_REGISTER_LINEAR_ENABLE) && (start_reg_addr < FRT_REGISTER_ENCRYPT_1) ||\
|
||||
(start_reg_addr > FRT_REGISTER_ENCRYPT_4)
|
||||
)
|
||||
{
|
||||
|
@ -1433,8 +1465,8 @@ void FRT_MsgProc_WriteRegister(device_handle device, void *pMsg)
|
|||
if (reg_num < 0x01 ||\
|
||||
((reg_num + start_reg_addr - 1) < FRT_REGISTER_DEVICE_ADDR) ||\
|
||||
(((reg_num + start_reg_addr -1) > FRT_REGISTER_REST_DEFAULT_SETTING) && ((reg_num + start_reg_addr -1) < FRT_REGISTER_TRANSDUCER_CFG_1R5)) ||\
|
||||
(((reg_num + start_reg_addr -1) > FRT_REGISTER_DISTANCE_WE) && ((reg_num + start_reg_addr -1) < FRT_REGISTER_LINEAR_POINT_Y_1)) ||\
|
||||
(((reg_num + start_reg_addr -1) > FRT_REGISTER_LINEAR_ENABLE) && ((reg_num + start_reg_addr -1) < FRT_REGISTER_ENCRYPT_1)) ||\
|
||||
(((reg_num + start_reg_addr -1) > FRT_REGISTER_ANEMOMETER_DELAY) && ((reg_num + start_reg_addr -1) < FRT_REGISTER_LINEAR_POINT_Y_1)) ||\
|
||||
(((reg_num + start_reg_addr -1) > FRT_REGISTER_LINEAR_ENABLE) && ((reg_num + start_reg_addr -1) < FRT_REGISTER_ENCRYPT_1)) ||\
|
||||
((reg_num + start_reg_addr -1) > FRT_REGISTER_ENCRYPT_4)
|
||||
)
|
||||
{
|
||||
|
|
|
@ -44,6 +44,7 @@ factory_config_info g_stConfigInfo={
|
|||
.linear_enable = 0, /* 线性插值使能 */
|
||||
.encrypt_0 = 0, /* 密文 */
|
||||
.encrypt_1 = 0, /* 密文 */
|
||||
.anemometerDelayTime = 2, /* 换能器匹配层延时us *//*大宇3,无锡电声2*/
|
||||
.flag_end = FLAG_SAVE_INFLASH_END,
|
||||
};
|
||||
|
||||
|
|
|
@ -128,7 +128,7 @@ void MX_FREERTOS_Init(void) {
|
|||
osThreadDef(anemometer, wind_task, osPriorityHigh, 0, 2*1024);// ·çËÙ·çÏò
|
||||
anemometerHandle = osThreadCreate(osThread(anemometer), NULL);
|
||||
|
||||
osThreadDef(temhum_update_task, tem_hum_update_task, osPriorityAboveNormal, 0, 512);//温湿度,大气压更新
|
||||
osThreadDef(temhum_update_task, tem_hum_update_task, osPriorityAboveNormal, 0, 1024);//温湿度,大气压更新
|
||||
temhum_update_taskHandle = osThreadCreate(osThread(temhum_update_task), NULL);
|
||||
|
||||
// osThreadDef(sensorTask, SensorTask, osPriorityRealtime, 0, 128);
|
||||
|
@ -151,7 +151,7 @@ void MX_FREERTOS_Init(void) {
|
|||
void StartDefaultTask(void const * argument)
|
||||
{
|
||||
/* USER CODE BEGIN StartDefaultTask */
|
||||
|
||||
osDelay(2000);
|
||||
/* Infinite loop */
|
||||
for(;;)
|
||||
{
|
||||
|
|
|
@ -44,6 +44,7 @@
|
|||
#include "sht30.h"
|
||||
#include "hp203b.h"
|
||||
#include "tmp117.h"
|
||||
#include "ms5607.h"
|
||||
|
||||
#include "inflash.h"
|
||||
/* USER CODE END Includes */
|
||||
|
@ -127,7 +128,7 @@ void Flash_EnableReadProtection(void)
|
|||
|
||||
/* USER CODE BEGIN 1 */
|
||||
///远程升级时读保护
|
||||
///Flash_EnableReadProtection();//¶Á±£»¤
|
||||
// Flash_EnableReadProtection();//¶Á±£»¤
|
||||
/* USER CODE END 1 */
|
||||
|
||||
/* MCU Configuration--------------------------------------------------------*/
|
||||
|
|
|
@ -0,0 +1,236 @@
|
|||
#include "ms5607.h"
|
||||
#include "i2c.h"
|
||||
#include "filter.h"
|
||||
#include "anemometer_dev.h"
|
||||
#include "uart_dev.h"
|
||||
|
||||
static void MS56XX_Reset(void)
|
||||
{
|
||||
uint8_t _cmd[] = {0x1e};
|
||||
HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff);
|
||||
osDelay(5);
|
||||
}
|
||||
|
||||
static void MS56XX_Read_PromData(uint16_t *VAL_C)
|
||||
{
|
||||
uint8_t _cmd[] = {0xa0};
|
||||
uint8_t temp_buff[2] = {0};
|
||||
for(uint8_t i = 0; i < 8; i++)
|
||||
{
|
||||
HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff);
|
||||
HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, temp_buff, 2, 0xff);
|
||||
*(VAL_C + i) = temp_buff[0];
|
||||
*(VAL_C + i) <<= 8;
|
||||
*(VAL_C + i) += temp_buff[1];
|
||||
_cmd[0] += 0x02;
|
||||
}
|
||||
}
|
||||
|
||||
static uint16_t MS56XX_C_Value[8] = {0};
|
||||
void MS56XX_Init(void)
|
||||
{
|
||||
MS56XX_Reset();
|
||||
MS56XX_Read_PromData(MS56XX_C_Value);
|
||||
}
|
||||
|
||||
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};
|
||||
if(HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff) != HAL_OK)
|
||||
{
|
||||
return HAL_ERROR;
|
||||
}
|
||||
osDelay(10);
|
||||
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];
|
||||
press <<= 8;
|
||||
press += D1_Value_Buff[1];
|
||||
press <<= 8;
|
||||
press += D1_Value_Buff[2];
|
||||
*D1_Value = press;
|
||||
return HAL_OK;
|
||||
}
|
||||
|
||||
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};
|
||||
if(HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff) != HAL_OK)
|
||||
{
|
||||
return HAL_ERROR;
|
||||
}
|
||||
osDelay(10);
|
||||
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];
|
||||
Temp <<= 8;
|
||||
Temp += D2_Value_Buff[1];
|
||||
Temp <<= 8;
|
||||
Temp += D2_Value_Buff[2];
|
||||
*D2_Value_ = Temp;
|
||||
return HAL_OK;
|
||||
}
|
||||
|
||||
static HAL_StatusTypeDef MS56XX_GetTemperature (int32_t *dT, int32_t *MS56XX_Temp) //计算温度
|
||||
{
|
||||
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))
|
||||
{
|
||||
*dT = D2_Value - MS56XX_C_Value[5] * 256; //公式 dT = D2 - TREF = D2 - C5 * 2^8
|
||||
}else
|
||||
{
|
||||
*dT = MS56XX_C_Value[5] * 256 - D2_Value; //公式 dT = D2 - TREF = D2 - C5 * 2^8
|
||||
*dT *= -1;
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
static HAL_StatusTypeDef MS56XX_GetPressureTemp(float *Temp, float *Press) //计算温度补偿压力
|
||||
{
|
||||
int32_t dT;
|
||||
int32_t MS56XX_Temperature;
|
||||
uint32_t D1_Value;
|
||||
if(MS56XX_ReadD1_Press(&D1_Value) != HAL_OK) //循环读取 D1
|
||||
{
|
||||
return HAL_ERROR;
|
||||
}
|
||||
|
||||
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);
|
||||
// term_printf("TEMP:%d\r\n", MS56XX_Temperature);
|
||||
|
||||
int64_t OFF = ((int64_t)MS56XX_C_Value[2] * 131072) + ((int64_t)MS56XX_C_Value[4] * dT )/ 64.0; //公式 OFF = OFFT1 + TCO *dT = C2 *2^17 +(C4 *dT )/ 2^6
|
||||
int64_t SENS = ((int64_t)MS56XX_C_Value[1] * 65536) + ((int64_t)MS56XX_C_Value[3] * dT )/ 128.0; //公式SENS = SENST1 + TCS* dT= C1 * 2^16 + (C3 * dT )/ 2^7
|
||||
|
||||
// term_printf("OFF:%d\r\n", OFF);
|
||||
// term_printf("SENS:%d\r\n", SENS);
|
||||
|
||||
//温度补偿部分 逻辑看芯片手册
|
||||
int64_t T2 = 0;
|
||||
int64_t OFF2 = 0;
|
||||
int64_t SENS2 = 0;
|
||||
if (MS56XX_Temperature < 2000 ) // second order temperature compensation when under 20 degrees C
|
||||
{
|
||||
T2 = (dT * dT) / 2147483648.0;
|
||||
OFF2 = 61 * ((MS56XX_Temperature - 2000) * (MS56XX_Temperature - 2000)) / 16;
|
||||
SENS2 = 2 * ((MS56XX_Temperature - 2000) * (MS56XX_Temperature - 2000)) ;
|
||||
if (MS56XX_Temperature < -1500)
|
||||
{
|
||||
OFF2 = OFF2 + 15 * ((MS56XX_Temperature + 1500) * (MS56XX_Temperature + 1500));
|
||||
SENS2 = SENS2 + 8 * ((MS56XX_Temperature + 1500) * (MS56XX_Temperature + 1500));
|
||||
}
|
||||
}
|
||||
|
||||
// term_printf("T2:%d\r\n", T2);
|
||||
MS56XX_Temperature = MS56XX_Temperature - T2;
|
||||
OFF = OFF - OFF2;
|
||||
SENS = SENS - SENS2;
|
||||
|
||||
|
||||
int32_t Tmp_Pressure = ((int32_t)D1_Value * SENS/2097152 - OFF) / 32768; //公式 P = D1 * SENS - OFF = (D1 * SENS / 2^21 - OFF) / 2^15
|
||||
|
||||
// term_printf("\r\nC1-C6:%d %d %d %d %d %d\r\n", MS56XX_C_Value[1], MS56XX_C_Value[2], MS56XX_C_Value[3], MS56XX_C_Value[4], MS56XX_C_Value[5], MS56XX_C_Value[6]);
|
||||
// term_printf("D1:%d\r\n", D1_Value);
|
||||
//
|
||||
// term_printf("dT:%d\r\n", dT);
|
||||
//
|
||||
// term_printf("OFF:%d\r\n", OFF);
|
||||
// term_printf("SENS:%d\r\n", SENS);
|
||||
// term_printf("P:%d\r\n", Tmp_Pressure);
|
||||
// term_printf("TEMP:%d\r\n", MS56XX_Temperature);
|
||||
// term_printf("PRESS:%d\r\n", Tmp_Pressure);
|
||||
if(MS56XX_Temperature<-6000)
|
||||
{
|
||||
MS56XX_Temperature=-6000;
|
||||
return HAL_ERROR;
|
||||
}
|
||||
if(MS56XX_Temperature>8500)
|
||||
{
|
||||
MS56XX_Temperature=8500;
|
||||
return HAL_ERROR;
|
||||
}
|
||||
if(Tmp_Pressure<1000)
|
||||
{
|
||||
// Tmp_Pressure=1000;
|
||||
*Press = 0;
|
||||
return HAL_ERROR;
|
||||
}
|
||||
if(Tmp_Pressure>120000)
|
||||
{
|
||||
// Tmp_Pressure=120000;
|
||||
*Press = 0;
|
||||
return HAL_ERROR;
|
||||
}
|
||||
*Temp = ((float)MS56XX_Temperature)/100;
|
||||
*Press = ((float)Tmp_Pressure)/100;
|
||||
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;
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
#ifndef __MS5607_H__
|
||||
#define __MS5607_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "main.h"
|
||||
#include "comm_types.h"
|
||||
#include "cmsis_os.h"
|
||||
|
||||
#define MS5607_ADDRESS 0x77<<1
|
||||
|
||||
void MS56XX_Init(void);
|
||||
HAL_StatusTypeDef MS56XX_GetPressure(float *Press);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /*__ __MS5607_H__ */
|
||||
|
|
@ -33,7 +33,7 @@ static u_int8_t i2c_write_cmd(u_int8_t addr,u_int16_t cmd)
|
|||
cmd_buff[0] = cmd>>8;
|
||||
cmd_buff[1] = cmd;
|
||||
|
||||
u_int8_t ret = HAL_I2C_Master_Transmit(&hi2c1,addr,cmd_buff,2,0xffff);
|
||||
u_int8_t ret = HAL_I2C_Master_Transmit(&hi2c1,addr,cmd_buff,2,0xff);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -83,7 +83,7 @@ u_int8_t sht30_init()
|
|||
if(ret == TRUE)
|
||||
term_printf("Sensor Sht30 Check OK.\r\n Temp:%.2f,Humi:%.2f\r\n", temp,humi);
|
||||
else
|
||||
term_printf("Sensor Sht30 Check Err.\r\n");
|
||||
// term_printf("Sensor Sht30 Check Err.\r\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -101,7 +101,7 @@ u_int8_t sht30_collect_data(stTempHumiSensor stSensorDev, float *temp, float *hu
|
|||
|
||||
i2c_write_cmd(stSensorDev.i2c_reg_addr,stSensorDev.cmd_read_data);
|
||||
|
||||
if(HAL_I2C_Master_Receive(&hi2c1,stSensorDev.i2c_reg_addr,read_buff,6,0xffff) != HAL_OK){
|
||||
if(HAL_I2C_Master_Receive(&hi2c1,stSensorDev.i2c_reg_addr,read_buff,6,0xff) != HAL_OK){
|
||||
return HAL_ERROR;
|
||||
}
|
||||
|
||||
|
@ -119,73 +119,107 @@ u_int8_t sht30_collect_data(stTempHumiSensor stSensorDev, float *temp, float *hu
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief 温湿度数据采集
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
u_int8_t sht45_collect_data(stTempHumiSensor stSensorDev, float *temp, float *humi)
|
||||
{
|
||||
u_int8_t read_buff[6] = {0};
|
||||
uint8_t _cmd[] = {0xFD};
|
||||
|
||||
u_int16_t temp_value;
|
||||
u_int16_t humi_value;
|
||||
|
||||
HAL_I2C_Master_Transmit(&hi2c1,stSensorDev.i2c_reg_addr,_cmd,1,0xff);
|
||||
osDelay(15);
|
||||
|
||||
if(HAL_I2C_Master_Receive(&hi2c1,stSensorDev.i2c_reg_addr,read_buff,6,0xff) != HAL_OK){
|
||||
return HAL_ERROR;
|
||||
}
|
||||
|
||||
if(CheckCrc8(read_buff, 0xFF) != read_buff[2] && CheckCrc8(&read_buff[3], 0xFF) != read_buff[5]){
|
||||
return HAL_ERROR;
|
||||
}
|
||||
|
||||
temp_value = ((u_int16_t)read_buff[0]<<8)|read_buff[1];
|
||||
*temp = -45 + 175*((float)temp_value/65535);
|
||||
|
||||
humi_value = ((u_int16_t)read_buff[3]<<8)|read_buff[4];
|
||||
*humi = -6 + 125*((float)humi_value / 65535);
|
||||
|
||||
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;
|
||||
}
|
||||
/**
|
||||
* @brief »ñÈ¡ÎÂʪ¶ÈÊý¾Ý
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
#define COLLECT_DATA_NUM 10
|
||||
BOOL get_temp_humi_data(float* temdata, float* humidata)
|
||||
{
|
||||
U_DataType collect_temdata[COLLECT_DATA_NUM]={0x00};
|
||||
U_DataType collect_humidata[COLLECT_DATA_NUM]={0x00};
|
||||
U_DataType tmp_temdata,tmp_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;
|
||||
|
||||
for(int i=0; i<COLLECT_DATA_NUM; i++){
|
||||
int ret = sht30_collect_data(g_stTempHumiSensor,&collect_temdata[i].fValue, &collect_humidata[i].fValue);
|
||||
// AssertError(ret == HAL_OK, return FALSE, "sht30采样失败");
|
||||
if(ret == HAL_ERROR)
|
||||
// return FALSE;
|
||||
goto error_return;
|
||||
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);
|
||||
}
|
||||
|
||||
tmp_temdata = filter_middle(collect_temdata,COLLECT_DATA_NUM, FILTER_DATA_TYPE_FLOAT);
|
||||
tmp_humidata = filter_middle(collect_humidata,COLLECT_DATA_NUM, FILTER_DATA_TYPE_FLOAT);
|
||||
|
||||
// 断言有问题
|
||||
// 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.fValue < -50)
|
||||
if(ret_falt >= COLLECT_DATA_NUM)
|
||||
{
|
||||
// tmp_temdata.fValue = -40;
|
||||
// term_printf("sht30温度值校验失败");
|
||||
// return FALSE;
|
||||
goto error_return;
|
||||
}
|
||||
if(tmp_temdata.fValue > 125)
|
||||
{
|
||||
// tmp_temdata.fValue = 125;
|
||||
// term_printf("sht30温度值校验失败");
|
||||
// return FALSE;
|
||||
goto error_return;
|
||||
}
|
||||
if(tmp_humidata.fValue < 0)
|
||||
{
|
||||
// tmp_humidata.fValue = 0;
|
||||
// term_printf("sht30湿度值校验失败");
|
||||
// return FALSE;
|
||||
goto error_return;
|
||||
}
|
||||
if(tmp_humidata.fValue > 100)
|
||||
{
|
||||
// tmp_humidata.fValue = 100;
|
||||
// term_printf("sht3湿度值校验失败");
|
||||
// return FALSE;
|
||||
goto error_return;
|
||||
}
|
||||
|
||||
*temdata = tmp_temdata.fValue;
|
||||
*humidata = tmp_humidata.fValue;
|
||||
tmp_temdata = calculateAverage(collect_temdata,COLLECT_DATA_NUM - ret_falt);
|
||||
tmp_humidata = calculateAverage(collect_humidata,COLLECT_DATA_NUM - ret_falt);
|
||||
|
||||
//g_stTempHumiData.temp = tmp_temdata.fValue;
|
||||
//g_stTempHumiData.humi = tmp_humidata.fValue;
|
||||
return TRUE;
|
||||
if(tmp_temdata < -50.0)
|
||||
{
|
||||
tmp_temdata = -50.0;
|
||||
}
|
||||
if(tmp_temdata > 125.0)
|
||||
{
|
||||
tmp_temdata = 125.0;
|
||||
}
|
||||
if(tmp_humidata < 0.0)
|
||||
{
|
||||
tmp_humidata = 0.0;
|
||||
}
|
||||
if(tmp_humidata > 100.0)
|
||||
{
|
||||
tmp_humidata = 100.0;
|
||||
}
|
||||
|
||||
*temdata = tmp_temdata;
|
||||
*humidata = tmp_humidata;
|
||||
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -376,6 +376,7 @@
|
|||
<state>$PROJ_DIR$\..\Drivers\HP203B</state>
|
||||
<state>$PROJ_DIR$\..\Drivers\RainLight</state>
|
||||
<state>$PROJ_DIR$\..\Drivers\Tmp117</state>
|
||||
<state>$PROJ_DIR$\..\Drivers\MS5607</state>
|
||||
</option>
|
||||
<option>
|
||||
<name>CCStdIncCheck</name>
|
||||
|
@ -1489,6 +1490,7 @@
|
|||
<state>$PROJ_DIR$\..\Drivers\HP203B</state>
|
||||
<state>$PROJ_DIR$\..\Drivers\RainLight</state>
|
||||
<state>$PROJ_DIR$\..\Drivers\Tmp117</state>
|
||||
<state>$PROJ_DIR$\..\Drivers\MS5607</state>
|
||||
</option>
|
||||
<option>
|
||||
<name>CCStdIncCheck</name>
|
||||
|
@ -2369,6 +2371,15 @@
|
|||
<name>$PROJ_DIR$\..\Drivers\HP203B\hp203b.h</name>
|
||||
</file>
|
||||
</group>
|
||||
<group>
|
||||
<name>MS5607</name>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\Drivers\MS5607\ms5607.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\Drivers\MS5607\ms5607.h</name>
|
||||
</file>
|
||||
</group>
|
||||
<group>
|
||||
<name>RainLight</name>
|
||||
<file>
|
||||
|
|
|
@ -2994,6 +2994,15 @@
|
|||
<name>$PROJ_DIR$\..\Drivers\HP203B\hp203b.h</name>
|
||||
</file>
|
||||
</group>
|
||||
<group>
|
||||
<name>MS5607</name>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\Drivers\MS5607\ms5607.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\Drivers\MS5607\ms5607.h</name>
|
||||
</file>
|
||||
</group>
|
||||
<group>
|
||||
<name>RainLight</name>
|
||||
<file>
|
||||
|
|
Loading…
Reference in New Issue