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

@@ -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) {
/*================================================================
* 无车状态