Files
DLD154V4B/utilities/at32f421_freertos_demo/inc/TaskLoop.h
2026-06-22 18:20:37 +08:00

174 lines
6.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
**************************************************************************
* @file TaskLoop.h
* @version v1.0
* @date 2025-09-08
* @brief 地感功能的实现
**************************************************************************
* Copyright notice & Disclaimer
* * Create 2025-09-08 by wangfq
* *
**************************************************************************
*/
#ifndef __TASKLOOP_H__
#define __TASKLOOP_H__
#include <stdint.h>
#define HOLD_TIME 5*1200
#define LC_HOLD_TIME 4*1200 //时间4分钟
#define IN_DELAY 10
#define OUT_DELAY 39
#define PLUSE_DELAY 10
#define MAX_CMP_LOOP_UNIT 4 // 5 组
#define MAX_CMP_DIF 20 //
#define MAX_TIMEOUT_CMP 120000 // 5毫秒 为单位, 表示10分钟 600秒
#define ALFA_CAP1 79
#define ALFA_CAP2 64
#define ALFA_ORG1 64
#define ALFA_ORG2 64
#define XNSUM_FOR_ORIGIN_FACTOR 6 //7 //8 //7 //6
extern uint8_t loop1_INI_LOOP;
extern uint8_t loop1_CAP_OK;
extern uint8_t loop1_CAP_FLAG;
extern uint8_t loop1_VD_FLAG;
extern uint8_t loop1_VD_HOLD;
extern uint8_t loop1_RF_FLAG;
extern uint8_t loop1_LOOP_OK;
extern uint8_t loop1_LOOP_OK0;
extern uint8_t loop1_FLAG_IN;
extern uint8_t loop1_FLAG_OUT;
extern uint8_t loop1_FLAG_PLUSE;
extern uint8_t loop1_FLAG_PLUSE_DELAY;
extern uint8_t loop1_FLAG_IN_PLUSE;
extern uint8_t loop1_FLAG_CUT;
extern uint8_t SET_PLUS; //输出方式
extern uint32_t g_xn_counter;
extern uint8_t g_flag_stable_delta2_flt;
// 二阶变化量计算状态结构体
typedef struct {
int16_t delta_prev; // 上一次的一阶变化量
int16_t delta2_flt; // 滤波后的二阶变化量
} SecondOrderState;
extern SecondOrderState second_order_state;
#define SECOND_ORDER_FILTER_COEF 64 // 滤波系数64/256=0.25
// 一阶滤波管理全局状态
typedef struct {
uint8_t flag_not_idle;
uint32_t counter_not_idle;
uint8_t flag_init_value;
uint32_t stable_init_value; // 开机稳定初始值
uint8_t flag_5sec;
uint16_t counter_5sec;
uint32_t recent_5sec;
// uint8_t flag_5min;
// uint32_t counter_5min;
// uint16_t recent_5min; // 最近5分钟的一阶滤波值
// uint8_t flag_10min;
// uint32_t counter_10min;
// uint16_t recent_10min; // 最近10分钟的一阶滤波值
// uint8_t flag_30min;
// uint32_t counter_30min;
// uint16_t recent_30min; // 最近半小时的一阶滤波值
// uint8_t flag_60min;
// uint32_t counter_60min;
// uint16_t recent_60min; // 最近1小时的一阶滤波值
uint32_t init_sum; // 初始化累加值
uint16_t init_samples; // 初始化采样计数器
uint8_t is_initialized; // 初始化完成标志
uint32_t init_freq; // 初始频率
uint32_t current_freq;
uint16_t cnt_sec_samples;
uint32_t sum_sec_samples;
uint16_t cnt_samples;
uint32_t sum_samples;
uint8_t flag_flat_release;
uint16_t cnt_flat_release;
uint16_t max_cnt_flat_release;
uint32_t last_loop_Origin;
uint8_t flag_loop_reconnect; // 线圈重连
uint16_t cnt_loop_reconnect;
uint8_t last_loop_vd_flag;
uint16_t window_size;
uint8_t flag_second_judge; // 进入第二轮判断;由于第一轮判定为有车状态超时了,那么进入第二轮判定,第二轮判定会默认当前无车开始
uint32_t second_loop_Origin;
uint32_t second_loop_ORG_SUM; // for option use
uint16_t second_loop_ORG_CNT;
uint32_t second_loop_dlt_ORG;
uint8_t second_loop_vd_flag;
// 二次判断增强条件
uint32_t second_judge_enter_time; // 进入二次判断的时间戳单位5ms
uint16_t second_judge_min_time; // 二次判断最小时间限制单位5ms默认10秒=2000
uint16_t cnt_stable_to_idle; // 连续检测到恢复到空闲值的计数
uint16_t stable_to_idle_threshold; // 恢复到空闲值的阈值次数
uint16_t cnt_not_idle;
uint16_t cnt_idle;
uint16_t cnt_simple_release;
uint16_t cnt_simple_busy;
// 从无车到有车 从有车到无车
// 频率的变化趋势: 频率变大 频率变小
// 捕获值的变化趋势: 值变小 值变大
// 电感量的变化趋势 值变小 值变大
uint16_t cnt_release_Up; // 从有车到无车时,一阶变化量 正数,一阶变化量是新捕获值与上一次捕捉值的差,
uint16_t cnt_release_Down; // 从有车到无车时,一阶变化量 负数,此时可能倒车?或者出车的过程中有其他更有影响的部件,如前轮和后轮部分
uint16_t min_release_capvd; // 从有车到无车时U字形 拐点处的 一阶滤波值
} FltHistoryManager;
extern FltHistoryManager flt_mgr ; // <20><>ʼ<EFBFBD><CABC>Ϊ0
// 初始化采样次数例如100次
#define INIT_SAMPLE_COUNT 10 //40 // 200
#define TMP_SAMPLE_COUNT 50
// 区间类型定义(绝对差值或百分比)
typedef enum {
RANGE_ABSOLUTE, // 绝对差值(如 ±50
RANGE_PERCENT // 百分比(如 ±10%
} RangeType;
// 阶段配置结构体(每个时间窗口的区间规则)
typedef struct {
uint32_t base_value; // 基准值例如开机稳定值、最近5分钟值等
uint32_t lower;
uint32_t upper;
uint16_t range_size; // 区间大小(绝对值或百分比数值)
RangeType range_type; // 区间类型(绝对或百分比)
} StageRangeConfig;
// 全局阶段配置数组示例开机、5分钟、10分钟、30分钟、1小时
#define STAGE_COUNT 2
#define STAGE_COUNT_SHORT 2
extern StageRangeConfig stage_config[STAGE_COUNT];
void loop_task_function(void *pvParameters);
#endif