# PD136HA 车检器分析 > 型号: PD136HA | 固件: V3.14 | 日期: 2021-11-16 | 平台: **HC32F003C4**(小华半导体 HDSC, Cortex-M0+;**用户确认 2026-09-11**。此前文档记 HC32F005,系按 SDK 头文件名推断) > 原始代码: `vd_detector/reference/PD136HA_V3.14-20211116/`(工程名 **PD132L-HD**,含 user/main.c 应用层) > 血统: **PD132L 同源移植版**(文件头明示"硬件使用 PD132L_V1.02,替换软件版本 PD132LA_V1.06") > 交付对齐报告: `docs/pd136ha-to-dld154v4b-delivery-alignment.md`(PD136HA → DLD154V4B 替换评估,2026-09-11) > 双型号对比: `docs/pd132t-vs-pd136ha-comparison.md`(与 PD132T 同血统两代对比,2026-09-11) ## 1. 平台与工程 | 项 | 值 | |----|-----| | MCU | **HC32F003C4**(**用户确认 2026-09-11**)。⚠ 工程档位仍为 HC32F005C6PA(``)/ startup `hc32f005c6ua` / SDK 板头 C6PA —— 三者与实际器件不一致,**重编译前须在 Keil 改正器件档位**;实测固件 `Code=11148 RO=268 RW=88 ZI=608` ⇒ ROM≈11.1KB、RAM≈696B,F003(16KB/2KB) 与 F005(32KB/4KB) 均可容纳 ✓ | | 时钟 | **外部晶振 12MHz(用户确认 2026-09-11)**;`CLK_INIT()` 配 XTH(`XTH_CR \|= 0x07` 注释「8-16MHZ」)→ 直取 XTH、**无 PLL / 无 HCLK_PRS·PCLK_PRS 分频** ⇒ PCLK0 = 12MHz,并关内部 RCH。⚠ `board_stkhc32f005.h` 的 `SYSTEM_XTH = 32MHz` 是 **STK demo 板**常量,本产品不用 | | 工具链 | Keil MDK(uvprojx,JLink) | | 工程名 | **PD132L-HD**(直接沿用 PD132 工程名,Author=YSHE) | | 版本史 | V3.11 (2021-03-03) → V3.12 → V3.13 → V3.14 (2021-11-16) | | V3.14 变更 | ① 去掉线圈环路小 LED 指示 ② 基线累计次数 99→255 ③ 灵敏度调整 ④ 延时档位 0/0.6/1.6/3s | | 代码规模 | main.c 832 行(CRLF/ASCII)+ 华大 SDK 驱动层 | ## 2. 硬件与 IO | 引脚 | 功能 | |------|------| | P23 (AF3) | TIM4_CHA 捕获输入(**线圈频率入口**) | | P33 | RLY2 继电器(**存在输出** VD_FLAG) | | P34 | RLY1 继电器(**脉冲输出**:PLUS 模式=存在\|离开,非 PLUS=离开脉冲) | | P15 | LEDA(有车指示/上电自检闪烁) | | P35/P26/P25/P24 | DIP5-8 拨码(延时 2bit / 脉冲模式 / 存在保持) | | P03/P32 | DIP9-10 拨码(灵敏度 2bit) | | P01/P02 | 模拟口(XTH 晶振通道) | **双继电器架构**(存在 + 脉冲分离),比 PD132L 多一路输出。 ## 3. 频率测量(周期累积法,与 PD132L 同框架) - 定时器:**ADTIM4**,PCLK0/8 预分频,锯齿波 0xFFFF,CHA **上升沿捕获** - 中断:`loop1_Xn = CapThis - CapLast`(相邻上升沿计数差 = 振荡周期) - 学习:`CapCnt > 100` 后 `loop1_LPCNT = 32768 / loop1_Xn`(**归一化基数 32768,与 PD132L/M1H 一致**) - 测量:累积 `LPCNT` 个周期得 `CAPVD = CapSum`(周期域自适应归一化) ```c // Tim4_IRQHandler 核心 loop1_Xn = Cap.loop1_CapThis - loop1_CapLast; // 周期 loop1_CapCnt++; if (loop1_INI_LOOP) { if (loop1_LPCNT == 0) { if (loop1_CapCnt > 100) { loop1_LPCNT = 32768 / loop1_Xn; // 基数 32768 if (loop1_LPCNT == 0) loop1_LPCNT = 1; ... } } else { loop1_CapSum += loop1_Xn; if (loop1_CapCnt >= loop1_LPCNT) { loop1_CAPVD = loop1_CapSum; // 一次测量窗 loop1_Origin = loop1_CAPVD; // 初始基线 loop1_INI_LOOP = 0; } } } ``` - Xn 有效范围检查(`Xn>400 && Xn<2030`)已被注释——**V3.14 去掉环路指示 LED 时一并禁用**,当前无频率范围过滤 - 时钟:PCLK0 = XTH = **12MHz(用户确认,已落定)** → 捕获时钟 = `AdtClkPClk0Div8` = **1.5MHz ✅**(原先的 `Delay_ms` 注释 `//12MHZ????` 问号已消除) ## 4. 滤波(IIR) ```c // VD1_TASK 中:一次指数滤波 loop1_Flt = (loop1_Value - loop1_CAPVD); // 方向取绝对值 loop1_Flt = ((INT32U)loop1_Flt * Flt_Reg) >> 8; loop1_Flt = loop1_Flt + loop1_CAPVD; ``` - 系数 `Flt_Reg`:INIT_VD 置 `ALFA_CAP1=79`,但主循环每次 CAP_OK 强制 `Flt_Reg = ALFA_CAP2 = 64`(SET_FLT 分支已注释) - **实际生效 α = 64/256 = 0.25**;79/64 双系数与 PD132L 同源 ## 5. 基线 ```c if (!loop1_VD_FLAG) { // 仅无车时更新(有车冻结) loop1_ORG_SUM += loop1_CAPVD; if (loop1_ORG_CNT == 255) { // V3.14: 99 -> 255 loop1_Origin = loop1_ORG_SUM >> 8; // 256 次滑动平均(2^8) loop1_ORG_CNT = 0; loop1_ORG_SUM = 0; } else loop1_ORG_CNT++; } ``` - **256 次滑动平均**(V3.14 从 99 改 255,`>>8` 即均值)——比 PD132L 的 100 次窗口更慢更稳 - 有车冻结基线(与 PD132L 一致) ### 5.1 时序速查(12MHz 晶振已确认) | 项 | 值 | 公式 | |----|-----|------| | 捕获时钟 | 1.5 MHz | PCLK0/8(ADTIM4 Div8) | | **测量节拍**(CAPVD 更新) | **21.8 ms** | 32768 / 1.5MHz | | **基线更新周期** | **5.59 s** | 256 窗 × 21.8ms | | **IIR τ** | **87.4 ms** | 21.8ms × 256/64 | | 时序 tick | 5ms(注释,ARR=0xF159 反推需 12.36MHz 计数时钟,**待验证**) | TIM1 PRS=4 | | 状态机节拍 | 50ms | TM1cnt≥10 | | 喂狗周期 | 300ms | Delay_300ms_cnt≥60 | > ⚠ TIM1 ARR=0xF159(61785) 与"5ms"注释矛盾:12MHz/16=750kHz 时 tick=82.4ms。代码逻辑按 5ms 自洽(60 tick=300ms、10 tick=50ms),绝对时间待现场示波器验证。 ## 6. 判据与灵敏度 ```c // 进入(无车时):CAPVD 下穿 Origin-dlt_ORG loop1_dlt_ORG = (Origin * SensTable[SensLevel]) >> 16; if (CAPVD < Origin - dlt_ORG) { VD_FLAG=1; FLAG_IN=1; ... } // 离开(有车时):CAPVD 回升越 Origin-dlt_ORG(离开表) loop1_dlt_ORG = (Origin * SensTable1[SensLevel]) >> 16; if (Origin - dlt_ORG < CAPVD) { VD_FLAG=0; FLAG_OUT=1; ... } ``` - **单次判定,无进入/离开去抖计数**(PD132L 的 IN_DELAY/OUT_DELAY 计数被注释掉)——PD136HA 判定更快但抗扰弱 - 滞回:进入用 SensTable,离开用 SensTable1(离开表更小 → 需恢复更多 → 滞回) ### 灵敏度表(× Origin >> 16,相对阈值 = 表值/65536) | SensLevel | DIP(SENS) | 进入表 SensTable | Δf/f 进入 | 离开表 SensTable1 | Δf/f 离开 | |-----------|-----------|-----------------|-----------|-------------------|-----------| | 0 | 0x00 | 162 | 0.247% | 81 | 0.124% | | 1 | 0x20 | 81 | 0.124% | 54 | 0.082% | | 2 | 0x10 | 54 | 0.082% | 32 | 0.049% | | 3(默认) | 0x30 | 28 | 0.043% | 18 | 0.027% | - 注释历史:`{300,162,81,40}` → `{216,108,54,26}` → `{300,162,81,40}/{108,54,32,18}` → 当前 `{162,81,54,28}/{81,54,32,18}` - 出厂默认 SensLevel=3(最灵敏档,Δf/f 0.043%) - **与 PD132L {300,60,32,21} 量纲相同但数值全新**(162 系)——V3.14"灵敏度调整"产物 ## 7. 状态机与输出 ``` 捕获中断(TIM4) → Xn → 累积 LPCNT 个 → CAPVD/CAP_OK ↓ 主循环 CAP_OK VD1_TASK:IIR → 基线(无车) → 进入/离开判据 → VD_FLAG/FLAG_OUT ↓ 50ms 状态机 (TIM1) FLAG_OUT 延迟 DELAY_TIME[3-SET_DLY] → FLAG_PLUSE(持续 500ms) RLY2 = VD_FLAG(存在) RLY1 = SET_PLUS ? (VD_FLAG|FLAG_OUT) : FLAG_PLUSE(脉冲) ``` - 延时档位 `DELAY_TIME[4] = {0,12,32,60}` tick(50ms) → **0 / 0.6s / 1.6s / 3s**(V3.14 实测校准) - 脉冲宽度 `PLUSE_DELAY = 10` tick = **500ms** - 拨码 6 位连续 6 次采样一致才生效(swcnt>5 去抖) ## 8. 异常处理 | 场景 | 处理 | |------|------| | 无捕获(线圈断/无振荡) | LOOP_OK=0 → FLAG_CUT=1 → 主循环 `Reset_RstPeripheralAll()` 整机复位 + LED 闪烁 | | 存在保持超时 | SET_HOLD(DIP8)=1 时进入置 VD_HOLD;`HOLD_TIME=6000 tick×50ms=300s` 仍占用 → 整机复位 | | 环路锁定超时 | SET_DLY≠3 时进入置 LC_HOLD;`LC_HOLD_TIME=4800 tick×50ms=240s` → 重新学习基线(INI_LOOP=1) | | 灵敏度拨码变化 | SENS 变化 → `Reset_RstPeripheralAll()` 复位 | | 看门狗 | WDT 820ms,主循环 300ms 喂狗 | | 上电 | 1s 延时(线圈稳定)→ LED 闪 6 次(继电器自检)→ 开始检测 | ## 9. 参数速查 | 参数 | 值 | |------|-----| | 归一化基数 | **32768** | | 测量节拍 | **21.85ms**(12MHz 晶振已确认) | | 基线窗口 | 256(有车冻结) | | IIR 系数 | 64(实际)/ 79(初始化) | | 进入/离开表 | {162,81,54,28} / {81,54,32,18} | | 档位 Δf/f | 0.247%~0.043%(进入)、0.124%~0.027%(离开) | | 时序 tick | 5ms 注释(待验证)/ 状态机 50ms | | 看门狗 | 820ms / 300ms 喂 | | HOLD / LC_HOLD | 300s / 240s(整机复位 / 重学基线) | | 输出 | RLY2 存在 + RLY1 脉冲(双继电器) | ## 10. 移植注意 / 血统关系 - **同源判定(PD132L → PD136HA)**:工程名 `PD132L-HD`;文件头 V3.11 明示"硬件使用 PD132L_V1.02、替换 PD132LA_V1.06";LPCNT=32768/Xn、IIR 79/64、有车冻结基线、相对阈值 >>16、HOLD=300s 全部继承 - **差异点(PD136HA 相对 PD132L 的独立改动)**: 1. 灵敏度表 {162,...} 系 vs {300,...} 系——档位重排且全部重新标定 2. 基线窗口 100 → 256(更慢更稳,抗干扰优先) 3. **进入/离开单次判定**(去掉 PD132L 的 6 次去抖)——响应更快但抗扰弱,配 256 窗基线补偿 4. 双继电器输出(存在+脉冲分离)——PD132L 单路 5. 延时档位 {0,12,32,60} vs PD132L {0,20,40,60} 注释——0.6s 档重定 6. MCU:STM8S003 (8 位) → **HC32F003C4** (M0+)——升级换代,捕获外设 TIM1→ADTIM4 - **与 M1H / DLD 线**:同路不同源(周期累积法范式相同,细节独立) - **归一化基数保持 32768 未动**——换 MCU 未重定标(与 DLD 线 131072/524288 重定标路线相反),印证"同源移植可保留基数,重写才需重定标"