diff --git a/docs/devlog.md b/docs/devlog.md index 2be4a26..8f89460 100644 --- a/docs/devlog.md +++ b/docs/devlog.md @@ -361,10 +361,84 @@ else --- +## 2026-06-26 — CAPVD_fast 初始化修复 + +### 问题 + +M4 V2.0 引入双路 IIR 后,进入检测使用 `CAPVD_fast`(快速 IIR,α=0.5)。但 `CAPVD_fast` 始终为 0,导致首次进入判定就触发有车。 + +### 根因 + +```c +// 原代码(错误): +if (loop1_CAPVD_fast != 0) { + loop1_CAPVD_fast = (loop1_CAPVD_fast + loop1_CAPVD) / 2; +} +``` + +TMR3 ISR 首次捕获时直接设置 `loop1_CAPVD`(不为 0),`INIT_VD` 将 `CAPVD_fast` 初始化为 0。`vd1_task` 进入时 `CAPVD != 0` → `if (CAPVD_fast != 0)` 永远为 false → `CAPVD_fast` 保持 0 不更新。 + +### 修复 + +条件反转:`== 0` 时首次锁定当前 CAPVD 值,之后正常执行快速 IIR。 + +```c +// 修复后: +if (loop1_CAPVD_fast == 0) { + loop1_CAPVD_fast = loop1_CAPVD; // 首次直接锁定 +} else { + loop1_CAPVD_fast = (loop1_CAPVD_fast + loop1_CAPVD) / 2; +} +``` + +--- + +## 2026-06-26 — 稳定期绕过 IIR 和斜率限幅 + +### 问题 + +上电后很快输出有车状态。日志显示: + +``` +First_capSum:177406, Origin:177406 ← 首测为瞬态高值 +Loop stable, Origin:149755 ← 稳定期后 Origin 仍偏高 +Car_In, Value:128654, Origin:149755 ← Origin - Value = 21067 >> dlt=82 +``` + +### 根因 + +V2.0 引入的 **5% 斜率限幅** 在稳定期内仍然生效。首测 CAPVD=177406 是瞬态高值(~38% 偏高),斜率限幅让 CAPVD 在 128 个采样周期内只能缓慢下降到 149755 — 无法在稳定期内充分收敛。100 窗口滑动平均被前半段的高值污染,导致 Origin 停在 149755,远高于真实值 ~128688。 + +### 修复 + +稳定期内不走 IIR 和斜率限幅——**直接用 raw Value** 建立基线: + +```c +if (!g_loop_stable) { + /* 稳定期内不做斜率限幅和 IIR — 直接用 Value 快速收敛到真实基线 */ + loop1_CAPVD = loop1_Value; + loop1_CAPVD_fast = loop1_Value; + // ... 滑动平均跟踪 ... + return; +} +``` + +稳定期结束后恢复正常 IIR + 斜率限幅用于检测。 + +| 场景 | 修复前 | 修复后 | +|------|--------|--------| +| 首测瞬态 | 177406 被限幅缓慢下降 | 直接被 128688 覆盖 | +| Origin 收敛 | 149755 (偏离 +16%) | ~128688 (正确) | +| 稳定期结束 | Origin 偏离 → 误判有车 | Origin 准确 → 正常检测 | + +--- + ## 修订记录 | 版本 | 时间 | 说明 | |------|------|------| +| V2.2 | 2026-06-26 | 稳定期绕过 IIR/斜率限幅,用 Value 直接收敛基线 | +| V2.1 | 2026-06-26 | CAPVD_fast 初始化修复(条件反转为 ==0 首次锁定) | | V2.0 | 2026-06-26 | M4 优化: 双路 IIR + 斜率限幅 + 进入确认;tick 10ms | | V1.7 | 2026-06-26 | vTaskDelay 10→50ms 修正(对齐原始 TMR15 5ms×10 设计);基线更新 1s→5s | | V1.6 | 2026-06-24 | 时序修正:OUT_DELAY/PULSE_DELAY→500ms;RS485→TTL Tx |