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 条目内 [ ] 占位)
This commit is contained in:
wangfq
2026-09-11 16:59:26 +08:00
parent 5fd58e035a
commit 0f8a0d6fbd
10 changed files with 411 additions and 10 deletions
+47
View File
@@ -4,6 +4,52 @@
---
## 2026-09-11 — 低Q 临界悬停自激根治:进/出判定参考统一 + 释放带夹紧 + 最小保持(固件 V4.36.42
用户反馈:拿金属板**缓慢接近**的时候,判据**乱跳**;随后用 **35µH**128kHz)、**46µH**112kHz)线圈复测,同样现象。
**现场实证(三根线圈,两份日志逐位复核)**
| 线圈 | f | 设计窗 | 进表/释表 dlt | 进车瞬间 OriginEMA | 悬停深度 | 自激 |
|---|---|---|---|---|---|---|
| 22µH | 163kHz | 出窗(20~24µH 段) | 49 / 23 | 34 | 50 counts | ~100ms × 3.0s |
| 35µH | 128kHz | 出窗(超 125k 上限) | 49 / 23 | 32 | 53 counts | ~100ms × 2.8s |
| 46µH | 112kHz | **合规(无告警)** | — | — | — | 同 |
⇒ 46µH 完全落在设计合理窗内且不触发 coil_fault ⇒ **不是测试线圈特例**;按 f>100kHz 判低Q,暴露段 = **L 37~58µHf 100~125kHz**,正是量产主力区间。
**根因(三段链条,日志与代码逐值吻合)**
1. 无车态:`loop1_dlt_ORG` = 进表值(49) ⇒ `vac_ref()` 门控 = 1×49`OriginEMA` = 32~34 ≯ 49 ⇒ 参考 = Origin ⇒ 进入线 = `Origin 49`
2. **进车瞬间**`loop1_dlt_ORG` 被切成释表值(23) ⇒ 同一 gap 现在 > 1×23 ⇒ **`vac_ref()` 改用 EMA**(低 32~34 counts
3. 释放线 = `EMA 1.8×23` = EMA41 ⇒ **比进入线还浅** ⇒ 深度 50~58 的静止凹脉冲"进门即满足释放" ⇒ 进入确认 5 + 释放确认 5 = 10 样本 = **100ms 周期自激**
**实现**
- **G1(根因)** 新增 `vac_gate_dlt()`= `Origin×SensTable[Sens]>>16`**状态无关**)并让 `vac_ref()` 用它做门控 ⇒ 进/出车同一参考;与 band_timeout 既有写法统一(`TaskLoop.c:297 / :307`
- **G2(滞回兜底)** 低Q 释放带夹紧:`if (_band > vac_gate_dlt()) _band = vac_gate_dlt()-1;` ⇒ 只在未来参数变化造成反向滞回时生效;**180(=41@SENS3)一字未动** —— 它是 V4.36.28 现场验证值,缩小它会把"静态带回缺口锁死"改回来
- **G3(通用抗抖)** `REL_MIN_HOLD_TICKS=30`Car_In 后 300ms 内禁释放(覆盖两种 `USE_SLOW_RELEASE` 配置),Car_OFF 清零;**只挡释放、不延迟检出**
- 单测 `tests/test_vac_ref_reanchor.c` 扩到 7 场景(新增 6 = 参考抖动;7 = 低Q 自激,含双线圈参数与"非低Q 不跳"判别)
**单测实测(现场参数逐位)**
| 场景 | 现状 V4.36.41 | 修后(G1+G2+G3 |
|---|---|---|
| 22µH 悬停(深 503s | Car_In **300** / OFF 300 | **1 / 0** |
| 35µH 悬停(深 533s | **300 / 300** | **1 / 0** |
| 撤板 | — | 1 / 1 ✓ |
| V4.36.28 回摆(深 36 < 带回 41) | 释放 ✓ | 释放 ✓(未被打破) |
| 非低Qf<100kHz)同深度 | — | **不自激 1/0** ✓ |
**与 V4.36.41 的关系**V4.36.41 的 DEMA 余数累加,消 ±127 counts 死区)把此处的表现从"**锁死**(不释放)"变成"**抖**",方向上更接近真因;本版才修掉结构本身。
**现场验证(待填)**
- [ ] 上板:慢放/停在边界不再跳、撤板能释放、快车/半截车正常
- [ ] 锁死侧:22/35/46µH 板停在"快释放位置"不动 ⇒ 是否长时间不释放(判据:`CAPVD` 回摆是否超过 `Origin41`
- [ ] 日志片段粘贴区:
```
(待填:修后 DBG|… Origin / VEM / RLN,确认有车态参考恒为 Origin)
```
语法:待 MRS 编译确认(本机无 AT32 工具链);单测 8/8 全绿(gcc -O0 -Wall -Wextra 0 warning);REV 4.36.42spec V2.61 / devlog V2.79。
> 归档:`docs/env-resync-trigger-line-analysis.md` §11/§12(根因与修复实证);补丁 `docs/patches/v4.36.42-G1-G2-G3-lowq-hysteresis.diff``v4.36.42-E-ema-oneway.diff` 为备查方案)。
## 2026-09-11 — 环境重校准后触发高度变低根治:基准/派生参考同步 + EMA 余数累加(固件 V4.36.41
用户反馈:黄灯常亮故障补偿后,金属板进入触发的高度比断电上电后低很多,感觉补偿结束后恢复不了正常灵敏度的触发高度。
@@ -2189,6 +2235,7 @@ if (dev >= dlt_ORG × 4) {
| 版本 | 时间 | 说明 |
|------|------|------|
| V2.79 | 2026-09-11 | V4.36.42 低Q 临界悬停自激根治: vac_ref() 门控改用状态无关进表 dlt(G1) + 低Q 释放带夹紧守卫(G2, 不动 180) + 有车 300ms 最小保持(G3); 22µH/35µH 现场自激(100ms 周期)修后 300/300→1/0; 新增"非低Q不跳"判别用例 |
| V2.78 | 2026-09-11 | V4.36.41 环境重校准后触发高度变低根治: 新增 origin_set_atomic() 同步真空 EMA(3 处写入点; 维持 OriginEMA ≤1×dlt 不变式) + EMA 余数累加消 ±127 counts 整数死区; 新增镜像单测 test_vac_ref_reanchor 5 场景全绿 |
| V2.77 | 2026-09-08 | 注释同步: TaskLoop.c/h + tests 全部 疾闪 → 一长两短 (V4.36.38 现役描述, 历史版本行保留变更记录) |
| V2.76 | 2026-09-08 | V4.36.40 热切换修复: fault3 强制期 Origin/LPCNT 冻结 → recover 改 TMR3 实时 Xn 判回窗(240000/Xn); 恢复后 LOOP_OK 回位自动发起重连确认+判稳重建 Origin, 换线圈不断电 ~6s 自愈 |