fix: 上电后稳定期 — 128样本(~128ms)仅跟踪基线不检测

- 新增 g_loop_stable 标志,Origin确立后持续慢闪
- vd1_task 稳定期内只做 IIR + 基线跟踪,跳过进入检测
- 稳定期 128 样本 (~128ms) 后自动启用检测
- 绿灯慢闪延续到稳定期结束
- 安全复位时重置 g_loop_stable
This commit is contained in:
wangfq
2026-06-23 14:40:38 +08:00
parent 8439f2e72b
commit 69bb28cf58
2 changed files with 23 additions and 4 deletions

View File

@@ -81,6 +81,7 @@ extern uint8_t loop1_FLAG_IN; // 进入延时中
extern uint8_t loop1_FLAG_OUT; // 离开延时中 extern uint8_t loop1_FLAG_OUT; // 离开延时中
extern uint8_t loop1_FLAG_PLUSE; // 脉冲输出中 extern uint8_t loop1_FLAG_PLUSE; // 脉冲输出中
extern uint8_t loop1_SensLevel; // 当前灵敏度等级 (0~3) extern uint8_t loop1_SensLevel; // 当前灵敏度等级 (0~3)
extern uint8_t g_loop_stable; // 线圈数值已稳定 (0=稳定中, 1=稳定)
/* 离开防抖计数器(连续 CAPVD 恢复到阈值以上才释放) */ /* 离开防抖计数器(连续 CAPVD 恢复到阈值以上才释放) */
extern uint8_t loop1_cnt_release; // 离开防抖计数 extern uint8_t loop1_cnt_release; // 离开防抖计数

View File

@@ -51,6 +51,7 @@ uint8_t loop1_FLAG_OUT;
uint8_t loop1_FLAG_PLUSE; uint8_t loop1_FLAG_PLUSE;
uint8_t loop1_SensLevel; uint8_t loop1_SensLevel;
uint8_t loop1_cnt_release; uint8_t loop1_cnt_release;
uint8_t g_loop_stable;
/*=========================================================================== /*===========================================================================
* 全局状态变量 — 计数器 * 全局状态变量 — 计数器
@@ -189,7 +190,7 @@ void LEDA_ON_OFF(void)
* 由 TMR15 ISR 每 5ms 驱动一次,是绿灯的唯一控制入口。 * 由 TMR15 ISR 每 5ms 驱动一次,是绿灯的唯一控制入口。
* *
* 模式: * 模式:
* 自检中 (loop1_INI_LOOP==1 或 线圈未稳定): * 自检/稳定中 (loop1_INI_LOOP || 线圈未连 || !g_loop_stable):
* → 慢闪 (200ms 亮 / 200ms 灭) * → 慢闪 (200ms 亮 / 200ms 灭)
* 正常工作: * 正常工作:
* → 有车亮 (VD_FLAG==1), 无车灭 * → 有车亮 (VD_FLAG==1), 无车灭
@@ -201,7 +202,7 @@ void poll_green_led(void)
static uint16_t _slow_tick = 0; 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++; _slow_tick++;
if (_slow_tick >= GREEN_SLOW_HALF) { if (_slow_tick >= GREEN_SLOW_HALF) {
_slow_tick = 0; _slow_tick = 0;
@@ -314,6 +315,7 @@ void INIT_VD(void)
loop1_FLAG_OUT = 0; loop1_FLAG_OUT = 0;
loop1_FLAG_PLUSE = 0; loop1_FLAG_PLUSE = 0;
loop1_cnt_release = 0; loop1_cnt_release = 0;
g_loop_stable = 0;
loop1_LC_HOLD = 0; loop1_LC_HOLD = 0;
loop1_LC_Reset = 0; loop1_LC_Reset = 0;
@@ -524,6 +526,7 @@ void TMR15_GLOBAL_IRQHandler(void)
loop1_LC_Reset = 1; loop1_LC_Reset = 1;
loop1_INI_LOOP = 1; loop1_INI_LOOP = 1;
loop1_LOOP_OK0 = 0; loop1_LOOP_OK0 = 0;
g_loop_stable = 0;
LC_Hold_CNT = 0; LC_Hold_CNT = 0;
loop1_ORG_CNT = 0; loop1_ORG_CNT = 0;
loop1_ORG_SUM = 0; loop1_ORG_SUM = 0;
@@ -586,12 +589,27 @@ void TMR15_GLOBAL_IRQHandler(void)
*===========================================================================*/ *===========================================================================*/
void vd1_task(void) void vd1_task(void)
{ {
#define STABLE_SAMPLES 128 // 稳定期样本数 (~128ms)
static uint16_t _stable_cnt = 0;
if (loop1_Origin == 0) return; if (loop1_Origin == 0) return;
/*--- 1. IIR 一阶低通滤波(对齐 M1H 公式) ---*/ /*--- 1. IIR 一阶低通滤波 ---*/
/* Value 已经是 MEASUREMENT_BASE 级别的原始值,不再右移 */
loop1_CAPVD = get_flt_value(loop1_Value, loop1_CAPVD); 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) { if (!loop1_VD_FLAG) {
/*================================================================ /*================================================================
* 无车状态 * 无车状态