Compare commits

...

4 Commits

7 changed files with 82 additions and 35 deletions

View File

@ -23,22 +23,23 @@ typedef enum
typedef enum
{
FRT_REGISTER_MIN_WIND_DIRECTION = 0, /* 最小风向 */
FRT_REGISTER_THROUGH_WIND_DIRECTION = 1, /* 极小风向 */
FRT_REGISTER_AVERAGE_WIND_DIRECTION = 2, /* 平均风向 */
FRT_REGISTER_INSTANTANEOUS_WIND_DIRECTION = 3, /* 瞬时风向 */
FRT_REGISTER_PEAK_WIND_DIRECTION = 4, /* 极大风向 */
FRT_REGISTER_MAX_WIND_DIRECTION = 5, /* 最大风向 */
FRT_REGISTER_MIN_WIND_SPEED = 6, /* 最小风速 */
FRT_REGISTER_THROUGH_WIND_SPEED = 7, /* 极小风速 */
FRT_REGISTER_AVERAGE_WIND_SPEED = 8, /* 平均风速 */
FRT_REGISTER_INSTANTANEOUS_WIND_SPEED = 9, /* 瞬时风速 */
FRT_REGISTER_PEAK_WIND_SPEED = 10, /* 极大风速 */
FRT_REGISTER_MAX_WIND_SPEED = 11, /* 最大风速 */
FRT_REGISTER_TEMPERATURE = 12, /* 大气温度 */
FRT_REGISTER_HUMIDITY = 13, /* 大气湿度 */
FRT_REGISTER_PRESSURE = 14, /* 大气压 */
FRT_REGISTER_RAIN = 15, /* 雨量 */
FRT_REGISTER_PRECIPITATION_INTENSITY = 16, /* 总辐射 */
FRT_REGISTER_AVERAGE_WIND_DIRECTION = 1, /* 平均风向 */
FRT_REGISTER_MAX_WIND_DIRECTION = 2, /* 最大风向 */
FRT_REGISTER_MIN_WIND_SPEED = 3, /* 最小风速 */
FRT_REGISTER_AVERAGE_WIND_SPEED = 4, /* 平均风速 */
FRT_REGISTER_MAX_WIND_SPEED = 5, /* 最大风速 */
FRT_REGISTER_TEMPERATURE = 6, /* 大气温度 */
FRT_REGISTER_HUMIDITY = 7, /* 大气湿度 */
FRT_REGISTER_PRESSURE = 8, /* 大气压 */
FRT_REGISTER_RAIN = 9, /* 雨量 */
FRT_REGISTER_PRECIPITATION_INTENSITY = 10, /* 总辐射 */
FRT_REGISTER_UV_INTENSITY = 11, /* 紫外强度 */
FRT_REGISTER_THROUGH_WIND_DIRECTION = 12, /* 极小风向 */
FRT_REGISTER_INSTANTANEOUS_WIND_DIRECTION = 13, /* 瞬时风向 */
FRT_REGISTER_PEAK_WIND_DIRECTION = 14, /* 极大风向 */
FRT_REGISTER_THROUGH_WIND_SPEED = 15, /* 极小风速 */
FRT_REGISTER_INSTANTANEOUS_WIND_SPEED = 16, /* 瞬时风速 */
FRT_REGISTER_PEAK_WIND_SPEED = 17, /* 极大风速 */
FRT_REGISTER_DEVICE_ADDR = 20, /* 设备地址 */
FRT_REGISTER_COMMU_BAUDRATE = 21, /* 波特率 */

View File

@ -39,6 +39,8 @@ typedef struct _usr_config_info{
u_int16_t temp5; /* 占位留待升级 */
u_int16_t temp6; /* 占位留待升级 */
u_int16_t temp7; /* 占位留待升级 */
u_int16_t temp8; /* 占位留待升级 */
u_int16_t temp9; /* 占位留待升级 */
u_int8_t flag_end;
}usr_config_info;

View File

@ -460,6 +460,7 @@ char str[100];
//}
SlidingWindow_10min win_10min = {0};
void wind_task(void const * argument)
{
//软件加密校验
@ -527,7 +528,6 @@ void wind_task(void const * argument)
// 接受信号很小
if(tofx<0||tofy<0)
{
tof_error_log_NS ++;
// 放弃本次采样,可以有效筛选雨滴等导致的异常大的风速数据
// 但是持续的遮挡会导致风速数据保持不变。
// 连续10次采样有问题判定为有遮挡置错误标志位将声速与风速分量置0
@ -540,6 +540,7 @@ void wind_task(void const * argument)
}
else
{
tof_error_log_NS ++;
continue;
}
// 手动设置渡越时间差为0会在探头受遮挡的时候输出0持续遮挡的时候也输出0但是计算出声速将变得很大
@ -594,7 +595,6 @@ void wind_task(void const * argument)
// 如果测量的信号幅值过小。
if(tofx<0||tofy<0)
{
tof_error_log_WE ++;
// 放弃本次采样,可以有效筛选雨滴等导致的异常大的风速数据
// 但是持续的遮挡会导致风速数据保持不变。
// 连续10次采样有问题判定为有遮挡置错误标志位将声速与风速分量置0
@ -607,6 +607,7 @@ void wind_task(void const * argument)
}
else
{
tof_error_log_WE ++;
continue;
}
// 手动设置渡越时间差为0会在探头受遮挡的时候输出0持续遮挡的时候也输出0但是计算出声速将变得很大
@ -663,6 +664,9 @@ void wind_task(void const * argument)
{
av_speed = 0;
av_angle = 0;
//滑动平均值索引归零
win_10min.count = 0;
win_10min.index = 0;
}
// 360一圈
if(av_speedy<0)
@ -844,7 +848,6 @@ void update_mcs_param(float new_wind_speed, float new_wind_dirction)
}
}
SlidingWindow_10min win_10min = {0};
SlidingWindow_3s win_3s = {0};
//求和函数
float sum(float arr[], int n)
@ -1066,7 +1069,6 @@ void tem_hum_update_task(void const * argument)
uint8_t tem_hun_check_flag = JudgeEncrypt();
uint16_t time_s_temp_humi = 0;//1秒计时温湿度更新
uint32_t time_s_1Day = 0;//1天的秒数
float backupTemperature;
uint8_t hp203_ret;
@ -1097,7 +1099,6 @@ void tem_hum_update_task(void const * argument)
osDelay(1000);
if(!tem_hun_check_flag)continue;
time_s_temp_humi ++;
time_s_1Day ++;
// 温湿度大气压更新
if (time_s_temp_humi >= g_usrConfigInfo.temp_hum_update_time)
{
@ -1129,12 +1130,6 @@ void tem_hum_update_task(void const * argument)
// 计时重置
time_s_temp_humi = 0;
}
// 一天重启
if (time_s_1Day >= 86400)
{
__iar_builtin_set_FAULTMASK(1);
NVIC_SystemReset();
}
// 风速风向更新
my_update_mcs_param(weather_info.instantaneous_wind_speed, weather_info.instantaneous_wind_direction);
}

