Files
DLD154V4B/docs/patches/v4.36.42-E-ema-oneway.diff
wangfq 0f8a0d6fbd fix(V4B): V4.36.42 — 低Q 临界悬停自激根治 (进/出参考统一 + 释放带夹紧 + 最小保持)
用户反馈: 金属板缓慢接近时判据乱跳; 35µH(128kHz)/46µH(112kHz) 线圈同样现象(46µH 在设计窗内且无告警)。

根因(三段链条, 现场日志与代码逐值吻合):
 ① 无车态 dlt_ORG=进表 49 ⇒ vac_ref() 门控 1×49; Origin−EMA=32~34 ≯49 ⇒ 参考=Origin ⇒ 进入线=Origin−49
 ② 进车瞬间 dlt_ORG 切成释表 23 ⇒ 同一 gap > 1×23 ⇒ vac_ref() 改用 EMA(低 32~34 counts)
 ③ 释放线 = EMA−1.8×23 ⇒ 比进入线还浅 ⇒ 深度 50~58 的静止凹脉冲"进门即满足释放"
   ⇒ 进入确认 5 + 释放确认 5 = 10 样本 = 100ms 周期自激(日志实测 ~30 组/3s)

实现:
 - G1 新增 vac_gate_dlt()(状态无关进表 dlt)供 vac_ref() 门控 (TaskLoop.c:297/307) ⇒ 进/出同一参考
 - G2 低Q 释放带夹紧 _band ≤ vac_gate_dlt()-1 (TaskLoop.c:339) ⇒ 只作未来兜底; 180(=41@SENS3, V4.36.28 现场值)一字未动
 - G3 REL_MIN_HOLD_TICKS=30 有车后 300ms 禁释放 (TaskLoop.h:69 + TaskLoop.c 调用点) ⇒ 只挡释放不延迟检出

单测: 新增场景 7 现场参数逐位复现 —— 22µH 悬停 300/300 → 1/0; 35µH 300/300 → 1/0; 撤板 1/1; V4.36.28 回摆仍释放; 非低Q 同深度不自激; 全套 8/8 全绿
文档: devlog V2.79(+条目) / spec 文档头 V2.61 / manual 表 V2.18 / cmcng.h 4.36.41→4.36.42 REV 42
待现场: 上板复测 + 锁死侧三线圈实验 (devlog 条目内 [ ] 占位)
2026-09-11 16:59:26 +08:00

26 lines
1.9 KiB
Diff
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
diff --git a/utilities/at32f421_freertos_demo/src/TaskLoop.c b/utilities/at32f421_freertos_demo/src/TaskLoop.c
index 4d589a9..ec77d25 100644
--- a/utilities/at32f421_freertos_demo/src/TaskLoop.c
+++ b/utilities/at32f421_freertos_demo/src/TaskLoop.c
@@ -1341,10 +1341,16 @@ void vd1_task(void)
/* V4.37(D): 余数累加 —— d/128 整数截断有 ±127 counts 死区
* (|d|<128 步进=0 ⇒ EMA 常驻真空下方 ~127 counts ⇒ vac_ref 被拉低
* ⇒ 进入线偏低 ⇒ 触发高度漂移, 只能断电上电复位; 2026-09-11 单测实测 127) */
- g_vac_frac += _ema_d;
- { int32_t _st = g_vac_frac / VACUUM_EMA_ALFA;
- g_vac_frac -= _st * VACUUM_EMA_ALFA;
- g_vacuum_ema += (uint32_t)_st;
+ /* V4.36.42(E): EMA 单向 —— 只允许向"真空回升"方向跟随
+ * ① 真空真下降由 Origin 块平均承担, vac_ref 取 min 天然选 Origin(EMA 偏高无害)
+ * ② 若 EMA 跟随近场金属向下, vac_ref 的"min + 1×dlt" 硬开关会被反复扫过
+ * (板缓慢接近/悬停时 进入线跳变 ±150 counts ⇒ 判据乱跳; 2026-09-11 仿真 sweep 实测)
+ * 保留 D 的余数累加 ⇒ 向上收敛无 ±127 counts 死区 */
+ if (_ema_d > 0) {
+ g_vac_frac += _ema_d;
+ int32_t _st = g_vac_frac / VACUUM_EMA_ALFA;
+ g_vac_frac -= _st * VACUUM_EMA_ALFA;
+ g_vacuum_ema += (uint32_t)_st;
}
}
if (((int32_t)loop1_Origin - (int32_t)g_vacuum_ema) > (int32_t)(loop1_Origin >> 2) ||