Files
vd-analysis/models/DLD154Pro/analysis.md
T
wangfq 292825a300 DLD154Pro 分析归档:确认 DLD154V4B 同源移植(CH59x RISC-V)
- peripheral_main.c(1528行) 完整拆解:M1H→V4B→154Pro 血统链实锤(文件头明示)
- 关键发现:归一化基数重定标 131072→524288(2^19),60MHz 下测量节拍 8.74ms
- 离开判定降级:平坦性三条件被 USE_FLATNESS_EXIT 编译开关禁用 → 简单滞回 3 次防抖
- 灵敏度表 {108,54,28,14}/{81,32,16,12} 首次运行时可配(BLE 写 Flash)
- 新增:7 种雷达融合模式(人车混行 3s 防砸/ETC 500ms 防抖/光耦复位)、RS485 双协议
- 对比总表升级六型号,同源辨析补 DLD154V4B→DLD154Pro
2026-08-27 18:49:22 +08:00

12 KiB
Raw Blame History

DLD154Pro 车检器分析

型号: DLD154Pro | 固件: V3.05 | 硬件: V3.01 | 平台: CH591R/CH592(沁恒 CH59x, RISC-V, BLE SoC @60MHz 原始代码: vd_detector/DLD154Pro/BLE/DLD154Pro_Peripheral_28K/APP/peripheral_main.c 等,自研) 血统: DLD154V4B TaskLoop V2.0 移植(M1H 精简系)——文件头明示,M1H→V4B→154Pro 链条

1. 平台与工程

MCU CH591R/CH592CH59x 系,RISC-V;注释标 CH591R @60MHzSDK 头为 CH592SFR——待硬件确认)
时钟 SetSysClock(CLK_SOURCE_PLL_60MHz)60MHz(实测可用,非假设)
工具链 MounRiver.wvproj
BLE 单芯片 SoC(28K 固件分区),TMOS 任务调度
版本 FW V3.05 / HW V3.01cmcng.h
代码规模 peripheral_main.c 1528 行 + dbn_ble_srv.c 898 行 + rs485_modbus.c 854 行 + rs485_700bs.c 302 行
算法来源 移植自 DLD154V4B TaskLoop V2.0M1H 精简系),2026-07-18

2. 硬件与 IO

引脚 功能
PA9 TMR0 捕获输入(线圈频率入口,浮空输入)
PA8 RLY1 存在继电器(单刀双掷,高电平有效——注意与宏"低有效"注释相反,实测 RLY1_ON=PA8 置 1
PB22 LEDA 绿色(有车亮,低有效)
PB23 LEDB 红色呼吸灯(PWM115.86kHz,心跳/光耦指示)
PA12 FLEVEL 线圈调频(一级0=66nF 低频默认 / 1=33nF 高频)
PA14/15/13 RS485 UART0 TX/RX/RE700BS 协议,Modbus 可选)
PB10 光耦输入 IN_1(雷达融合/复位,上拉输入,低有效)

单继电器架构(V4B 双路 → 154Pro 单路),光耦输入做雷达融合而非第二线圈。

