commit 694c86ba48467e70143dd5af5757cdffb3bdb2d8 Author: wangfq Date: Thu Aug 27 17:55:28 2026 +0800 feat(vd-analysis): 车检器分析仓库初始化 + PD132L/PD132T 分析 - README: 仓库说明 + 型号索引 + 新增型号流程 - docs/methodology.md: 参考代码分析方法论模板 (10 节) - docs/cross-model-comparison.md: PD132L vs PD132T 对比总表 - models/PD132L/analysis.md: STM8S003F3 V1.09 完整分析 - models/PD132T/analysis.md: MA801AS V3.01 完整分析 (L 的 8051 移植版) 核心结论: 两型号检测算法逐行对应 (32768 基数/79·64 IIR/100 基线/ {300,60,32,21} 灵敏度表), 差异在平台(PCA vs TIM1)/Xn窗口(1.27×)/ 拨码编码(组合位 vs 直接)/看门狗(WDTCR vs IWDG+WWDG) diff --git a/README.md b/README.md new file mode 100644 index 0000000..b259601 --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +# vd-analysis 车检器分析仓库 + +车检器参考代码/逆向分析的分类归档库。原始代码散落在 `vd_detector/reference/`,本仓库只放**分析结论**(算法拆解、参数表、跨型号对比、移植注意事项)。 + +## 型号索引 + +| 型号 | 平台 | 固件版本 | 分析文档 | 原始代码 | +|------|------|---------|---------|---------| +| PD132L | STM8S003F3 (IAR) | V1.09 (2020-04) | [models/PD132L/analysis.md](models/PD132L/analysis.md) | `reference/PD132L_V1.09-STM8_20200422` | +| PD132T | MA801AS / 8051 (Keil) | V3.01 (2021-06) | [models/PD132T/analysis.md](models/PD132T/analysis.md) | `reference/PD132T_V3.01-20210623` | +| M1H | STC12C5202 (8051) | — | 待归档 | `reference/M1H code` | +| TLD-110 | P87LPC762 (8051) | — | 待归档 | `reference/TLD-110(410) code` | + +## 目录结构 + +``` +vd-analysis/ +├── README.md # 本索引 +├── docs/ +│ ├── methodology.md # 参考代码分析方法论(新车型分析模板) +│ └── cross-model-comparison.md# 跨型号参数对比总表 +├── models/ +│ ├── <型号>/ +│ │ └── analysis.md # 单型号分析(平台/硬件/算法/参数/移植注意) +│ └── ... +└── tools/ # 分析辅助脚本(预留) +``` + +## 分析新增型号流程 + +1. 原始代码放 `vd_detector/reference/<型号>_<版本>_<日期>/`(不入本仓库) +2. 按 `docs/methodology.md` 模板拆解,写 `models/<型号>/analysis.md` +3. 更新 `docs/cross-model-comparison.md` 对比总表 +4. 更新本 README 型号索引 +5. 提交推送(`vd-analysis` 仓库) diff --git a/docs/cross-model-comparison.md b/docs/cross-model-comparison.md new file mode 100644 index 0000000..66b6703 --- /dev/null +++ b/docs/cross-model-comparison.md @@ -0,0 +1,50 @@ +# 跨型号参数对比总表 + +各型号参考代码的核心参数横向对比。**数值量纲以各型号归一化基数为准,横向比较必须先换算口径**(Δf/f = 表值/基数)。 + +## 参与型号 + +| 型号 | 平台 | 版本 | 文档 | +|------|------|------|------| +| PD132L | STM8S003F3 | V1.09 | [models/PD132L/analysis.md](../models/PD132L/analysis.md) | +| PD132T | MA801AS (8051) | V3.01 | [models/PD132T/analysis.md](../models/PD132T/analysis.md) | +| M1H | STC12C5202 (8051) | — | 待归档 | +| TLD-110 | P87LPC762 (8051) | — | 待归档 | + +## PD132L vs PD132T(2026-08-27 首版) + +| 维度 | PD132L (STM8) | PD132T (MA801) | 差异说明 | +|------|--------------|----------------|---------| +| MCU/工具链 | STM8S003F3 / IAR | MA801AS / Keil C51 | 移植关系(T 文件头明示) | +| 捕获外设 | TIM1 输入捕获 (PSC=9 ÷10) | PCA (Timer0 重装252 ÷4) | 平台差异 | +| **归一化基数** | **32768 (2^15)** | 32768 | 相同 | +| Xn 有效窗口 | 320 ~ 1620 | 406 ~ 2050 | ≈1.27×(捕获时钟比) | +| IIR 系数 | 79 / 64 | 79 / 64 | 相同 | +| 基线窗口 | 100 | 100 | 相同 | +| 进入判据 | CAPVD < Origin−dlt | 同 | 相同 | +| 离开判据 | CAPVD > Origin−dlt(SET_ASB 选档/固定最高档) | 同 | 相同 | +| 灵敏度表 | {300,60,32,21}/{60,32,21,14} | 同 | **完全相同** | +| tick / 主逻辑 | 5ms / 50ms | 5ms / 50ms | 相同 | +| 脉冲宽 | 500ms | 500ms | 相同 | +| 有限存在 | 300s (HOLD_TIME=6000) | 300s | 相同 | +| 灵敏度拨码 | SA1/SA2 组合位 (0x0C) | P1.0-1 直接 0~3 | **编码方式不同** | +| 功能开关位 | 高位分布 + SW0 | 低位 P1.2-5,无 SW0 | 位序不同 | +| 看门狗 | IWDG 1.02s + WWDG | WDTCR 1.05s | 平台差异 | +| 复位触发 | WWDG_CR 写序列 | ISPCR=0x20 | 平台差异 | +| LED | 单(LEDA) | 双(DET+PWR) | T 多电源灯 | +| 继电器 | PD4/PD3 | P1.6/P1.7 | 引脚不同,功能同 | +| 上电延时 | 800ms | 750ms | 略差 | +| UART | 有(未启用) | 无 | — | + +## 跨型号通用结论 + +1. **灵敏度表不能照搬数值**:PD132 的 {300,60,32,21} 是 32768 基数的绝对计数;DLD 系 {216,108,36,10}/{108,54,28,14} 是 65536 基数。换算 Δf/f 后再比较:PD132 SENS=0 ≈ 0.92% vs DLD154V4B SENS=0 ≈ 0.33%——PD132 最低档更不灵敏。 +2. **离开阈值语义**:PD132 默认固定最高档(SensTable1[3]),DLD 系用当前档滞回——两种设计哲学。 +3. **Xn 窗口跨平台按捕获时钟缩放**:PD132L→T 是 1.27 倍,移植必须重算。 +4. **拨码编码随硬件重排**:组合位(SA1/SA2 → 0x0C 位)vs 直接编码(P1.0-1 → 0~3)。 + +## 待补型号 + +- [ ] M1H(STC12C5202, 8051, C 语言, 2008) +- [ ] TLD-110(P87LPC762, 8051, 汇编, 2003-2006) +- [ ] 其他新参考代码 diff --git a/docs/methodology.md b/docs/methodology.md new file mode 100644 index 0000000..61f407d --- /dev/null +++ b/docs/methodology.md @@ -0,0 +1,87 @@ +# 车检器参考代码分析方法论 + +拿到一份新车型参考代码时的标准拆解流程。按此模板逐节分析,保证各型号文档结构一致、可横向对比。 + +## 0. 平台识别(先做,决定后续所有数值解读) + +| 检查项 | 方法 | +|--------|------| +| MCU 型号 | 头文件/工程名(如 `iostm8s003f3.h`、`REG_MA801.H`) | +| 工具链 | 工程文件类型:`.ewp`=IAR、`.uvproj`=Keil、`.uvprojx`=Keil5、`.mpy`=MounRiver 等 | +| 架构 | 8051(`.A51` 启动)/ STM8 / Cortex-M / RISC-V | +| 主频/时钟 | 晶振配置代码(`CLK_SWR`/`OSCCON` 等)、PLL 设置 | +| 代码规模 | 核心文件行数、有无 UART/协议 | + +## 1. 硬件资源 + +- 引脚分配:线圈捕获脚、继电器、LED、拨码、通信口 +- 线圈调频:电容档(FLEVEL 引脚、档位数、电容值——**以实测反推为准,代码注释可能过时**) +- 看门狗:类型(IWDG/WWDG/WDTCR)、超时时间、喂狗位置 + +## 2. 频率测量(核心第一步) + +| 检查项 | 关注点 | +|--------|--------| +| 捕获外设 | TIM 输入捕获 / PCA / 门控计数 / 外部中断计时 | +| 捕获边沿 | 上升/下降/双边沿,周期法还是频率法 | +| 时钟分频 | PSC 值、捕获时钟 = 主频/分频 | +| 周期有效性窗口 | Xn 上下限(对应频率范围)——**跨平台移植必须按捕获时钟比例缩放** | +| 归一化 | LPCNT = BASE/Xn?BASE 是多少(32768/131072/524288…)→ 决定灵敏度表量纲 | + +## 3. 滤波 + +- IIR 系数(如 `ALFA_CAP1=79` → α=79/256≈0.31) +- 多档滤波(增强滤波开关切换系数) +- 滤波生效位置(CAPVD 还是 Value) + +## 4. 基线跟踪 + +- 滑动平均窗口(100/500…)、更新节拍 +- 有车冻结逻辑、冻结超时/稳定期检查 +- 上电稳定期(STABLE_SAMPLES、绕过滤波) + +## 5. 检测判据 + +- 进入:`CAPVD < Origin − dlt`?(负向/正向) +- 离开:滞回表选择(当前档 / 固定最高档) +- 平坦性/确认机制(连续 N 次) +- 斜率限幅/防抖 + +## 6. 灵敏度表 + +- 表值 + 归一化基数 → 换算 Δf/f 和 ΔL/L(**口径必须标注**:`Δf/f = SensTable/BASE`,`ΔL/L ≈ −2×`) +- 档位数、默认档、拨码映射 +- ⚠ 跨型号照搬灵敏度表 = 基数不同量纲错位(如 PD132 32768 基数的 {300,60,32,21} 不能直接对到 65536 基数的产品) + +## 7. 状态机与时序 + +- 进入/离开/脉冲标志转移(FLAG_IN→IN_PLUSE→FLAG_OUT→FLAG_PLUSE) +- tick 时长(5ms/10ms/50ms)、脉冲宽度、延时参数 +- 有限存在(HOLD)超时行为 + +## 8. 异常处理 + +- 线圈断开检测(RF_FLAG/Xn 窗口失败)→ 继电器/指示灯行为 +- 看门狗复位触发源(超时/灵敏度变化/断开) +- 上电自检流程 + +## 9. 参数速查表(输出格式) + +| 参数 | 值 | 说明 | +|------|-----|------| +| 归一化基数 | | | +| 捕获时钟 | | | +| 测量窗 | | | +| IIR 系数 | | | +| 基线窗口 | | | +| 灵敏度表 | | | +| tick/脉冲 | | | +| 看门狗 | | | + +## 10. 移植注意事项(跨型号/跨平台) + +1. **Xn 窗口按捕获时钟缩放**(PD132L 320-1620 vs PD132T 406-2050 ≈ 1.27 倍) +2. **灵敏度表按归一化基数换算**,禁止照搬数值 +3. **电容档以实测反推为准**(代码注释可能错) +4. 拨码编码位序各型号不同(组合位 vs 直接编码),移植时按硬件重排 +5. 看门狗/复位方式随平台变化(WWDG 写序列 vs ISPCR) diff --git a/models/PD132L/analysis.md b/models/PD132L/analysis.md new file mode 100644 index 0000000..6c2db9f --- /dev/null +++ b/models/PD132L/analysis.md @@ -0,0 +1,106 @@ +# PD132L 车检器分析 + +> 型号: PD132L | 固件: V1.09 | 日期: 2020-04-22 | 平台: **STM8S003F3P6** (IAR EWSTM8) +> 原始代码: `vd_detector/reference/PD132L_V1.09-STM8_20200422/`(MAIN.c 579 行 + uart.c) + +## 1. 平台与工程 + +| 项 | 值 | +|----|-----| +| MCU | STM8S003F3P6(8 位, 16KB Flash) | +| 工具链 | IAR EWSTM8(`.ewp`/`.eww`/`.ewd`) | +| 时钟 | 外部晶振(`CLK_SWR=0xB4`,注释 12MHz),无分频 | +| 看门狗 | **IWDG**(PR=6, RLR=0xFF → ~1.02s)+ **WWDG**(窗口,事件触发软复位) | +| 调试 | UART1 输出代码存在(`INIT_UART()` 被注释,未启用) | + +## 2. 硬件资源 + +| 引脚 | 功能 | +|------|------| +| PC3 | LP 线圈捕获(TIM1_CC3 输入,下降沿) | +| PD4 | RLY1 存在继电器(低有效) | +| PD3 | RLY2 脉冲继电器(低有效) | +| PB5 | LEDA 存在指示灯(低有效点亮) | +| PA3 / PD2 | SA1 / SA2 灵敏度拨码 | +| PC4 / PC5 / PC6 | SW3 / SW2 / SW1 功能拨码 | +| PD5 | SW0 功能拨码 | +| PB4 / PD6 | 扩展/预留输出 | + +## 3. 检测算法 + +### 3.1 频率测量 + +- TIM1 输入捕获(CCR3),下降沿→下降沿测周期;PSC=0x0009 → 捕获时钟 ÷10 +- 每周期得 `Xn`;有效性窗口 **320 < Xn < 1620**(超出判线圈断开/异常) +- 归一化:`LPCNT = 32768 / Xn`(**BASE = 2^15**),累加 LPCNT 个周期得 `Value/CAPVD ≈ 32768` + +### 3.2 滤波 + +- IIR:`Flt_Reg = 79`(增强滤波拨码开)/ `64`(关),`Δ×Flt_Reg>>8` 双向(升/降分支) +- 滤波作用于 CAPVD(每 CAP_OK 节拍) + +### 3.3 基线 + +- 无车时 100 次滑动平均:`ORG_CNT==99 → Origin = ORG_SUM/100` +- 有车冻结(`!VD_FLAG` 才更新) + +### 3.4 进入/离开 + +- 进入:`CAPVD < Origin − dlt_ORG`,`dlt_ORG = Origin×SensTable[SensLevel]>>16`;置 `VD_FLAG/FLAG_IN` +- 离开:`CAPVD > Origin − dlt_ORG`,`dlt_ORG = Origin×SensTable1[...]>>16`;SET_ASB=1 用当前档,否则**固定最高档 SensTable1[3]** + +### 3.5 灵敏度表 + +``` +SensTable[4] = {300, 60, 32, 21} // 进入 +SensTable1[4] = { 60, 32, 21, 14} // 离开(滞回) +``` + +- 归一化基数 32768 → 进入阈值 Δf/f = 300/32768≈**0.92%** … 21/32768≈**0.064%** +- 档位:SENS=0~3(拨码 SA1/SA2 组合 0x00/0x04/0x08/0x0C 映射) + +### 3.6 状态机/时序 + +- TIM2 5ms tick → 50ms 主节拍(TM1cnt≥10) +- FLAG_IN → FLAG_IN_PLUSE(进入脉冲 500ms = 10 tick)→ FLAG_OUT → FLAG_PLUSE(离开脉冲 500ms) +- 有限存在:`HOLD_TIME = 5×1200 = 6000 tick = 300s` 超时 → WWDG 复位继电器 +- 线圈断开:RF_FLAG 检测失败 → LOOP_OK=0 → 继电器断开 + LED 快闪(6 次×200ms) + +## 4. 拨码与配置 + +| 位 | 开关 | 含义 | +|----|------|------| +| swok&0x80 | SET_ASB | 离开阈值自动(用当前档)/手动(固定最高档) | +| swok&0x40 | SET_FLT | 增强滤波(79/64) | +| swok&0x20 | SET_PLUS | 脉冲输出模式(继电器2=进入脉冲) | +| swok&0x10 | SET_HOLD | 有限存在 | +| swok&0x0C | SA1/SA2 | 灵敏度 0~3 | + +去抖:连续 6 次读取一致才生效;灵敏度变化 → WWDG 复位("灵敏档拨开重新改档位") + +## 5. 参数速查表 + +| 参数 | 值 | +|------|-----| +| 归一化基数 | 32768 (2^15) | +| Xn 有效窗口 | 320 ~ 1620 | +| IIR 系数 | 79 / 64 | +| 基线窗口 | 100 | +| 灵敏度表 | {300,60,32,21} / {60,32,21,14} | +| tick | 5ms → 主逻辑 50ms | +| 脉冲宽 | 500ms | +| 有限存在 | 300s | +| 看门狗 | IWDG 1.02s + WWDG | +| 上电延时 | 800ms | + +## 6. 版本特性 + +- V1.01: STM8 移植,"功能与 132T 一样" +- V1.03: 微调,"无存在改为 5 分钟" +- V1.09: 线圈断开时线圈上电继电器断开 + +## 7. 移植注意事项 + +1. BASE=2^15=32768 → 灵敏度表量纲与 131072/524288 基数的产品不同,**照搬数值会错 4~16 倍** +2. Xn 窗口随捕获时钟定标,换 MCU 必须重算 +3. 离开阈值"固定最高档"语义(SET_ASB 关)与 DLD 系"当前档滞回"不同 diff --git a/models/PD132T/analysis.md b/models/PD132T/analysis.md new file mode 100644 index 0000000..2f310ca --- /dev/null +++ b/models/PD132T/analysis.md @@ -0,0 +1,89 @@ +# PD132T 车检器分析 + +> 型号: PD132T | 固件: V3.01 | 日期: 2021-06-23 | 平台: **MA801AS**(8051 内核, Keil C51) +> 原始代码: `vd_detector/reference/PD132T_V3.01-20210623/`(USER/main.c 458 行) +> 说明: 文件头明确"**实现与 PD132L_V1.09 一样的功能**"——PD132L 的 8051 移植版,核心算法逐行对应。 + +## 1. 平台与工程 + +| 项 | 值 | +|----|-----| +| MCU | MA801AS(泉州,8051 内核) | +| 工具链 | Keil C51(`.uvproj`,含 `STARTUP.A51`) | +| 时钟 | `AUXR=0xC0`(内部时钟相关);Timer0 8bit 自动重装 252 给 PCA 提供时钟(÷4) | +| 看门狗 | **WDTCR**(0x3C → ~1.05s);复位用 `ISPCR=0x20`(ISP 软复位) | +| 调试 | 无 UART | + +## 2. 硬件资源 + +| 引脚 | 功能 | +|------|------| +| PCA CEX1 | 线圈捕获(CCAPM1 下降沿 + 中断) | +| P1.6 | SOLA 继电器 A(脉冲/存在输出) | +| P1.7 | SOLB 继电器 B(存在输出) | +| P3.3 | LED_DET 检测指示灯 | +| P3.2 | LED_PWR 电源指示灯(**PD132L 没有**) | +| P1.0 / P1.1 | SENS0 / SENS1 灵敏度拨码(**直接编码 0~3**) | +| P1.2 | SENUP 自动/手动离开阈值(≈L 的 SET_ASB) | +| P1.3 | FLT 增强滤波 | +| P1.4 | PLUS 脉冲模式 | +| P1.5 | HOLD 有限存在 | + +## 3. 检测算法(与 PD132L 对应) + +### 3.1 频率测量 + +- PCA 捕获(CCAPM1=0x31 下降沿捕获 + 中断);Timer0 8bit 自动重装 252 作 PCA 时钟源(CMOD=0x04) +- 每周期得 `Xn`;有效性窗口 **406 < Xn < 2050**(≈ PD132L 的 1.27 倍,捕获时钟不同) +- 归一化:`LPCNT = 32768 / Xn`,累加得 CAPVD ≈ 32768 + +### 3.2 滤波 + +- IIR:`Flt_Reg = ALFA_CAP1(79)`(FLT 开)/ `ALFA_CAP2(64)`(关),`Δ×Flt_Reg>>8` 双向 + +### 3.3 基线 / 3.4 进入离开 / 3.5 灵敏度表 + +- 与 PD132L **完全一致**:100 次平均基线、`CAPVD < Origin−dlt` 进入、`> Origin−dlt` 离开(SET_ASB 语义同)、 + `SensTable {300,60,32,21} / SensTable1 {60,32,21,14}` 相同 + +### 3.6 状态机/时序 + +- Timer1 5ms tick → 50ms 主节拍(TM1cnt≥10),脉冲 500ms、有限存在 HOLD_TIME=6000(300s) +- 有限存在超时 → `ISPCR=0x20` 软复位(对应 L 的 WWDG 复位) +- 线圈断开 → 继电器全断 + LED 快闪 6 次 + +## 4. 拨码与配置 + +| 位 | 开关 | 含义 | +|----|------|------| +| swok bit2 (P1.2) | SENUP | 自动/手动离开阈值 | +| swok bit3 (P1.3) | FLT | 增强滤波 | +| swok bit4 (P1.4) | PLUS | 脉冲模式 | +| swok bit5 (P1.5) | HOLD | 有限存在 | +| swok bit0-1 (P1.0-1) | SENS0/1 | 灵敏度 **0~3 直接编码** | + +去抖:连续 6 次一致生效;灵敏度变化 → `ISPCR=0x20` 复位 + +## 5. 参数速查表 + +| 参数 | 值 | 对比 PD132L | +|------|-----|------------| +| 归一化基数 | 32768 | 相同 | +| Xn 有效窗口 | 406 ~ 2050 | ≈1.27× | +| IIR 系数 | 79 / 64 | 相同 | +| 基线窗口 | 100 | 相同 | +| 灵敏度表 | {300,60,32,21}/{60,32,21,14} | 相同 | +| tick | 5ms → 50ms | 相同 | +| 脉冲宽 | 500ms | 相同 | +| 有限存在 | 300s | 相同 | +| 看门狗 | WDTCR 1.05s | L=IWDG 1.02s+WWDG | +| 上电延时 | 750ms | L=800ms | + +## 6. 与 PD132L 的差异要点 + +1. 平台:STM8S003F3 → MA801AS(8051),TIM1 捕获 → PCA 捕获 +2. **Xn 窗口 406/320=1.27、2050/1620=1.27**:捕获时钟比例,频率范围设计一致 +3. 拨码:灵敏度 8 位组合(SA1/SA2)→ 6 位直接编码(P1.0-1);无 SW0 +4. LED:单 LED → 双 LED(+LED_PWR) +5. 看门狗/复位:IWDG+WWDG 写序列 → WDTCR + ISPCR=0x20 +6. 无 UART、无 IN_DELAY/OUT_DELAY 宏(L 定义但逻辑注释)