Files
DLD154Pro/docs/technical-spec.md
T
wangfq ccd996d56e refactor: 融合模式枚举重排,地感且光耦后移
0=或 1=混行 2=ETC 3=且 4=仅地感 5=仅光耦 6=复位
- storage.h: AND_RADAR 从位置 2 移至位置 4
- peripheral_main.c: 注释块 MODE 标签及内联模式号同步
- 全部 4 份文档表格/节号/版本号对齐
2026-07-30 09:01:12 +08:00

21 KiB
Raw Permalink Blame History

DLD154Pro 技术规格书

单路线圈蓝牙车辆检测器 | 固件版本: V3.01 | 硬件版本: V3.01 本文档面向工程开发、系统集成及故障深度分析


1. 系统架构

1.1 硬件架构

                         ┌──────────────────────────────────────┐
     线圈 ───────────────┤ PA9 (TMR0)        CH591R (RISC-V)     │
                         │   输入捕获           60MHz / 28KB     ├── PB22 (GPIO) ──── 绿灯
     光耦 ───────────────┤ PB10 (GPIO)                            │
                         │                                       ├── PB23 (PWM11) ─── 红灯 (呼吸)
     RS485 ──────────────┤ PA14 TX / PA15 RX / PA13 RE (UART0)   │
                         │                                       ├── PA8 (GPIO) ──── 继电器 RLY1
     BLE ────────────────┤ 2.4GHz 无线                           │
                         │                                       ├── PA12 (GPIO) ──── 调频电容 (33nF)
                         └──────────────────────────────────────┘

1.2 软件架构

Main_Circulation (无 RTOS, 裸机轮询)
├── vd1_task() — 每 ~8.74ms 执行 (MEASUREMENT_BASE 测量窗)
│   ├── IIR 滤波 (ALFA_CAP1=79/256, τ≈24ms)
│   ├── 斜率限幅 (MAX_SLOPE_RATE=5%)
│   ├── 基线跟踪 (WINDOW_ORIGIN=500 滑动平均, ~4.4s)
│   ├── 进入确认 (ENTRY_CONFIRM=3 次)
│   ├── 离开检测 (滞回 + 平坦性三条件 CN200910309382)
│   └── 冻结超时恢复 (FREEZE_TIMEOUT=1000, ~8.7s + ±2% 稳定性检查)
├── TMR0 ISR — 线圈频率捕获 (下降沿→下降沿周期)
├── TMR1 ISR — 5ms 系统 tick (LED 驱动 + 继电器输出 + 光耦扫描)
├── opt_input_poll() — 光耦输入处理 (7 种输出模式融合)
├── rs485_700bs_poll() — RS485 700BS 从机协议
├── poll_dbn_ble() — BLE 命令处理
└── LEDB PWM 呼吸灯 (PWM11, 硬件自主)

2. 电气参数

参数 最小值 典型值 最大值 单位 备注
供电电压 (VDD) 10 12 / 24 30 V 宽压输入
功耗 0.5 2 W 含继电器吸合 + BLE
工作温度 -40 +85 °C 工业级
存储温度 -55 +125 °C
线圈电感范围 50 200 1000 μH 超出范围可工作但精度下降
线圈频率范围 20 80 200 kHz 含 33nF 调频电容
线圈 Q 值 5 过低导致振荡不稳定
继电器触点电压 250 VAC 单刀双掷 (SPDT)
继电器触点电流 3 A
GPIO 输出电压 0 3.3 3.6 V CMOS 电平
GPIO 输出电流 12 mA 单引脚最大
BLE 工作频率 2.4 GHz BLE 4.2
BLE 发射功率 0 dBm 典型
ESD 防护 ±2 kV HBM

3. IO 引脚分配

3.1 完整引脚表

引脚 标识 功能 方向 外设 初始状态 备注
PA9 LP 线圈频率捕获 IN TMR0 核心输入,下降沿→下降沿
PA8 RLY1 继电器输出 OUT GPIO PP 0 (释放) 单刀双掷,低电平有效
PA12 FLEVEL 线圈调频 OUT GPIO PP L (33nF) 0=接33nF(低频), 1=0nF(高频)
PA14 UART0_TX RS485 发送 OUT UART0 700BS / Modbus
PA15 UART0_RX RS485 接收 IN UART0 700BS / Modbus
PA13 UART0_RE RS485 方向控制 OUT GPIO PP RX (接收) 高=发送, 低=接收
PB10 IN_1 光耦输入 IN GPIO IN_PU 外部雷达 / 复位信号
PB22 LEDA 绿灯 OUT GPIO PP 0 (灭) 有车亮 / 无车灭,低有效
PB23 LEDB 红灯 ALT PWM11 呼吸灯,低有效
PA07 预留/未分配

