docs: 四文档同步更新至 V2.5
- devlog: 修订记录修正 30s→10s, 新增 V2.5 - release-notes: V1.6→V2.5, 新增 M4 优化特性 + 完整版本历程 - product-manual: V1.5→V2.5, 补充 V1.6~V2.5 版本历史 - technical-spec: V1.5→V2.5, 重写 §§4.2-4.5/5.2/12.1/13: - §4.2: 双路 IIR 架构(慢速基线 τ=135ms + 快速检测 τ=28ms) - §4.3.2: 进入确认机制(CAPVD_fast + ENTRY_CONFIRM=3) - §4.4: 斜率限幅 5% + 基线更新速率 1s (10ms tick) - §4.5: 冻结超时恢复演进史 V1.5→V2.5,完整逻辑 + 常量表 - §5.2: Tick 改为 10ms,新增 FREEZE_TIMEOUT 参数 - §12.1: 进入延迟 ~530ms,瞬态抑制,温漂 1s 补偿 - §13: 新增 M4 优化编译选项
This commit is contained in:
@@ -465,11 +465,11 @@ if (dev >= dlt_ORG × 4) {
|
|||||||
| 场景 | CAPVD 行为 | 稳定性检查 | 结果 |
|
| 场景 | CAPVD 行为 | 稳定性检查 | 结果 |
|
||||||
|------|-----------|-----------|------|
|
|------|-----------|-----------|------|
|
||||||
| 车辆驶入(Xn 先增) | 偏高 2~3s 后下降 | 中途恢复 → `freeze_cnt` 清零 | 正常冻结保护 ✓ |
|
| 车辆驶入(Xn 先增) | 偏高 2~3s 后下降 | 中途恢复 → `freeze_cnt` 清零 | 正常冻结保护 ✓ |
|
||||||
| 温度漂移 | 缓慢爬升到新值并稳定 | 爬升阶段频繁重置;稳定后连续 30s | Origin 更新 ✓ |
|
| 温度漂移 | 缓慢爬升到新值并稳定 | 爬升阶段频繁重置;稳定后连续 10s | Origin 更新 ✓ |
|
||||||
| 更换线圈 | 瞬间跳到新频率 | 稳定后连续 30s | Origin 更新 ✓ |
|
| 更换线圈 | 瞬间跳到新频率 | 稳定后连续 10s | Origin 更新 ✓ |
|
||||||
| 车辆缓慢驶入(CAPVD 持续爬升) | 持续偏高且不断上升 | 每超出 ±2% 就重置 → 永远到不了 30s | **不触发更新** ✓ |
|
| 车辆缓慢驶入(CAPVD 持续爬升) | 持续偏高且不断上升 | 每超出 ±2% 就重置 → 永远到不了 10s | **不触发更新** ✓ |
|
||||||
|
|
||||||
最后一行是关键:如果没有稳定性检查,车辆缓慢驶入时 CAPVD 持续偏高 30s 也会触发 Origin 更新——这是错误的。
|
最后一行是关键:如果没有稳定性检查,车辆缓慢驶入时 CAPVD 持续偏高 10s 也会触发 Origin 更新——这是错误的。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -477,8 +477,9 @@ if (dev >= dlt_ORG × 4) {
|
|||||||
|
|
||||||
| 版本 | 时间 | 说明 |
|
| 版本 | 时间 | 说明 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
| V2.4 | 2026-06-29 | 冻结超时增加稳定性检查: CAPVD 需连续 30s 稳定在 ±2% 窗口内 |
|
| V2.5 | 2026-06-29 | 冻结超时 30s→10s,加快环境变化响应 |
|
||||||
| V2.3 | 2026-06-29 | 基线冻结超时: 持续偏高30s后强制更新 Origin,防止环境变化死锁 |
|
| V2.4 | 2026-06-29 | 冻结超时增加稳定性检查: CAPVD 需连续稳定在 ±2% 窗口内 |
|
||||||
|
| V2.3 | 2026-06-29 | 基线冻结超时: 持续偏高后强制更新 Origin,防止环境变化死锁 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
| V2.2 | 2026-06-26 | 稳定期绕过 IIR/斜率限幅,用 Value 直接收敛基线 |
|
| V2.2 | 2026-06-26 | 稳定期绕过 IIR/斜率限幅,用 Value 直接收敛基线 |
|
||||||
| V2.1 | 2026-06-26 | CAPVD_fast 初始化修复(条件反转为 ==0 首次锁定) |
|
| V2.1 | 2026-06-26 | CAPVD_fast 初始化修复(条件反转为 ==0 首次锁定) |
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# DLD154V4B 产品手册
|
# DLD154V4B 产品手册
|
||||||
|
|
||||||
> 单路线圈车辆检测器 | 型号: DLD154V4B | 版本: V1.5
|
> 单路线圈车辆检测器 | 型号: DLD154V4B | 版本: V2.5
|
||||||
> 适用于停车场、收费站、交通卡口等场景的车辆到达/离开检测
|
> 适用于停车场、收费站、交通卡口等场景的车辆到达/离开检测
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -237,6 +237,10 @@ DLD154V4B 是一款基于 ARM Cortex-M4 微控制器的**单通道环形线圈
|
|||||||
| V1.3 | 2026-06-23 | 指示灯行为规范化,上电稳定期,线圈重连保护 |
|
| V1.3 | 2026-06-23 | 指示灯行为规范化,上电稳定期,线圈重连保护 |
|
||||||
| V1.4 | 2026-06-23 | 移植 CN200910309382 平坦性离开判定 |
|
| V1.4 | 2026-06-23 | 移植 CN200910309382 平坦性离开判定 |
|
||||||
| V1.5 | 2026-06-23 | Origin 基线污染保护,USE_FLATNESS_EXIT 编译开关 |
|
| V1.5 | 2026-06-23 | Origin 基线污染保护,USE_FLATNESS_EXIT 编译开关 |
|
||||||
|
| V1.6 | 2026-06-24 | 时序修正:OUT_DELAY/PULSE_DELAY→500ms;RS485→TTL Tx |
|
||||||
|
| V2.0 | 2026-06-26 | M4 核心优化:双路 IIR + 斜率限幅 + 进入确认 |
|
||||||
|
| V2.2 | 2026-06-26 | 稳定期绕过 IIR/斜率限幅,基线收敛更准确 |
|
||||||
|
| V2.3~2.5 | 2026-06-29 | 基线冻结超时自动恢复(10s),含稳定性检查 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# DLD154V4B 产品发布说明
|
# DLD154V4B 产品发布说明
|
||||||
|
|
||||||
> 固件版本 **V1.6** | 发布日期 2026-06-24
|
> 固件版本 **V2.5** | 发布日期 2026-06-29
|
||||||
> 单路线圈车辆检测器 · ARM Cortex-M4 · 专利级检测算法
|
> 单路线圈车辆检测器 · ARM Cortex-M4 · M4 核心优化 + 自适应基线
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -63,6 +63,19 @@ DLD154V4B 是一款面向道闸控制、车位检测、ETC 收费站等场景的
|
|||||||
| 有车 | 车离开 | 无车 | cnt_release→3 → VD_FLAG=0 ✓ |
|
| 有车 | 车离开 | 无车 | cnt_release→3 → VD_FLAG=0 ✓ |
|
||||||
| 无车 | 车进入 | 有车 | 正常进入检测 ✓ |
|
| 无车 | 车进入 | 有车 | 正常进入检测 ✓ |
|
||||||
|
|
||||||
|
### 5. M4 核心优化(V2.0+)
|
||||||
|
|
||||||
|
利用 Cortex-M4 @120MHz 的算力优势,相比 8051 时代设计做了系统性改进:
|
||||||
|
|
||||||
|
| 改进项 | 8051 旧设计 | M4 优化 | 效果 |
|
||||||
|
|--------|-----------|---------|------|
|
||||||
|
| **tick 周期** | 50ms | **10ms** | 响应密度 5× |
|
||||||
|
| **双路 IIR** | 单路 α=79/256 | 慢速 τ=135ms (基线) + 快速 τ=28ms (检测) | 基线跟踪/检测解耦 |
|
||||||
|
| **斜率限幅** | 无 | 单次变化 >5% 截断 | 过滤 EMI/闪电尖峰 |
|
||||||
|
| **进入确认** | 单次阈值 | 连续 3 次 + 快速 IIR | 进入响应 ~530ms,误触发大幅降低 |
|
||||||
|
| **基线冻结超时** | 无(永久冻结) | 稳定 10s 后自动更新 | 环境变化免复位 |
|
||||||
|
| **冻结稳定性检查** | — | ±2% 窗口验证 | 防止波动值被判为新常态 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 技术规格速览
|
## 技术规格速览
|
||||||
@@ -72,7 +85,8 @@ DLD154V4B 是一款面向道闸控制、车位检测、ETC 收费站等场景的
|
|||||||
| MCU | AT32F421F8P7 (Cortex-M4, 120MHz, 64KB Flash, 16KB SRAM) |
|
| MCU | AT32F421F8P7 (Cortex-M4, 120MHz, 64KB Flash, 16KB SRAM) |
|
||||||
| 线圈通道 | 1 路,30~200kHz |
|
| 线圈通道 | 1 路,30~200kHz |
|
||||||
| 灵敏度 | 4 级(DIP),0.015% ~ 0.33% |
|
| 灵敏度 | 4 级(DIP),0.015% ~ 0.33% |
|
||||||
| 进入防抖 | 500ms |
|
| tick 周期 | 10ms (M4 优化) |
|
||||||
|
| 进入防抖 | 500ms + 3 次连续确认 |
|
||||||
| 离开防抖 | 500ms(SW_4=ON)或 0(SW_4=OFF) |
|
| 离开防抖 | 500ms(SW_4=ON)或 0(SW_4=OFF) |
|
||||||
| 脉冲宽度 | 500ms |
|
| 脉冲宽度 | 500ms |
|
||||||
| 输出模式 | 存在 / 脉冲(SW_3) |
|
| 输出模式 | 存在 / 脉冲(SW_3) |
|
||||||
@@ -81,6 +95,7 @@ DLD154V4B 是一款面向道闸控制、车位检测、ETC 收费站等场景的
|
|||||||
| 供电 | DC 10~30V 宽压,< 2W |
|
| 供电 | DC 10~30V 宽压,< 2W |
|
||||||
| 温度 | -40°C ~ +85°C |
|
| 温度 | -40°C ~ +85°C |
|
||||||
| CPU 占用 | < 5% @120MHz |
|
| CPU 占用 | < 5% @120MHz |
|
||||||
|
| 基线冻结超时 | 10s(稳定后自动恢复) |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -112,7 +127,14 @@ DLD154V4B 是一款面向道闸控制、车位检测、ETC 收费站等场景的
|
|||||||
| V1.3 | 06-23 | 指示灯规范化、上电稳定期 128ms、线圈重连状态保持 |
|
| V1.3 | 06-23 | 指示灯规范化、上电稳定期 128ms、线圈重连状态保持 |
|
||||||
| V1.4 | 06-23 | 移植 CN200910309382 平坦性离开判定(整数化适配) |
|
| V1.4 | 06-23 | 移植 CN200910309382 平坦性离开判定(整数化适配) |
|
||||||
| V1.5 | 06-23 | Origin 基线污染保护(4×阈值冻结),USE_FLATNESS_EXIT 开关 |
|
| V1.5 | 06-23 | Origin 基线污染保护(4×阈值冻结),USE_FLATNESS_EXIT 开关 |
|
||||||
| **V1.6** | **06-24** | **时序修正**:OUT_DELAY/PULSE_DELAY 统一 500ms;接口更正 RS485→TTL Tx |
|
| V1.6 | 06-24 | 时序修正:OUT_DELAY/PULSE_DELAY 统一 500ms;RS485→TTL Tx |
|
||||||
|
| V1.7 | 06-26 | vTaskDelay 10→50ms 修正,基线更新 1s→5s |
|
||||||
|
| V2.0 | 06-26 | **M4 核心优化**:双路 IIR + 斜率限幅 + 进入确认,tick 10ms |
|
||||||
|
| V2.1 | 06-26 | CAPVD_fast 初始化修复 |
|
||||||
|
| V2.2 | 06-26 | 稳定期绕过 IIR/斜率限幅,直接用 Value 收敛基线 |
|
||||||
|
| V2.3 | 06-29 | 基线冻结超时自动恢复(持续偏离后强制更新 Origin) |
|
||||||
|
| V2.4 | 06-29 | 冻结超时增加稳定性检查(CAPVD 需连续稳定在 ±2% 窗口内) |
|
||||||
|
| **V2.5** | **06-29** | **冻结超时 30s→10s**,加快环境变化响应 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# DLD154V4B 技术规格书
|
# DLD154V4B 技术规格书
|
||||||
|
|
||||||
> 单路线圈车辆检测器 | 固件版本: V1.5 | 文档版本: V1.0
|
> 单路线圈车辆检测器 | 固件版本: V2.5 | 文档版本: V2.0
|
||||||
> 本文档面向工程开发、系统集成及故障深度分析
|
> 本文档面向工程开发、系统集成及故障深度分析
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -30,12 +30,14 @@
|
|||||||
```
|
```
|
||||||
FreeRTOS Kernel (CMSIS-RTOS v2)
|
FreeRTOS Kernel (CMSIS-RTOS v2)
|
||||||
├── loop_task (主检测任务)
|
├── loop_task (主检测任务)
|
||||||
│ ├── vd1_task() — 每 5ms tick 执行
|
│ ├── vd1_task() — 每 ~10ms 执行 (M4 优化)
|
||||||
│ │ ├── IIR 滤波 (ALFA_CAP1 = 79/256)
|
│ │ ├── 双路 IIR 滤波 (慢速 α=18/256, 快速 α=0.5)
|
||||||
|
│ │ ├── 斜率限幅 (MAX_SLOPE_RATE=5%)
|
||||||
│ │ ├── 基线跟踪 (100 窗口滑动平均)
|
│ │ ├── 基线跟踪 (100 窗口滑动平均)
|
||||||
│ │ ├── 进入/离开检测
|
│ │ ├── 进入确认 (ENTRY_CONFIRM=3 次)
|
||||||
|
│ │ ├── 离开检测 (平坦性 / cnt_release)
|
||||||
│ │ ├── 时序状态机 (IN/OUT/PULSE/HOLD)
|
│ │ ├── 时序状态机 (IN/OUT/PULSE/HOLD)
|
||||||
│ │ └── 平坦性离开判定 (CN200910309382)
|
│ │ └── 冻结超时恢复 (10s + ±2% 稳定性检查)
|
||||||
│ ├── poll_sw_state() — 拨码去抖
|
│ ├── poll_sw_state() — 拨码去抖
|
||||||
│ ├── poll_green_led() — 绿灯驱动
|
│ ├── poll_green_led() — 绿灯驱动
|
||||||
│ └── poll_yellow_led() — 黄灯故障编码
|
│ └── poll_yellow_led() — 黄灯故障编码
|
||||||
@@ -176,21 +178,47 @@ TMR3 ISR:
|
|||||||
|
|
||||||
**改进效果**:响应速度提升 16 倍,精度保留全部采样信息。
|
**改进效果**:响应速度提升 16 倍,精度保留全部采样信息。
|
||||||
|
|
||||||
### 4.2 IIR 滤波
|
### 4.2 IIR 滤波(M4 优化:双路 IIR)
|
||||||
|
|
||||||
|
V2.0 起采用双路 IIR 架构,将基线跟踪与检测判定解耦:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
// α = Flt_Reg / 256 = 79 / 256 ≈ 0.3086
|
#define ALFA_CAP1 18 // 慢速 IIR: α = 18/256 ≈ 0.07, τ≈135ms
|
||||||
if (Value > CAPVD)
|
#define ALFA_FAST 128 // 快速 IIR: α = 128/256 = 0.5, τ≈28ms
|
||||||
CAPVD += ((Value - CAPVD) * 79) >> 8;
|
```
|
||||||
else
|
|
||||||
CAPVD -= ((CAPVD - Value) * 79) >> 8;
|
| 滤波器 | α | τ @10ms | 输入 | 用途 |
|
||||||
|
|--------|---|---------|------|------|
|
||||||
|
| CAPVD (慢速) | 18/256 ≈ 0.07 | 135ms | Value(经斜率限幅) | 基线跟踪 |
|
||||||
|
| CAPVD_fast (快速) | 128/256 = 0.5 | 28ms | CAPVD(慢速滤波后) | 进入/离开检测判定 |
|
||||||
|
|
||||||
|
**为什么需要双路:**
|
||||||
|
- 基线跟踪需要**慢响应**,避免将车辆的频率偏移"学"进基线(τ=135ms,等效 M1H 的 79/256 @50ms)
|
||||||
|
- 检测判定需要**快响应**,快速捕捉车辆进入/离开(τ=28ms,5× 快于旧设计)
|
||||||
|
- 快速 IIR 输入来自慢速 IIR 的输出,继承斜率限幅的瞬态抑制能力
|
||||||
|
|
||||||
|
**进入确认**:快速 IIR 连续 3 次低于阈值才判定有车,单次瞬态干扰被过滤。
|
||||||
|
|
||||||
|
```c
|
||||||
|
// 快速 IIR: α=0.5 → (old + new) / 2
|
||||||
|
loop1_CAPVD_fast = (loop1_CAPVD_fast + loop1_CAPVD) / 2;
|
||||||
|
|
||||||
|
// 进入确认
|
||||||
|
if (CAPVD_fast < Origin - dlt_ORG) {
|
||||||
|
if (++entry_cnt >= 3)
|
||||||
|
VD_FLAG = 1; // 确认有车
|
||||||
|
} else {
|
||||||
|
entry_cnt = 0; // 恢复到阈值以上则重置
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
| 参数 | 值 | 说明 |
|
| 参数 | 值 | 说明 |
|
||||||
|------|-----|------|
|
|------|-----|------|
|
||||||
| α | 79/256 ≈ 0.3086 | 指数平滑系数 |
|
| α_slow | 18/256 ≈ 0.07 | 慢速 IIR 指数平滑系数 |
|
||||||
| 响应速度 | ~3 次达 63% | ~15ms @5ms tick |
|
| α_fast | 128/256 = 0.5 | 快速 IIR 指数平滑系数 |
|
||||||
| 噪声抑制 | 良好 | 单次野值影响 < 31% |
|
| 慢速 τ | ~135ms | 等效 50ms tick 的 79/256 |
|
||||||
|
| 快速 τ | ~28ms | 5× 快于旧设计 |
|
||||||
|
| ENTRY_CONFIRM | 3 | 连续确认次数 |
|
||||||
|
|
||||||
### 4.3 检测判据
|
### 4.3 检测判据
|
||||||
|
|
||||||
@@ -208,17 +236,29 @@ const uint16_t SensTable_1[4] = {108, 72, 18, 9}; // 离开阈值(滞回
|
|||||||
| 2 | 36 | 0.055% | 18 | 0.027% |
|
| 2 | 36 | 0.055% | 18 | 0.027% |
|
||||||
| 3 (高) | 10 | 0.015% | 9 | 0.014% |
|
| 3 (高) | 10 | 0.015% | 9 | 0.014% |
|
||||||
|
|
||||||
#### 4.3.2 进入检测
|
#### 4.3.2 进入检测(M4 优化:确认机制)
|
||||||
|
|
||||||
```c
|
```c
|
||||||
dlt_ORG = (Origin * SensTable[SENS]) >> 16; // /65536
|
// 使用快速 IIR (CAPVD_fast) 提高响应速度
|
||||||
if (CAPVD > Origin + dlt_ORG) {
|
// 连续 ENTRY_CONFIRM 次低于阈值才判定有车
|
||||||
// 频率上升超过阈值 → 有车
|
if (CAPVD_fast < Origin - dlt_ORG) {
|
||||||
// 进入 IN_DELAY (500ms) 防抖
|
entry_cnt++;
|
||||||
|
if (entry_cnt >= ENTRY_CONFIRM) { // 3 次连续确认
|
||||||
|
VD_FLAG = 1; FLAG_IN = 1;
|
||||||
|
entry_cnt = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (entry_cnt > 0) entry_cnt = 0; // 恢复则重置
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
> **注**:有车时线圈电感减小 → 频率上升 → CAPVD > Origin。公式为 `CAPVD > Origin + dlt_ORG`(判定上升量)。
|
| 对比 | 8051/M1H 旧设计 | M4 优化 |
|
||||||
|
|------|----------------|---------|
|
||||||
|
| 判定依据 | CAPVD(慢速 IIR) | **CAPVD_fast**(快速 IIR,5× 响应) |
|
||||||
|
| 确认方式 | 单次阈值 | **连续 3 次确认** |
|
||||||
|
| 瞬态抑制 | 无 | **斜率限幅 + 确认双重保护** |
|
||||||
|
| 进入响应 | ~550ms (50ms tick + 500ms IN_DELAY) | **~530ms** (10ms tick + 3×10ms + 500ms) |
|
||||||
|
| 误触发风险 | 中 | **低** |
|
||||||
|
|
||||||
#### 4.3.3 离开检测(滞回)
|
#### 4.3.3 离开检测(滞回)
|
||||||
|
|
||||||
@@ -272,20 +312,38 @@ if (CAPVD < Origin + dlt_ORG) {
|
|||||||
|
|
||||||
**整数化适配:** 专利原实现用 float(Hz 频率值),DLD154V4B 用 uint32 定点(Origin ≈ 131K)。导数计算用 int32 整数差分,阈值 /K1、/K2 做整数除法,精度足够。
|
**整数化适配:** 专利原实现用 float(Hz 频率值),DLD154V4B 用 uint32 定点(Origin ≈ 131K)。导数计算用 int32 整数差分,阈值 /K1、/K2 做整数除法,精度足够。
|
||||||
|
|
||||||
### 4.4 基线跟踪
|
### 4.4 基线跟踪(M4 优化:斜率限幅 + 冻结超时)
|
||||||
|
|
||||||
|
#### 4.4.1 斜率限幅
|
||||||
|
|
||||||
|
EMI/闪电等瞬态干扰会造成 CAPVD 瞬间跳变。物理车辆不可能让线圈频率瞬间改变 >5%:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
// 有车时冻结,无车时 100 窗口滑动平均
|
#define MAX_SLOPE_RATE 5 // 单次最大变化 5%
|
||||||
if (!VD_FLAG && !FLAG_OUT) {
|
|
||||||
if (CAPVD - Origin < dlt_ORG * 4) { // Origin 污染保护
|
int32_t raw_delta = Value - CAPVD;
|
||||||
ORG_SUM += CAPVD;
|
int32_t max_step = CAPVD * MAX_SLOPE_RATE / 100;
|
||||||
if (++ORG_CNT >= 100) {
|
if (max_step < 100) max_step = 100; // 最小限幅,防止低 Origin 时锁死
|
||||||
Origin = ORG_SUM / 100;
|
if (raw_delta > max_step) raw_delta = max_step;
|
||||||
ORG_SUM = ORG_CNT = 0;
|
if (raw_delta < -max_step) raw_delta = -max_step;
|
||||||
}
|
uint32_t clamped_value = CAPVD + raw_delta;
|
||||||
|
CAPVD = get_flt_value(clamped_value, CAPVD); // 慢速 IIR
|
||||||
|
```
|
||||||
|
|
||||||
|
尖峰被截断,真实车辆信号(缓慢的频率漂移)不受影响。
|
||||||
|
|
||||||
|
#### 4.4.2 基线跟踪规则
|
||||||
|
|
||||||
|
```c
|
||||||
|
// 仅无车 + 无离开延时中 → 跟踪基线
|
||||||
|
if (!VD_FLAG) {
|
||||||
|
int32_t dev = CAPVD - Origin;
|
||||||
|
if (dev < dlt_ORG * 4) {
|
||||||
|
// CAPVD 未显著偏离 → 正常跟踪
|
||||||
|
loop1_freeze_cnt = 0;
|
||||||
|
update_moving_average(&ORG_SUM, &ORG_CNT, &Origin, CAPVD, 100);
|
||||||
} else {
|
} else {
|
||||||
// 冻结:CAPVD 偏离 Origin 超过进入阈值的 4 倍
|
// CAPVD 异常偏高 → 冻结 + 超时恢复逻辑
|
||||||
ORG_SUM = ORG_CNT = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -293,49 +351,67 @@ if (!VD_FLAG && !FLAG_OUT) {
|
|||||||
| 设计决策 | 原因 |
|
| 设计决策 | 原因 |
|
||||||
|---------|------|
|
|---------|------|
|
||||||
| 有车时冻结基线 | 防止把车辆的影响"学"进基线(仿 TLD-110) |
|
| 有车时冻结基线 | 防止把车辆的影响"学"进基线(仿 TLD-110) |
|
||||||
| 100 窗口跟踪 | 缓慢跟踪温漂,但不响应车辆 |
|
| 100 窗口滑动平均 | 缓慢跟踪温漂,但不响应车辆 |
|
||||||
| 4× 冻结阈值 | 防止异常 CAPVD 上升污染基线(V1.5 新增) |
|
| 4× 冻结阈值 | 防止异常 CAPVD 上升污染基线(V1.5) |
|
||||||
|
| 5% 斜率限幅 | 过滤 EMI/闪电尖峰,保护 IIR(V2.0) |
|
||||||
|
| 冻结超时 + 稳定性检查 | 防止永久冻结死锁(V2.3~2.5) |
|
||||||
|
|
||||||
#### 4.4.1 更新速率
|
#### 4.4.3 基线更新速率
|
||||||
|
|
||||||
`vd1_task` 每 50ms(TMR15 5ms×10)执行一次。空闲时每次累加 CAPVD 到 `ORG_SUM`,满 100 次后取平均更新 Origin:
|
`vd1_task` 每 ~10ms 执行一次。空闲时每次累加 CAPVD 到 `ORG_SUM`,满 100 次后取平均更新 Origin:
|
||||||
|
|
||||||
```
|
```
|
||||||
100 样本 × 50ms/tick = 5000ms = 5 秒
|
100 样本 × 10ms/tick = 1000ms = 1 秒
|
||||||
```
|
```
|
||||||
|
|
||||||
| 产品 | 窗口大小 | 更新周期 | 空闲时跟踪 | 有车时冻结 |
|
| 产品 | 窗口大小 | 更新周期 | 空闲时跟踪 | 有车时冻结 |
|
||||||
|------|---------|---------|-----------|-----------|
|
|------|---------|---------|-----------|-----------|
|
||||||
| **DLD154V4B** | 100 次 | **5000ms** | ✅ | ✅ |
|
| **DLD154V4B** | 100 次 | **1000ms** | ✅ | ✅ |
|
||||||
| **M1H** | 100 次 | **5000ms** | ✅ | ❌(有车也跟踪) |
|
| **M1H** | 100 次 | 5000ms | ✅ | ❌(有车也跟踪) |
|
||||||
| **TLD-110** | 16 次 | **~800ms** | ✅ | ✅ |
|
| **TLD-110** | 16 次 | ~800ms | ✅ | ✅ |
|
||||||
|
|
||||||
**关键差异:**
|
> **注意**:V2.0 将 tick 从 50ms 提升到 10ms,基线更新从每 5 秒加速到每 1 秒 —— 对温漂的跟踪能力显著提升,同时保持 100 窗口的抗噪能力。
|
||||||
|
|
||||||
- **DLD154V4B vs M1H**:同为 100 窗口 5s,但 DLD154V4B 有车时冻结基线。M1H 有车也跟踪的风险——长时间有车会把频率偏移"学"进基线,安全性不如冻结方案。
|
### 4.5 Origin 污染保护与冻结超时恢复(V1.5 → V2.5)
|
||||||
- **TLD-110 最快**:16 次累积 ~800ms 完成一次更新,有车冻结 + 小窗口快跟踪,对温漂响应最敏捷。但 16 样本窗口的抗噪能力弱于 100 窗口。
|
|
||||||
- DLD154V4B 的 100 窗口 5s 取 M1H 的窗口大小 + TLD-110 的冻结策略,Origin 更稳定但温漂跟踪慢于 TLD-110。
|
|
||||||
- 注意:TMR3 ISR 在 50ms 间隙内可能完成多次测量窗口(每次 ~1ms),但 vd1_task 只取最新一个 Value 做 IIR,基线更新速率受 vd1_task 的 50ms tick 限制,与测量窗口大小无关。
|
|
||||||
|
|
||||||
### 4.5 Origin 污染保护(V1.5)
|
#### 4.5.1 问题演进
|
||||||
|
|
||||||
**问题**:实测发现车辆驶入时 Xn 偶尔先增大再减小。无车状态下 Origin 跟踪上升被污染到虚高值,导致离开时 `|f - f_b|` 远超阈值 → 绿灯常亮、永远不释放。
|
| 版本 | 问题 | 方案 | 遗留问题 |
|
||||||
|
|------|------|------|---------|
|
||||||
|
| V1.5 | 车辆驶入时 Xn 先增,Origin 被污染后无法释放 | 4×阈值冻结 | 环境变化时永久冻结,需复位 |
|
||||||
|
| V2.3 | 永久冻结导致死锁 | 冻结超时(30s 后强制更新) | 波动值也可能超时触发 |
|
||||||
|
| V2.4 | 波动值被误判为"新常态" | 稳定性检查(±2% 窗口) | — |
|
||||||
|
| V2.5 | 30s 等待太长 | 缩短到 10s | — |
|
||||||
|
|
||||||
**修复**:基线跟踪前增加保护条件:
|
#### 4.5.2 当前完整逻辑
|
||||||
|
|
||||||
```c
|
```c
|
||||||
// 仅当 CAPVD 偏离 Origin < dlt_ORG × 4 时才更新基线
|
if (dev < dlt_ORG * 4) {
|
||||||
// 超出则冻结+重置累计
|
/* 正常范围 → 跟踪,清零冻结状态 */
|
||||||
if (CAPVD - Origin < dlt_ORG * 4)
|
loop1_freeze_cnt = 0;
|
||||||
update_moving_average(...);
|
update_moving_average(...);
|
||||||
else
|
} else {
|
||||||
freeze();
|
/* 异常偏高 → 冻结 + 超时 + 稳定性验证 */
|
||||||
|
if (loop1_freeze_cnt == 0)
|
||||||
|
loop1_freeze_ref = CAPVD; // 记录冻结起始值
|
||||||
|
else if (|CAPVD - freeze_ref| > freeze_ref * FREEZE_STABILITY_RATE / 100)
|
||||||
|
reset(freeze_cnt, freeze_ref); // 波动 > ±2% → 重新计时
|
||||||
|
|
||||||
|
loop1_freeze_cnt++;
|
||||||
|
if (loop1_freeze_cnt >= FREEZE_TIMEOUT) { // 10s @ 10ms/tick
|
||||||
|
Origin = CAPVD; // 连续稳定 → 接受为新基线
|
||||||
|
}
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
| 场景 | Origin | CAPVD | dev | 4×阈值 | 结果 |
|
#### 4.5.3 关键常量
|
||||||
|------|--------|-------|-----|--------|------|
|
|
||||||
| 正常无车 | 127080 | 127081 | +1 | 276 | 跟踪 ✓ |
|
| 常量 | 值 | 说明 |
|
||||||
| 异常上升 | 127085 | 127884 | +799 | 276 | 冻结 ✓ |
|
|------|-----|------|
|
||||||
|
| 冻结触发阈值 | dlt_ORG × 4 | CAPVD 偏离 Origin 的倍数 |
|
||||||
|
| FREEZE_TIMEOUT | 1000 | ~10s @ 10ms/tick |
|
||||||
|
| FREEZE_STABILITY_RATE | 2 | 稳定性窗口:参考值的 ±2% |
|
||||||
|
| 基线窗口 | 100 | 滑动平均样本数(更新周期 ~1s) |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -355,16 +431,17 @@ else
|
|||||||
|
|
||||||
### 5.2 时序参数
|
### 5.2 时序参数
|
||||||
|
|
||||||
| 参数 | Tick (50ms) | 时间 | 说明 |
|
| 参数 | Tick (10ms) | 时间 | 说明 |
|
||||||
|------|------------|------|------|
|
|------|------------|------|------|
|
||||||
| IN_DELAY | 10 | **500 ms** | 进入确认防抖 |
|
| IN_DELAY | 50 | **500 ms** | 进入确认防抖(3 次 IIR 确认 + 500ms IN_DELAY) |
|
||||||
| OUT_DELAY | 10 | **500 ms** | 离开防抖(仅 SW_4=ON 时生效,OFF 时为 0) |
|
| OUT_DELAY | 50 | **500 ms** | 离开防抖(仅 SW_4=ON 时生效,OFF 时为 0) |
|
||||||
| PULSE_DELAY | 10 | **500 ms** | 脉冲输出宽度 |
|
| PULSE_DELAY | 50 | **500 ms** | 脉冲输出宽度 |
|
||||||
| HOLD_TIME | 5×1200 | **~5 min** | 有限存在超时 |
|
| HOLD_TIME | 5×1200 | **~5 min** | 有限存在超时 |
|
||||||
| LC_HOLD_TIME | 4×1200 | **~4 min** | 安全复位超时 |
|
| LC_HOLD_TIME | 4×1200 | **~4 min** | 安全复位超时 |
|
||||||
| STABLE_SAMPLES | 128 tick | **~128 ms** | 上电稳定期 |
|
| STABLE_SAMPLES | 128 tick | **~128 ms** | 上电稳定期 |
|
||||||
|
| FREEZE_TIMEOUT | 1000 | **~10 s** | 基线冻结超时(连续稳定后更新 Origin) |
|
||||||
|
|
||||||
> **SW_4 离开延时**:SW_4=ON 时,OUT_DELAY=500ms;SW_4=OFF 时,离开延时为 0,FLAG_OUT 立即切换到 FLAG_PLUSE。PULSE_DELAY 固定 500ms,不受 SW_4 影响。
|
> **M4 优化**:V2.0 将 tick 从 50ms (TMR15 5ms×10) 提升到 10ms (vTaskDelay 10ms)。IIR 系数同步调整(α 从 79/256→18/256),保持等效时间常数。进入确认 3×10ms + 500ms IN_DELAY = ~530ms,比旧设计 (50ms + 500ms = 550ms) 略快。基线更新从 5s 加速到 1s。
|
||||||
|
|
||||||
### 5.3 系统 Tick 来源
|
### 5.3 系统 Tick 来源
|
||||||
|
|
||||||
@@ -537,7 +614,7 @@ if (!g_loop_stable) {
|
|||||||
DLD154V4B/
|
DLD154V4B/
|
||||||
├── utilities/at32f421_freertos_demo/
|
├── utilities/at32f421_freertos_demo/
|
||||||
│ ├── src/
|
│ ├── src/
|
||||||
│ │ └── TaskLoop.c # 主检测逻辑 (~868 行 V1.5)
|
│ │ └── TaskLoop.c # 主检测逻辑 (~945 行 V2.5)
|
||||||
│ ├── inc/
|
│ ├── inc/
|
||||||
│ │ └── TaskLoop.h # 全局变量和函数声明
|
│ │ └── TaskLoop.h # 全局变量和函数声明
|
||||||
│ └── ... # FreeRTOS + HAL 框架
|
│ └── ... # FreeRTOS + HAL 框架
|
||||||
@@ -556,6 +633,7 @@ DLD154V4B/
|
|||||||
| 原始 | ~1177 行 | 包含二阶滤波、FltHistoryManager 等死代码 |
|
| 原始 | ~1177 行 | 包含二阶滤波、FltHistoryManager 等死代码 |
|
||||||
| V1.1 | ~706 行 | 精简重构,-40% |
|
| V1.1 | ~706 行 | 精简重构,-40% |
|
||||||
| V1.5 | ~868 行 | 增加平坦性判定、污染保护 |
|
| V1.5 | ~868 行 | 增加平坦性判定、污染保护 |
|
||||||
|
| V2.5 | ~945 行 | 增加双路 IIR、斜率限幅、进入确认、冻结超时+稳定性 |
|
||||||
|
|
||||||
**删除的死代码:**
|
**删除的死代码:**
|
||||||
- 二阶差分滤波(计算但从未参与判决)
|
- 二阶差分滤波(计算但从未参与判决)
|
||||||
@@ -572,12 +650,13 @@ DLD154V4B/
|
|||||||
|
|
||||||
| 指标 | 值 | 说明 |
|
| 指标 | 值 | 说明 |
|
||||||
|------|-----|------|
|
|------|-----|------|
|
||||||
| 进入检测延迟 | < 3 ms (测量) + 500 ms (防抖) | 电信号延迟 |
|
| 进入检测延迟 | < 3 ms (测量) + 3×10ms (确认) + 500 ms (防抖) = **~530 ms** | M4 优化,比旧 550ms 略快 |
|
||||||
| 离开检测延迟 | < 3 ms (测量) + 平坦性确认 + 1.9 s (防抖) | 含双重确认 |
|
| 离开检测延迟 | < 3 ms (测量) + 平坦性确认 + 500 ms (防抖) | 含双重确认 |
|
||||||
| 误检率(单阈值) | — | 基准参考 |
|
| 误检率(单阈值) | — | 基准参考 |
|
||||||
| 误检率(平坦性) | 显著降低 | 大车多峰场景 |
|
| 误检率(平坦性) | 显著降低 | 大车多峰场景 |
|
||||||
| 频率分辨率 | < 0.01% | 取决于线圈 Q 值 |
|
| 频率分辨率 | < 0.01% | 取决于线圈 Q 值 |
|
||||||
| 温漂补偿 | 自动(100 窗口基线跟踪) | 仅无车时 |
|
| 温漂补偿 | 自动(100 窗口基线跟踪,更新周期 ~1s) | 仅无车时;冻结超时 10s |
|
||||||
|
| 瞬态抑制 | 5% 斜率限幅 + 3 次进入确认 | EMI/闪电免疫 |
|
||||||
|
|
||||||
### 12.2 CPU 占用
|
### 12.2 CPU 占用
|
||||||
|
|
||||||
@@ -585,7 +664,7 @@ DLD154V4B/
|
|||||||
|------|------|-----------------|------|
|
|------|------|-----------------|------|
|
||||||
| TMR3 ISR (捕获) | 50k/s @100kHz | ~2.1% | 每边沿约 50 周期 |
|
| TMR3 ISR (捕获) | 50k/s @100kHz | ~2.1% | 每边沿约 50 周期 |
|
||||||
| TMR15 ISR (tick) | 200/s | < 1% | LED + 计数 |
|
| TMR15 ISR (tick) | 200/s | < 1% | LED + 计数 |
|
||||||
| vd1_task | 20/s | < 1% | 滤波 + 检测 |
|
| vd1_task | 100/s | < 1% | 滤波 + 检测(M4 10ms tick) |
|
||||||
| FreeRTOS 开销 | — | < 1% | 任务调度 |
|
| FreeRTOS 开销 | — | < 1% | 任务调度 |
|
||||||
| **总计** | — | **< 5%** | 余量充足 |
|
| **总计** | — | **< 5%** | 余量充足 |
|
||||||
|
|
||||||
@@ -606,9 +685,13 @@ DLD154V4B/
|
|||||||
|
|
||||||
#define USE_FLATNESS_EXIT 1 // 1 = 平坦性离开判定 (CN200910309382)
|
#define USE_FLATNESS_EXIT 1 // 1 = 平坦性离开判定 (CN200910309382)
|
||||||
// 0 = 简单 cnt_release 防抖
|
// 0 = 简单 cnt_release 防抖
|
||||||
```
|
|
||||||
|
|
||||||
置 0 回退到传统 `cnt_release >= 3`,方便对比测试两种方案的差异。
|
// M4 优化参数
|
||||||
|
#define MAX_SLOPE_RATE 5 // 斜率限幅: 单次最大变化 5%
|
||||||
|
#define ENTRY_CONFIRM 3 // 进入确认: 连续 N 次低于阈值
|
||||||
|
#define FREEZE_TIMEOUT 1000 // 冻结超时: ~10s @ 10ms/tick
|
||||||
|
#define FREEZE_STABILITY_RATE 2 // 稳定性窗口: 参考值的 ±2%
|
||||||
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -626,4 +709,5 @@ DLD154V4B V1.4 起实现该专利的整数化版本,用于大车通行时的
|
|||||||
|
|
||||||
| 版本 | 日期 | 说明 |
|
| 版本 | 日期 | 说明 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
| V1.0 | 2026-06-24 | 技术规格书初版 |
|
| V1.0 | 2026-06-24 | 技术规格书初版(V1.5 固件) |
|
||||||
|
| V2.0 | 2026-06-29 | 更新至 V2.5 固件:双路 IIR、斜率限幅、进入确认、冻结超时+稳定性 |
|
||||||
|
|||||||
Reference in New Issue
Block a user