用户反馈: 金属板缓慢接近时判据乱跳; 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 条目内 [ ] 占位)
26 lines
1.9 KiB
Diff
26 lines
1.9 KiB
Diff
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) ||
|