fix(V4B): V4.36.34 — EMA 钳位自愈 + SUM/ADR 诊断 (35uH VEM 垃圾)

35uH 日志: VEM 垃圾 536M→846M→2224M 递增 (10:23:03 起)
连锁: vac_ref=垃圾 → RLN=-2070862722 → RSM 永不够 → 卡死
      触发判定 vac_ref-dlt 巨大 → CAPVD=真空值假 Car_In
分析: EMA 公式限幅不可能跳5亿; 写点全正常 → 越界写, 写源未定
防御: EMA 每步限 ±3×dlt; 与 Origin 偏差>25% 自愈回 Origin
诊断: DBG 加 SUM(ORG_SUM 对照); 每 10s ADR 打 4 变量地址
语法0 error, 4测试全绿; spec V2.51 / devlog V2.69
This commit is contained in:
wangfq
2026-09-08 10:32:43 +08:00
parent da2fc83afb
commit 76177fd086
4 changed files with 40 additions and 9 deletions
+2 -2
View File
@@ -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
@@ -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)
}
}