3. 频率测量(周期累积法,V4B 血统 + 2^19 基数)

  • 定时器:TMR0 输入捕获 FallEdge_To_FallEdge(下降沿到下降沿),TMR0_CAPGetData() 直接给出相邻下降沿周期 Xn
  • 学习:CapCnt > 200(上电/换频后等振荡稳定)→ LPCNT = MEASUREMENT_BASE / Xn,异常保护 lpcnt==0 || >65535 → 100
  • 测量:累积 LPCNT 个周期 → Value = CapSum(≈ MEASUREMENT_BASE),CAP_OK=1
  • 第一个测量窗直接作为基线 Origin(不等 IIR
// TMR0_IRQHandler 核心
loop1_Xn = (uint16_t)TMR0_CAPGetData();          // 相邻下降沿周期
if (loop1_INI_LOOP) {
    if (loop1_LPCNT == 0) {
        if (loop1_CapCnt > 200) {                 // 振荡稳定等待
            uint32_t lpcnt = (uint32_t)MEASUREMENT_BASE / loop1_Xn;
            if (lpcnt == 0 || lpcnt > 65535) lpcnt = 100;  // 异常保护
            loop1_LPCNT = (uint16_t)lpcnt;
        }
    } else {
        loop1_CapSum += loop1_Xn;
        if (loop1_CapCnt >= loop1_LPCNT) {
            loop1_CAPVD = loop1_CapSum;           // 一次测量窗
            loop1_Origin = loop1_CAPVD;           // 首个窗直接基线
            loop1_INI_LOOP = 0;
        }
    }
} else {
    loop1_CapSum += loop1_Xn;
    if (loop1_CapCnt >= loop1_LPCNT) {
        loop1_Value = loop1_CapSum;               // 正常运行
        loop1_CAP_OK = 1;
        ...
    }
}
  • 归一化基数 524288 (2^19)60MHz → 测量窗 8.74ms(代码注释明确)
  • 相对 DLD154V4B:基数 131072→524288(×4),是跨芯片重写重定标的又一实例(M1H 系 32768 → V4B 131072 → 154Pro 524288 三代三基数)

4. 滤波(IIR + 斜率限幅)

// vd1_task 第 1 步:斜率限幅后一阶 IIR
raw_delta = loop1_Value - loop1_CAPVD;
max_step  = loop1_CAPVD * MAX_SLOPE_RATE / 100;   // 5% 单次最大变化
if (max_step < 100) max_step = 100;                // 下限保护
clamped_value = loop1_CAPVD + clamp(raw_delta);
loop1_CAPVD = get_flt_value(clamped_value, loop1_CAPVD);  // IIR a=Flt_Reg/256=79/256
  • Flt_Reg = ALFA_CAP1 = 79(固定,无 64 档),α ≈ 0.31
  • 斜率限幅 5%MAX_SLOPE_RATE=5,拒绝 EMI 瞬态尖峰)——与 V4B 同源

稳定期快速收敛

if (!g_loop_stable) {
    loop1_CAPVD = loop1_Value;                     // 绕过 IIR/斜率限幅
    update_moving_average(..., 100);               // 100 窗滑动平均基线
    if (++loop1_stable_cnt >= STABLE_SAMPLES)      // 128 窗 (~1.1s)
        g_loop_stable = 1;
    return;
}

5. 基线(500 窗滑动平均 + 冻结保护双条件)

if (!loop1_VD_FLAG) {                              // 无车才跟踪(有车冻结)
    loop1_dlt_ORG = (Origin * sens_in) >> 16;
    dev = CAPVD - Origin;
    if (dev < dlt_ORG * 4) {
        update_moving_average(&Origin, CAPVD, WINDOW_ORIGIN);  // 500 窗
    } else {
        // CAPVD 异常偏高: 冻结, 超时 + 稳定性双条件强制更新
        if (drift > freeze_ref * FREEZE_STABILITY_RATE / 100) { // ±2% 漂移则重置计时
            loop1_freeze_cnt = 0; loop1_freeze_ref = CAPVD;
        }
        loop1_freeze_cnt++;
        if (loop1_freeze_cnt >= FREEZE_TIMEOUT) {  // 1000 窗 ~8.7s
            loop1_Origin = loop1_CAPVD;            // 确认稳定的新常态
            ...
        }
    }
}
  • 窗口 500WINDOW_ORIGINuint16_t——注释明确警示 uint8_t 会截断 500>255
  • 冻结保护:dev ≥ 4×dlt_ORG 暂停跟踪;超时(8.7s)+ 稳定性(±2%)双条件才强制更新基线(与 V4B 同源)

5.1 时序速查(60MHz 实测配置,非假设)

