PD136HA 完整分析归档:确认 PD132L 同源移植(HC32 M0+)

- 应用层 main.c(832行) 到位,补全算法级分析
- 血统实锤:工程名 PD132L-HD,文件头明示硬件用 PD132L_V1.02/替换 PD132LA_V1.06
- 周期累积法同框架:LPCNT=32768/Xn、IIR 79/64(实际64)、有车冻结基线、相对阈值>>16
- 独立改动:灵敏度表 {162,81,54,28}/{81,54,32,18}(Δf/f 0.247%~0.043%)、
  基线窗口 100→256(5.59s)、进入/离开单次判定(去抖注释)、双继电器输出
- 时序量化:测量节拍 21.8ms、基线 5.59s、IIR τ 87ms(12MHz 假设待验证)
- 对比总表升级五型号,同源辨析补 PD132L→PD136HA
This commit is contained in:
wangfq
2026-08-27 18:40:23 +08:00
parent 90df2cfe62
commit 7cb861ee1d
3 changed files with 198 additions and 71 deletions
+170 -44
View File
@@ -1,61 +1,187 @@
# PD136HA 车检器分析
> 型号: PD136HA | 固件: V3.14 | 日期: 2021-11-16 | 平台: **HC32F005C6PA**(华大半导体, Cortex-M0+
> 原始代码: `vd_detector/reference/PD136HA_V3.14-20211116/`
> ⚠ **完整性警示:该工程只有华大官方 SDK 驱动层(driver/ + common/),没有应用层代码(main.c / 检测算法)**——无法做算法级对比,本文档仅分析平台与外设资源。
> 型号: PD136HA | 固件: V3.14 | 日期: 2021-11-16 | 平台: **HC32F005**(华大半导体, Cortex-M0+
> 原始代码: `vd_detector/reference/PD136HA_V3.14-20211116/`(工程名 **PD132L-HD**,含 user/main.c 应用层)
> 血统: **PD132L 同源移植版**(文件头明示"硬件使用 PD132L_V1.02,替换软件版本 PD132LA_V1.06"
## 1. 平台与工程
| 项 | 值 |
|----|-----|
| MCU | HC32F005C6PA(华大半导体,Cortex-M0+32KB Flash |
| 外部晶振 | 32 MHzboard 头 `SYSTEM_XTH = 32*1000*1000u` |
| 工具链 | Keil MDK.axf/.sct/hex 产物JLink 调试 |
| 工程名 | **PD132L**遗留命名——PD136HA 疑似 PD132 系列的 HC32 移植版 |
| 代码规模 | 驱动层 ~30 文件(driver/src 21 个 .c |
| 固件产物 | PD132L.hex 32KB(仅驱动库编译结果,无应用逻辑) |
| MCU | HC32F005(注释标 HC32F003C4,工程编译目标 startup_hc32f005c6ua.oSDK 板头为 C6PA——**三者不完全一致,待硬件确认** |
| 时钟 | 外部晶振 XTH8-16MHz 档),CLK_INIT 切 XTH、关内部 RCHDelay_ms 注释 **12MHz** |
| 工具链 | Keil MDKuvprojxJLink |
| 工程名 | **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. 外设资源(从驱动层推断硬件能力)
## 2. 硬件与 IO
| 驱动 | 外设 | 车检器相关用途 |
|------|------|----------------|
| adt.c | ADT 高级定时器 | **线圈频率捕获候选**(输入捕获/比较) |
| pca.c | PCA 可编程计数器阵列 | **线圈频率捕获候选**HC32F005 的 PCA 可做周期测量) |
| uart.c | UART | 调试/通信 |
| adc.c | ADC | 环境/电压监测 |
| wdt.c | WDT | 看门狗(区别于 V4B 的无狗) |
| spi.c / i2c.c | SPI / I2C | EEPROM/扩展(board 头有 EVB I2C EEPROM |
| flash.c | Flash | 参数存储 |
| crc.c | CRC | 校验 |
| gpio.c / sysctrl.c / reset.c / lvd.c / lpm.c / trim.c / ram.c / bgr.c / bt.c / vc.c | 基础外设 | — |
**board_stkhc32f005.h 是华大 STK 开发板定义**(按键/ LED/ SPI/ I2C EEPROM),**不是车检器板**——说明工程是从华大 SDK 例程模板改的,应用板引脚定义不在本工程内。
## 3. 与 PD132 系列的关系(推断,待应用代码确认)
| 证据 | 推断 |
| 引脚 | 功能 |
|------|------|
| 工程名/产物名都是 PD132L | PD136HA 很可能是 PD132LSTM8)向 HC32F005M0+)的移植 |
| 时间线 | PD132L V1.09 (2020-04) → PD136HA V3.14 (2021-11),间隔 1.5 年,符合换代节奏 |
| 版本号 | V3.14 高于 PD132T V3.01——PD136 是更晚的系列 |
| MCU 升级 | STM8S003 (8 位) → HC32F005 (M0+ 32 位),是 PD132 系列的升级换代 |
| 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 晶振通道) |
⚠ 但**无法确认算法继承关系**:无应用层代码,无法对比灵敏度表/滤波/基线。若按 PD132 系惯例(PD132T 移植 PD132L),PD136HA 大概率沿用周期累积法 + {300,60,32,21} 系灵敏度表——**待应用代码佐证**
**双继电器架构**(存在 + 脉冲分离),比 PD132L 多一路输出
## 4. 缺口与建议
## 3. 频率测量(周期累积法,与 PD132L 同框架)
- [ ] **补齐应用层代码**(main.c + 检测算法文件)才能完成算法分析
- [ ] 拿到应用层后:确认测频外设(ADT 还是 PCA)、归一化基数、灵敏度表、时序
- [ ] 对比表暂不纳入 PD136HA(无算法参数可比),README 索引标注"仅 SDK 层"
- 定时器:**ADTIM4**PCLK0/8 预分频,锯齿波 0xFFFFCHA **上升沿捕获**
- 中断:`loop1_Xn = CapThis - CapLast`(相邻上升沿计数差 = 振荡周期)
- 学习:`CapCnt > 100``loop1_LPCNT = 32768 / loop1_Xn`**归一化基数 32768,与 PD132L/M1H 一致**
- 测量:累积 `LPCNT` 个周期得 `CAPVD = CapSum`(周期域自适应归一化)
## 5. 参数速查(仅平台级)
```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 = 12MHzDelay_ms 注释)→ 捕获时钟 = **1.5MHz**(待现场验证)
## 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/8ADTIM4 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_TASKIIR → 基线(无车) → 进入/离开判据 → 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. 参数速查
| 参数 | 值 |
|------|-----|
| MCU | HC32F005C6PA (Cortex-M0+) |
| 晶振 | 32MHz 外部 |
| 捕获外设候选 | ADT / PCA |
| 看门狗 | 有 WDT 驱动 |
| 通信 | UART / SPI / I2C |
| 存储 | Flash 驱动(参数区 |
| 应用算法 | **缺失** |
| 归一化基数 | **32768** |
| 测量节拍 | 21.8ms12MHz 假设) |
| 基线窗口 | 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. MCUSTM8S003 (8 位) → HC32F005 (M0+)——升级换代,捕获外设 TIM1→ADTIM4
- **与 M1H / DLD 线**:同路不同源(周期累积法范式相同,细节独立)
- **归一化基数保持 32768 未动**——换 MCU 未重定标(与 DLD 线 131072/524288 重定标路线相反),印证"同源移植可保留基数,重写才需重定标"