Files
DLD154V4B/utilities/at32f421_freertos_demo/inc/TaskLoop.h
wangfq 95bf13a5ef refactor: 精简检测算法,对齐 M1H/TLD-110 参考实现
- 删除二阶差分滤波(计算但从未参与判决)
- 删除 FltHistoryManager 死代码(20+ 未用字段)
- 删除 StageRangeConfig(区间约束计算后未引用)
- 删除动态窗口切换,改为 M1H 固定 100 窗口基线
- 修复 LPCNT 计算溢出 (32768/Xn<<6 改为乘除顺序)
- 进入/离开判决对齐 M1H:单次检测 + TMR15 时序防抖
- 时序状态机简化:去掉 PLUSE_IN_F/PLUSE_IN 中间层
- 拨码去抖次数对齐 M1H: 10→5
- 代码量: 1177→706 行 (-40%)
2026-06-23 08:39:48 +08:00

141 lines
7.4 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 v2.0
* @date 2025-09-08 (original), 2026-06-23 (simplified)
* @brief 地感功能实现 — 精简版,对齐 M1H/TLD-110 参考实现
**************************************************************************
* Copyright notice & Disclaimer
* * Create 2025-09-08 by wangfq
* * Simplify 2026-06-23: 去除二阶滤波、StageRangeConfig 等未使用模块
**************************************************************************
*/
#ifndef __TASKLOOP_H__
#define __TASKLOOP_H__
#include <stdint.h>
#include <stddef.h>
/*===========================================================================
* 时序参数(每 tick ≈50ms由 TMR15 5ms×10 产生),对齐 M1H 参考实现
*===========================================================================*/
#define HOLD_TIME (5 * 1200) // 有限存在保持(约 5 分钟)
#define LC_HOLD_TIME (4 * 1200) // 安全复位时间(约 4 分钟)
#define IN_DELAY 10 // 进入防抖 500ms
#define OUT_DELAY 38 // 离开防抖 1.9s
#define PULSE_DELAY 19 // 脉冲宽度 950ms
/*===========================================================================
* 滤波参数 — 对齐 M1H
*===========================================================================*/
#define ALFA_CAP1 79 // IIR 指数平滑 α = 79/256 ≈ 0.31
/*===========================================================================
* 频率测量参数
* XNSUM_FOR_ORIGIN_FACTOR: Value/LPCNT 的归一化右移量
* 使 Origin 保持在合理的 uint32 范围内
*===========================================================================*/
#define XNSUM_FOR_ORIGIN_FACTOR 6 // >>6
/*===========================================================================
* 灵敏度表 — 对齐 M1H
* 进入阈值 = Origin × SensTable[SENS] / 65536
* 离开阈值 = Origin × SensTable_1[SENS] / 65536 (滞回 ~50%
*===========================================================================*/
extern const uint16_t SensTable[4];
extern const uint16_t SensTable_1[4];
/*===========================================================================
* 全局状态变量 — 捕获 & 测量
*===========================================================================*/
extern uint32_t g_sys_freq; // 系统时钟频率
extern uint8_t g_input_div; // TIM3 输入分频倍数
extern uint16_t loop1_Xn; // 当前相邻边沿周期差
extern uint16_t loop1_CapThis; // 本次捕获值
extern uint16_t loop1_CapLast; // 上次捕获值
extern uint16_t loop1_LPCNT; // 每 Value 需累加 LPCNT 次 Xn
extern uint16_t loop1_CapCnt; // 当前窗口已累加次数
extern uint32_t loop1_CapSum; // 当前窗口累加和
extern uint32_t loop1_Value; // 一个测量窗口的原始 ΣXn
extern uint32_t loop1_CAPVD; // IIR 滤波后的频率值
extern uint32_t loop1_Origin; // 基线(无车时的参考频率)
extern uint32_t loop1_ORG_SUM; // 基线跟踪累加和
extern uint16_t loop1_ORG_CNT; // 基线跟踪计数(窗口=100
extern uint16_t loop1_dlt_ORG; // 当前灵敏度阈值
extern uint8_t Flt_Reg; // IIR 滤波系数
/*===========================================================================
* 全局状态变量 — 标志位
*===========================================================================*/
extern uint8_t loop1_INI_LOOP; // 初始化阶段
extern uint8_t loop1_CAP_OK; // 新测量数据就绪
extern uint8_t loop1_VD_FLAG; // 有车标志
extern uint8_t loop1_VD_HOLD; // 有限存在计时启用
extern uint8_t loop1_RF_FLAG; // 本 tick 收到线圈振荡边沿
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_SensLevel; // 当前灵敏度等级 (0~3)
/*===========================================================================
* 全局状态变量 — 计数器
*===========================================================================*/
extern uint16_t Hold_CNT; // 有限存在计数器
extern uint8_t loop1_INCNT; // 进入延时计数
extern uint8_t loop1_OUTCNT; // 离开延时/脉冲宽度计数
extern uint8_t TM1cnt; // 50ms tick 分频计数
/*===========================================================================
* 拨码开关状态
*===========================================================================*/
extern uint8_t SET_PLUS; // 0=存在输出, 1=脉冲输出
extern uint8_t SET_DLY; // 0=无延时, 1=延时
extern uint8_t SET_SAFE; // 1=安全复位拨下
/*===========================================================================
* 拨码开关去抖变量
*===========================================================================*/
extern uint8_t sw0, sw1, swok, swcnt;
extern uint8_t SENS, SENS_LAST;
/*===========================================================================
* 安全复位相关
*===========================================================================*/
extern uint8_t loop1_LC_HOLD; // 安全复位计时中
extern uint8_t loop1_LC_Reset; // 触发安全复位
extern uint32_t LC_Hold_CNT; // 安全复位计数器
extern uint16_t g_safe_max_cnt; // 安全复位超时
/*===========================================================================
* 故障指示相关 (DLD154V4B 特有M1H 无黄灯)
*===========================================================================*/
extern uint8_t g_loop_power_up_state; // 上电后线圈是否曾连接
extern uint8_t g_led_loop_reconnect; // 线圈重连状态 (0=正常, >0=故障闪烁)
extern uint8_t g_flag_faul_reconnect; // 故障灯切相
extern uint8_t g_step_fault_led; // 故障灯步骤
extern uint16_t g_counter_fault_led; // 故障灯计数器
/*===========================================================================
* 调试计数器
*===========================================================================*/
extern uint32_t g_xn_counter; // 边沿总数(用于调试输出)
/*===========================================================================
* 函数声明
*===========================================================================*/
void loop_task_function(void *pvParameters);
void poll_sw_state(void);
uint32_t get_flt_value(uint32_t new_value, uint32_t last_Value);
uint8_t update_moving_average(uint32_t* p_sum, uint16_t* p_cnt,
uint32_t* p_origin, uint32_t new_value,
uint8_t window);
void poll_yellow_led(void);
void LEDA_ON_OFF(void);
void vd1_task(void);
#endif /* __TASKLOOP_H__ */