Files
DLD154V4B/docs/devlog.md

114 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# DLD154V4B 开发日志
> MCU: AT32F421F8P7 (Cortex-M4, 120MHz) | 线圈通道: 1路 | 通信: RS485
---
## 2026-06-23 — 跳出框框:去掉 >>6 精度浪费
### 背景
DLD154V4B 的检测算法继承自 M1HSTC12C5202, 2008和 TLD-110P87LPC762, 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框框的改进 |