公式
捕获方式 下降沿到下降沿 TMR0_CapInit(FallEdge)
测量节拍CAPVD 更新) 8.74 ms 524288 / 60MHz
基线更新周期 4.37 s 500 窗 × 8.74ms
IIR τ 28.3 ms(注释 ~24ms 8.74ms × 256/79
稳定期 1.12 s 128 窗 × 8.74ms
冻结超时 8.74 s 1000 窗
进入确认 26.2 ms 3 窗
时序 tick / 状态机节拍 5ms / 50ms TMR1=FREQ_SYS/200TM1cnt≥10
脉冲宽度 500 ms IN_DELAY/PLUSE_DELAY=10 × 50ms
看门狗 558ms 超时 / 500ms 喂 WWDGg_wdg_counter≥100

6. 判据与灵敏度

// 无车: 进入确认 ENTRY_CONFIRM=3 次连续低于阈值
loop1_dlt_ORG = (Origin * sens[g_freq_sens].sens_in) >> 16;
if (CAPVD < Origin - dlt_ORG) {
    loop1_entry_cnt++;
    if (loop1_entry_cnt >= ENTRY_CONFIRM) { loop1_VD_FLAG=1; ... }
}

// 有车: USE_FLATNESS_EXIT=1 时平坦性三条件 (V4B 同款, K1=K2=8, 下限 18/7, 确认 3)
//        当前 V3.05: #define USE_FLATNESS_EXIT 被注释 → 走 #else 简单滞回
loop1_dlt_ORG = (Origin * sens[g_freq_sens].sens_out) >> 16;
if (Origin - dlt_ORG < CAPVD) {
    if (++loop1_cnt_release >= 3) loop_release_common();  // 3 次防抖
}

重要:V3.05 实际走"简单滞回 + 3 次防抖离开"。平坦性三条件(专利 CN200910309382)代码完整保留但被 // #define USE_FLATNESS_EXIT 编译开关禁用——与 DLD154V4B 的离开算法不一致,别想当然认为移植就全继承。

灵敏度表(出厂默认,运行时以 g_loop_sens_list 为准,BLE 可改)

档位 index 进入表 SensTable Δf/f 进入 离开表 SensTable1 Δf/f 离开
0 108 0.165% 81 0.124%
1(出厂默认) 54 0.082% 32 0.049%
2 28 0.043% 16 0.024%
3 14 0.021% 12 0.018%
  • 出厂默认 loop_cng_default[7]={2,1,0,0x00,4,0,0} → sensitvity=2 → g_freq_sens=1(表值 54/32
  • 最灵敏档 0.021% 比 V4B (0.031%) 更灵敏——154Pro 定位高灵敏度场景
  • 灵敏度表可经 BLE 0x24 改写(g_loop_sens_list 存 Flash),V4B 是编译期常量——154Pro 首次引入运行时可配灵敏度表

7. 状态机与输出

捕获中断(TMR0) → Xn → 累积 LPCNT 个 → Value/CAP_OK
        ↓ 主循环 CAP_OK8.74ms
vd1_task:斜率限幅 → IIR → 稳定期/基线 → 进入确认/离开 → VD_FLAG/FLAG_OUT
        ↓ 5ms 时序中断 (TMR1) / 50ms 节拍
FLAG_OUT 延迟 g_loop_out_delay(=delay_time×2×50ms) → FLAG_PLUSE(500ms)
FLAG_IN  → FLAG_PLUSE_IN(500ms 进入脉冲, output_mode=1 时)
RLY1 = 存在输出(7 种融合模式) / 进入脉冲 / 离开脉冲
  • 输出融合 7 模式direction_mode 低 4 位,skill 有记录勿与 110S 混用): 0=地感∨雷达 / 1=人车混行(3s 防砸窗口)/ 2=ETC(500ms 防抖)/ 3=地感∧雷达 / 4=纯地感 / 5=纯雷达(3 样本多数表决)/ 6=光耦复位(≥400ms 低+上升沿复位)
  • 光耦防抖:3 样本多数表决(6 次注释为遗留)
  • 输出方式 output_mode0=存在(融合)/ 1=进入脉冲 / 2=离开脉冲
  • RS485 双协议:g_fm_700bs_disable=0 → 700BS=1 → Modbus RTUMB_MAX_READ_REGS=40 已修)

