From 6c479b4bd8328da1b08a02925ec9961e8f87822c Mon Sep 17 00:00:00 2001 From: wangfq Date: Tue, 23 Jun 2026 11:05:37 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E5=BC=80=E5=8F=91=E6=97=A5=E5=BF=97=20?= =?UTF-8?q?=E2=80=94=20<<6/>>6=20=E7=B2=BE=E5=BA=A6=E6=B5=AA=E8=B4=B9?= =?UTF-8?q?=E5=88=86=E6=9E=90=E4=B8=8E=E6=94=B9=E8=BF=9B=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/devlog.md | 113 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 docs/devlog.md diff --git a/docs/devlog.md b/docs/devlog.md new file mode 100644 index 0000000..f33bdf8 --- /dev/null +++ b/docs/devlog.md @@ -0,0 +1,113 @@ +# DLD154V4B 开发日志 + +> MCU: AT32F421F8P7 (Cortex-M4, 120MHz) | 线圈通道: 1路 | 通信: RS485 + +--- + +## 2026-06-23 — 跳出框框:去掉 >>6 精度浪费 + +### 背景 + +DLD154V4B 的检测算法继承自 M1H(STC12C5202, 2008)和 TLD-110(P87LPC762, 2003),但有几个关键硬件差异: + +| 特性 | M1H / TLD-110 | DLD154V4B | +|------|--------------|-----------| +| 主频 | ~12MHz (8051) | 120MHz (Cortex-M4) | +| 分频芯片 | CD4060 (Pin5, ÷32) | **无**,直连 PA7 | +| MCU 内分频 | 无 | TIM3 DIV_4 → **DIV_2** | +| 有效分频比 | ÷32 | ÷2 | +| 捕获方式 | PCA 周期捕获 / 门控计数 | TIM3_CH2 硬件输入捕获 | + +### 问题:<<6 和 >>6 的精度浪费 + +原始代码的数据流存在一个"膨胀再压缩"的精度陷阱: + +``` +TMR3 ISR: + Xn = 周期差值 (4800 ticks @ DIV_4) + LPCNT = (32768 << 6) / Xn = 437 ← 窗口开大 64×,降噪 + Value = Σ 437次 Xn ≈ 2,097,600 ← 437 样本精密累加 + +vd1_task: + tmp = Value >> 6 = 32,775 ← 6bit 精度全部丢弃! + CAPVD = IIR(tmp...) ← IIR 只看到 ~6 样本有效信息 +``` + +`<<6` 和 `>>6` 在数学上互相抵消——437 个样本累加,然后右移 6 位,等效仅用 ~7 个样本(437/64 ≈ 6.8)。窗口开大降噪了,但精度被自己扔掉了。 + +### 方案:去掉 <<6/>>6,用 MEASUREMENT_BASE + +``` +TMR3 ISR: + LPCNT = 131072 / Xn = 27~54 ← 自适应窗口,不丢精度 + Value = Σ Xn ≈ 131072 ← 直接作为检测输入 + +vd1_task: + CAPVD = IIR(Value) ← 全精度参与滤波 +``` + +| 参数 | 旧方案 | 新方案 | +|------|--------|--------| +| LPCNT (100kHz, DIV_2) | — | **54** | +| 测量窗口 | 17.5ms (DIV_4) | **~1ms** | +| 有效精度/窗口 | ~6 样本 (>>6 后) | **54 样本 (全保留)** | +| Origin 范围 | ~32K | **~131K** | +| 灵敏度阈值 | 百分比公式,自动按比例缩放 ✓ | 同 ✓ | +| 进入响应 | ~50ms | **~3ms** | + +### 同步改进 + +| # | 改动 | 原因 | +|---|------|------| +| 1 | TIM3 分频 DIV_4 → DIV_2 | 提高采样率,中断率 2× 仍安全 (CPU<3%) | +| 2 | MEASUREMENT_BASE = 131072 (2^17) | 平衡精度和 Origin 范围 | +| 3 | 去除所有 >>6 | 保留全采样精度 | +| 4 | 离开增加 `cnt_release >= 3` 防抖 | 防瞬间噪声导致误落杆 | +| 5 | 基线冻结 + 100 窗口慢跟踪 | 仿 TLD-110,有车不更新基线 | + +### 为什么不需要 CD4060 外部分频 + +AT32F421 的 TIM3 有内置输入分频器,配合 120MHz 主频: + +| 线圈频率 | DIV_2 中断率 | CPU 占用 (50周期/ISR) | +|---------|------------|----------------------| +| 100 kHz | 50k/s | 2.1% | +| 150 kHz | 75k/s | 3.1% | +| 200 kHz | 100k/s | 4.2% | + +均在安全范围内,无需外部分频芯片。 + +### 对比 M1H/TLD-110 + +| 指标 | M1H (CD4060÷32) | DLD154V4B (新) | +|------|----------------|---------------| +| 测量间隔 | ~50ms (固定) | **~1ms (自适应)** | +| 进入防抖 | 500ms IN_DELAY | 500ms IN_DELAY | +| 离开防抖 | 1.9s OUT_DELAY | **3次连续确认** + 1.9s OUT_DELAY | +| 基线跟踪 | 100次 (有车也跟) | 100次 (有车冻结) | + +--- + +## 2026-06-23 — 精简重构,对齐参考实现 + +- 删除二阶差分滤波(计算但从未参与判决) +- 删除 FltHistoryManager 死代码(20+ 未用字段) +- 删除 StageRangeConfig(区间约束未引用) +- 删除动态窗口切换(LOOP_WINDOW_SIZE_LOW→FAST) +- 时序状态机简化:去掉 PLUSE_IN_F/PLUSE_IN 中间层 +- 拨码去抖 10→5(对齐 M1H) +- 代码量:1177→706 行(-40%) + +--- + +## 2026-06-22 — 参考分析 + +见 [reference_analysis.md](reference_analysis.md):M1H + TLD-110 完整算法分析。 + +--- + +## 修订记录 + +| 版本 | 时间 | 说明 | +|------|------|------| +| V1.0 | 2026-06-23 | 初始开发日志,记录跳出<<6/>>6框框的改进 |