Files
DLD110SV4B/docs/technical-spec.md
T

16 KiB
Raw Blame History

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 滑动开关编码

// 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 关键常量

#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 滤波

#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 进入检测

// 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)
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 斜率限幅

#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. 编译选项

// 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)

产品手册(安装指南、故障排查、使用说明等)请参阅 产品手册