fix(V4B): V4.36.41 — 环境重校准后触发高度变低根治 (基准/派生参考同步 + EMA 余数累加)

用户反馈: 黄灯常亮故障补偿后, 金属板进入触发的高度比断电上电后低很多, 补偿结束也恢复不了正常灵敏度。

根因(两处, 均可复核): V4B 进入判定用 vac_ref()=min(Origin, 真空EMA) 而非 Origin (TaskLoop.c:1432)
 ① env_resync_apply() 只原子换 loop1_Origin, 没同步 g_vacuum_ema。补偿前提是 dev>+4×dlt 连续 7s,
    学到的 B≈当前 CAPVD ⇒ Δ≥4×dlt 必然 ⇒ Origin−EMA=Δ>1×dlt ⇒ vac_ref 必然切旧 EMA ⇒ 进入线整整低 Δ
 ② g_vacuum_ema += _ema_d/128 为整数除法, |d|<128 时步进恒 0 ⇒ EMA 粘在真空下方 ≤127 counts
    (2.59×dlt > 1×dlt 门槛) ⇒ 进入线常驻偏低 ≈0.100% Δf/f 且不自愈; 断电上电 EMA=Origin(偏差 0) 故持久正常

修复:
 - 新增 origin_set_atomic() (TaskLoop.c:308): "一步换 Origin"时 |ΔOrigin| > ORIGIN_JUMP_REANCH_DLT(=1)×dlt
   则同步重锚 g_vacuum_ema; 与 VAC_REF_DELTA_DLT 同口径 ⇒ 维持 |Origin−EMA| ≤ 1×dlt 不变式; 小步不动 EMA
 - 3 处 Origin 写入点改经它: env_resync_apply(:968) / 重连判稳完成(:1207) / 冻结超时更新(:1372)
 - EMA 更新改余数累加器 g_vac_frac(:1344) 消 ±127 counts 死区; g_vac_frac 在 INIT(:583)/判稳(:1266) 清零

单测(新增 tests/test_vac_ref_reanchor.c, 5 场景; gcc -O0 -Wall -Wextra 0 warning; 全套 8/8 全绿):
 补偿后进入线 130457(低 130 counts = 2.65×dlt = 0.100% Δf/f) → 130587(低 0); EMA 追赶偏差 127→0 counts

文档: devlog V2.78(+条目) / spec 文档头 V2.60 / manual 版本表 V2.17 / cmcng.h 4.36.40→4.36.41 (REV 41)
归档: docs/env-resync-trigger-line-analysis.md + docs/patches/v4.36.41-{A-B,D}*.diff

