From 69bb28cf581e9085b016b5d9db04f8871238ceb3 Mon Sep 17 00:00:00 2001 From: wangfq Date: Tue, 23 Jun 2026 14:40:38 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=B8=8A=E7=94=B5=E5=90=8E=E7=A8=B3?= =?UTF-8?q?=E5=AE=9A=E6=9C=9F=20=E2=80=94=20128=E6=A0=B7=E6=9C=AC(~128ms)?= =?UTF-8?q?=E4=BB=85=E8=B7=9F=E8=B8=AA=E5=9F=BA=E7=BA=BF=E4=B8=8D=E6=A3=80?= =?UTF-8?q?=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 g_loop_stable 标志,Origin确立后持续慢闪 - vd1_task 稳定期内只做 IIR + 基线跟踪,跳过进入检测 - 稳定期 128 样本 (~128ms) 后自动启用检测 - 绿灯慢闪延续到稳定期结束 - 安全复位时重置 g_loop_stable --- .../at32f421_freertos_demo/inc/TaskLoop.h | 1 + .../at32f421_freertos_demo/src/TaskLoop.c | 26 ++++++++++++++++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/utilities/at32f421_freertos_demo/inc/TaskLoop.h b/utilities/at32f421_freertos_demo/inc/TaskLoop.h index c4e9b88..90aaa36 100644 --- a/utilities/at32f421_freertos_demo/inc/TaskLoop.h +++ b/utilities/at32f421_freertos_demo/inc/TaskLoop.h @@ -81,6 +81,7 @@ 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 uint8_t g_loop_stable; // 线圈数值已稳定 (0=稳定中, 1=稳定) /* 离开防抖计数器(连续 CAPVD 恢复到阈值以上才释放) */ extern uint8_t loop1_cnt_release; // 离开防抖计数 diff --git a/utilities/at32f421_freertos_demo/src/TaskLoop.c b/utilities/at32f421_freertos_demo/src/TaskLoop.c index da78f91..f829815 100644 --- a/utilities/at32f421_freertos_demo/src/TaskLoop.c +++ b/utilities/at32f421_freertos_demo/src/TaskLoop.c @@ -51,6 +51,7 @@ uint8_t loop1_FLAG_OUT; uint8_t loop1_FLAG_PLUSE; uint8_t loop1_SensLevel; uint8_t loop1_cnt_release; +uint8_t g_loop_stable; /*=========================================================================== * 全局状态变量 — 计数器 @@ -189,7 +190,7 @@ void LEDA_ON_OFF(void) * 由 TMR15 ISR 每 5ms 驱动一次,是绿灯的唯一控制入口。 * * 模式: - * 自检中 (loop1_INI_LOOP==1 或 线圈未稳定): + * 自检/稳定中 (loop1_INI_LOOP || 线圈未连 || !g_loop_stable): * → 慢闪 (200ms 亮 / 200ms 灭) * 正常工作: * → 有车亮 (VD_FLAG==1), 无车灭 @@ -201,7 +202,7 @@ void poll_green_led(void) static uint16_t _slow_tick = 0; /*--- 自检阶段:慢闪 ---*/ - if (loop1_INI_LOOP || !g_loop_power_up_state) { + if (loop1_INI_LOOP || !g_loop_power_up_state || !g_loop_stable) { _slow_tick++; if (_slow_tick >= GREEN_SLOW_HALF) { _slow_tick = 0; @@ -314,6 +315,7 @@ void INIT_VD(void) loop1_FLAG_OUT = 0; loop1_FLAG_PLUSE = 0; loop1_cnt_release = 0; + g_loop_stable = 0; loop1_LC_HOLD = 0; loop1_LC_Reset = 0; @@ -524,6 +526,7 @@ void TMR15_GLOBAL_IRQHandler(void) loop1_LC_Reset = 1; loop1_INI_LOOP = 1; loop1_LOOP_OK0 = 0; + g_loop_stable = 0; LC_Hold_CNT = 0; loop1_ORG_CNT = 0; loop1_ORG_SUM = 0; @@ -586,12 +589,27 @@ void TMR15_GLOBAL_IRQHandler(void) *===========================================================================*/ void vd1_task(void) { +#define STABLE_SAMPLES 128 // 稳定期样本数 (~128ms) + + static uint16_t _stable_cnt = 0; + if (loop1_Origin == 0) return; - /*--- 1. IIR 一阶低通滤波(对齐 M1H 公式) ---*/ - /* Value 已经是 MEASUREMENT_BASE 级别的原始值,不再右移 */ + /*--- 1. IIR 一阶低通滤波 ---*/ loop1_CAPVD = get_flt_value(loop1_Value, loop1_CAPVD); + /*--- 2. 稳定期:只跟踪基线,不检测车辆 ---*/ + if (!g_loop_stable) { + update_moving_average(&loop1_ORG_SUM, &loop1_ORG_CNT, + &loop1_Origin, loop1_CAPVD, 100); + _stable_cnt++; + if (_stable_cnt >= STABLE_SAMPLES) { + g_loop_stable = 1; + PRINT("Loop stable, Origin:%d\n", loop1_Origin); + } + return; + } + if (!loop1_VD_FLAG) { /*================================================================ * 无车状态