Files
vd-analysis/models/PD132L/analysis.md
T

121 lines
4.7 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.
# 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 | STM8S003F3P68 位, 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} // 离开(滞回)
```
- 阈值代码 `Origin×表>>16` → 进入阈值 Δf/f = 300/65536≈**0.46%** … 21/65536≈**0.032%**(⚠ 勿用归一化基数 32768 当分母——会得到 0.92%/0.064% 的错误值;Origin 在 Δf/f 分子分母约掉,只与 >>16 分母 65536 有关,2026-08-28 修正)
- 档位: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 |
## 5.1 时序/速率/周期速查(2026-08-27 补)
> 推导假设外部晶振 12MHz(代码注释),**待现场验证**;公式:测量节拍 = BASE/捕获时钟。
| 量 | 公式/值 | 数值 |
|----|---------|------|
| 捕获时钟 | TIM1 PSC=9 → 12M/10 | **1.2 MHz** |
| **测量节拍**CAPVD 更新) | 32768 / 1.2MHz | **27.3 ms** |
| **基线更新周期** | 100 窗 × 27.3ms | **2.73 s** |
| IIR 时间常数 τ | 27.3ms × 256/7964 | **88 ms / 109 ms** |
| 进入响应 | 1 个测量节拍(无确认机制) | ~27 ms |
| 离开响应 | 1 节拍 + 脉冲 | ~27 ms + 500ms |
| 上电稳定 | Delay_ms(800) + LPCNT 学习(100 周期) | ~1 s |
## 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 系"当前档滞回"不同