View File

@ -1298,9 +1298,10 @@ void FRT_MsgProc_ReadRegister(device_handle device, void *pMsg)
u_int16_t reg_num= (data[4] << 8)| data[5];
if ( \
start_reg_addr < 0x00 ||\
(start_reg_addr > FRT_REGISTER_PRESSURE && start_reg_addr < FRT_REGISTER_DEVICE_ADDR) ||\
(start_reg_addr > FRT_REGISTER_PRESSURE && start_reg_addr < FRT_REGISTER_THROUGH_WIND_DIRECTION) ||\
(start_reg_addr > FRT_REGISTER_PEAK_WIND_SPEED && start_reg_addr < FRT_REGISTER_DEVICE_ADDR) ||\
(start_reg_addr > FRT_REGISTER_TEMPHUM_UPDATE_TIME && start_reg_addr < FRT_REGISTER_TRANSDUCER_CFG_1R5) ||\
start_reg_addr > FRT_REGISTER_ID_4 \
start_reg_addr > FRT_REGISTER_ID_4 \
)
{
@ -1310,9 +1311,10 @@ void FRT_MsgProc_ReadRegister(device_handle device, void *pMsg)
if ( \
reg_num < 0x01 ||\
(((reg_num + start_reg_addr - 1) > FRT_REGISTER_PRESSURE) && ((reg_num + start_reg_addr - 1) < FRT_REGISTER_DEVICE_ADDR)) ||\
(((reg_num + start_reg_addr - 1) > FRT_REGISTER_PRESSURE) && ((reg_num + start_reg_addr - 1) < FRT_REGISTER_THROUGH_WIND_DIRECTION)) ||\
(((reg_num + start_reg_addr - 1) > FRT_REGISTER_PEAK_WIND_SPEED) && ((reg_num + start_reg_addr - 1) < FRT_REGISTER_DEVICE_ADDR)) ||\
(((reg_num + start_reg_addr -1) > FRT_REGISTER_TEMPHUM_UPDATE_TIME) && ((reg_num + start_reg_addr -1) < FRT_REGISTER_TRANSDUCER_CFG_1R5)) ||\
((reg_num + start_reg_addr -1) > FRT_REGISTER_ID_4) \
((reg_num + start_reg_addr -1) > FRT_REGISTER_ID_4) \
)
{

View File

@ -188,6 +188,8 @@ void SensorTask(void const * argument)
}
/* USER CODE END Application */
uint16_t time_s_1Hour = 0;//1小时的秒数
uint8_t time_h_1Day = 0;//1天的小时
void LEDTask(void const * argument)
{
/* USER CODE BEGIN StartDefaultTask */
@ -196,9 +198,22 @@ void LEDTask(void const * argument)
for(;;)
{
osDelay(1000);
time_s_1Hour ++;
if(LED_Check_flag)
{
HAL_GPIO_TogglePin(GPIOC,GPIO_LED_CTRL_Pin);
// 一天重启
if (time_s_1Hour >= 3600)
{
time_s_1Hour = 0;
time_h_1Day++;
}
if (time_h_1Day >= 24)
{
time_h_1Day = 0;
__iar_builtin_set_FAULTMASK(1);
NVIC_SystemReset();
}
}
}
/* USER CODE END StartDefaultTask */

View File

@ -10,14 +10,44 @@ void initLowPassFilter(SL_LowPassFilter* filter, float alpha)
filter->alpha = alpha;
// 初始化上一次的输出值为0
filter->previous = 0.0f;
filter->x = 0;
filter->times = 0;
}
// 更新滤波器输出值
float updateFilter(SL_LowPassFilter* filter, float new_input)
{
// 更新滤波后的值
float output = (1.0f - filter->alpha) * filter->previous + filter->alpha * new_input;
// 滤波新值
float filtedData = (1.0f - filter->alpha) * filter->previous + filter->alpha * new_input;
//差值大于一定值认为有问题暂定4
if((filter->x) - filtedData > 4 || (filtedData) - filter->x > 4 )
{
// 将有问题的值存起来
(filter->x) = filtedData;
// 使用上一次的正确值当结果
filtedData = filter->previous;
// 清空计数
filter->times = 0;
}else
{
// 差值在允许范围内
// 差值合理一定时间后认为数据没问题
if(filter->times < 3)
{
filter->times++;
// 没满足次数,使用旧值
filtedData = filter->previous;
}
else
{
// 将值存起来,直接使用滤波后的值
(filter->x) = filtedData;
}
}
// 更新上一次的输出值
filter->previous = output;
return output;
filter->previous = filtedData;
return filtedData;
}

View File

@ -9,6 +9,8 @@
typedef struct {
float alpha; // 滤波器系数
float previous; // 上一次的输出值
float x; // 上一次的输入值
uint8_t times; // 次数
} SL_LowPassFilter;
extern SL_LowPassFilter low_pass_filter_x;