- 用户口径 + 源码取证:PD132T 用 USER/REG_MA801.H(首行 for Megawin MA801;sbit CEX1=P3^5 ✓ 与图纸 LP→pin9 吻合), 此前「STC12C2052」系按寄存器地址相似的误判 ⇒ 已更正;3MHz/10.92ms 结论不变 · CMOD=0x04 作者原注「时钟源为定时器0溢出」+ Megawin 手册 CPS 表(CPS[2:0]=010⇒T0 溢出)两法互证(对 2/3 比特布局分歧免疫) · AUXR=0xC0 无 MA801 专册直证,由 T1 0x15A0=60000 计数=5ms 反证定时器输入 12MHz ⇒ 1T 生效 - PD136HA 实际芯片 = HC32F003C4(用户确认,小华 HDSC);工程档位 F005C6PA/startup C6UA 不一致 ⇒ 重编译前须改; 实测 Code=11148 RO=268 RW=88 ZI=608 ⇒ ROM≈11.1KB / RAM≈696B;Keil <Cpu> CLOCK(12000000) 独立佐证 12MHz - PD132T CCAPM1=0x31 实为双沿捕获(旧稿「下降沿」有误)⇒ ISR 的 Xn 是半周期 ⇒ 线圈绝对频段重算 (PD132T ≈23.4~118kHz / PD136HA·PD132L ≈11.8~60kHz);Δf/f 为比值口径 ⇒ 灵敏度结论不受影响 - 同步 6 文件(报告 §2.3 更正块 + §11⑩、前端专项、PD132T/PD136HA 分析稿、跨型号表、README);表格校验 0 异常
189 lines
9.6 KiB
Markdown
189 lines
9.6 KiB
Markdown
# 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)
|
||
|
||
## 1. 平台与工程
|
||
|
||
| 项 | 值 |
|
||
|----|-----|
|
||
| MCU | **HC32F003C4**(**用户确认 2026-09-11**)。⚠ 工程档位仍为 HC32F005C6PA(`<Device>`)/ 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 重定标路线相反),印证"同源移植可保留基数,重写才需重定标"
|