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:
@@ -137,6 +137,61 @@ EMA 更新窗 = 无车 + `dev ∈ ±4×dlt`(`1302-1326`)。把板拿到感
|
||||
|
||||
---
|
||||
|
||||
## 11. 现场日志实证(2026-09-11 `154log260911a.txt`):低Q 自激振荡的完整链条
|
||||
|
||||
**现象**:金属板缓慢接近并停在触发边界时,`Car_In`/`Car_OFF` 以 ~100ms 周期连续反复(16:34:50.179–16:34:53.168 约 3s 内 ~30 次)。线圈 22µH / f=163kHz(`EVT|coil_fault below_l_min_20_24u`)⇒ `g_q_lo=1` 低Q 路径。
|
||||
|
||||
**关键实测值**:`Origin=129254`、进表 dlt=49(SensTable 25)、释表 dlt=23(SensTable_1 12)、`EMA≈129220`、`CAPVD/慢滤波≈129204`(深度 50 counts)
|
||||
|
||||
**三步链条(全部可复核)**
|
||||
1. **无车**:`loop1_dlt_ORG`=49 ⇒ `vac_ref()` 门控阈值 = 1×49 = 49;`Origin−EMA`=34 **≯** 49 ⇒ **参考 = Origin** ⇒ 进入线 = 129254−49 = **129205**。CAPVD=129204(差 1 count)+ 5 样本确认 ⇒ `Car_In` ✓
|
||||
2. **进车瞬间**:`loop1_dlt_ORG` 被切成释表值 23(`TaskLoop.c:1577`)⇒ 同一个 gap(34) 现在 **> 1×23** ⇒ **`vac_ref()` 改用 EMA** ⇒ 释放线 = EMA − 1.8×23 = 129220−41 = **129179**(= 日志 `RLN` 字段精确吻合 ✓)
|
||||
3. **释放**:`g_rel_smooth`(129204) > 129179 ⇒ 命中 ⇒ 5 样本确认 ⇒ `Car_OFF` ✓ ⇒ 回到步骤 1 ⇒ **自激**
|
||||
|
||||
**⇒ 滞回带反向重叠**:进入需"深于 **49**",释放只需"浅于 **75**"(= 34 + 41)⇒ 深度落在 **(49, 75)** 的静止凹脉冲**同时满足两条判定** ⇒ 必然振荡。周期 = 进入确认 5 + 释放确认 5 = 10 样本 = **100ms**(与日志完全一致)。
|
||||
|
||||
**与 V4.36.41(A+B/D)的关系**
|
||||
- `vac_ref()` 切到 EMA 的**根因**是「门控阈值用了会随状态切换的 `loop1_dlt_ORG`」+「低Q ×1.8 释放带浅于 ×1.0 进入线」——V4.36.31/33 引入 vac_ref 时就埋下,**与 A+B/D 无关**。
|
||||
- 但 **D(EMA 精确化)是"改变表象"的那一环**:旧版 EMA 有 ±127 死区,此深度下会被粘在 CAPVD 上方 ⇒ gap 为负 ⇒ 参考恒为 Origin ⇒ 释放线 = Origin−41 = 129213 ⇒ 够不着 ⇒ 表现为**锁死**(不释放)而非抖动。⇒ D 把"锁死"变成了"抖",两者都不对。
|
||||
- 另注:本文 §1–§10 的主结论(补偿后触发高度变低)**不受影响** —— 那段日志里 `Origin−VEM ≤ 34 < 1×dlt`,`vac_ref()` 全程取 Origin ✓(先前仿真的"EMA 追赶扫开关"在实机上被"释放后 1s 冻结"抑制,量级被高估)。
|
||||
|
||||
**修复方向(待评审,先出方案不动代码)**
|
||||
|
||||
| 方案 | 内容 | 说明 |
|
||||
|---|---|---|
|
||||
| **G1 根因** | `vac_ref()` 门控阈值改用**固定进入表 dlt**(状态无关) | 参考线不再"进门瞬间跳 34 counts";进/出判定共用同一参考 |
|
||||
| **G2 滞回一致** | 低Q 释放线强制**浅于**进入线:`rel_line ≥ vac_ref − k×dlt_进`(k<1,如 0.5)或夹紧 `rel_line ≥ entry_line + margin` | 消除 (49,75) 重叠带,恢复正向滞回 |
|
||||
| **G3 通用抗抖** | 最小保持时间(进入后/释放后各 N ms 禁止反向) | 对所有 Q 档生效,掐断 100ms 级自激 |
|
||||
| G4 现场 | 22µH/163kHz 落在电感量告警带(20–24µH);确认量产线圈选型 | 非量产线圈也要做 G1–G3(30µH 也可能落进重叠带) |
|
||||
|
||||
## 12. 修复 G1+G2+G3(2026-09-11 采纳并已应用到工作树)
|
||||
|
||||
> 决定:**D 保留 + 上 G1+G2+G3**(E 单向方案留在 `docs/patches/v4.36.42-E-ema-oneway.diff` 备查,未采用)。
|
||||
> ⚠ 关键前提(devlog 救命):`REL_BAND_LO_MULT=180`(=41@SENS3)是 **V4.36.28 现场验证过的值** —— 23µH 板"快释放停住"回摆只到 `Origin−36`,靠 41 才释放;**任何"缩小释放带"的改法都会把那个锁死改回来** ⇒ G2 只做兜底夹紧,绝不动 180。
|
||||
|
||||
| 方案 | 改动 | 位置 |
|
||||
|---|---|---|
|
||||
| **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;` ⇒ 未来参数变化若造成"反向滞回"自动兜住;今天 41<49 **不生效**(行为零变化) | `TaskLoop.c:341` |
|
||||
| **G3 通用抗抖** | `REL_MIN_HOLD_TICKS=30`(300ms):`Car_In` 后最小保持期内禁释放(`rel_release_hit()` 调用点加门),`Car_OFF` 清零;覆盖两种 `USE_SLOW_RELEASE` 配置。**不延迟检出**(只挡释放) | `TaskLoop.h:68` + `TaskLoop.c:1504/1600/1602/1628` |
|
||||
|
||||
**单测实证**(`tests/test_vac_ref_reanchor.c` 场景 7,现场参数逐位复现 Origin=129254 / dlt 49·23 / EMA≈129220 / CAPVD 深 50):
|
||||
| 版本 | 静止悬停 3s 内 Car_In / OFF |
|
||||
|---|---|
|
||||
| 现状 V4.36.41 | **300 / 300**(100ms 周期自激,与现场日志一致) |
|
||||
| 同上,**35µH/128kHz** 参数(Origin=129141 / EMA 129109 / 深 53,日志 `154log260911b`) | **300 / 300** → 修后 **1 / 0** ✓ |
|
||||
| G1 | 1 / 0 ✓ |
|
||||
| G1+G2 | 1 / 0 ✓ |
|
||||
| G1+G2+G3 | 1 / 0 ✓ |
|
||||
|
||||
回归保护:撤板仍释放(1/1)✓;**V4.36.28 回摆释放(深度 36 < 带回 41)仍成立** ✓;全套 8 个单测全绿 ✓。
|
||||
|
||||
**双线圈差分验证(2026-09-11 两份现场日志)**:22µH/163kHz(深 50、gap 34)与 35µH/128kHz(深 53、gap 32)**同构自激** ⇒ 机理与线圈无关,只取决于
|
||||
① `f>100kHz`(两者都判 QLO=1,而设计窗上限 120~125kHz 对应 L≳37~40µH ⇒ **量产线圈同样落在低Q 档**)② 板停在深度 (49, 41+gap) 的重叠带。
|
||||
⇒ 这不是测试线圈特例;停走排队车辆恰好停在环线边缘时同样会踩到(对流量计数即重复计数)。
|
||||
|
||||
**G3 权衡(现场可选调)**:300ms 最小保持会让**真实车辆离开时的释放**最多晚 300ms(对存在型/流量计数无影响;若做速度估计或需要更快的释放沿,可把 `REL_MIN_HOLD_TICKS` 降到 10=100ms)。
|
||||
|
||||
## 附:相关历史(devlog)
|
||||
|
||||
| 版本 | 内容 |
|
||||
|
||||
Reference in New Issue
Block a user