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

229 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 | 单芯片 SoC28K 固件分区),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.0**M1H 精简系),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
```c
// 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 + 斜率限幅)
```c
// 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 同源
### 稳定期快速收敛
```c
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 窗滑动平均 + 冻结保护双条件)
```c
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; // 确认稳定的新常态
...
}
}
}
```
- 窗口 **500**WINDOW_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. 判据与灵敏度
```c
// 无车: 进入确认 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_HOLD`g_hold_time=exist_mode×5s` 超时 → FLAG_HOLD_TIMEOUT → 主循环 INIT_VD 全复位重建基线 |
| 安全复位 | loopSafe_Timeout>0 时进入置 LC_HOLD`g_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 ms**60MHz 实测配置) |
| 基线窗口 | 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 系**:同路不同源(周期累积法范式相同,细节独立)