diff --git a/utilities/at32f421_freertos_demo/inc/TaskLoop.h b/utilities/at32f421_freertos_demo/inc/TaskLoop.h index afece45..35d3d36 100644 --- a/utilities/at32f421_freertos_demo/inc/TaskLoop.h +++ b/utilities/at32f421_freertos_demo/inc/TaskLoop.h @@ -43,6 +43,7 @@ #define VACUUM_EMA_ALFA 128 // V4.36.31: 真空 EMA 平滑因子 (τ≈1.28s@10ms): B3 判定参考解耦 // 无车 dev 窗内跟踪实时真空; 噪声 σ_ema≈σ/16 (σ1-2 → 0.1 counts) #define VAC_REF_DELTA_DLT 1 // V4.36.33: vac_ref 重锚阈值 (×dlt): 仅 Origin−EMA > 1×dlt(真锚错) +#define ORIGIN_JUMP_REANCH_DLT 1 // V4.36.41: Origin 单步跳变 > 1×dlt ⇒ 同步重锚真空 EMA (B1 护栏) // 才用 EMA 锚低 — 防金属板悬感应边缘(dev−20~−40<4dlt)快速拉低 EMA // → 触发线漂移(触发高度下降); 小偏差仍用 Origin // 150(→35)不够: 23µH 现场实测板停临界回摆 Origin-36, 需释放线 ORIGIN_JUMP_REANCH_DLT×dlt 才重锚 EMA; 小步(≤1×dlt)不动, + * 与 VAC_REF_DELTA_DLT 同口径 ⇒ 保持 |Origin−EMA| ≤ 1×dlt 不变式, + * 不干扰 EMA 在对称窗内的实时真空跟踪 */ +static void origin_set_atomic(uint32_t new_origin) +{ + int32_t _jump = (int32_t)new_origin - (int32_t)loop1_Origin; + if (_jump < 0) _jump = -_jump; + loop1_Origin = new_origin; + if (g_vacuum_ema == 0 || loop1_dlt_ORG == 0 || + _jump > (int32_t)(loop1_dlt_ORG * ORIGIN_JUMP_REANCH_DLT)) + g_vacuum_ema = new_origin; +} + static uint8_t rel_release_hit(void) { uint32_t _cmp = loop1_CAPVD; @@ -946,7 +963,7 @@ static void env_resync_apply(uint32_t new_origin) { PRINT("EVT|env_resync Origin:%d->%d CAPVD:%d\n", loop1_Origin, new_origin, loop1_CAPVD); - loop1_Origin = new_origin; + origin_set_atomic(new_origin); /* V4.36.41: 同步真空 EMA — 补偿后进入线不再被旧真空拖低 */ loop1_freeze_cnt = 0; loop1_freeze_ref = 0; loop1_ORG_CNT = 0; @@ -1185,7 +1202,7 @@ void vd1_task(void) if (_d < 0) _d = -_d; if (_d <= (int32_t)_dlt) { /* 回带内=空场确认 → Origin 对齐当前空场(消基线差) */ - loop1_Origin = loop1_CAPVD; + origin_set_atomic(loop1_CAPVD); /* V4.36.41: 护栏(小步≤1×dlt 不动 EMA) */ loop1_CAPVD_slow = loop1_CAPVD; loop1_dlt_ORG = ((uint32_t)loop1_Origin * SensTable[loop1_SensLevel]) >> 16; @@ -1341,7 +1358,7 @@ void vd1_task(void) } loop1_freeze_cnt++; if (loop1_freeze_cnt >= FREEZE_TIMEOUT) { - loop1_Origin = loop1_CAPVD; + origin_set_atomic(loop1_CAPVD); /* V4.36.41: 护栏(大步下跳也同步重锚) */ loop1_freeze_cnt = 0; loop1_freeze_ref = 0; loop1_ORG_CNT = 0;