3.2 无物理拨码开关

DLD154Pro 没有物理 DIP 开关。所有配置参数(灵敏度、输出模式、延时、协议选择等)通过 BLE 小程序 管理,持久化存储在 DataFlash 中。

配置项 管理方式 Flash 地址
灵敏度等级 BLE 小程序 Loop_Cng_Unit.sensitvity
输出模式 (06) BLE 小程序 Loop_Cng_Unit.direction_mode[3:0]
功能码 (协议/光耦功能) BLE 小程序 Loop_Cng_Unit.direction_mode[7:4]
存在时间 (有限/永久) BLE 小程序 Loop_Cng_Unit.exist_mode
离开延时 BLE 小程序 Loop_Cng_Unit.delay_time
频率档位 (高/低) BLE 小程序 Loop_Cng_Unit.loopFreq_Level
RS485 地址 BLE 小程序 Addr_RS485_ID_Offset (0x14)
RS485 波特率 BLE 小程序 Addr_RS485_Baud_Offset (0x11)
蓝牙空闲超时 BLE 小程序 ADDR_BT_Close_TIMEOUT_Offset (0x10)

4. 检测算法

4.1 频率测量

4.1.1 硬件链路

DLD154Pro 不使用 CD4060 外部分频芯片。线圈直接驱动 PA9 (TMR0),利用 CH591R 内置 TMR0 的下降沿→下降沿周期捕获。

对比项 M1H/TLD-110 DLD154V4B DLD154Pro
外部分频 CD4060 Pin5 (÷32) 无(直连) 无(直连)
MCU 内部分频 TIM3 DIV_2 (÷2) TMR0 无分频
总分频比 ÷32 ÷2 ÷1
MCU 主频 120MHz 60MHz
MEASUREMENT_BASE 131072 (2^17) 524288 (2^19)
测量窗口 ~2.2ms ~8.74ms

设计要点DLD154Pro 升高 MEASUREMENT_BASE 以补偿更低的主频和无内部分频,使归一化 Value ≈ 524288,保持与 DLD154V4B 一致的百分比阈值语义。

4.1.2 捕获流程

线圈边沿 → PA9 (TMR0 下降沿→下降沿捕获)
       │
       ▼
TMR0 ISR:
  CAPDAT = TMR0 捕获寄存器 (相邻下降沿周期)
  Xn = CAPDAT (TMR0 直接给出,无需手动计算边沿差)
       │
       ▼
  LPCNT = MEASUREMENT_BASE / Xn   (自适应窗口)
  CapSum += Xn
  CapCnt++
       │
  CapCnt >= LPCNT ?
    YES → Value = CapSum          (≈ MEASUREMENT_BASE = 524288)
           CapCnt = CapSum = 0
           loop1_CAP_OK = 1       (通知 vd1_task)

4.1.3 关键常量

#define MEASUREMENT_BASE  524288L   // 2^19
// 无内部分频 (TMR0 直读)
线圈频率 Xn @60MHz LPCNT 测量窗口 Value 范围
50 kHz 1200 436 8.7 ms ~523200
80 kHz 750 700 8.7 ms ~525000
100 kHz 600 873 8.7 ms ~523800
150 kHz 400 1310 8.7 ms ~524000
200 kHz 300 1747 8.7 ms ~524100

自适应 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%

斜率限幅:单次 Value 变化 >5% → 截断,过滤 EMI/闪电尖峰:

#define MAX_SLOPE_RATE  5   // 单次最大变化 5%

int32_t raw_delta = (int32_t)Value - (int32_t)CAPVD;
int32_t max_step  = (int32_t)(CAPVD * MAX_SLOPE_RATE / 100);
if (max_step < 100) max_step = 100;   // 最小限幅防止锁死
// clamp: raw_delta ∈ [max_step, +max_step]
uint32_t clamped_value = CAPVD + raw_delta;
CAPVD = get_flt_value(clamped_value, CAPVD);

4.3 检测判据

4.3.1 灵敏度表

// 4 级灵敏度 (MAX_LOOP_SENS_AMOUNT=4)
const uint16_t SensTable[4]   = {108, 54, 28, 14};   // 进入阈值
const uint16_t SensTable1[4]  = { 81, 32, 16, 12};   // 离开阈值(滞回)
等级 sens_in ΔL/L 进入 sens_out ΔL/L 离开 迟滞比 适用场景
低 (0) 108 0.330% 81 0.247% 1.33 大车 / 强干扰环境
中 (1) 54 0.165% 32 0.098% 1.69 普通轿车(默认)
高 (2) 28 0.085% 16 0.049% 1.75 摩托车 / 安静环境
最高 (3) 14 0.043% 12 0.037% 1.17 超高灵敏度

