From b4d7ca74e6613545fa62603d68988757af715e74 Mon Sep 17 00:00:00 2001 From: wangfq Date: Mon, 20 Jul 2026 18:14:29 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=96=B0=E5=A2=9E=E6=8A=80=E6=9C=AF?= =?UTF-8?q?=E8=A7=84=E6=A0=BC=E4=B9=A6=E5=92=8C=E4=BA=A7=E5=93=81=E6=89=8B?= =?UTF-8?q?=E5=86=8C=20(V1.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/product-manual.md | 286 ++++++++++++++++++++++++++ docs/technical-spec.md | 454 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 740 insertions(+) create mode 100644 docs/product-manual.md create mode 100644 docs/technical-spec.md diff --git a/docs/product-manual.md b/docs/product-manual.md new file mode 100644 index 0000000..ba8a511 --- /dev/null +++ b/docs/product-manual.md @@ -0,0 +1,286 @@ +# DLD110SV4 产品手册 + +> 单线圈蓝牙车辆检测器 | 型号: DLD110SV4 | 版本: V4.20 +> 适用于停车场、收费站、交通卡口等场景的车辆到达/离开检测 +> 通过蓝牙小程序远程配置参数、OTA 升级、实时查看检测状态 + +--- + +## 1. 产品概述 + +DLD110SV4 是一款基于沁恒 CH591R RISC-V 微控制器的**单通道环形线圈蓝牙车辆检测器**。通过实时监测埋地线圈的 LC 振荡频率变化,精确检测车辆的存在与离开。内置 BLE 5.1 无线通信,支持通过微信小程序远程配置参数、在线读取检测状态、查看断开次数等诊断信息,免去现场拆盖拨码的麻烦。 + +### 1.1 核心特性 + +- **蓝牙小程序配置**:灵敏度、输出模式、延时等全部参数通过 BLE 在线配置,即时生效 +- **蓝牙 OTA 升级**:固件远程无线升级,无需拆机烧录 +- **高精度频率测量**:自适应窗口脉冲计数,归一化基线 ≈ 524288,保留全部采样精度 +- **专利离开判定**:平坦性三条件判定(CN200910309382),防大车多峰误触发 +- **线圈重连保护**:断开期间保持有车状态,重连后快速恢复 +- **诊断上报**:线圈断开次数(≤3)BLE 实时上报,故障一目了然 +- **灵敏度可调**:硬件滑动开关 3 级 + BLE 在线配置灵敏度表 +- **双输出模式**:存在输出 / 进入脉冲 / 离开脉冲,RLY1 功能可配,RLY2 固定存在 +- **宽频率范围**:支持 30 ~ 200 kHz 线圈频率 + +### 1.2 适用场景 + +| 场景 | 说明 | +|------|------| +| 道闸控制 | 车辆到达触发抬杆,离开触发落杆 | +| 车位检测 | 实时监测车位占用状态 | +| 流量统计 | 通过 BLE 上报车流量数据到平台 | +| ETC/收费站 | 触发抓拍、计费 | +| 红绿灯触发 | 感应线圈触发信号灯相位切换 | + +--- + +## 2. 技术参数 + +| 项目 | 参数 | +|------|------| +| 产品型号 | DLD110SV4 | +| 微控制器 | 沁恒 CH591R (RISC-V, BLE 5.1) | +| 主频 | 60 MHz | +| Flash | 192 KB (应用区 28KB) | +| RAM | 32 KB (应用可用 ~18KB) | +| 线圈通道数 | 1 路 | +| 工作电压 | DC 3.3V (由板载 LDO 供电) | +| 线圈电感范围 | 50 ~ 1000 μH(推荐 100 ~ 300 μH) | +| 频率测量范围 | 30 ~ 200 kHz | +| 频率测量精度 | 优于 0.01% | +| 灵敏度等级 | 硬件 3 级 + BLE 在线可配 | +| 响应时间 | < 10 ms(进入检测) | +| 进入防抖 | 500 ms | +| 离开防抖 | 可配置 (100ms × delay_time) | +| 脉冲输出宽度 | 500 ms | +| 继电器输出 | 2 路(RLY1 功能继电器 + RLY2 存在继电器) | +| 继电器触点容量 | AC 250V / 3A | +| 无线通信 | BLE 5.1 (2.4GHz) | +| 通信距离 | 30 ~ 100 m(无遮挡/有遮挡) | +| OTA 升级 | 支持蓝牙无线升级 | +| 工作温度 | -40°C ~ +85°C | +| 存储温度 | -55°C ~ +125°C | +| 防护等级 | IP65(封装后) | + +--- + +## 3. 硬件接口 + +### 3.1 端子定义 + +| 端子 | 标识 | 功能 | 说明 | +|------|------|------|------| +| 1 | VCC | 电源正极 | DC 3.3V | +| 2 | GND | 电源地 | — | +| 3 | LOOP | 线圈端子 | 接环形线圈两端 | +| 4 | LOOP | 线圈端子 | 接环形线圈两端 | +| 5 | RLY1-NO | 继电器 1 常开 | 功能继电器(存在/脉冲) | +| 6 | RLY1-COM | 继电器 1 公共 | — | +| 7 | RLY2-NO | 继电器 2 常开 | 存在继电器 | +| 8 | RLY2-COM | 继电器 2 公共 | — | + +### 3.2 指示灯 + +DLD110SV4 配备 1 个绿色状态指示灯 LEDA (PB22) 和 1 个红色电源指示灯(硬件直连)。 + +| 指示灯 | 颜色 | 功能 | +|--------|------|------| +| 电源灯 | 红色 | 上电常亮 | +| LEDA | 绿色 | 车辆检测 / 自检 / 故障指示 | + +### 3.3 滑动开关 + +| 开关 | 标识 | 功能 | +|------|------|------| +| SA1 | KEY_SA1 | 灵敏度选择 bit0 | +| SA2 | KEY_SA2 | 灵敏度选择 bit1 | + +> 拨向 ON = 1。SA2:SA1 = 11→低灵敏、10→中、01→高、00→最高(BLE 灵敏度表生效)。 + +--- + +## 4. 功能说明 + +### 4.1 检测原理 + +环形线圈埋于路面下,与检测器内部电容构成 LC 谐振回路。当金属物体(车辆)经过线圈上方时,线圈电感发生变化,导致谐振频率上升。检测器通过高精度输入捕获实时监测频率偏移,当偏移量超过灵敏度阈值时,判定为有车。 + +``` +线圈频率 f₀ (无车基线) → 车辆进入 → f ↑ (频率上升) + ↓ + f - f₀ > 阈值 → 判定"有车" + ↓ + 车辆离开 → f ↓ → f ≈ f₀ + ↓ + 平坦性三条件确认 → 判定"无车" +``` + +### 4.2 灵敏度配置 + +**硬件灵敏度(滑动开关)**: + +| SA2 | SA1 | 灵敏度 | 适用场景 | +|-----|-----|--------|----------| +| ON (1) | ON (1) | **低** | 大车 / 高底盘车辆 | +| ON (1) | OFF (0) | **中** | 普通轿车 | +| OFF (0) | ON (1) | **高** | 摩托车 / 小轿车 | +| OFF (0) | OFF (0) | **最高** | BLE 灵敏度表生效 | + +**BLE 在线灵敏度**: + +在最高档(SA2=0, SA1=0)下,灵敏度由 BLE 配置的 `g_loop_sens_list` 表决定。小程序可在线修改各频率档的进出阈值,适应特殊场景需求。 + +### 4.3 BLE 配置参数 + +所有运行参数通过蓝牙小程序配置,即时生效,写入 EEPROM 持久化: + +| 参数 | 小程序对应 | 说明 | 默认值 | +|------|-----------|------|--------| +| 灵敏度 | 灵敏度索引 | 当前生效的灵敏度表索引 | 2 | +| 延时 | 离开延时 | 100ms × 设定值 | 0 | +| 输出方式 | 输出模式 | 0=存在, 1=进入脉冲, 2=离开脉冲 | 0 | +| 频率档 | 频率档位 | 1~4 = 高频~低频 | 1 | +| 安全复位 | 安全复位超时 | 0=关闭 | 0 | +| 有限存在 | 有限存在时间 | 0=无限, 否则 ×30s | 0 | + +### 4.4 输出模式 + +**存在输出(output_mode = 0):** +- RLY1 + RLY2 有车时持续吸合 +- 无车时释放 + +**进入脉冲(output_mode = 1):** +- RLY1:进入时输出 500ms 脉冲,脉冲结束后释放 +- RLY2:固定存在输出(有车吸合、无车释放) + +**离开脉冲(output_mode = 2):** +- RLY1:离开时输出 500ms 脉冲,脉冲结束后释放 +- RLY2:固定存在输出(有车吸合、无车释放) + +### 4.5 线圈断开保护 + +- 线圈断开时 LEDA 200ms 快闪(故障指示) +- 继电器全部释放,保护道闸控制器 +- 断开次数(≤3)通过 BLE 上报,小程序可查看 +- **重连后保留断开前的有车状态**:车仍在线圈上 → 恢复输出;车已离开 → 正常释放 + +> **提示**:线圈断开后若车仍在线圈上方,重连后继电器会恢复输出,道闸不会误落杆。 + +### 4.6 安全复位 + +当 BLE 配置 `loopSafe_Timeout` 非 0 时,有车持续时间超过设定值后触发安全复位: +- 继电器全部释放 +- 频率基线重新学习 +- LEDA 慢闪等待线圈稳定 +- 约 1.1s 稳定期后恢复正常 + +> **⚠ 安全复位仅在现场维护或更换线圈后通过 BLE 配置,正常设置为 0。** + +--- + +## 5. 指示灯行为 + +| 状态 | LEDA (绿灯) | 含义 | +|------|------------|------| +| 上电自检中 | **200ms 慢闪** | 稳定期,约持续 1.1s | +| 线圈未连接/断开 | **200ms 快闪** | 检查线圈接头 | +| 正常运行,无车 | **灭** | — | +| 正常运行,有车 | **常亮** | 检测到车辆 | + +> 有车常亮优先级最高。在线圈断开状态下,即使有车也不亮(强制快闪指示故障)。 + +--- + +## 6. 安装指南 + +### 6.1 线圈安装 + +1. **线圈尺寸**:推荐 1m × 2m 矩形,绕 3 ~ 4 匝 +2. **埋设深度**:地表下 3 ~ 5 cm +3. **线圈电感**:100 ~ 300 μH(推荐值) +4. **引线**:双绞屏蔽线,长度 < 100m +5. **防水处理**:线圈和接头做防水密封 + +### 6.2 检测器安装 + +1. 固定在机柜内或设备箱中 +2. 远离强电磁干扰源(变频器、大电机等) +3. 线圈引线独立走线,勿与强电线并行走线 +4. 确保良好接地 + +### 6.3 上电调试 + +1. 确认线圈正确连接后上电 +2. 打开小程序搜索 BLE 设备,连接 DLD110SV4 +3. 观察 LEDA:慢闪约 1.1s 后熄灭(无车状态),表示稳定就绪 +4. 小程序查看实时频率和 variation 值,确认读数正常 +5. 金属物体(铁板或车辆)靠近线圈 → LEDA 应亮起 +6. 根据实际灵敏度调整滑动开关或 BLE 参数 +7. 配置输出模式和延时参数 + +--- + +## 7. BLE 小程序使用 + +### 7.1 连接设备 + +1. 打开微信小程序 +2. 搜索附近的 BLE 设备 +3. 选择 "DLD110S" 设备连接 +4. 连接成功后自动读取设备参数 + +### 7.2 主要功能 + +| 功能 | 说明 | +|------|------| +| 参数读写 | 在线修改灵敏度/输出模式/延时等,即时生效 | +| 实时状态 | 查看频率、variation、有车/无车状态 | +| 断开次数 | 查看线圈历史断开次数 | +| OTA 升级 | 远程升级固件 | + +### 7.3 传感器数据 + +小程序实时显示 BLE 上报的关键数据: + +| 数据项 | 说明 | +|--------|------| +| 频率 (frequent) | 当前线圈振荡频率 (Hz) | +| 变化量 (variation) | Origin − CAPVD,正值=频偏(有车) | +| 车辆状态 | 有车 / 无车 | +| 断开次数 | 累计线圈断开次数 | + +--- + +## 8. 故障排查 + +| 现象 | 可能原因 | 处理方法 | +|------|---------|----------| +| LEDA 快闪,小程序显示频偏异常 | 线圈断开或未连接 | 检查线圈接头、引线通断 | +| LEDA 常亮不灭 | 灵敏度太高 / 线圈频率漂移 | 降低灵敏度 / 检查线圈 | +| LEDA 从不亮 | 灵敏度太低 / 线圈 Q 值过低 | 提高灵敏度 / 更换线圈 | +| 电源灯不亮 | 电源故障 | 检查供电电压 | +| 频繁误触发 | 电磁干扰 / 灵敏度太高 | 降低灵敏度 / 屏蔽干扰源 | +| BLE 无法连接 | 超出通信距离 / 设备已被连接 | 靠近设备 / 断开其他手机连接 | +| 小程序读数不更新 | BLE 断连 | 重新连接 | + +--- + +## 9. 版本历史 + +| 版本 | 日期 | 说明 | +|------|------|------| +| V4.00 | — | 初始版本(旧算法) | +| V4.20 | 2026-07-18 | 算法移植 DLD154V4B V2.0,删除旧线圈算法 | +| V4.21 | 2026-07-20 | variation 3B 上报;全项目 GBK→UTF-8;线圈重连保留 VD_FLAG | + +--- + +## 10. 订购信息 + +| 型号 | 说明 | +|------|------| +| DLD110SV4 | 单路环形线圈蓝牙车辆检测器,CH591R BLE | + +--- + +> **技术规格书**(算法详情、IO 分配、电气参数等)请参阅 [技术规格书](technical-spec.md) diff --git a/docs/technical-spec.md b/docs/technical-spec.md new file mode 100644 index 0000000..765879e --- /dev/null +++ b/docs/technical-spec.md @@ -0,0 +1,454 @@ +# DLD110SV4 技术规格书 + +> 单路线圈蓝牙车辆检测器 | 固件版本: V4.20 | 文档版本: V1.0 +> 本文档面向工程开发、系统集成及故障深度分析 + +--- + +## 1. 系统架构 + +### 1.1 硬件架构 + +``` + ┌──────────────────────────────────┐ + 线圈 ────────────┤ PA9 (TMR0) CH591R │ + │ 输入捕获 RISC-V ├──── PA8 (GPIO) ──────── RLY1 功能继电器 + │ 60MHz / 192KB │ + 调频电容 ×2 ────┤ PA12/PA13 (GPIO) ├──── PB23 (GPIO) ─────── RLY2 存在继电器 + │ │ + 滑动开关 ×2 ────┤ PA14/PA15 (GPIO) ├──── PB22 (GPIO) ─────── LEDA 绿灯 + │ │ + BLE ────────────┤ 内置 2.4GHz RF ├──── 小程序配置 + OTA + └──────────────────────────────────┘ +``` + +### 1.2 软件架构 + +``` +主循环轮询 (无 RTOS) +├── TMR0 ISR — 线圈频率捕获 (FallEdge_To_FallEdge) +│ ├── Xn = TMR0_CAPGetData() (直接获取周期) +│ ├── LPCNT = 2^19 / Xn (自适应测量窗) +│ └── CapCnt >= LPCNT → Value = ΣXn, CAP_OK = 1 +├── TMR1 ISR — 5ms 系统 tick (LED 驱动 + 50ms 状态机) +├── cjq_srv() — 主循环服务 +│ ├── 线圈断开/重连检测 +│ ├── CAP_OK → vd1_task() (核心检测算法, ~8.74ms 周期) +│ │ ├── IIR 滤波 (ALFA_CAP1=79/256, τ≈24ms) +│ │ ├── 斜率限幅 (MAX_SLOPE_RATE=5%) +│ │ ├── 基线跟踪 (500 窗口滑动平均, ~4.4s) +│ │ ├── 进入确认 (ENTRY_CONFIRM=3 次) +│ │ ├── 离开检测 (平坦性三条件 / cnt_release) +│ │ └── 冻结超时恢复 (~8.7s + ±2% 稳定性检查) +│ └── BLE 状态上报 (variation / frequent / car_state) +└── BLE 协议栈 — DBN 命令解析 + 传感器数据上报 +``` + +--- + +## 2. 电气参数 + +| 参数 | 最小值 | 典型值 | 最大值 | 单位 | 备注 | +|------|--------|--------|--------|------|------| +| 供电电压 (VDD) | 3.0 | 3.3 | 3.6 | V | CH591R 内核电压 | +| 功耗 | — | 0.1 | 0.3 | W | BLE 广播 + 检测 | +| 工作温度 | -40 | — | +85 | °C | 工业级 | +| 存储温度 | -55 | — | +125 | °C | — | +| 线圈电感范围 | 50 | 200 | 1000 | μH | 超出范围可工作但精度下降 | +| 线圈频率范围 | 30 | 100 | 200 | kHz | — | +| 线圈 Q 值 | 5 | — | — | — | 过低导致振荡不稳定 | +| 继电器触点电压 | — | — | 250 | VAC | — | +| 继电器触点电流 | — | — | 3 | A | — | +| GPIO 输出电压 | 0 | 3.3 | 3.6 | V | CMOS 电平 | +| GPIO 输出电流 | — | — | 25 | mA | 单引脚最大 | +| BLE 发射功率 | — | 0 | +3 | dBm | 可配置 | +| BLE 通信距离 | — | 30 | 100 | m | 无遮挡/有遮挡 | + +--- + +## 3. IO 引脚分配 + +### 3.1 完整引脚表 + +| 引脚 | 标识 | 功能 | 方向 | 外设 | 初始状态 | 备注 | +|------|------|------|------|------|---------|------| +| **PA9** | **LP** | 线圈频率捕获 | IN | **TMR0** | — | **核心输入** | +| PA8 | RLY1 | 功能继电器 | OUT | GPIO PP | 0 (开路) | 存在/进入脉冲/离开脉冲 | +| PB23 | RLY2 | 存在继电器 | OUT | GPIO PP | 0 (开路) | 固定存在输出 | +| PB22 | LEDA | 绿灯 | OUT | GPIO PP | 0 (灭) | 有车/自检/故障指示 | +| PA12 | FLEVEL_H | 调频电容 33nF | OUT | GPIO PP | — | 0=接入, 1=断开 | +| PA13 | FLEVEL_L | 调频电容 10nF | OUT | GPIO PP | — | 0=接入, 1=断开 | +| PA14 | KEY_SA1 | 灵敏度 bit0 | IN | GPIO, 上拉 | — | 滑动开关 | +| PA15 | KEY_SA2 | 灵敏度 bit1 | IN | GPIO, 上拉 | — | 滑动开关 | + +### 3.2 调频电容组合 + +| loopFreq_Level | FLEVEL_H (PA12) | FLEVEL_L (PA13) | 电容组合 | 说明 | +|----------------|-----------------|-----------------|---------|------| +| 0 (高频) | 0 | 0 | 33nF + 10nF | 总电容最大, 频率最低 | +| 1 (中高) | 0 | 1 | 33nF | — | +| 2 (中低) | 1 | 0 | 10nF | — | +| 3 (低频) | 1 | 1 | 0 | 无外加电容, 频率最高 | + +> **注**:`0=接入电容`(低电平),`1=断开电容`(高电平)。调频档位由 BLE 配置参数 `loopFreq_Level` (1~4) 控制。 + +### 3.3 滑动开关编码 + +```c +// SA1/SA2 读取与解码 (与 DLD154V4B 一致) +SENS = 3 - (sw & 0x03); +// SA2:SA1 = 11 → SENS = 0 (低灵敏) +// SA2:SA1 = 10 → SENS = 1 +// SA2:SA1 = 01 → SENS = 2 +// SA2:SA1 = 00 → SENS = 3 (最高灵敏, BLE 灵敏度表) +``` + +附加灵敏度等级通过 BLE 配置 `g_loop_sens_list.sens[freq_level].sens_in/sens_out`,支持运行时覆盖。 + +--- + +## 4. 检测算法 + +### 4.1 频率测量 + +#### 4.1.1 硬件链路 + +DLD110SV4 使用 CH591R 内置 TMR0 输入捕获,直接捕获线圈振荡边沿周期(FallEdge_To_FallEdge)。 + +| 对比项 | DLD154V4B (AT32F421) | DLD110SV4 (CH591R) | +|--------|----------------------|---------------------| +| MCU | Cortex-M4 @120MHz | RISC-V @60MHz | +| 捕获外设 | TIM3_CH2 | TMR0 | +| 分频 | DIV_2 (÷2) | 无 | +| 捕获方式 | CapThis - CapLast 差分 | TMR0_CAPGetData() 直接返回 | +| 定时器宽度 | 16-bit | 16-bit | + +#### 4.1.2 捕获流程 + +``` +线圈边沿 → PA9 (TMR0) + │ + ▼ +TMR0 自由运行 (16-bit, 60MHz) + └─ FallEdge_To_FallEdge → TMR0_CAPGetData() → Xn + │ + ▼ +TMR0 ISR: + Xn == 0 → 除零保护, return + LPCNT = MEASUREMENT_BASE / Xn (自适应窗口) + if (LPCNT > 65535) return (Xn 毛刺保护) + CapSum += Xn + CapCnt++ + │ + CapCnt >= LPCNT ? + YES → Value = CapSum (≈ MEASUREMENT_BASE) + CapCnt = CapSum = 0 + loop1_CAP_OK = 1 (通知 vd1_task) +``` + +#### 4.1.3 关键常量 + +```c +#define MEASUREMENT_BASE 524288L // 2^19 +``` + +| 线圈频率 | Xn @60MHz | LPCNT | 测量窗口 | Value 范围 | +|---------|-----------|-------|---------|-----------| +| 50 kHz | 1200 | 437 | ~7.3 ms | ~524400 | +| 100 kHz | 600 | 874 | ~8.7 ms | ~524400 | +| 150 kHz | 400 | 1311 | ~8.7 ms | ~524400 | +| 200 kHz | 300 | 1748 | ~8.7 ms | ~524400 | + +> **设计要点**:LPCNT 自适应使不同频率下 Value 归一化到 ~524288,百分比阈值(灵敏度)直接适用,无需频率补偿。 + +### 4.2 IIR 滤波 + +```c +#define ALFA_CAP1 79 // IIR α = 79/256 ≈ 0.31 (@8.74ms → τ≈24ms) + +// get_flt_value(): 通用一阶 IIR +CAPVD = (|Value - CAPVD| * ALFA_CAP1) >> 8 +``` + +| 参数 | 值 | 说明 | +|------|-----|------| +| α | 79/256 ≈ 0.31 | 指数平滑系数 | +| τ | ~24ms @8.74ms tick | 3 次更新达 63% | +| 噪声抑制 | 良好 | 单次野值影响 < 31% | + +进入确认:CAPVD 连续 ENTRY_CONFIRM=3 次低于阈值才判定有车。 + +### 4.3 检测判据 + +#### 4.3.1 灵敏度表 + +灵敏度通过 BLE 配置的 `g_loop_sens_list` 表实现,支持 4 级频率档 × 多级灵敏度。滑动开关选择当前生效的灵敏度索引,BLE 可在线修改表值。 + +| SENS (滑动开关) | 进入阈值 (sens_in/65536) | 离开阈值 (sens_out/65536) | 典型频偏 | +|----------------|-------------------------|--------------------------|---------| +| 0 (低) | ~0.33% | ~0.16% | 大车/高底盘 | +| 1 (中) | ~0.16% | ~0.11% | 普通轿车 | +| 2 (高) | ~0.055% | ~0.027% | 摩托车/小轿车 | + +#### 4.3.2 进入检测 + +```c +// CAPVD 连续 ENTRY_CONFIRM 次低于阈值才判定有车 +dlt_ORG = (Origin * sens_in) >> 16; +if (CAPVD < Origin - dlt_ORG) { + 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; +} +``` + +| 参数 | 值 | 说明 | +|------|-----|------| +| ENTRY_CONFIRM | 3 | 连续确认次数 | +| 进入响应 | ~530ms | 3×8.74ms 确认 + 500ms IN_DELAY | + +#### 4.3.3 离开检测(滞回) + +##### 模式 1:简单防抖 (USE_FLATNESS_EXIT=0) + +```c +dlt_ORG = (Origin * sens_out) >> 16; +if (CAPVD < Origin + dlt_ORG) { + if (++cnt_release >= 3) { VD_FLAG = 0; FLAG_OUT = 1; } +} else { + cnt_release = 0; +} +``` + +##### 模式 2:平坦性判定 (USE_FLATNESS_EXIT=1) — 默认 + +基于专利 **CN200910309382**(中山大学),解决大车通行时频率多峰导致的多次误触发。 + +**三条件判定**:频率回归基频 + 一阶导数近零 + 二阶导数近零,连续 FLAT_CONFIRM_CNT(3) 次全部满足。 + +| 常量 | 值 | 含义 | +|------|-----|------| +| SLOPE_FLAT_THRESH | 350 | 斜率趋零判断阈值 (幅值基准 2^19) | +| MIN_DELTA2 | 18 | Δ2 下限 | +| MIN_DELTA3 | 7 | Δ3 下限 | +| FLAT_CONFIRM_CNT | 3 | 平坦确认次数 | + +### 4.4 基线跟踪 + +#### 4.4.1 斜率限幅 + +```c +#define MAX_SLOPE_RATE 5 // 单次最大变化 5% + +int32_t raw_delta = Value - CAPVD; +int32_t max_step = CAPVD * MAX_SLOPE_RATE / 100; +if (max_step < 100) max_step = 100; // 最小限幅,防止低 Origin 时锁死 +if (raw_delta > max_step) raw_delta = max_step; +if (raw_delta < -max_step) raw_delta = -max_step; +CAPVD = get_flt_value(CAPVD + raw_delta, CAPVD); +``` + +EMI/闪电等瞬态干扰被截断,真实车辆信号不受影响。 + +#### 4.4.2 基线更新速率(两阶段) + +| 阶段 | 窗口 | 周期 | 用途 | +|------|------|------|------| +| 稳定期 (`!g_loop_stable`) | 100 | **~0.9s** | 绕过 IIR/限幅,快速收敛 | +| 正常运行 | 500 (WINDOW_ORIGIN) | **~4.4s** | 强噪声抑制,稳定跟踪 | + +#### 4.4.3 冻结超时恢复 + +| 常量 | 值 | 说明 | +|------|-----|------| +| 冻结触发阈值 | dlt_ORG × 4 | CAPVD 偏离 Origin 的倍数 | +| FREEZE_TIMEOUT | 1000 | ~8.7s @8.74ms/tick | +| FREEZE_STABILITY_RATE | 2 | 稳定性窗口:参考值的 ±2% | + +--- + +## 5. 时序状态机 + +### 5.1 时序参数 + +| 参数 | 50ms Tick 数 | 时间 | 说明 | +|------|-------------|------|------| +| IN_DELAY | 10 | **500 ms** | 进入确认防抖 | +| OUT_DELAY | 由 delay_time 配置 | 100ms × delay_time | 离开延时(可配) | +| PULSE_DELAY | 10 | **500 ms** | 脉冲输出宽度 | +| HOLD_TIME | 由 exist_mode 配置 | 30s × exist_mode | 有限存在超时 | +| STABLE_SAMPLES | 128 窗 | **~1.1 s** | 上电稳定期 | +| FREEZE_TIMEOUT | 1000 窗 | **~8.7 s** | 基线冻结超时 | + +### 5.2 系统 Tick 来源 + +TMR1 每 5ms 产生一次中断。`TM1cnt` 计数到 10 后执行 50ms 状态机(进入/离开/脉冲标志处理 + 继电器时序)。 + +--- + +## 6. 线圈重连逻辑 + +### 6.1 设计目标 + +断开时不丢 VD_FLAG(车辆仍在线圈上方),重连后 CAPVD=0 触发首个样本直锁快速收敛。 + +### 6.2 状态机 + +``` +断开检测: loop1_RF_FLAG == 0 (没有收到边沿) + ├─ loop1_LOOP_OK = 0 + ├─ g_disconnect_active = 1 + ├─ g_loop_cut_amount++ (≤3) + ├─ 保留 loop1_VD_FLAG ← 关键:不丢有车状态 + ├─ 关断继电器输出 + └─ LEDA 200ms 快闪 + +重连检测: loop1_RF_FLAG == 1 (重新收到边沿) + ├─ loop1_LOOP_OK = 1 + ├─ g_disconnect_active = 0 + ├─ loop1_CAPVD = 0 ← 触发快速收敛 + └─ vd1_task: CAPVD == 0 → CAPVD = Value (直锁首个样本) +``` + +### 6.3 断开-重连场景矩阵 + +| 断开前 | 断开期间 | 重连后 | VD_FLAG | LEDA | 继电器 | +|--------|---------|--------|---------|------|--------| +| 有车 | 车仍在 | 车仍在 | 1 → 保持 | 正常 | 恢复输出 | +| 有车 | 车离开 | 无车 | 1 → cnt_release→3 → 0 | 灭 | 释放 | +| 无车 | 车进入 | 有车 | 0 → entry→3 → 1 | 亮 | 吸合 | + +--- + +## 7. 指示灯状态机 + +### 7.1 LEDA (绿灯) 行为表 + +DLD110SV4 仅有一个绿色 LEDA (PB22),承担自检、有车指示、故障诊断三重功能。 + +| 条件 | 行为 | 含义 | +|------|------|------| +| `g_disconnect_active == 1` | **200ms 快闪** | 线圈当前断开中 | +| `!g_loop_power_up_state` | **200ms 快闪** | 上电后从未连接线圈 | +| `!g_loop_stable` | **200ms 慢闪** | 稳定期中(自检) | +| `VD_FLAG == 1` (有车) | **常亮** | 有车检测中 | +| 正常运行,无车 | **灭** | 一切正常 | + +> **注意**:有车常亮优先级最高,覆盖闪烁状态。 + +--- + +## 8. BLE 协议接口 + +### 8.1 DBN BLE 协议 + +DLD110SV4 通过 BLE GATT 与小程序通信,协议基于 DBN (Device Binary Notification) 框架。 + +- **服务 UUID**: `0xFFE0` +- **通知 Characteristic**: `0xFFE1` (NOTIFY) +- **写入 Characteristic**: `0xFFE2` (WRITE_NO_RESPONSE) +- **Magic Byte**: `0x7F` +- **帧格式**: Magic(1) + Len(1) + Cmd(1) + Sub(1) + Value(LEN) + XOR(1) + SUM(1) + +### 8.2 传感器数据上报 + +通过 `CMD_SUB_SENS_REPORT` 主动上报线圈动态信息: + +| 字段 | 字节 | 说明 | +|------|------|------| +| loop_state | 1 | 线圈状态 | +| cut_amount | 3 | 累计断开次数 (≤3) | +| frequent | 3 | 实时频率 (Hz), 小端序 | +| variation | **3** | Origin − CAPVD, 有符号 int24, 小端序 | + +> **V4.20 变更**:`variation` 从 2B 升级为 3B 有符号(int24),范围 ±8,388,607,完整覆盖 2^19 幅值基准。旧版 2B 无符号 ±32767 截断已废弃。 + +### 8.3 可配置参数 + +通过 BLE 读写命令配置: + +| 参数 | 说明 | 范围 | +|------|------|------| +| sensitvity | 灵敏度索引 | 0~15 | +| delay_time | 离开延时 | 0~255 (×100ms) | +| output_mode | 输出模式 | 0=存在, 1=进入脉冲, 2=离开脉冲 | +| direction_mode | 方向模式 | — | +| loopFreq_Level | 频率档位 | 1~4 | +| loopSafe_Timeout | 安全复位超时 | 0=关闭, >0=超时秒数 | +| exist_mode | 有限存在 | 0=无限, >0=超时×30s | + +--- + +## 9. 编译选项 + +```c +// peripheral_main.c + +#define USE_FLATNESS_EXIT 1 // 1 = 平坦性离开判定 (CN200910309382) + // 0 = 简单 cnt_release 防抖 + +// 算法参数 +#define MAX_SLOPE_RATE 5 // 斜率限幅: 单次最大变化 5% +#define ENTRY_CONFIRM 3 // 进入确认: 连续 N 次低于阈值 +#define FREEZE_TIMEOUT 1000 // 冻结超时: ~8.7s @8.74ms/tick +#define FREEZE_STABILITY_RATE 2 // 稳定性窗口: 参考值的 ±2% +``` + +--- + +## 10. 关键专利 + +| 专利号 | 名称 | 权利人 | 应用 | +|--------|------|--------|------| +| CN200910309382 | 一种防误检环形线圈车辆检测器 | 中山大学 张辉/黄永强/陈古典 | 平坦性三条件离开判定 | + +DLD110SV4 自 V2.0 起实现该专利的整数化版本,用于大车通行时的离开判定。 + +--- + +## 11. 代码架构 + +### 11.1 目录结构 + +``` +DLD110SV4/ +├── BLE/DLD110S_Peripheral_28K/APP/ +│ ├── peripheral_main.c # 主流程 + 检测算法 + TMR0/TMR1 ISR +│ ├── dbn_ble_srv.c # DBN BLE 协议服务 +│ ├── peripheral.c # BLE 外设角色管理 +│ └── storage.c # 参数存储 (EEPROM) +├── BLE/HAL/ # MCU / RTC / KEY / LED 驱动 +├── BLE/LIB/ # CH59x BLE ROM 库 +├── SRC/ # 标准外设驱动 + RISC-V 启动 +├── docs/ # 技术文档 +└── tools/ # 辅助工具 +``` + +### 11.2 与 DLD154V4B 的主要差异 + +| 项目 | DLD154V4B | DLD110SV4 | +|------|-----------|-----------| +| MCU | AT32F421 (Cortex-M4) | CH591R (RISC-V) | +| 主频 | 120 MHz | 60 MHz | +| MEASUREMENT_BASE | 131072 (2^17) | 524288 (2^19) | +| 有效 tick | 10ms (FreeRTOS) | ~8.74ms (主循环) | +| 配置方式 | DIP 开关 | BLE 小程序 + 滑动开关(灵敏度) | +| 指示灯 | 红/绿/黄 三色 | 单绿灯 LEDA | +| 对外接口 | TTL Tx | BLE | +| 定时器 | TIM3 + TIM15 | TMR0 + TMR1 | +| RTOS | FreeRTOS | 无 (主循环轮询) | +| 捕获方式 | CapThis - CapLast 差分 | TMR0_CAPGetData() 直接获取 | + +--- + +## 12. 修订记录 + +| 版本 | 日期 | 说明 | +|------|------|------| +| V1.0 | 2026-07-20 | 技术规格书初版 (固件 V4.20) | + +> **产品手册**(安装指南、故障排查、使用说明等)请参阅 [产品手册](product-manual.md)