8. 异常处理

场景 处理
线圈断开 LOOP_OK=0 → FLAG_CUT=1、断开计数 g_loop_cut_amount++g_loop_cut_last 边沿记忆)、继电器释放、不丢 VD_FLAG(重连恢复有车态)
断开重连 200ms 等待起振 → CAPVD=0 直锁首个样本快速收敛 → 丢弃断开期间过期数据 → Origin 丢失防御全复位
有限存在超时 exist_mode>0 时进入置 VD_HOLDg_hold_time=exist_mode×5s 超时 → FLAG_HOLD_TIMEOUT → 主循环 INIT_VD 全复位重建基线
安全复位 loopSafe_Timeout>0 时进入置 LC_HOLDg_safe_max_cnt=loopSafe_Timeout×1s 超时 → 重新初始化测量重建基线(对齐 M1H)
看门狗 WWDG 558ms,主循环 500ms 喂(poll_wdg
参数存储 para_store_init 读 Flash;魔数 0x33BB C33C 不符 → 恢复出厂 + 复位(factory_dev 写入出厂参数)
上电 稳定期 128 窗(LEDA 200ms 慢闪自检)→ 稳定后检测

9. 参数速查

参数
归一化基数 524288 (2^19)
测量节拍 8.74 ms60MHz 实测配置)
基线窗口 500(有车冻结 + 超时/稳定性双条件)
IIR 系数 79+ 斜率限幅 5%
进入/离开表 {108,54,28,14} / {81,32,16,12}(运行时可配)
档位 Δf/f 0.165%~0.021%(进入)、0.124%~0.018%(离开)
时序 tick 5ms / 状态机 50ms
看门狗 WWDG 558ms / 500ms 喂
有限存在 / 安全复位 exist_mode×5s / loopSafe_Timeout×1s
输出 RLY1 单继电器(7 模式融合)+ 呼吸灯
BLE 0x24 查询响应 8B + 3B LE LOOP_MEASURE_BASE(偏移 8-10

10. 移植注意 / 血统关系

  • 同源判定(DLD154V4B → DLD154Pro:文件头明示"算法移植自 DLD154V4B TaskLoop V2.0"IIR 79/斜率限幅 5%/稳定期 128 窗/500 窗基线/冻结双条件/进入 3 次确认全部继承
  • 差异点(154Pro 相对 V4B 的独立改动)
    1. 归一化基数 131072→524288(×4)——跨芯片重写重定标,60MHz 下测量窗 8.74ms(与 V4B 10ms 任务节拍同量级)
    2. 离开判定降级:平坦性三条件被 USE_FLATNESS_EXIT 编译开关禁用 → 简单滞回 3 次防抖(V4B 用专利三条件)——移植≠全继承,务必看编译开关
    3. 灵敏度表运行时可配(BLE 写 Flash)vs V4B 编译期常量;档位全重标且最灵敏档提升到 0.021%
    4. 双继电器 → 单继电器 + 光耦输入(7 种雷达融合模式,含人车混行 3s 防砸/ETC 500ms 防抖/光耦复位)
    5. 新增 RS485 双协议(700BS + Modbus RTU)、BLE 上报(variation/LOOP_MEASURE_BASE 3B LE
    6. 有限存在/安全复位改为参数可配(V4B 编译期常量)
    7. MCUAT32F421 (M4, FreeRTOS) → CH59x (RISC-V, TMOS) —— 从带 RTOS 变成裸机+BLE 协议栈
  • 与 M1H:同源链 M1H → V4B → 154Pro,但基数三代三变(32768/131072/524288),任何跨型号换算必须先按各自 BASE 归一化
  • 与 PD132 系:同路不同源(周期累积法范式相同,细节独立)