diff --git a/utilities/at32f421_freertos_demo/src/TaskLoop.c b/utilities/at32f421_freertos_demo/src/TaskLoop.c index ced6631..ea7c4c7 100644 --- a/utilities/at32f421_freertos_demo/src/TaskLoop.c +++ b/utilities/at32f421_freertos_demo/src/TaskLoop.c @@ -654,12 +654,24 @@ void vd1_task(void) * 无车状态 *================================================================*/ - /*--- 基线跟踪(仿 TLD-110:有车时冻结) ---*/ - update_moving_average(&loop1_ORG_SUM, &loop1_ORG_CNT, - &loop1_Origin, loop1_CAPVD, 100); + /*--- 基线跟踪(仿 TLD-110:有车时冻结) + * 额外保护: CAPVD 异常上升时暂停跟踪,防止基线被污染 + * 否则车辆驶入时若 Xn 先增大,Origin 被顶上去后无法释放 ---*/ + loop1_dlt_ORG = ((uint32_t)loop1_Origin * SensTable[loop1_SensLevel]) >> 16; + { + int32_t dev = (int32_t)loop1_CAPVD - (int32_t)loop1_Origin; + if (dev < (int32_t)(loop1_dlt_ORG * 4)) { + /* CAPVD 未显著高于基线 → 安全跟踪 */ + update_moving_average(&loop1_ORG_SUM, &loop1_ORG_CNT, + &loop1_Origin, loop1_CAPVD, 100); + } else { + /* CAPVD 异常偏高 → 冻结跟踪,重置累计 */ + loop1_ORG_CNT = 0; + loop1_ORG_SUM = 0; + } + } /*--- 进入检测 ---*/ - loop1_dlt_ORG = ((uint32_t)loop1_Origin * SensTable[loop1_SensLevel]) >> 16; if (loop1_CAPVD < (loop1_Origin - loop1_dlt_ORG)) { PRINT("Car_In, Value:%d, CAPVD:%d, Origin:%d, dlt:%d\n",