diff --git a/docs/devlog.md b/docs/devlog.md index 837f3b0..b49bcc7 100644 --- a/docs/devlog.md +++ b/docs/devlog.md @@ -4,6 +4,20 @@ --- +## 2026-09-08 — EMA 内存污染:VEM 垃圾实锤 + 钳位自愈防御(固件 V4.36.34) + +35µH 日志(35uH 释放不了):VEM 字段垃圾 536259907→846958055→2224104615(显示负) 递增, 10:23:03 起持续。 +**连锁破坏**: vac_ref()=垃圾 EMA → 释放线 RLN=-2070862722 → RSM 永不够 → 卡死; 且触发判定 vac_ref-dlt 巨大 → 10:23:06 CAPVD 130841(真空值) 假 Car_In。 + +**分析**:EMA 公式限幅(±差/128)不可能一步跳 5 亿; 写点仅 INIT/判稳/EMA 更新全正常 → 别处越界写。垃圾值 ≈CAPVD×N(N 随无车时长增、卡死即停) 具 ORG_SUM 语义但数值不匹配; 拼接/计数器规律不成立 → 写源未定。 + +**V4.36.34 三重**: +1. 防御: EMA 每步限 ±3×dlt(防 CAPVD 毛刺拖带); 与 Origin 偏差 >25% 视为污染自愈回 Origin +2. 诊断: DBG 加 SUM=loop1_ORG_SUM 对照 (VEM 与 SUM 同帧可判是否地址重叠); 每 10s ADR 行打印 &VEM/&ORGSUM/&Origin/&RSM +3. 机理确认: 卡死由 EMA 垃圾连锁 (释放线垃圾+假触发), 非释放逻辑本身 + +语法 0 error、4 测试全绿;REV 4.36.34;spec V2.51 / devlog V2.69。 + ## 2026-09-04 — vac_ref 重锚阈值:EMA 边缘污染修复(固件 V4.36.33) V4.36.32 板测反馈:33µH 大幅好转(剩上电自检完首压偶发);23µH 仍可复现;**新问题(所有线圈):金属板间隔几秒再压,触发高度下降一半甚至更多,多试几轮恢复**。 @@ -2112,6 +2126,7 @@ if (dev >= dlt_ORG × 4) { | 版本 | 时间 | 说明 | |------|------|------| +| V2.69 | 2026-09-08 | V4.36.34 EMA 钳位自愈+SUM/ADR 诊断: 35µH VEM 垃圾实锤(写源待定) | | V2.68 | 2026-09-04 | V4.36.33 vac_ref 重锚阈值(Origin−EMA>1×dlt 才锚 EMA): 修边缘悬停拉低 EMA 触发高度漂移 | | V2.67 | 2026-09-04 | V4.36.32 释放后分级补偿(冻结1s+降权2s×1/5): 仿132T 慢采样防残余整窗拉低 Origin | | V2.66 | 2026-09-04 | V4.36.31 B3 真空 EMA 重锚: vac_ref=min(Origin,EMA) 判定参考解耦; A2 存档 | diff --git a/docs/technical-spec.md b/docs/technical-spec.md index 0b73153..be67cf3 100644 --- a/docs/technical-spec.md +++ b/docs/technical-spec.md @@ -1,6 +1,6 @@ # DLD154V4B 技术规格书 -> 单路线圈车辆检测器 | 固件版本: V4.36.33 | 文档版本: V2.50 +> 单路线圈车辆检测器 | 固件版本: V4.36.34 | 文档版本: V2.51 > 本文档面向工程开发、系统集成及故障深度分析 --- @@ -843,3 +843,4 @@ DLD154V4B V1.4 起实现该专利的整数化版本,用于大车通行时的 | V2.48 | 2026-09-04 | **V4.36.32 释放后分级补偿(仿 PD132T 慢采样)**:均值窗是满窗替换(500 样本/5s)——快采样 10ms 让窗装得快, 释放残余(板缓离低 CAPVD)易整窗拉低 Origin。分级:释放后全冻结 1s(REL_ORIGIN_FREEZE_TICKS 50→100) → 降权低速补偿 2s(ORIGIN_LOWLEARN_TICKS=200, 窗 500→2500=25s, 学习速率 1/5, ORIGIN_LOWLEARN_MULT=5) → 正常。全宏可调;EMA/判定零影响 | | V2.49 | 2026-09-04 | 文档勘误:① 4.4.2 表"折算频率下降"列少乘 2(应 = −dXn/Xn: −2.06/−0.43/−0.23/−0.15%);② 补方向澄清——本表只管 CAPVD>Origin(L 升方向),车压 L 降方向冻结不在此表;③ 4.3.1 注 USE_PLANB_TABLE 双表 | | V2.50 | 2026-09-04 | **V4.36.33 vac_ref 重锚阈值 VAC_REF_DELTA_DLT=1**:用户反馈触发高度漂移(间隔几秒再压变浅、多试几轮恢复)——EMA(α128 τ1.28s)+4×dlt 宽窗把金属板悬感应边缘(dev−20~−40)当真空快学 → vac_ref 被拉低 → 触发线漂移。修: 仅 Origin−EMA>1×dlt(真锚错 J1 130 counts) 才重锚 EMA, 小偏差用 Origin | +| V2.51 | 2026-09-08 | **V4.36.34 EMA 钳位+自愈+诊断**:35µH 日志 VEM 垃圾实锤(536M→846M→2224M 递增, 10:23:03 起) → EMA 内存被越界写(值≈ORG_SUM 语义但数值不匹配; 写源未定)。防御: EMA 每步限 ±3×dlt、与 Origin 偏差>25% 自愈回 Origin;诊断: DBG 加 SUM(ORG_SUM 对照)+每 10s ADR(四变量地址) | diff --git a/utilities/at32f421_freertos_demo/inc/cmcng.h b/utilities/at32f421_freertos_demo/inc/cmcng.h index 06f3289..61d7749 100644 --- a/utilities/at32f421_freertos_demo/inc/cmcng.h +++ b/utilities/at32f421_freertos_demo/inc/cmcng.h @@ -14,11 +14,11 @@ #define __CMCNG_H__ #define PRODUCT_MODEL "DLD154" -#define FIRMWARE_VER "4.36.33" // ..޶ (2026-09-03 : СĶֻ REV; MAIN/SUB ɲƷ) +#define FIRMWARE_VER "4.36.34" // ..޶ (2026-09-03 : СĶֻ REV; MAIN/SUB ɲƷ) #define HARDWARE_VER "3.00" #define FIRMWARE_VER_MAIN 4 #define FIRMWARE_VER_SUB 36 -#define FIRMWARE_VER_REV 33 +#define FIRMWARE_VER_REV 34 #define HARDWARE_VER_MAIN 3 #define HARDWARE_VER_SUB 0 diff --git a/utilities/at32f421_freertos_demo/src/TaskLoop.c b/utilities/at32f421_freertos_demo/src/TaskLoop.c index 9d5ef87..f8ae819 100644 --- a/utilities/at32f421_freertos_demo/src/TaskLoop.c +++ b/utilities/at32f421_freertos_demo/src/TaskLoop.c @@ -1259,11 +1259,21 @@ void vd1_task(void) update_moving_average(&loop1_ORG_SUM, &loop1_ORG_CNT, &loop1_Origin, loop1_CAPVD, _win); /* V4.36.31: 真空 EMA 同步更新 (同条件同守卫; α=128 τ≈1.28s) */ - if (g_vacuum_ema == 0) + if (g_vacuum_ema == 0) { g_vacuum_ema = loop1_CAPVD; - else - g_vacuum_ema += (uint32_t)((int32_t)loop1_CAPVD - (int32_t)g_vacuum_ema) - / VACUUM_EMA_ALFA; + } else { + /* V4.36.34: EMA 钳位 — 每步最多 ±3×dlt (防 CAPVD 毛刺拖带); + * 与 Origin 偏差 >25% 视为内存污染/失控, 自愈回 Origin (20260908 35uH 日志 VEM 垃圾实锤) */ + int32_t _ema_d = (int32_t)loop1_CAPVD - (int32_t)g_vacuum_ema; + int32_t _ema_lim = (int32_t)(loop1_dlt_ORG * 3); + if (_ema_d > _ema_lim) _ema_d = _ema_lim; + else if (_ema_d < -_ema_lim) _ema_d = -_ema_lim; + if (_ema_d != 0) + g_vacuum_ema += (uint32_t)_ema_d / VACUUM_EMA_ALFA; + if (((int32_t)loop1_Origin - (int32_t)g_vacuum_ema) > (int32_t)(loop1_Origin >> 2) || + ((int32_t)g_vacuum_ema - (int32_t)loop1_Origin) > (int32_t)(loop1_Origin >> 2)) + g_vacuum_ema = loop1_Origin; + } } } else if (dev < 0) { g_env_wait_cnt = 0; // V4.24: 目标靠近(车方向) → 等待重来 @@ -1709,7 +1719,7 @@ void loop_task_function(void *pvParameters) _rln = vac_ref() - ((loop1_dlt_ORG * REL_BAND_LO_MULT) / 100); /* V4.36.31: 显示真空锚定线 */ PRINT("DBG|t=%ums f=%dkHz L=%luuH Xn=%d LPCNT=%d Value=%d CAPVD=%d slow=%d " "Origin=%d dlt=%d SENS=%d VD=%d FRZ=%d/%d LIM=%d LOOP=%d STBL=%d " - "QLO=%d VEM=%d RSM=%d RLN=%d RCN=%d\n", + "QLO=%d VEM=%d RSM=%d RLN=%d RCN=%d SUM=%lu\n", _t_ms, _fk, coil_l_uH(_fk), @@ -1717,8 +1727,13 @@ void loop_task_function(void *pvParameters) loop1_Origin, loop1_dlt_ORG, loop1_SensLevel, loop1_VD_FLAG, loop1_freeze_cnt, loop1_freeze_ref, g_slope_limit_cnt, loop1_LOOP_OK, g_loop_stable, - g_q_lo, g_vacuum_ema, g_rel_smooth, _rln, loop1_cnt_release); + g_q_lo, g_vacuum_ema, g_rel_smooth, _rln, loop1_cnt_release, + (unsigned long)loop1_ORG_SUM); } + if ((_t_ms % 10000) == 0) /* V4.36.34 诊断: 关键变量地址 (每 10s) */ + PRINT("ADR|VEM=%08X ORGSUM=%08X Origin=%08X RSM=%08X\n", + (unsigned)&g_vacuum_ema, (unsigned)&loop1_ORG_SUM, + (unsigned)&loop1_Origin, (unsigned)&g_rel_smooth); g_slope_limit_cnt = 0; // 限幅计数按周期清 (统计最近 2s) } }