ΔL/L 换算ΔL/L_entry = 2 × sens_in / 65536。物理依据:线圈振荡 f∝1/√L,dT/T ≈ dL/(2L)。

⚠ 第四档 (sens=14) 信噪比余量仅约 2:120°C 温漂 ≈0.1% 感量偏移),仅推荐摩托车/小型车辆检测场景,需确保线圈安装质量。

4.3.2 进入检测

#define ENTRY_CONFIRM  3   // 连续 3 次低于阈值才判定有车

dlt_ORG = (Origin * SensTable[SENS]) >> 16;   // = Origin × sens / 65536

if (CAPVD < Origin - dlt_ORG) {
    if (++loop1_entry_cnt >= ENTRY_CONFIRM) {
        loop1_VD_FLAG = 1;   loop1_FLAG_IN = 1;
        loop1_entry_cnt = 0;
    }
} else {
    loop1_entry_cnt = 0;     // 恢复则重置
}

进入响应时间3 次确认 × 8.74ms + 500ms IN_DELAY = ~530ms

4.3.3 离开检测(滞回 + 平坦性)

离开滞回

有车状态下,使用更小的离开阈值 SensTable1

dlt_ORG = (Origin * SensTable1[SENS]) >> 16;

if (CAPVD > Origin - dlt_ORG) {          // 高于离开阈值
    if (++loop1_cnt_release >= 3) {       // 连续 3 次确认
        loop_release_common();            // VD_FLAG=0, FLAG_OUT=1
    }
} else {
    loop1_cnt_release = 0;                // 回落立即重置
}
平坦性离开判定(专利 CN200910309382

基于中山大学专利,解决大车通行时频率多峰导致的多次误触发。三条件同时满足才判定离开:

① |f  f_b| < dlt_ORG         (频率回归基频)
② |f'| < Δ2                    (一阶导数近零,Δ2 = max_slope / K1
③ |f''| < Δ3                   (二阶导数近零,Δ3 = max_slope_rate / K2

Δ2、Δ3 从车辆进入后的第一上升坡面动态计算(避免固定阈值的不适应性)。

常量 含义
K1, K2 8 动态阈值除数(专利推荐值)
FLAT_CONFIRM_CNT 3 平坦确认次数

算法源码位于 peripheral_main.c:vd1_task(),编译宏 USE_FLATNESS_EXIT 控制。

4.4 基线跟踪

4.4.1 跟踪规则

// 仅无车 → 跟踪基线
if (!loop1_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, WINDOW_ORIGIN);
    }
    // 偏离 > 4× 阈值 → 冻结 + 超时恢复(见 4.4.3)
}
// 有车时冻结基线 (仿 TLD-110)

4.4.2 两阶段基线更新

阶段 窗口 周期 用途
稳定期 (!g_loop_stable) 100 ~0.9s 绕过 IIR/限幅,快速收敛
正常运行 500 (WINDOW_ORIGIN) ~4.4s 强噪声抑制,稳定跟踪

稳定期 CAPVD 直接赋值为 raw Value(不经过 IIR),实现开机 ~1.1s 内基线就绪。

4.4.3 冻结超时恢复

常量 说明
冻结触发阈值 dlt_ORG × 4 CAPVD 偏离 Origin 的倍数
FREEZE_TIMEOUT 1000 ~8.7s (1000 × 8.74ms)
FREEZE_STABILITY_RATE 2 稳定性窗口:参考值的 ±2%
if (dev < dlt_ORG * 4) {
    /* 正常范围: 跟踪 + 清零冻结 */
    loop1_freeze_cnt = 0;
    update_moving_average(...);
} else {
    /* 异常偏高: 冻结 + 稳定性验证 */
    if (loop1_freeze_cnt == 0)
        loop1_freeze_ref = CAPVD;               // 记录冻结起始值
    else if (|CAPVD - freeze_ref| > freeze_ref * 2 / 100)
        reset(freeze_cnt, freeze_ref);          // 波动 >±2% → 重新计时

    if (++loop1_freeze_cnt >= FREEZE_TIMEOUT) { // 8.7s 连续稳定
        Origin = CAPVD;                         // 接受为新基线
    }
}

5. 时序状态机