待现场(编译烧录后回填 devlog 条目): 4 项 [ ] + 2 处日志待填 (EVT|env_resync / DBG Origin·VEM·RLN)
This commit is contained in:
wangfq
2026-09-11 14:08:25 +08:00
parent 1de4b4c8f3
commit 5fd58e035a
10 changed files with 551 additions and 9 deletions
+39
View File
@@ -4,6 +4,44 @@
---
## 2026-09-11 — 环境重校准后触发高度变低根治:基准/派生参考同步 + EMA 余数累加(固件 V4.36.41
用户反馈:黄灯常亮故障补偿后,金属板进入触发的高度比断电上电后低很多,感觉补偿结束后恢复不了正常灵敏度的触发高度。
**根因(两处,均可复核)**V4B 的**进入判定用的是 `vac_ref() = min(Origin, 真空EMA)`,不是 `Origin`**`TaskLoop.c:1432`)。而 V4.36.31 引入真空 EMA 后,**补偿路径没有同步它**:
- **机制1(一次性,量级大)**`env_resync_apply()` 只原子替换 `loop1_Origin`EMA 停在旧真空。补偿的前提是 `dev > +4×dlt` 连续 7s,学到的 B ≈ 当前 CAPVD ⇒ **Δ ≥ 4×dlt 是必然**,于是 `Origin EMA = Δ > 1×dlt``vac_ref()` **必然**切到旧 EMA ⇒ 进入线整整低 Δ(SENS3@130k:Δ≥192 counts ≈ 0.15% Δf/f 的额外触发门槛)。断电上电时 EMA 由判稳重建 = Origin,故立刻恢复。
- **机制2(常驻,单测实测)**`g_vacuum_ema += _ema_d/128` 是**整数除法**`|d| < 128` 时步进恒为 0 ⇒ EMA 被"粘"在**真空下方最多 127 counts2.59×dlt > 1×dlt 门槛)** ⇒ 进入线常驻偏低 ≈ 0.100% Δf/f 且不自愈;断电上电因 `EMA = Origin` 精确相等(偏差 0)而持久正常。
**实现**
- 新增 `origin_set_atomic()``TaskLoop.c:308`):"一步换 Origin"时,若 `|ΔOrigin| > ORIGIN_JUMP_REANCH_DLT(=1)×dlt` 则同步重锚 `g_vacuum_ema`;与 `VAC_REF_DELTA_DLT` 同口径 ⇒ 维持 `|OriginEMA| ≤ 1×dlt` 不变式;小步(≤1×dlt,如悬停抖动/重连对齐)不动 EMA,不干扰对称窗内的实时跟踪。
- 3 处 Origin 写入点改经它:**`env_resync_apply`(:968,补偿路径)**、重连判稳完成(:1207)、冻结超时更新(:1372)。
- EMA 更新改**余数累加器** `g_vac_frac`:1344):消 ±127 counts 整数死区,τ/噪声不变;`g_vac_frac` 在 INIT:583/判稳(:1266)同步清零。
- 新增镜像单测 `tests/test_vac_ref_reanchor.c`:5 场景(复现+修复对比 / 护栏大小步 / V4.36.33 门控回归 / 上电语义 / 死区实测)。
**单测实测数字**`Origin 130506→130636`,Δ=130dlt=49):
| 场景 | 现状 | V4.36.41 |
|---|---|---|
| 补偿后进入线 | 130457(低 130 = 2.65×dlt = 0.100% Δf/f | **130587(低 0** |
| EMA 追赶 40s 后偏差 | 127 counts2.59×dlt | **0** |
**现场验证(待填)**
- [ ] 制造黄灯常亮补偿 → 抓 `EVT|env_learn_start` / `EVT|env_resync Origin:..->..`
- [ ]`DBG|… Origin=… VEM=… RLN=…`:确认 `Origin VEM` 是否长期 > 1×dlt(本根因的直接判据)
- [ ] 单变量对照(同一块板同一高度序列):(a)补偿后立刻测 /(b)灭灯后静置 10s 再测 /(c)断电上电测 —— 本版应 (a)≈(b)≈(c)
- [ ] 现场日志片段粘贴区:
```
(待填)EVT|env_resync Origin:……->……
(待填)DBG|…… Origin=…… VEM=…… RLN=…… dlt=……
```
语法:待 MRS 编译确认(本机无 AT32 工具链);**镜像单测 8/8 全绿**gcc -O0 -Wall -Wextra0 warning);REV 4.36.41spec V2.60 / devlog V2.78。
> 归档:根因分析稿 `docs/env-resync-trigger-line-analysis.md`;补丁 `docs/patches/v4.36.41-A-B-origin-ema-sync.diff`、`docs/patches/v4.36.41-D-ema-frac-no-deadband.diff`。
> ⚠ 提交前:`cmcng.h` 的 `FIRMWARE_VER` 字符与 `FIRMWARE_VER_REV` 需 40→41`technical-spec.md` 文档头(固件版本 V4.36.41 / 文档版本 V2.60)同步;本条目日期按实际 commit 日校准。
## 2026-09-08 — 就绪巩固期 Q 分级:低Q 上电首压防卡(固件 V4.36.36)
用户反馈:电感偏低/低Q 线圈上电自检结束(绿灯灭)马上压板,大概率绿灯常亮;10s 后再测正常。要求绿灯自检闪时长分级:高Q 5s/中Q 7s/低Q ≥10s。
@@ -2151,6 +2189,7 @@ if (dev >= dlt_ORG × 4) {
| 版本 | 时间 | 说明 |
|------|------|------|
| 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 自愈 |
| V2.75 | 2026-09-08 | V4.36.39: COIL_UNDER_MIN_AS_OPEN 默认 0→1 (用户拍板) —— L<20µH 短路级出厂等同断开 |