用户反馈: 金属板缓慢接近时判据乱跳; 35µH(128kHz)/46µH(112kHz) 线圈同样现象(46µH 在设计窗内且无告警)。 根因(三段链条, 现场日志与代码逐值吻合): ① 无车态 dlt_ORG=进表 49 ⇒ vac_ref() 门控 1×49; Origin−EMA=32~34 ≯49 ⇒ 参考=Origin ⇒ 进入线=Origin−49 ② 进车瞬间 dlt_ORG 切成释表 23 ⇒ 同一 gap > 1×23 ⇒ vac_ref() 改用 EMA(低 32~34 counts) ③ 释放线 = EMA−1.8×23 ⇒ 比进入线还浅 ⇒ 深度 50~58 的静止凹脉冲"进门即满足释放" ⇒ 进入确认 5 + 释放确认 5 = 10 样本 = 100ms 周期自激(日志实测 ~30 组/3s) 实现: - G1 新增 vac_gate_dlt()(状态无关进表 dlt)供 vac_ref() 门控 (TaskLoop.c:297/307) ⇒ 进/出同一参考 - G2 低Q 释放带夹紧 _band ≤ vac_gate_dlt()-1 (TaskLoop.c:339) ⇒ 只作未来兜底; 180(=41@SENS3, V4.36.28 现场值)一字未动 - G3 REL_MIN_HOLD_TICKS=30 有车后 300ms 禁释放 (TaskLoop.h:69 + TaskLoop.c 调用点) ⇒ 只挡释放不延迟检出 单测: 新增场景 7 现场参数逐位复现 —— 22µH 悬停 300/300 → 1/0; 35µH 300/300 → 1/0; 撤板 1/1; V4.36.28 回摆仍释放; 非低Q 同深度不自激; 全套 8/8 全绿 文档: devlog V2.79(+条目) / spec 文档头 V2.61 / manual 表 V2.18 / cmcng.h 4.36.41→4.36.42 REV 42 待现场: 上板复测 + 锁死侧三线圈实验 (devlog 条目内 [ ] 占位)
868 lines
56 KiB
Markdown
868 lines
56 KiB
Markdown
# DLD154V4B 技术规格书
|
||
|
||
> 单路线圈车辆检测器 | 固件版本: V4.36.42 | 文档版本: V2.61
|
||
> 本文档面向工程开发、系统集成及故障深度分析
|
||
|
||
---
|
||
|
||
## 1. 系统架构
|
||
|
||
### 1.1 硬件架构
|
||
|
||
```
|
||
┌──────────────────────────────────┐
|
||
线圈 ────────────┤ PA7 (TIM3_CH2) AT32F421F8P7 │
|
||
│ 输入捕获 Cortex-M4 ├──── PB1 (TMR14 PWM) ──── 红灯
|
||
│ 120MHz / 64KB │
|
||
DIP ×5 ─────────┤ PA0~PA4 (GPIO) ├──── PA9 (GPIO) ──────── 绿灯
|
||
│ │
|
||
Tx ─────────────┤ USART (TTL) ├──── PA10 (GPIO) ─────── 黄灯
|
||
│ │
|
||
│ PA5 (GPIO) ──┼──── RLY2 继电器
|
||
│ PA6 (GPIO) ──┼──── RLY1 继电器
|
||
│ │
|
||
│ SWD (PA13/PA14) ────────────────┼──── 调试接口
|
||
└──────────────────────────────────┘
|
||
```
|
||
|
||
### 1.2 软件架构
|
||
|
||
```
|
||
FreeRTOS Kernel (CMSIS-RTOS v2)
|
||
├── loop_task (主检测任务)
|
||
│ ├── vd1_task() — 每 ~10ms 执行 (M4 优化)
|
||
│ │ ├── IIR 滤波 (ALFA_CAP1=79/256, τ≈32ms)
|
||
│ │ ├── 斜率限幅 (MAX_SLOPE_RATE=5%)
|
||
│ │ ├── 基线跟踪 (500 窗口滑动平均, 5s)
|
||
│ │ ├── 进入确认 (ENTRY_CONFIRM=3 次)
|
||
│ │ ├── 离开检测 (cnt_release 防抖,平坦性 #if 可选)
|
||
│ │ ├── 时序状态机 (IN/OUT/PULSE/HOLD)
|
||
│ │ └── 冻结超时恢复 (10s + ±2% 稳定性检查)
|
||
│ ├── poll_sw_state() — 拨码去抖
|
||
│ ├── poll_green_led() — 绿灯驱动
|
||
│ └── poll_yellow_led() — 黄灯故障编码
|
||
├── TMR3_ISR() — 线圈频率捕获
|
||
├── TMR15_ISR() — 5ms 系统 tick (LED 驱动 + 看门狗活性计数)
|
||
├── TMR14_PWM() — 红灯呼吸
|
||
└── IWDT — 硬件看门狗 (超时≈1.64s, main 使能, 主循环 poll_wdg 喂狗)
|
||
```
|
||
|
||
---
|
||
|
||
## 2. 电气参数
|
||
|
||
| 参数 | 最小值 | 典型值 | 最大值 | 单位 | 备注 |
|
||
|------|--------|--------|--------|------|------|
|
||
| 供电电压 (VDD) | 10 | 12 / 24 | 30 | V | 宽压输入 |
|
||
| 功耗 | — | 0.5 | 2 | W | 含继电器吸合 |
|
||
| 工作温度 | -40 | — | +85 | °C | 工业级 |
|
||
| 存储温度 | -55 | — | +125 | °C | — |
|
||
| 线圈电感范围 | 50 | 200 | 1000 | μH | 超出范围可工作但精度下降 |
|
||
| 线圈频率范围 | 30 | 100 | 200 | kHz | — |
|
||
| 线圈 Q 值 | 5 | — | — | — | 过低导致振荡不稳定 |
|
||
| 继电器触点电压 | — | — | 250 | VAC | — |
|
||
| 继电器触点电流 | — | — | 3 | A | — |
|
||
| GPIO 输出电压 | 0 | 3.3 | 3.6 | V | CMOS 电平 |
|
||
| GPIO 输出电流 | — | — | 25 | mA | 单引脚最大 |
|
||
| ESD 防护 | ±2 | — | — | kV | HBM |
|
||
|
||
---
|
||
|
||
## 3. IO 引脚分配
|
||
|
||
### 3.1 完整引脚表
|
||
|
||
| 引脚 | 标识 | 功能 | 方向 | 外设 | 初始状态 | 备注 |
|
||
|------|------|------|------|------|---------|------|
|
||
| PA0 | SA_1 | 灵敏度 bit0 | IN | GPIO, 上拉 | — | DIP 开关 |
|
||
| PA1 | SA_2 | 灵敏度 bit1 | IN | GPIO, 上拉 | — | DIP 开关 |
|
||
| PA2 | SW_3 | 存在/脉冲选择 | IN | GPIO, 上拉 | — | 0=存在, 1=脉冲 |
|
||
| PA3 | SW_4 | 离开延时 | IN | GPIO, 上拉 | — | 0=无, 1=500ms |
|
||
| PA4 | SW_5 | 安全复位 | IN | GPIO, 上拉 | — | 1=复位 |
|
||
| PA5 | RLY2 | 继电器 2 | OUT | GPIO PP | 0 (开路) | 辅助输出 |
|
||
| PA6 | RLY1 | 继电器 1 | OUT | GPIO PP | 0 (开路) | 主输出 |
|
||
| **PA7** | **LP** | 线圈频率捕获 | IN | **TIM3_CH2** | — | **核心输入** |
|
||
| PA9 | LEDA | 绿灯 | OUT | GPIO PP | 0 (灭) | 有车/自检 |
|
||
| PA10 | LEDC | 黄灯 | OUT | GPIO PP | 0 (灭) | 故障诊断 |
|
||
| PB1 | LEDA_RED | 红灯 | ALT | TMR14_CH1 PWM | — | 呼吸灯 |
|
||
| PA13 | SWDIO | 调试数据 | I/O | SWD | — | 仅调试 |
|
||
| PA14 | SWCLK | 调试时钟 | IN | SWD | — | 仅调试 |
|
||
|
||
### 3.2 拨码开关逻辑
|
||
|
||
```c
|
||
// DIP 开关读取与解码
|
||
SENS = 3 - (sw & 0x03);
|
||
// SA_2:SA_1 = 11 → SENS = 0 (低灵敏)
|
||
// SA_2:SA_1 = 10 → SENS = 1
|
||
// SA_2:SA_1 = 01 → SENS = 2
|
||
// SA_2:SA_1 = 00 → SENS = 3 (最高灵敏)
|
||
|
||
SET_PLUS = (sw >> 2) & 0x01; // PA2 = SW_3
|
||
SET_DLY = (sw >> 3) & 0x01; // PA3 = SW_4
|
||
SET_SAFE = (sw >> 4) & 0x01; // PA4 = SW_5
|
||
```
|
||
|
||
**拨码去抖**:连续 5 次读取一致才生效(对齐 M1H 参考实现)。
|
||
|
||
---
|
||
|
||
## 4. 检测算法
|
||
|
||
### 4.1 频率测量
|
||
|
||
#### 4.1.1 硬件链路
|
||
|
||
DLD154V4B **不使用** CD4060 外部分频芯片。线圈直接驱动 PA7 (TIM3_CH2),利用 AT32F421 内置 TIM3 输入分频器 DIV_2 (÷2)。
|
||
|
||
| 对比项 | M1H/TLD-110 | DLD154V4B |
|
||
|--------|-------------|-----------|
|
||
| 外部分频 | CD4060 Pin5 (÷32) | **无(直连)** |
|
||
| MCU 内部分频 | 无 | TIM3 DIV_2 (÷2) |
|
||
| 总分频比 | ÷32 | **÷2** |
|
||
| 中断率 @100kHz | ~3.1k/s | **50k/s** |
|
||
| CPU 占用 @120MHz | — | < 3% |
|
||
|
||
#### 4.1.2 捕获流程
|
||
|
||
```
|
||
线圈边沿 → PA7 (TIM3_CH2)
|
||
│
|
||
▼
|
||
TIM3 自由运行 (16-bit, 计数时钟 = sclk = 120MHz)
|
||
└─ 通道输入捕获 DIV_2 (每 2 个信号边沿捕获一次) → CH2 捕获 → 读 CCR2
|
||
Xn = 2 × 120MHz / f_real → f_kHz = 240000 × LPCNT / CAPVD (V4.27 修正)
|
||
│
|
||
▼
|
||
TMR3 ISR:
|
||
CCR2_now → 存为 CapThis
|
||
Xn = CapThis - CapLast (相邻边沿周期差)
|
||
处理 16-bit 溢出: if (Xn & 0x8000) Xn += 0x10000
|
||
CapLast = CapThis
|
||
│
|
||
▼
|
||
LPCNT = MEASUREMENT_BASE / Xn (自适应窗口)
|
||
CapSum += Xn
|
||
CapCnt++
|
||
│
|
||
CapCnt >= LPCNT ?
|
||
YES → Value = CapSum (≈ MEASUREMENT_BASE)
|
||
CapCnt = CapSum = 0
|
||
loop1_CAP_OK = 1 (通知 vd1_task)
|
||
```
|
||
|
||
#### 4.1.3 关键常量
|
||
|
||
```c
|
||
#define MEASUREMENT_BASE 131072 // 2^17
|
||
#define g_input_div 2 // TIM3 DIV_2
|
||
```
|
||
|
||
| 线圈频率 | Xn @DIV_2 | LPCNT | 测量窗口 | Value 范围 |
|
||
|---------|-----------|-------|---------|-----------|
|
||
| 50 kHz | 1200 | 109 | 2.2 ms | ~130800 |
|
||
| 100 kHz | 600 | 218 | 2.2 ms | ~130800 |
|
||
| 150 kHz | 400 | 328 | 2.2 ms | ~131200 |
|
||
| 200 kHz | 300 | 437 | 2.2 ms | ~131100 |
|
||
|
||
> **设计要点**:LPCNT 自适应使不同频率下 Value 归一化到 ~131072,百分比阈值(灵敏度)直接适用,无需频率补偿。
|
||
|
||
#### 4.1.4 精度陷阱(已修复)
|
||
|
||
旧代码存在 `<<6` 和 `>>6` 互相抵消的精度浪费:
|
||
|
||
```
|
||
旧: LPCNT = (32768 << 6) / Xn = 437 → 窗口 17.5ms
|
||
Value >>= 6 → 等效 7 样本精度
|
||
新: LPCNT = 131072 / Xn = 27~54 → 窗口 ~1ms
|
||
不做右移 → 全样本精度
|
||
```
|
||
|
||
**改进效果**:响应速度提升 16 倍,精度保留全部采样信息。
|
||
|
||
### 4.2 IIR 滤波(M4 优化:ALFA_CAP1=79 @10ms)
|
||
|
||
V2.6 起采用单路 IIR,ALFA_CAP1=79 @10ms (τ≈32ms),比旧 50ms tick 的 τ≈162ms 快 5 倍:
|
||
|
||
```c
|
||
#define ALFA_CAP1 79 // IIR α = 79/256 ≈ 0.31 (@10ms → τ≈32ms)
|
||
|
||
// get_flt_value(): 通用一阶 IIR
|
||
CAPVD = (|Value - CAPVD| * ALFA_CAP1) >> 8 // 每 tick 移动 ~31%
|
||
```
|
||
|
||
| 参数 | 值 | 说明 |
|
||
|------|-----|------|
|
||
| α | 79/256 ≈ 0.31 | 指数平滑系数 |
|
||
| τ | ~32ms @10ms tick | 3 次更新达 63% |
|
||
| 噪声抑制 | 良好 | 单次野值影响 < 31% |
|
||
|
||
**进入确认**:CAPVD 连续 ENTRY_CONFIRM=3 次低于阈值才判定有车。
|
||
|
||
```c
|
||
if (CAPVD < Origin - dlt_ORG) {
|
||
if (++entry_cnt >= 3)
|
||
VD_FLAG = 1; // 确认有车
|
||
} else {
|
||
entry_cnt = 0; // 恢复则重置
|
||
}
|
||
```
|
||
|
||
| 对比 | 8051/M1H 旧设计 | V2.6 |
|
||
|------|----------------|------|
|
||
| tick | 50ms | **10ms** |
|
||
| IIR α | 79/256 (@50ms, τ=162ms) | **79/256 (@10ms, τ=32ms)** |
|
||
| 确认方式 | 单次阈值 | **连续 3 次** |
|
||
| 瞬态抑制 | 无 | **斜率限幅 + 确认** |
|
||
| 进入响应 | ~550ms | **~530ms** |
|
||
|
||
### 4.3 检测判据
|
||
|
||
#### 4.3.1 灵敏度表
|
||
|
||
```c
|
||
const uint16_t SensTable[4] = {300, 60, 32, 21}; // 进入阈值 (V2.11: 全档与 PD132T 完全一致)
|
||
const uint16_t SensTable_1[4] = { 60, 32, 21, 14}; // 离开阈值 (V2.11: 分档与 PD132T 完全一致)
|
||
```
|
||
|
||
| SENS | SensTable | 进入阈值 (×Origin/65536) | SensTable_1 | 离开阈值 (×Origin/65536) |
|
||
|------|-----------|-------------------------|-------------|-------------------------|
|
||
| 0 (低) | 300 | 0.46% | 60 | 0.092% |
|
||
| 1 | 60 | 0.09% | 32 | 0.049% |
|
||
| 2 | 32 | 0.049% | 21 | 0.032% |
|
||
| 3 (高) | 21 | 0.032% | 14 | 0.021% |
|
||
|
||
> 注(V2.49):上表为 `USE_PLANB_TABLE=0`(PD132T 原表)分支;当前代码 `USE_PLANB_TABLE=1`(方案B V4.07 调校)实际编译分支为 **SensTable={337,71,38,25}、SensTable_1={51,27,18,12}**(4.4.2 故障补偿表用此分支值)。两表由编译宏切换。
|
||
|
||
> ⚠ V2.8(2026-08-27):SENS=3 最高档进入阈值 10→20(0.015%→0.031% Δf/f,ΔL/L 0.031%→0.061%),离开 9→14(滞回 90%→70%)——现场广告杆落杆时最高档易误触发(落杆机械/电磁扰动越过 0.015% 阈值),提高阈值并加大滞回。
|
||
|
||
> ⚠ V2.11(2026-08-28):**PD132T 客户现场替换对齐——进入/离开表全档与 PD132T 完全一致**:① 进入 216/108/36/20 → **300/60/32/21**(0.33%/0.16%/0.055%/0.031% → **0.458%/0.092%/0.049%/0.032%** Δf/f,即 PD132T SensTable 原值);② 离开表 {108,72,18,14} → **{60,32,21,14}**(0.092%/0.049%/0.032%/0.021% Δf/f,即 PD132T SensTable1 原值,SENUP 标贴 OFF=出厂默认态)。替换后任意档位触发/释放手感与 PD132T 完全一致。
|
||
|
||
#### 4.3.2 进入检测(M4 优化:确认机制)
|
||
|
||
```c
|
||
// CAPVD 连续 ENTRY_CONFIRM 次低于阈值才判定有车
|
||
if (CAPVD < Origin - dlt_ORG) {
|
||
entry_cnt++;
|
||
if (entry_cnt >= ENTRY_CONFIRM) { // 3 次连续确认
|
||
VD_FLAG = 1; FLAG_IN = 1;
|
||
entry_cnt = 0;
|
||
}
|
||
} else {
|
||
if (entry_cnt > 0) entry_cnt = 0; // 恢复则重置
|
||
}
|
||
```
|
||
|
||
| 对比 | 8051/M1H 旧设计 | V2.6 M4 优化 |
|
||
|------|----------------|-------------|
|
||
| 判定依据 | CAPVD (α=79, τ=162ms) | **CAPVD (α=79, τ=32ms)** |
|
||
| 确认方式 | 单次阈值 | **连续 3 次确认** |
|
||
| 瞬态抑制 | 无 | **斜率限幅 + 确认双重保护** |
|
||
| 进入响应 | ~550ms | **~530ms** |
|
||
|
||
#### 4.3.3 离开检测(滞回)
|
||
|
||
##### 模式 1:简单防抖 (USE_FLATNESS_EXIT=0) — 默认(V2.9 起)
|
||
|
||
```c
|
||
dlt_ORG = (Origin * SensTable_1[SENS]) >> 16; // V2.11 起恒 14(对齐 PD132T 默认)
|
||
if ((Origin - dlt_ORG) < CAPVD) { // CAPVD 回升至距基线不足 dlt → 离开
|
||
if (++cnt_release >= 3) { // 连续 3 次确认
|
||
VD_FLAG = 0; FLAG_OUT = 1;
|
||
}
|
||
} else {
|
||
cnt_release = 0; // 回落立即重置
|
||
}
|
||
```
|
||
|
||
> **离开分档设计依据(V2.11)**:离开表 {60,32,21,14}(0.092%/0.049%/0.032%/0.021% Δf/f)对齐 PD132T **SENUP 标贴 OFF**(拨码**低有效**:标贴 OFF=电平 1=SET_ASB=1 → `if(SET_ASB)` 分档分支,**出厂默认态**)。物理意义:离开滞回比进入小一档(档0: 20%、档1: 53%、档2: 58%、档3: 70%),保证释放快于触发、车走即释放,同时防瞬态误落杆。若现场 PD132T 的 SENUP 标贴为 **ON**(电平0=SET_ASB=0 → 恒 14),需将 `SensTable_1` 改回恒 14 表对齐。
|
||
|
||
> **⚠ V4.03(2026-08-31)释放慢滤波(方案 A,USE_SLOW_RELEASE)**:现场金属板测试——灵敏度表已对齐,但**释放高度 V4B 比 PD132T 低**(V4B 刚离开触发位置即释放,PD132T 需离得更远)。根因:**IIR 滤波时间常数差异**(V4B 10ms tick + α79 → τ≈32ms;PD132T 43.7ms tick + α79/64 → τ≈142~175ms,慢 4.4~5.5×),释放阈值浅(进入的 20%)放大差异。修复:离开判定改用**独立慢滤波值** `loop1_CAPVD_slow`(α=18/256 @10ms → τ≈142ms,复刻 PD132T 恢复速度,吃原始 Value 不经斜率限幅),进入路径不变。开关 `USE_SLOW_RELEASE`(TaskLoop.h,默认 1;0=原快滤波释放)。单测:τ fast=30ms/slow=140ms,释放时机差 260ms(`tests/test_release_slow_filter.c`)。⚠ 若现场 PD132T 的 SET_FLT=ON(α64 → τ≈175ms),可调 `RELEASE_ALFA` 15(τ≈170ms)更贴近。
|
||
|
||
> **⚠ V4.04(2026-09-01)方案A 现场复核修正(RELEASE_ALFA 18→21 + 进入 snap)**:金属板复测两现象——① 慢速抬板释放高度 V4B 仍比 PD132T 高一点(跟手速有关);② 定在 HR0/2(释放高度一半)保持 ~1s V4B 释放、PD132T 不释放。根因:① **τ 对齐用了近似口径**——α18 精确 τ≈137ms vs PD132T α79@43.7ms 精确 τ≈118ms(α=79 时 `T×256/α` 近似公式高估 19.6%),叠加 3 次确认 30ms;② **双滤波进入瞬态假释放**——进入由快滤波 30ms 确认、释放判定用慢滤波,进入确认瞬间慢滤波还悬在基线附近,残余信号落在窄带(SENS=3 时 0.032%~0.044%)时释放条件瞬时为真 → 假释放;PD132T 进出共用同一滤波,结构性免疫。修正:① `RELEASE_ALFA` 18→**21**(精确 τ≈117ms 对齐 PD132T 118ms);② 进入确认处 **snap `loop1_CAPVD_slow = loop1_CAPVD`**(进入线 0.032% 恒深于离开线 0.021%,snap 后释放条件结构性为假)。单测:τ fast=30ms/slow=120ms,释放时机差 200ms;仿真 3s 抬升高度差 +9mm→+3mm,0.10% 板 HR0/2 假释放消除。⚠ 待板级复测。
|
||
|
||
> **⚠ V4.05(2026-09-01)方案B 实验(USE_SLOW_RELEASE=0 + USE_PLANB_TABLE=1)**:对比路线——释放走**快滤波**(无慢滤波状态),手感对齐改由**调深释放阈值表** `ReleaseTable_B={80,42,27,18}`(原始 `{60,32,21,14}` 加深 ~30%)承担。⚠ **关键认知:释放方向是 CAPVD 向 Origin 恢复,dlt 增大(调深)→ 释放线降低 → 释放更早**(与"调深=更严格"直觉相反,仿真+单测双确认)。仿真预测:深信号(≥0.2%)加深表比 PD132T 早 3~6 counts,原始表更接近;浅信号(~0.1%)加深表更接近(差 ~1.3 counts)。HR0/2 假释放结构性免疫(无悬停状态)。现场 A/B 对比后定稿,`USE_SLOW_RELEASE`/`USE_PLANB_TABLE` 两宏二选一保留。
|
||
|
||
> **⚠ V4.06/V4.07(2026-09-01)方案B 现场调校定稿(USE_SLOW_RELEASE=0 + USE_PLANB_TABLE=1)**:现场实测——加深表失败(释放更早);**用户改 SENS=3 进入 21→25、释放 14→12 → 接近 PD132T 最高灵敏手感**。关键:**进入加深(触发更严)+ 释放调浅(释放更晚)**组合,滞回 66%→47%。全档等比(×25/21 进入、×12/14 释放)后 **V4.07 SENS=0 回调 357→337**:进入 `{337,71,38,25}`、释放 `{51,27,18,12}`。⚠ 与 PD132T 表值不再一致(行为等效)。废弃 `ReleaseTable_B`(方向错误,并入 SensTable_1 调校)。
|
||
|
||
##### 模式 2:平坦性判定 (USE_FLATNESS_EXIT=1) — ⚠ 默认禁用(#if 0,代码保留)
|
||
|
||
基于专利 **CN200910309382**(中山大学),解决大车通行时频率多峰导致的多次误触发。
|
||
|
||
> ⚠ **2026-08-28 现场结论:平坦性算法实测不理想,默认关闭(USE_FLATNESS_EXIT=0)**,离开判定切回简单 cnt_release 防抖(模式 1)。平坦性代码完整保留在 `#if USE_FLATNESS_EXIT` 内,可在 TaskLoop.h 一行开启,现场对比验证用。
|
||
|
||
**算法架构:**
|
||
|
||
```
|
||
车辆到达 → 单一阈值法 (沿用 SensTable)
|
||
│
|
||
▼ Phase 1: g_exit_state = 0 (追踪第一上升坡面)
|
||
│ 追踪最大 |f'| 和 |f''|
|
||
│ 当 |f'| 连续 3 次 < SLOPE_FLAT_THRESH:
|
||
│ Δ2 = max_slope / K1 (一阶平坦阈值)
|
||
│ Δ3 = max_slope_rate / K2 (二阶平坦阈值)
|
||
│ g_exit_state = 1
|
||
│
|
||
▼ Phase 2: g_exit_state = 1 (平坦性判定)
|
||
三条件同时满足:
|
||
① |f - f_b| < dlt_ORG (频率回归基频)
|
||
② |f'| < Δ2 (一阶导数近零)
|
||
③ |f''| < Δ3 (二阶导数近零)
|
||
│
|
||
连续 FLAT_CONFIRM_CNT(3) 次全部满足 → 车辆离开
|
||
```
|
||
|
||
**参数表:**
|
||
|
||
| 常量 | 值 | 含义 |
|
||
|------|-----|------|
|
||
| K1, K2 | 8 | 动态阈值除数(专利推荐值) |
|
||
| SLOPE_FLAT_THRESH | 100 | 斜率趋零判断阈值 |
|
||
| MIN_DELTA2 | 5 | Δ2 下限(防除数过小) |
|
||
| MIN_DELTA3 | 2 | Δ3 下限 |
|
||
| FLAT_CONFIRM_CNT | 3 | 平坦确认次数 |
|
||
|
||
**整数化适配:** 专利原实现用 float(Hz 频率值),DLD154V4B 用 uint32 定点(Origin ≈ 131K)。导数计算用 int32 整数差分,阈值 /K1、/K2 做整数除法,精度足够。
|
||
|
||
### 4.4 基线跟踪(M4 优化:斜率限幅 + 冻结超时)
|
||
|
||
#### 4.4.1 斜率限幅
|
||
|
||
EMI/闪电等瞬态干扰会造成 CAPVD 瞬间跳变。物理车辆不可能让线圈频率瞬间改变 >5%:
|
||
|
||
```c
|
||
#define MAX_SLOPE_RATE 5 // 单次最大变化 5%
|
||
|
||
int32_t raw_delta = Value - CAPVD;
|
||
int32_t max_step = CAPVD * MAX_SLOPE_RATE / 100;
|
||
if (max_step < 100) max_step = 100; // 最小限幅,防止低 Origin 时锁死
|
||
if (raw_delta > max_step) raw_delta = max_step;
|
||
if (raw_delta < -max_step) raw_delta = -max_step;
|
||
uint32_t clamped_value = CAPVD + raw_delta;
|
||
CAPVD = get_flt_value(clamped_value, CAPVD); // 慢速 IIR
|
||
```
|
||
|
||
尖峰被截断,真实车辆信号(缓慢的频率漂移)不受影响。
|
||
|
||
#### 4.4.2 基线跟踪规则
|
||
|
||
```c
|
||
// 仅无车 + 无离开延时中 → 跟踪基线
|
||
if (!VD_FLAG) {
|
||
int32_t dev = CAPVD - Origin;
|
||
if (dev < dlt_ORG * 4) {
|
||
// CAPVD 未显著偏离 → 正常跟踪
|
||
loop1_freeze_cnt = 0;
|
||
update_moving_average(&ORG_SUM, &ORG_CNT, &Origin, CAPVD, 100);
|
||
} else {
|
||
// CAPVD 异常偏高 → 冻结 + 超时恢复逻辑
|
||
}
|
||
}
|
||
```
|
||
|
||
| 设计决策 | 原因 |
|
||
|---------|------|
|
||
| 有车时冻结基线 | 防止把车辆的影响"学"进基线(仿 TLD-110) |
|
||
| 100 窗口滑动平均 | 缓慢跟踪温漂,但不响应车辆 |
|
||
| 4× 冻结阈值 | 防止异常 CAPVD 上升污染基线(V1.5) |
|
||
| 5% 斜率限幅 | 过滤 EMI/闪电尖峰,保护 IIR(V2.0) |
|
||
| 冻结超时 + 稳定性检查 | 防止永久冻结死锁(V2.3~2.5) |
|
||
| 环境重校准(V4.24/26/30/31) | dev>+4×dlt 高位连续 7s(ENV_RESYNC_WAIT,V4.26 60s→10s,V4.30→8s,V4.31→7s)→ 判定永久环境变化 → 学习基线 B(空闲窗均值+判稳,黄灯常亮)→ 原子替换 Origin;铁块类瞬态 7s 内仍只冻结不污染 |
|
||
|
||
**故障补偿/黄灯常亮触发幅度量化(2026-09-04 补充)**
|
||
|
||
> ⚠ **方向澄清(V2.49 补充,易混点)**:本表只管 **CAPVD 高于 Origin(dev>0)** 方向 = 等效电感量**上升**(铁磁体靠近 / 涡流型金属从感应区移走 / Origin 相对当前空场偏低)。**车压是反方向**(涡流主导 L↓、f↑、CAPVD↓、dev<0)→ 冻结不学习(FREEZE_TIMEOUT 兜底),不进本表;车走正常回程 CAPVD≈Origin(dev≈0)也不进本表。只有 CAPVD **越过 Origin 继续走高**(环境 L 净升超过 4×dlt 且持续)才触发黄灯常亮/学习替换。
|
||
|
||
触发条件 = **dev = CAPVD − Origin > +4×dlt**(纯比例制,无绝对 counts 门槛;dlt = Origin×SensTable[SENS]>>16),且高位**连续**(期间回摆进 ±4dlt 窗口或目标靠近 dev<0 均清零重来):
|
||
- 连续 **2s**(ENV_WARN_WAIT=200)→ 黄灯常亮**预判锁存**(回摆不解除)
|
||
- 连续 **7s**(ENV_RESYNC_WAIT=700)→ 判定永久环境变化 → 学习基线 B → 原子替换 Origin → 空闲连续 2s 黄灯灭(总 ~15s)
|
||
|
||
仅处理 **CAPVD 高于 Origin**(等效电感量**上升**方向:铁磁体靠近 / 涡流型金属移走 / 环境 L 净升)。反方向(L 下降=车辆语义)冻结不学习,持续 ~10s 稳定后兜底更新(FREEZE_TIMEOUT,±2% 稳定窗)。
|
||
|
||
| SENS 档 | SensTable 进入表 | dlt 占 Origin | **触发幅度(4×dlt)** | 折算等效电感量上升 | 折算频率下降 |
|
||
|---|---|---|---|---|---|
|
||
| 0(最低灵) | 337 | 0.514% | **+2.06%** | **+4.11%** | ≈ −2.06% |
|
||
| 1 | 71 | 0.108% | **+0.43%** | **+0.87%** | ≈ −0.43% |
|
||
| 2 | 38 | 0.058% | **+0.23%** | **+0.46%** | ≈ −0.23% |
|
||
| 3(最高灵) | 25 | 0.038% | **+0.15%** | **+0.31%** | ≈ −0.15% |
|
||
|
||
换算依据(43nF 板口径):f = 240000/Xn;L = 2.533e7/(f²×C_nF) ⇒ L ∝ Xn²,小信号 dL/L ≈ 2×dXn/Xn ≈ 2×(dev/Origin),**df/f = −dXn/Xn**(f 与 Xn 反比;频率列 = Xn 偏差取负,非一半——V2.49 勘误)。
|
||
现场实例(SENS=3,Origin=129868,dlt=49):触发 CAPVD > 129868+196 = **130064**(+196 counts ≈ +0.15%);日志 neg_var_freeze dev=+247~+2003(5×~41×dlt)均远超触发线。
|
||
|
||
#### 4.4.3 基线更新速率(两阶段)
|
||
|
||
| 阶段 | 窗口 | 周期 | 用途 |
|
||
|------|------|------|------|
|
||
| 稳定期 (`!g_loop_stable`) | 100 | **1s** | 绕过 IIR/限幅,快速收敛,开机即用 |
|
||
| 正常运行 | 500 (WINDOW_ORIGIN) | **5s** | 强噪声抑制,稳定跟踪 |
|
||
|
||
```
|
||
稳定期: CAPVD = Value (raw) → 100 样本 → Origin 快速建立
|
||
正常: CAPVD = IIR(Value, α=79) → 500 样本 → Origin 稳定跟踪
|
||
```
|
||
|
||
### 4.5 Origin 污染保护与冻结超时恢复(V1.5 → V2.5)
|
||
|
||
#### 4.5.1 问题演进
|
||
|
||
| 版本 | 问题 | 方案 | 遗留问题 |
|
||
|------|------|------|---------|
|
||
| V1.5 | 车辆驶入时 Xn 先增,Origin 被污染后无法释放 | 4×阈值冻结 | 环境变化时永久冻结,需复位 |
|
||
| V2.3 | 永久冻结导致死锁 | 冻结超时(30s 后强制更新) | 波动值也可能超时触发 |
|
||
| V2.4 | 波动值被误判为"新常态" | 稳定性检查(±2% 窗口) | — |
|
||
| V2.5 | 30s 等待太长 | 缩短到 10s | — |
|
||
|
||
#### 4.5.2 当前完整逻辑
|
||
|
||
```c
|
||
if (dev < dlt_ORG * 4) {
|
||
/* 正常范围 → 跟踪,清零冻结状态 */
|
||
loop1_freeze_cnt = 0;
|
||
update_moving_average(...);
|
||
} else {
|
||
/* 异常偏高 → 冻结 + 超时 + 稳定性验证 */
|
||
if (loop1_freeze_cnt == 0)
|
||
loop1_freeze_ref = CAPVD; // 记录冻结起始值
|
||
else if (|CAPVD - freeze_ref| > freeze_ref * FREEZE_STABILITY_RATE / 100)
|
||
reset(freeze_cnt, freeze_ref); // 波动 > ±2% → 重新计时
|
||
|
||
loop1_freeze_cnt++;
|
||
if (loop1_freeze_cnt >= FREEZE_TIMEOUT) { // 10s @ 10ms/tick
|
||
Origin = CAPVD; // 连续稳定 → 接受为新基线
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 4.5.3 关键常量
|
||
|
||
| 常量 | 值 | 说明 |
|
||
|------|-----|------|
|
||
| 冻结触发阈值 | dlt_ORG × 4 | CAPVD 偏离 Origin 的倍数 |
|
||
| FREEZE_TIMEOUT | 1000 | ~10s @ 10ms/tick |
|
||
| FREEZE_STABILITY_RATE | 2 | 稳定性窗口:参考值的 ±2% |
|
||
| 基线窗口 | 100 | 滑动平均样本数(更新周期 ~1s) |
|
||
|
||
---
|
||
|
||
## 5. 时序状态机
|
||
|
||
### 5.1 状态转移
|
||
|
||
```
|
||
IN_DELAY=10 OUT_DELAY=10
|
||
[空闲] ──有车──→ [进入延时] ──超时──→ [有车确认]
|
||
↑ │
|
||
│ 车辆离开 (+ SW_4离开延时)
|
||
│ ↓
|
||
└──脉冲结束───── [脉冲输出] ←──超时── [离开延时]
|
||
PULSE_DELAY=10
|
||
```
|
||
|
||
### 5.2 时序参数
|
||
|
||
| 参数 | Tick (10ms) | 时间 | 说明 |
|
||
|------|------------|------|------|
|
||
| IN_DELAY | 50 | **500 ms** | 进入确认防抖(3 次 IIR 确认 + 500ms IN_DELAY) |
|
||
| OUT_DELAY | 50 | **500 ms** | 离开防抖(仅 SW_4=ON 时生效,OFF 时为 0) |
|
||
| PULSE_DELAY | 50 | **500 ms** | 脉冲输出宽度 |
|
||
| HOLD_TIME | 5×1200 | **~5 min** | 有限存在超时 |
|
||
| LC_HOLD_TIME | 4×1200 | **~4 min** | 安全复位超时 |
|
||
| STABLE_SAMPLES | 128 tick | **≥1.3 s** | 上电稳定期最少样本(基准漂移达标才判稳,见 §7) |
|
||
| STABLE_ORIGIN_PPT | 1 | — | 判稳带:窗口 Origin 均值漂移 ≤ Origin×0.1% |
|
||
| STABLE_SETTLE_WINDOWS | 2 | ~2 s | 连续窗口漂移达标数 |
|
||
| STABLE_MAX_SAMPLES | 500 tick | **~5 s** | 自检硬兜底上限(超时强制判稳) |
|
||
| FREEZE_TIMEOUT | 1000 | **~10 s** | 基线冻结超时(连续稳定后更新 Origin) |
|
||
| ENV_WARN_WAIT | 200 tick | **~2 s** | 环境预判锁存(V4.31):dev>+4×dlt 高位连续 2s → 黄灯常亮预判(锁存) |
|
||
| ENV_RECOVER_WAIT | 200 tick | ~2 s | 恢复确认(V4.31):新基线替换后 环境空闲连续 2s 才解除预判锁存、黄灯灭(回摆/目标靠近保持常亮) |
|
||
| ENV_RESYNC_WAIT | 700 tick | **~7 s** | 环境重校准等待:dev>+4×dlt 高位连续 7s 判定永久环境变化(V4.31 拍板:60s→10s→8s→7s) |
|
||
| ENV_LEARN_WINDOW | 200 tick | ~2 s | 环境学习窗口(基线 B 均值窗,学习期黄灯常亮) |
|
||
| ENV_LEARN_MAX_TICKS | 3000 tick | **~30 s** | 学习预算:窗口不稳超时放弃,保留旧 Origin(防死锁) |
|
||
| COIL_F_OK_MIN_KHZ | 18 kHz | — | 线圈频率合理窗下界(V4.36.18):f<18kHz → L偏大告警 |
|
||
| COIL_F_OK_MAX_KHZ | 125 kHz | — | 线圈频率合理窗上界(V4.36.9):f>125kHz → L偏小告警(43nF 板口径 ≈38µH;历史 120@68nF实验→92→108→115→125) |
|
||
| COIL_CAL_C_NF | 43 nF | — | **标定等效谐振电容**(V4.34 产品基准):三极管库存板(R19在/R27空,66nF 名义)实测 C_eff≈43;68 为 0Ω 实验板仅机理验证口径(产品不用);高频档(33nF)参考 34;标定法:LCR 实测 L → C=2.533e7/(f²×L),多颗平均 |
|
||
|
||
> **M4 优化**:V2.0 将 tick 从 50ms (TMR15 5ms×10) 提升到 10ms (vTaskDelay 10ms)。IIR 系数同步调整(α 从 79/256→18/256),保持等效时间常数。进入确认 3×10ms + 500ms IN_DELAY = ~530ms,比旧设计 (50ms + 500ms = 550ms) 略快。基线更新从 5s 加速到 1s。
|
||
|
||
### 5.3 系统 Tick 来源
|
||
|
||
TMR15 每 5ms 产生一次中断,`TM1cnt` 计数到 10 后触发 vd1_task(50ms 周期)。TMR15 ISR 同时驱动 LED。
|
||
|
||
---
|
||
|
||
## 6. 指示灯状态机
|
||
|
||
### 6.1 三 LED 驱动架构
|
||
|
||
```
|
||
TMR15 ISR (每 5ms)
|
||
├── 红灯 PB1 — TMR14 PWM 呼吸(硬件自主,不需软件干预)
|
||
├── 绿灯 PA9 — poll_green_led() 每 tick 更新
|
||
└── 黄灯 PA10 — poll_yellow_led() 每 tick 更新
|
||
```
|
||
|
||
> **设计原则**:三 LED 由 TMR15 ISR 统一驱动,单点控制。vd1_task 只设标志位,ISR 据此刷新硬件。
|
||
|
||
### 6.2 绿灯行为表
|
||
|
||
```c
|
||
void poll_green_led(void) {
|
||
if (loop1_INI_LOOP || !g_loop_stable) {
|
||
// 自检 / 稳定期:慢闪 200ms
|
||
blink_200ms();
|
||
} else if (g_disconnect_active) {
|
||
// 当前断开中:强制灭
|
||
LEDA_OFF;
|
||
} else if (VD_FLAG || FLAG_IN || FLAG_OUT) {
|
||
// 有车 / 进入 / 离开延时中:亮
|
||
LEDA_ON;
|
||
} else {
|
||
// 无车:灭
|
||
LEDA_OFF;
|
||
}
|
||
}
|
||
```
|
||
|
||
### 6.3 黄灯行为表
|
||
|
||
| 优先级 | 条件 | 行为 | 参数 | 诊断含义 |
|
||
|--------|------|------|------|---------|
|
||
| 1 | `g_disconnect_active == 1` 或 `!g_loop_power_up_state` | **快闪** | 200ms 亮 / 200ms 灭 | 线圈当前断开中 / 从无线圈上电 |
|
||
| 1 | **`g_coil_fault == 3`(V4.36.37 短路级)** | **快闪**(同断开级) | 200ms 亮 / 200ms 灭 | **电感量 <20µH(f>171kHz,真短路级)**——断开级指示;功能随 `COIL_UNDER_MIN_AS_OPEN` |
|
||
| 4 | `g_env_warn` 或 `g_env_resync` | **常亮** | — | 环境异常预判/重校准学习(V4.24/25/31;预判 2s 锁存、累计 7s 触发学习、替换后空闲 2s 灭) |
|
||
| 6 | **`g_coil_fault == 2`(V4.36.38 可用级)** | **一长两短** | 900ms 亮 / 300ms 灭 / 100ms 亮 / 300ms 灭 / 100ms 亮 / 700ms 灭 循环 | **电感量 20~24µH(156<f≤171k,低于下限但可用)**——判定恒照常,与一长一短(出窗)/快闪(断开)可区分 |
|
||
| 5 | `g_coil_fault == 1`(V4.36.25 三分) | **一长一短** | 长亮 900ms / 灭 300ms / 短亮 100ms / 灭 700ms 循环 | 电感量出合理窗(仍继续判车):f<18kHz=L偏大(>1.15mH) **或** 125k<f≤156k=L偏小(24~38µH) |
|
||
| 3 | `g_disconnect_count == 1` | **1 短闪** | 80ms 亮 / 200ms 灭 → 1.2s 灭(循环) | 断开 1 次,已恢复 |
|
||
| 3 | `g_disconnect_count == 2` | **2 短闪** | 同上 | 断开 2 次 |
|
||
| 3 | `g_disconnect_count >= 3` | **3 短闪** | 同上 | 断开 3+ 次 |
|
||
| 2 | 正常 | **灭** | — | 一切正常 |
|
||
|
||
> **V2.55 注:电感低于下限的分级(V4.36.37 方案A,用户拍板)——指示与功能解耦:**
|
||
> - **可用级 fault==2(156~171k,L 20~24µH)**:黄灯**一长两短**(900/300/100/300/100/700ms 循环,V4.36.38);判定/继电器/绿灯**恒照常**(不随宏)——23µH 类"低但可用"线圈不误杀
|
||
> - **短路级 fault==3(f>171k,L<20µH)**:黄灯**快闪 200ms**(与断开同款)——功能随 `COIL_UNDER_MIN_AS_OPEN`(宏作用域 V4.36.37 从 156k 移到 171k):
|
||
> - **=1(默认,V4.36.39 用户拍板)**:等同线圈断开完全态——判车暂停(vd1_task 挂起)+ 继电器保持释放 + 绿灯不亮;恢复=coil_monitor_recover 无条件监测(**V4.36.40 热切换修复**:强制期 Origin 冻结→改用 TMR3 实时 Xn 判回窗 240000/Xn),f 回窗 ≤171k 连续 5s → 实时置档 → LOOP_OK 自然回位 → 上升沿自动发起重连确认+无车判稳重建 Origin → 新线圈正常即全恢复(换线圈不断电 ~6s 自动恢复,无需重启)
|
||
> - =0(可选关):仍正常判车,快闪仅作"真短路/损坏"提示
|
||
> - 防抖:越界/恢复均 COIL_FAULT_HOLD_TICKS=500(5s,V4.36.21)
|
||
|
||
```c
|
||
void poll_yellow_led(void) { // 优先级 1 > 4 > 5 > 3 > 2 (V4.26)
|
||
if (g_disconnect_active || !g_loop_power_up_state)
|
||
fast_blink_200ms(); // ① 断开中快闪
|
||
else if (g_env_warn || g_env_resync)
|
||
led_on(); // ④ 环境预判/学习中常亮 (V4.24/25)
|
||
else if (g_coil_fault)
|
||
long_short_blink(); // ⑤ 电感量不合理: 一长一短 (V4.26)
|
||
else if (g_disconnect_count > 0)
|
||
n_short_flash(g_disconnect_count); // ③ N 短闪编码
|
||
else
|
||
led_off(); // ② 正常
|
||
}
|
||
```
|
||
|
||
> **注意**:"上电后不接线,之后再接线圈"不计入断开次数(`g_loop_power_up_state` 控制)。只有已连接过的线圈断开才计入 `g_disconnect_count`。
|
||
|
||
---
|
||
|
||
## 7. 上电稳定期
|
||
|
||
### 7.1 背景
|
||
|
||
Origin 首次确立后,线圈振荡未真正稳定。立即启用检测容易误判为有车(绿灯常亮)。
|
||
|
||
### 7.2 实现
|
||
|
||
```c
|
||
#define STABLE_SAMPLES 128 // 最少样本 (128×10ms≈1.3s)
|
||
#define STABLE_ORIGIN_PPT 1 // 判稳带: 窗口均值漂移 ≤ Origin×0.1%
|
||
#define STABLE_SETTLE_WINDOWS 2 // 连续 2 窗漂移达标判稳
|
||
#define STABLE_MAX_SAMPLES 500 // 硬兜底 5s (防环境长期不稳无限自检)
|
||
|
||
if (!g_loop_stable) {
|
||
// 仅跟踪基线,不检测车辆 (窗=100样本≈1s)
|
||
update_moving_average(&ORG_SUM, &ORG_CNT, &Origin, CAPVD, 100);
|
||
// 每窗完成时比较 Origin 均值漂移: ≤0.1% → g_settle_cnt++, 否则清零
|
||
if ((g_stable_cnt >= STABLE_SAMPLES && g_settle_cnt >= STABLE_SETTLE_WINDOWS)
|
||
|| g_stable_cnt >= STABLE_MAX_SAMPLES)
|
||
g_loop_stable = 1; // 基准稳定确认, 正式启用检测 (V4.23)
|
||
return; // 跳过进入/离开判断
|
||
}
|
||
```
|
||
|
||
稳定期间绿灯继续慢闪(`poll_green_led` 条件包含 `!g_loop_stable`),**闪烁持续到基准值稳定才停止**。
|
||
安全复位时 `loop1_LC_Reset` 重置 `g_loop_stable = 0`。
|
||
**勘误(2026-09-04 板测确认)**:LC_Reset 期间 RLY 刷新被挂起(不关断,保持当前输出),
|
||
LC_Reset 在下次 Car_In 清除;V4.36.4 绿灯=RLY2 镜像 → 复位期间绿灯随继电器保持亮,
|
||
观感与旧版(绿灯灭=复位中)不同,机制不变。SW5 极性:ON(引脚低→SET_SAFE=0)→启用
|
||
4 分钟自动复位;OFF(SET_SAFE=1)→禁用。LC_Hold_CNT 在 TMR15 50ms 分频步进
|
||
(4800×50ms=240s)。
|
||
|
||
> **V4.23 判稳语义**:自检结束 = 基准值稳定(连续 2 窗 Origin 漂移 ≤0.1%),而非固定样本数。
|
||
> 旧实现固定 128 样本即判稳,与基准是否稳定无关,且 static 计数残留导致二次稳定期 1 样本瞬间判稳——已改全局计数并在判稳退出/INIT_VD 时清零。
|
||
|
||
---
|
||
|
||
## 8. 线圈重连逻辑
|
||
|
||
### 8.1 设计目标
|
||
|
||
断开时不丢 VD_FLAG(车辆仍在线圈上方),重连后快速收敛 IIR。
|
||
|
||
### 8.2 状态机
|
||
|
||
```
|
||
断开检测: loop1_RF_FLAG == 0 (没有收到边沿)
|
||
├─ loop1_LOOP_OK = 0
|
||
├─ g_disconnect_active = 1
|
||
├─ g_disconnect_count++ (≤3)
|
||
├─ 保留 loop1_VD_FLAG ← 关键:不丢有车状态
|
||
├─ 关断继电器输出
|
||
└─ 绿灯强制灭
|
||
|
||
重连检测: loop1_RF_FLAG == 1 (重新收到边沿)
|
||
├─ loop1_LOOP_OK = 1
|
||
├─ g_disconnect_active = 0
|
||
├─ loop1_CAPVD = 0 ← 触发快速收敛
|
||
└─ vd1_task: CAPVD == 0 → CAPVD = Value (直锁首个样本)
|
||
```
|
||
|
||
### 8.3 断开-重连场景矩阵
|
||
|
||
| 断开前 | 断开期间 | 重连后 | VD_FLAG | 绿灯 | 继电器 |
|
||
|--------|---------|--------|---------|------|--------|
|
||
| 有车 | 车仍在 | 车仍在 | 1 → 保持 | 恢复亮 | 恢复输出 |
|
||
| 有车 | 车离开 | 无车 | 1 → cnt_release→3 → 0 | 灭 | 释放 |
|
||
| 无车 | 车进入 | 有车 | 0 → CAPVD>Origin+dlt → 1 | 亮 | 吸合 |
|
||
|
||
---
|
||
|
||
## 9. 调试接口 (TTL Tx)
|
||
|
||
### 9.1 物理层
|
||
|
||
| 参数 | 值 |
|
||
|------|-----|
|
||
| 接口 | TTL 电平 UART Tx |
|
||
| 电平 | 3.3V CMOS |
|
||
| 波特率 | 9600(默认) |
|
||
| 数据位 | 8 |
|
||
| 停止位 | 1 |
|
||
| 校验 | 无 |
|
||
| 用途 | 调试信息输出(频率、状态、标志位) |
|
||
|
||
### 9.2 数据格式
|
||
|
||
> 调试输出内容待后续版本补充。当前版本可通过 TTL 串口输出检测状态和原始频率值,用于开发调试和现场调参。
|
||
|
||
---
|
||
|
||
## 10. 故障检测
|
||
|
||
### 10.1 检测项
|
||
|
||
| 检测项 | 判定条件 | 触发动作 |
|
||
|--------|---------|---------|
|
||
| 线圈断开 | `loop1_RF_FLAG == 0` 持续 | 黄灯快闪 / 继电器释放 |
|
||
| 线圈短路 | Xn 持续为 0 或极小 | 黄灯快闪 / 继电器释放 |
|
||
| 电感量出窗(偏大) | 空场 f 持续 < 18 kHz(L>1.15mH,V4.36.25) | 黄灯**一长一短**(g_coil_fault=1)/ 防抖 5s |
|
||
| 电感量出窗(偏小) | 空场 125k < f ≤ 156k(L 24~38µH,V4.36.25) | 黄灯**一长一短**(g_coil_fault=1)/ 防抖 5s,仍判车 |
|
||
| **电感量低于下限·可用级** | 空场 156 < f ≤ 171 kHz(L 20~24µH,V4.36.37/38) | 黄灯**一长两短**(g_coil_fault=2,900/300/100/300/100/700ms);判定/继电器恒照常(不随宏);防抖 5s |
|
||
| **电感量短路级** | 空场 f > 171 kHz(L<20µH,V4.36.37) | 黄灯**快闪 200ms(断开同款)**(g_coil_fault=3);功能随 `COIL_UNDER_MIN_AS_OPEN`:0=仍判车 / 1=等同断开(判车停+继电器释放+绿灯灭);恢复回窗≤171k 连续 5s 实时置档;防抖 5s |
|
||
|
||
### 10.2 黄灯编码设计
|
||
|
||
断开次数编码提供了比 TLD-110 的均匀闪烁更丰富的诊断信息:
|
||
- **快闪=当前故障** → 现场立即处理
|
||
- **N短闪=历史故障** → 判断是偶发还是持续问题
|
||
- **一长一短=线圈电感量不合理**(V4.26/V4.36):空场频率出 20~115kHz 窗(默认低频档 43nF 口径;上限演进 120@68nF实验 → 92 → 108 → **115** ≈L44µH 定稿);用标定线圈实测后微调阈值
|
||
|
||
---
|
||
|
||
## 11. 代码架构
|
||
|
||
### 11.1 目录结构
|
||
|
||
```
|
||
DLD154V4B/
|
||
├── utilities/at32f421_freertos_demo/
|
||
│ ├── src/
|
||
│ │ └── TaskLoop.c # 主检测逻辑 (~945 行 V2.5)
|
||
│ ├── inc/
|
||
│ │ └── TaskLoop.h # 全局变量和函数声明
|
||
│ └── ... # FreeRTOS + HAL 框架
|
||
├── docs/
|
||
│ ├── product-manual.md # 产品手册
|
||
│ ├── technical-spec.md # 本文档
|
||
│ ├── devlog.md # 开发日志
|
||
│ └── reference_analysis.md # M1H/TLD-110 参考分析
|
||
└── README.md
|
||
```
|
||
|
||
### 11.2 代码精简历程
|
||
|
||
| 版本 | 代码量 | 说明 |
|
||
|------|--------|------|
|
||
| 原始 | ~1177 行 | 包含二阶滤波、FltHistoryManager 等死代码 |
|
||
| V1.1 | ~706 行 | 精简重构,-40% |
|
||
| V1.5 | ~868 行 | 增加平坦性判定、污染保护 |
|
||
| V2.5 | ~945 行 | 增加双路 IIR、斜率限幅、进入确认、冻结超时+稳定性 |
|
||
|
||
**删除的死代码:**
|
||
- 二阶差分滤波(计算但从未参与判决)
|
||
- FltHistoryManager(20+ 未用字段)
|
||
- StageRangeConfig(区间约束未引用)
|
||
- 动态窗口切换(LOOP_WINDOW_SIZE_LOW → FAST)
|
||
- 中间层时序状态(PLUSE_IN_F / PLUSE_IN)
|
||
|
||
---
|
||
|
||
## 12. 性能基准
|
||
|
||
### 12.1 检测性能
|
||
|
||
| 指标 | 值 | 说明 |
|
||
|------|-----|------|
|
||
| 进入检测延迟 | < 3 ms (测量) + 3×10ms (确认) + 500 ms (防抖) = **~530 ms** | M4 优化,比旧 550ms 略快 |
|
||
| 离开检测延迟 | < 3 ms (测量) + 3×10ms (防抖确认) + 500 ms (可选延时) | 滞回 + 3 次确认 |
|
||
| 误检率(单阈值) | — | 基准参考 |
|
||
| 误检率(防抖) | 滞回 + 3 次确认 | 瞬态干扰免疫(平坦性 #if 可选) |
|
||
| 频率分辨率 | < 0.01% | 取决于线圈 Q 值 |
|
||
| 温漂补偿 | 自动(100 窗口基线跟踪,更新周期 ~1s) | 仅无车时;冻结超时 10s |
|
||
| 瞬态抑制 | 5% 斜率限幅 + 3 次进入确认 | EMI/闪电免疫 |
|
||
|
||
### 12.2 CPU 占用
|
||
|
||
| 任务 | 频率 | CPU 占用 @120MHz | 说明 |
|
||
|------|------|-----------------|------|
|
||
| TMR3 ISR (捕获) | 50k/s @100kHz | ~2.1% | 每边沿约 50 周期 |
|
||
| TMR15 ISR (tick) | 200/s | < 1% | LED + 计数 |
|
||
| vd1_task | 100/s | < 1% | 滤波 + 检测(M4 10ms tick) |
|
||
| FreeRTOS 开销 | — | < 1% | 任务调度 |
|
||
| **总计** | — | **< 5%** | 余量充足 |
|
||
|
||
### 12.3 RAM 占用
|
||
|
||
| 模块 | 大小 | 说明 |
|
||
|------|------|------|
|
||
| 全局检测变量 | ~100 B | 状态、计数、滤波值 |
|
||
| FreeRTOS 堆栈 | ~4 KB | 任务栈 + 系统堆 |
|
||
| 剩余 | ~11 KB | 可用于扩展功能 |
|
||
|
||
---
|
||
|
||
## 13. 编译选项
|
||
|
||
```c
|
||
// TaskLoop.h
|
||
|
||
#define USE_FLATNESS_EXIT 0 // 1 = 平坦性离开判定 (CN200910309382)
|
||
// 0 = 简单 cnt_release 防抖 (V2.9 默认)
|
||
|
||
// M4 优化参数
|
||
#define MAX_SLOPE_RATE 5 // 斜率限幅: 单次最大变化 5%
|
||
#define ENTRY_CONFIRM 3 // 进入确认: 连续 N 次低于阈值
|
||
#define FREEZE_TIMEOUT 1000 // 冻结超时: ~10s @ 10ms/tick
|
||
#define FREEZE_STABILITY_RATE 2 // 稳定性窗口: 参考值的 ±2%
|
||
|
||
// 看门狗参数 (IWDT, V2.10 新增)
|
||
#define WDT_COUNTER_LIMIT 100 // 喂狗周期 500ms (TMR15 5ms × 100)
|
||
#define WDT_DIV 2 // IWDT 分频枚举值: 2 = WDT_CLK_DIV_16 (实际分频 16, 勿传 16!)
|
||
#define WDT_RLD 4095 // 12bit 重装载 → 超时 ≈ 1.64s
|
||
```
|
||
|
||
### 13.1 看门狗机制(IWDT,V2.10 新增)
|
||
|
||
AT32F421 独立看门狗(IWDT),双保险喂狗模式(对齐 DLD154Pro V3.03 方案):
|
||
|
||
| 环节 | 实现 |
|
||
|------|------|
|
||
| 使能 | `main()` 中 `wdt_init()`:分频 16(枚举 `WDT_CLK_DIV_16`)+ 重装载 4095 + 立即喂一次 |
|
||
| 超时 | ≈ 1.64s(LSI≈40kHz,`16×4096/40k`) |
|
||
| 活性计数 | TMR15 ISR 每 5ms `g_wdg_counter++` |
|
||
| 喂狗 | 主循环每轮 `poll_wdg()`:计数达 100(500ms)才 `wdt_counter_reload()` |
|
||
|
||
**双保险语义**:
|
||
- TMR15 ISR 死 → 计数不涨 → 永不喂狗 → 1.64s 后复位
|
||
- 主循环死(阻塞/死循环不走喂狗点)→ poll_wdg 不执行 → 1.64s 后复位
|
||
- FreeRTOS 调度失败 / 任务创建失败 → 无人喂狗 → 复位(期望行为,避免"假活")
|
||
|
||
> ⚠ 喂狗周期 500ms 必须远小于超时 1.64s;修改 WDT_DIV/WDT_RLD 时保持 `喂狗周期 < 超时/2`。
|
||
|
||
---
|
||
|
||
## 14. 关键专利
|
||
|
||
| 专利号 | 名称 | 权利人 | 应用 |
|
||
|--------|------|--------|------|
|
||
| CN200910309382 | 一种防误检环形线圈车辆检测器 | 中山大学 张辉/黄永强/陈古典 | 平坦性三条件离开判定 |
|
||
|
||
DLD154V4B V1.4 起实现该专利的整数化版本,用于大车通行时的离开判定,有效抑制频率曲线多峰导致的多次误触发。**V2.9(2026-08-28)起默认关闭(现场实测不理想),代码保留在 `#if USE_FLATNESS_EXIT` 内可一行开启。**
|
||
|
||
---
|
||
|
||
## 15. 修订记录
|
||
|
||
| 版本 | 日期 | 说明 |
|
||
|------|------|------|
|
||
| V1.0 | 2026-06-24 | 技术规格书初版(V1.5 固件) |
|
||
| V2.0 | 2026-06-29 | 更新至 V2.5 固件:双路 IIR、斜率限幅、进入确认、冻结超时+稳定性 |
|
||
| V2.1 | 2026-06-29 | 更新至 V2.6:单路 IIR ALFA_CAP1=79, WINDOW_ORIGIN=500, 两阶段基线 |
|
||
| V2.2 | 2026-09-02 | 更新至 V4.23:上电稳定期判稳语义(基准漂移≤0.1%×2窗 + 5s兜底)、红灯呼吸周期≈2.6s、绿灯自检描述 |
|
||
| V2.3 | 2026-09-02 | 更新至 V4.24:环境重校准(dev>+4dlt 高位连续 60s → 学习基线 B → 空闲原子替换 Origin,黄灯常亮指示;瞬态 60s 内不污染、30s 学习预算兜底) |
|
||
| V2.4 | 2026-09-02 | 更新至 V4.25:环境异常黄灯预判锁存(ENV_WARN_WAIT=5s 触发;回摆保持,ENV_RECOVER_WAIT 空闲 5s 才解除);预判≠学习 |
|
||
| V2.5 | 2026-09-03 | 更新至 V4.26:线圈电感量告警(频率窗 20~120kHz 单窗,黄灯一长一短);故障补偿 ENV_RESYNC_WAIT 60s→10s;黄灯优先级 1>4>5>3>2 |
|
||
| V2.6 | 2026-09-03 | 更新至 V4.27:频率测量 4 倍偏差修正(calc_freq_khz 60000→240000:TMR3 实际 120MHz 计数 + 通道 DIV_2 边沿分频,原按 60MHz 假设漏乘 2×2);§4.1.2 流程文字更正 |
|
||
| V2.7 | 2026-09-03 | 更新至 V4.28:L 估算引入标定等效谐振电容 COIL_CAL_C_NF=43(名义 66nF 与实测 C_eff≈43 不符;5 组实测 41.3~45.5nF) |
|
||
| V2.8 | 2026-09-03 | 更新至 V4.29:硬件修复(拨码三极管 5.1K→0Ω)使低频档并联全导通,C_eff 43→68.4≈名义66;COIL_CAL_C_NF 43→68 |
|
||
| V2.9 | 2026-09-03 | 更新至 V4.30:故障补偿时序 预判 5s→3s(300)/补偿 10s→8s(800)/恢复确认 5s→2s(200),总恢复 ~16s |
|
||
| V2.10 | 2026-09-03 | 更新至 V4.31:预判 3s→2s(200)/补偿 8s→7s(700),总恢复 ~16s→~15s |
|
||
| V2.11 | 2026-09-03 | 更新至 V4.32:黄灯一长一短模式时序 200/100/100/800ms → 300/100/100/700ms(dur[4]={60,20,20,140}) |
|
||
| V2.12 | 2026-09-03 | 更新至 V4.33:线圈频率合理窗上限 COIL_F_OK_MAX_KHZ 120→92kHz(>92k → L偏小告警) |
|
||
| V2.13 | 2026-09-03 | 更新至 V4.34:产品基准回到三极管库存板(不改电路),COIL_CAL_C_NF 68→43;0Ω 改动仅机理验证 |
|
||
| V2.14 | 2026-09-03 | 更新至 V4.35:频率窗上限 92→108kHz(43nF 板口径 ≈50µH,V4.33 的 92@68nF 实验板→43nF 过严复核修正) |
|
||
| V2.15 | 2026-09-03 | 更新至 V4.36:频率窗上限 108→115kHz(43nF 板口径 ≈44µH,放行 ~48µH 小线圈) |
|
||
| V2.16 | 2026-09-03 | 文档同步(V4.30~36 参数全面对齐):黄灯行为表模式 5 一长一短 300/100/100/700ms、模式 4 常亮 2s/7s/2s、COIL_F_OK_MAX_KHZ 115、故障表 f>115k |
|
||
| V2.17 | 2026-09-04 | 固件版本体系增加修订号:**V4.36.1**(MAIN/SUB 由产品定,小改动只增 REV);启动日志打印 fw 行 |
|
||
| V2.18 | 2026-09-04 | **V4.36.2 重连确认窗**:载波连续恢复 ~100ms 才确认重连重置(防接触抖动重复计数/首样本毛刺);断开判定不加防抖(释放速度安全刚需) |
|
||
| V2.19 | 2026-09-04 | **V4.36.3 有车断开继电器保持 RELAY_HOLD_MS=500ms**:断开前 VD_FLAG=1 → RLY 保持不释放;500ms 内重连+有车 → 无缝续持;重连+无车 → vd1_task 判离释放;超时仍断 → 强制释放(宏可调) |
|
||
| V2.20 | 2026-09-04 | **V4.36.4 绿灯=继电器状态指示**:稳定后绿灯镜像 RLY1(PA6) 实际输出——吸合亮/释放灭;删除断开时绿灯强制灭分支(与保持逻辑一致,消除"拔线绿灯灭=误判继电器释放");自检/判稳期仍 200ms 慢闪 |
|
||
| V2.21 | 2026-09-04 | **V4.36.5 重连起振抑制按 Q 分档**:低Q(高频小L 46~50µH)起振慢前几窗偏差大→假有车跳输出;按空场频率 f 分档抑制——f>100k 低Q 400ms / 80~100k 中Q 200ms / ≤80k 高Q 0ms(136/210µH 实测无需);抑制期仅挂起进入确认累计 |
|
||
| V2.22 | 2026-09-04 | **V4.36.6 高Q 档抑制窗 0→100ms**:高Q(≤80kHz 大L) 增加 100ms 短兜底窗(覆盖起振/插头瞬态),分档完整为 高Q 100ms/中Q 200ms/低Q 400ms |
|
||
| V2.23 | 2026-09-04 | **V4.36.7 参数调整**:RELAY_HOLD_MS 500→**1000**(有车断开继电器保持);抑制窗 高Q 100→**200** / 中Q 200→**300** / 低Q 400 不变 → 分档 200/300/400ms |
|
||
| V2.24 | 2026-09-04 | **V4.36.8 Q 档判定参数**:进入确认 ENTRY_CONFIRM 按 Q 档(高3/中4/低5 样本)+ 释放确认同表分档——低Q 抖动大防假进入/输出抖落;dlt 已比例化无需分档;update_q_confirm_need 每样本按空场 f 更新 |
|
||
| V2.25 | 2026-09-04 | **V4.36.9 COIL_F_OK_MAX_KHZ 115→125**:频率合理窗 20~125kHz(43nF 板口径 ≈38µH 起) |
|
||
| V2.26 | 2026-09-04 | **V4.36.10 绿灯镜像勘误**:绿灯指示对象 RLY1(PA6 脉冲/存在继电器)→**RLY2(PA5 默认继电器,恒随车辆存在)**——用户确认产品两个继电器:默认 + 拨码3 可选脉冲,绿灯指示默认继电器 |
|
||
| V2.27 | 2026-09-04 | **V4.36.11 低Q 重连抑制窗 400→1500ms**:Q 分档抑制 高200/中300/**低1500**ms |
|
||
| V2.28 | 2026-09-04 | **V4.36.12 黄灯一长一短 长亮 300→900ms**:dur {60,20,20,140}→{180,20,20,140}(总周期 1.8s),灭100/短亮100/灭700 不变 |
|
||
| V2.29 | 2026-09-04 | **V4.36.13 一长一短 灭 100→300ms**:dur {180,20,20,140}→{180,60,20,140}=900/300/100/700ms(总周期 2.0s) |
|
||
| V2.30 | 2026-09-04 | **V4.36.14 重连确认窗漏网路径修复**:主循环拍级自身上升沿检测(g_prev_ok)替代 ISR LOOP_OK0——插头抖动致 LOOP_OK0 卡 1 时恢复不再漏触发确认窗(现场 21µH 无窗直接 Car_In 复现);LO 抑制窗仍 1500ms(用户临时 3000 未入库) |
|
||
| V2.31 | 2026-09-04 | **V4.36.15 重连判稳门控**:无车断开重连后值稳定才放行动作——200ms 步进漂移≤dlt/2 连续 600ms + dev 回带(≤dlt) → Origin 对齐当前空场(消新旧基线差);不稳黄灯续闪;强车 8×dlt 例外即时放行;5s 兜底。低Q 窗末假车(21µH 蠕变 ~2.2s > 固定窗)根治 |
|
||
| V2.32 | 2026-09-04 | **V4.36.16 上电自检与重连灯语义分离**:黄灯模式1 去 !power_up(上电有线圈黄灯不闪,自检归绿灯慢闪);无线圈由 disconnect_active 覆盖仍双闪;判稳门控触发加 g_loop_stable(上电/安全复位不判稳);运行中重连仍黄灯接管 |
|
||
| V2.33 | 2026-09-04 | **V4.36.17 修复上电无线圈黄灯不闪**:断开分支置位条件含 power_up(上电 phase 故意不置 disconnect_active),V4.36.16 去 !power_up 后裸奔 → 黄灯模式1 改 `!LOOP_OK || g_reconn_stab`(5ms 实时载波缺失判定,同时让运行中断开黄灯反应从 150ms 加快到 5ms) |
|
||
| V2.34 | 2026-09-04 | **V4.36.18 频率窗下界 20→18kHz**:放行更大电感线圈(18~125kHz @43nF ≈ L 47µH~1.15mH);test 边界 17 偏大/18 正常;参数表同步修正历史滞后(MAX 125 / C_NF 43) |
|
||
| V2.35 | 2026-09-04 | **V4.36.19 低Q 释放抗抖**:低Q(21~50µH)高灵敏边界试探释放点外移/锁死(释放带回 23≈σ,快值判释放被抖断);τ50ms 平滑(REL_ALFA=46, 打印降采样平均效应工程版)+带回×1.5(REL_BAND_LO_MULT) 仅低Q 生效,高/中Q 零影响 |
|
||
| V2.36 | 2026-09-04 | 故障补偿触发幅度量化说明(4.4.2 补分档表):触发 dev>+4×dlt 连续 2s 黄灯常亮 / 7s 学习替换;SENS=3 ≈ Xn+0.15% ≈ 电感+0.31%(L∝Xn²,dL/L≈2×dXn/Xn) |
|
||
| V2.37 | 2026-09-04 | **V4.36.20 最低工作电感量 COIL_L_MIN_UH=20µH**(43nF 口径):L<20µH(f>171kHz)→ 按线圈断开快闪指示(模式1,coil_fault==2 归入断开级);原上限 125kHz(38µH) 放宽至 20µH 可工作;L 偏大(f<18kHz)一长一短保留(coil_fault==1);test 边界 171 正常/172 偏小 |
|
||
| V2.38 | 2026-09-04 | **V4.36.21 电感量判定防抖 1s→5s**(COIL_FAULT_HOLD_TICKS=500):下限判定重要防误检——起振/瞬态频率冲高越界需持续 5s 才置位断开级快闪,恢复同样 5s 清除 |
|
||
| V2.39 | 2026-09-04 | **V4.36.22 最低电感量 20→25µH**(COIL_L_MIN_UH=25):频率上限 171→153kHz(f@25µH=153.5k);L<25µH → 断开级快闪;test 边界 153 正常/154 偏小 |
|
||
| V2.40 | 2026-09-04 | **V4.36.23 最低电感量 25→24µH**(COIL_L_MIN_UH=24):频率上限 153→156kHz(f@24µH=156.7k);L<24µH → 断开级快闪;test 边界 156 正常/157 偏小 |
|
||
| V2.41 | 2026-09-04 | **V4.36.24 L<下限 双模式宏 COIL_UNDER_MIN_AS_OPEN**:0=仅黄灯快闪(绿灯/继电器/判定照常,默认);1=视为线圈断开完全状态——ISR 强制 LOOP_OK=0(主循环断开路径+黄灯快闪)、RLY 刷新/保持短路(继电器保持释放、绿灯灭、无 5ms 抖动)、vd1_task 停;新增 coil_monitor_recover 无条件恢复监测(强制期原 coil_monitor 停摆,防换线圈后死锁,f 回窗 5s 清) |
|
||
| V2.42 | 2026-09-04 | **V4.36.25 电感量三分语义修正**(用户设计拍板):合理窗恢复 18~125kHz(COIL_F_OK_MAX_KHZ=125,V4.36.22 曾误随下限推到 156);新增 COIL_L_MIN_F_KHZ=156(=24µH 下限)——f<18k 或 125k<f≤156k → coil_fault=1 一长一短(出窗但高于下限);f>156k(L<24µH)→ coil_fault=2 快闪断开级;coil_monitor_recover 判据同步(回 18~156 解除强制,125~156 由原路径接管为一长一短);test 126→1/156→1/157→2 |
|
||
| V2.43 | 2026-09-04 | **V4.36.26 低Q 发散治理剂量加大(方案A)**:REL_ALFA 46→30(τ 50→85ms);带回保持 35(回滞 14 counts 不再压缩);新增 REL_ORIGIN_FREEZE_TICKS=50——释放确认(Car_OFF)后 Origin 均值窗冻结 500ms,切断「释放残余→Origin 学入→释放线漂移」cycle 间正反馈(治本项) |
|
||
| V2.44 | 2026-09-04 | **V4.36.27/28 低Q 锁死根因定位与带回修正**(23µH/33µH 双日志对照 + 诊断字段 QLO/RSM/RLN/RCN):排除 Origin 漂移(全程恒定)与 g_q_lo(=1 正常)与平滑滞后(RSM 跟随正常)→ 根因=**静态带回缺口**:23µH 板停临界稳态 CAPVD 回摆仅 Origin-36,释放线 Origin-34(MULT150)反而更高 2 counts → RCN 永不累计 → 锁死;33µH 回摆 Origin-25 富余 9 → 正常。实测 σ≈1-2 counts(此前 σ25 假设错误)。修正 REL_BAND_LO_MULT 150→180(带回 35→41,线 Origin-41 < Origin-36 稳态,余 4 counts;触发-释放回滞 49-41=8 counts=4~8σ 安全);V4.36.27 为诊断字段过渡版 |
|
||
| V2.45 | 2026-09-04 | **V4.36.29 低Q 释放判定容差 REL_LO_TOL=4**(J1 日志 75s 延迟释放根因):Origin 过冲残留(拿起板 env 学高 34 counts, 释放后均值窗 7s 收敛)被 VD 冻结 → 释放线偏高 → 撤板后真空 CAPVD 距线仅 7 counts、RSM 平滑差 1 count 卡 75s。容差 4 = 等效释放线 Origin-45(回滞 49-45=4 counts, σ1-2 安全);板停触发深处(dev-49)不误释放;正常撤板余量不变 |
|
||
| V2.46 | 2026-09-04 | **V4.36.30 环带超时兜底替代容差**(用户反馈 V4.36.29 容差致"抬一点就释放"):撤 REL_LO_TOL=4(回滞恢复 8 counts);新增 REL_BAND_TIMEOUT_TICKS=250——低Q 触发后若 CAPVD 平滑 > 进入线(已离开触发深度)持续 2.5s → 强制释放。空间回滞带内停住(试探卡死)不再永久锁;真实车深压不触发;J1 撤板 2.5s 内释放(原 75s) |
|
||
| V2.47 | 2026-09-04 | **V4.36.31 真空 EMA 重锚(B3)**:无车 dev 窗维护 g_vacuum_ema(α=128, τ≈1.28s, 判稳建立);判定参考 vac_ref()=min(Origin, EMA)——进入线/低Q 释放线/环带兜底线全部锚真空参考。Origin 被 env 学习锚高(板搁置态 130636 vs 真空 130506)时释放线不再偏高;撤板真空即释放。DBG 加 VEM/RLN 显示真空锚定线。A2(学入步长限 1%)存档可选加严 |
|
||
| V2.48 | 2026-09-04 | **V4.36.32 释放后分级补偿(仿 PD132T 慢采样)**:均值窗是满窗替换(500 样本/5s)——快采样 10ms 让窗装得快, 释放残余(板缓离低 CAPVD)易整窗拉低 Origin。分级:释放后全冻结 1s(REL_ORIGIN_FREEZE_TICKS 50→100) → 降权低速补偿 2s(ORIGIN_LOWLEARN_TICKS=200, 窗 500→2500=25s, 学习速率 1/5, ORIGIN_LOWLEARN_MULT=5) → 正常。全宏可调;EMA/判定零影响 |
|
||
| V2.49 | 2026-09-04 | 文档勘误:① 4.4.2 表"折算频率下降"列少乘 2(应 = −dXn/Xn: −2.06/−0.43/−0.23/−0.15%);② 补方向澄清——本表只管 CAPVD>Origin(L 升方向),车压 L 降方向冻结不在此表;③ 4.3.1 注 USE_PLANB_TABLE 双表 |
|
||
| V2.50 | 2026-09-04 | **V4.36.33 vac_ref 重锚阈值 VAC_REF_DELTA_DLT=1**:用户反馈触发高度漂移(间隔几秒再压变浅、多试几轮恢复)——EMA(α128 τ1.28s)+4×dlt 宽窗把金属板悬感应边缘(dev−20~−40)当真空快学 → vac_ref 被拉低 → 触发线漂移。修: 仅 Origin−EMA>1×dlt(真锚错 J1 130 counts) 才重锚 EMA, 小偏差用 Origin |
|
||
| V2.51 | 2026-09-08 | **V4.36.34 EMA 钳位+自愈+诊断**:35µH 日志 VEM 垃圾实锤(536M→846M→2224M 递增, 10:23:03 起) → EMA 内存被越界写(值≈ORG_SUM 语义但数值不匹配; 写源未定)。防御: EMA 每步限 ±3×dlt、与 Origin 偏差>25% 自愈回 Origin;诊断: DBG 加 SUM(ORG_SUM 对照)+每 10s ADR(四变量地址) |
|
||
| V2.52 | 2026-09-08 | **V4.36.35 EMA cast 顺序根治**:(uint32_t)负差/128 = +3355万/样本(C 语义: 负 cast uint32 后无符号除法)——V4.36.31 引入的 EMA 爆炸源, V4.36.34 自愈每样本兜住(炸+重置净零)掩盖; 修: 有符号先除 (uint32_t)(_ema_d/128)。35µH V4.36.34 全绿: 13+ cycle 正常+band_timeout 兜底 2 次实战; ADR 条件修复(_t_ms 恒 2000 原永不触发) |
|
||
| V2.53 | 2026-09-08 | **V4.36.36 就绪巩固期 Q 分级**:低Q 上电判稳完(绿灯灭)即压板 → 绿灯常亮(系统未收敛完)。判稳完成后再按 Q 档绿灯继续慢闪: 高Q 5s(READY_HOLD_HI=1000)/中Q 7s(MID=1400)/低Q 10s(LO=2000, 5ms tick)——期间 Origin/EMA/滤波继续收敛, 绿灯灭才允许操作。Loop stable 打印带 ready:Ns |
|
||
| V2.54 | 2026-09-08 | 文档补全:6.3 黄灯行为表更新 V4.36.25 三分语义——fault==2(L<24µH f>156k) 与断开同快闪(行 2);fault==1 一长一短含 125~156k;新增 COIL_UNDER_MIN_AS_OPEN 宏指示/功能解耦说明;10.1 故障表同步 18k/156k 三分 + 宏 + 防抖 5s |
|
||
| V2.55 | 2026-09-08 | **V4.36.37 电感分级降级(方案A, 用户拍板)**:低于下限拆两级——156~171k(L20~24µH)=fault2 疾闪100ms(恒判车, 与断开区分);f>171k(L<20µH)=fault3 短路级断开快闪(COIL_UNDER_MIN_AS_OPEN 作用域 156k→171k);recover 回窗≤171k 且恢复实时置档(原清0有5s黄灯空档) |
|
||
| V2.56 | 2026-09-08 | V4.36.38: fault2 可用级黄灯指示 疾闪100ms → **一长两短** (900/300/100/300/100/700ms 循环, 用户定节奏) |
|
||
| V2.57 | 2026-09-08 | V4.36.39: COIL_UNDER_MIN_AS_OPEN 默认值 0→1 (用户拍板) —— L<20µH 短路级出厂即等同断开(判车停+继电器释放+绿灯灭) |
|
||
| V2.58 | 2026-09-08 | V4.36.40 热切换修复: recover 恢复判定改 TMR3 实时 Xn(240000/Xn) —— 原 calc_freq_khz(冻结Origin,LPCNT) 永不回窗致换线圈死锁; 恢复后自然走重连+判稳重建 Origin |
|
||
| V2.59 | 2026-09-08 | 注释同步: 代码/测试全部 疾闪 → 一长两短 (V2.55~58 历史版本行保留当时变更记录) |
|
||
| V2.61 | 2026-09-11 | **V4.36.42 低Q 临界悬停自激根治**:`vac_ref()` 门控原先用会随状态切换的 `loop1_dlt_ORG`(无车=进表 49 / 有车=释表 23)⇒ 进门瞬间参考由 Origin 阶跃到 EMA,与低Q ×1.8 释放带叠加成**反向滞回** ⇒ 深度 1.0~1.8×dlt 的静止凹脉冲自激(100ms 周期)。新增 `vac_gate_dlt()`(G1) 统一参考 + 低Q 释放带夹紧(G2) + 有车 300ms 最小保持(G3);22µH/35µH 现场实测 300/300 → 1/0 |
|
||
| V2.60 | 2026-09-11 | **V4.36.41 环境重校准后触发高度变低根治**:进入判定用 `vac_ref()=min(Origin,真空EMA)`,环境重校准路径未同步该参考 ⇒ 新增 `origin_set_atomic()`(3 处 Origin 写入点;维持 Origin−EMA ≤1×dlt 不变式)+ EMA 余数累加消 ±127 counts 整数死区;新增镜像单测 test_vac_ref_reanchor(5 场景) |
|