5.1 状态转移

                       IN_DELAY=10(500ms)            OUT_DELAY(delay_time×100ms)
     [空闲] ──有车──→ [进入延时] ──超时──→ [有车确认] ──车辆离开──→ [离开延时]
        ↑                                                                            │
        │                                                               ┌────────────┘
        └──脉冲结束───── [脉冲输出] ←──超时── [离开延时] ←──────────────┘
                         PLUSE_DELAY=10(500ms)

5.2 时序参数

参数 Tick (50ms) 时间 说明
IN_DELAY 10 500 ms 进入确认防抖
OUT_DELAY delay_time × 2 可配 离开延时 (delay_time=5 → 500ms)
PLUSE_DELAY 10 500 ms 脉冲输出宽度
HOLD_TIME exist_mode × 20 × 5 可配 有限存在超时 (exist_mode × 5s)
LC_HOLD_TIME 4 × 1200 ~4 min 安全复位超时
STABLE_SAMPLES 128 tick ~1.1 s 上电稳定期
FREEZE_TIMEOUT 1000 ~8.7 s 基线冻结超时

Tick 来源TMR1 每 5ms 中断一次,TM1cnt 计数到 10 后触发 vd1_task50ms 周期)。

5.3 输出模式 (脉冲/存在)

DLD154Pro 仅一个继电器,支持存在输出和脉冲输出两种模式:

模式 output_mode 值 行为
存在输出 0 有车持续吸合,离开后延时释放
进入脉冲 1 确认有车→吸合 500ms→释放
离开脉冲 2 车辆离开+延时→吸合 500ms→释放

6. 输出融合模式

6.1 7 种融合模式

DLD154Pro 支持通过光耦输入 (PB10) 接入外部雷达/车检器信号,并按融合模式组合继电器输出。

模式值 名称 继电器吸合条件 适用场景
0 地感光耦 coil OR opto 互补冗余,任一触发即吸合(默认)
1 人车混行防砸 有车后 coil OR opto,离场 3s 窗口内光耦有效 混合交通流防砸人
2 ETC 模式 有车后 coil OR opto,光耦断开 500ms 防抖才释放 ETC 专用
3 地感光耦 coil AND opto 双确认,防地感误触
4 仅地感 线圈有车 纯线圈场景
5 仅光耦 光耦输入有效 纯雷达,地感只做背景监控
6 光耦复位 仅地感(光耦用于远程复位) 带远程复位功能

6.2 人车混行防砸 (模式 1) 状态机

IDLE (仅线圈检测)
  │ 线圈检测到车
  ▼
ARMED (线圈 || 光耦)
  │ 两者均释放
  ▼
WINDOW (3s 防砸窗口)
  │  光耦触发 → 继电器吸合,窗口复位
  │  线圈上线 → 回到 ARMED
  │  3s 超时无触发 → 回到 IDLE,落杆

6.3 ETC 模式 (模式 2) 状态机

IDLE (仅线圈检测)
  │ 线圈检测到车
  ▼
ARMED (线圈 || 光耦)
  │ 两者均释放
  ▼
DEBOUNCE (500ms 防抖)
  │  线圈/光耦重新触发 → 回到 ARMED
  │  500ms 超时 → 回到 IDLE,落杆

6.4 光耦防抖

所有非复位模式共用 3 样本多数表决消抖(等效 ~30ms),防止光耦信号抖动。


7. 指示灯状态机

7.1 驱动架构

TMR1 ISR (每 5ms)
├── 红灯 PB23 — PWM11 呼吸(硬件自主,~1.9s 周期)
├── 绿灯 PB22 — 有车亮 / 无车灭 / 稳定期慢闪 200ms
└── (无黄灯 — Pro 采用双色 LED 方案)

7.2 绿灯行为表

状态 绿灯行为 说明
上电初始化/稳定期 慢闪 (200ms 亮/200ms 灭) 基线学习中
线圈断开 等待恢复
正常运行,无车 就绪
正常运行,有车 车辆检测中
光耦参与模式 (非 LOOP_ONLY/LOOP_X_RESET) 跟随 relay1_state 与实际继电器状态一致

7.3 红灯行为

呼吸灯 (PWM11, ~1.9s 周期),始终运行,指示系统正常工作。不参与车辆/故障指示。


8. 上电稳定期

#define STABLE_SAMPLES  128   // ~1.1s (@8.74ms × 128)

if (!g_loop_stable) {
    loop1_CAPVD = loop1_Value;               // 绕过 IIR,直接赋值
    update_moving_average(..., 100);         // 小窗口快速收敛
    loop1_stable_cnt++;
    if (loop1_stable_cnt >= STABLE_SAMPLES)
        g_loop_stable = 1;                   // 启用检测
    return;                                   // 跳过进入/离开判断
}

稳定期间绕过 IIR 和斜率限幅,用 100 窗口快速建立基线。绿灯持续慢闪。


9. 线圈故障处理

9.1 断开/重连状态保持

断开前 断开期间 重连后 检测结果
有车 绿灯灭,继电器释放 车还在 CAPVD < Origindlt → VD_FLAG=1 ✓
有车 绿灯灭 车离开 cnt_release→3 → VD_FLAG=0 ✓
无车 绿灯灭 车进入 CAPVD < Origindlt → VD_FLAG=1 ✓

断开时保留 VD_FLAG,仅关断继电器。重连时 CAPVD=0 触发首个样本直锁 Value,跳过 IIR 预热。

9.2 有限存在超时

hold_time > 0 时,有车超过指定时间 → 整通道复位重建基线(等效安全复位),而非简单 FLAG_OUT。


10. 通信协议

10.1 接口总览

接口 物理层 协议 用途
BLE 2.4GHz DBN BLE 私有协议 参数配置 + 主动上报
RS485 UART0 半双工 700BS / Modbus RTU 工业总线接入

10.2 BLE 协议

帧格式

Magic | Addr/Sub | Len | CMD | Data | XOR | SUM
1B    | 1B       | 1B  | 1B  | xx   | 1B  | 1B

主要命令

命令码 功能
0x10 获取设备信息
0x23 设置车检器参数
0x24 读取车检器参数
0x31 读写 RS485 波特率/地址/蓝牙超时
0x8A 读写灵敏度列表
0xC0 设备主动上报传感信息
0xC5 主动上报使能配置
0x6D 设备复位

10.3 RS485 700BS 协议

参数
波特率 9600 (默认)
数据位 8N1
地址范围 1247
帧格式 主机 3 字节 (STX ADDR XOR), 从机 39 字节变长
心跳 空闲 5s / 故障(线圈断开) 1s / 事件(car_state 翻转)立即

命令集

命令 功能 回复
0xFA 查询有车+线圈状态 F5 DATA XOR
0x1B 查询线圈频率 14 Fre1-3 ADDR XOR
0x2C 复位初始化线圈 无回复
0x3D 查询虚拟拨码 (DIP1-5) 32 DATA ADDR XOR

DLD154Pro 无物理拨码,0x3D 返回 BLE 配置的等效值。

10.4 RS485 Modbus RTU 协议

参数
波特率 9600 (默认), 可配 19200/38400/57600/115200
数据位 8N1
从机地址 1247 (默认 1)
支持功能码 0x02 (DI), 0x03 (HR), 0x04 (IR), 0x06 (写单), 0x10 (写多), 0x11 (报告 ID)
协议选择 g_function_mode bit0 (BLE 设置)

详细寄存器映射见 docs/rs485-modbus-protocol.md。RS485 地址/波特率在 Modbus 侧只读,通过 BLE 小程序修改。


11. Flash 存储布局

地址 大小 内容
0x00 4B 魔数 (0x33 0xBB 0xC3 0x3C)
0x04 7B Loop_Cng_Unit 参数
0x10 ADDR_BT_Close_TIMEOUT_Offset 1B 蓝牙空闲超时 (分钟)
0x11 Addr_RS485_Baud_Offset 3B RS485 波特率 (LE32)
0x14 Addr_RS485_ID_Offset 1B RS485 从机地址
0x20 Addr_Sens_Array_In 16B 灵敏度进入阈值 (4×uint16_t LE)
0x30 Addr_Sens_Array_Out 16B 灵敏度离开阈值 (4×uint16_t LE)

出厂默认:灵敏度=中(1),存在模式,延时=500ms,高频,RS485 ID=1,波特率=9600,蓝牙超时=0(不关闭)。


12. 版本历史

版本 日期 说明
V3.00 2026-07-21 项目初始化:从 DLD110SV4 复制基线 + 硬件适配 (CH591R)
V3.01 2026-07-28 光耦输出模式完整实现 (6 种融合逻辑 + 状态机);LEDA 同步继电器状态

13. 相关文档

文档 路径
产品说明书 docs/product-manual.md
硬件资源说明 docs/DLD154Pro硬件资源.md
RS485 700BS 协议 docs/rs485-700bs-protocol.md
RS485 Modbus 协议 docs/rs485-modbus-protocol.md
开发日志 docs/devlog.md