Files
DLD154V4B/docs/technical-spec.md
T
wangfq 5a3ab667bc feat(V4B): V4.36.24 — L<下限双模式宏 COIL_UNDER_MIN_AS_OPEN
用户需求: L<24µH 后 0=仅黄灯快闪(现状, 判定/继电器/绿灯照常);
1=视为线圈断开完全状态: 黄灯快闪+继电器保持释放+绿灯不亮
- ISR RF 分支置 LOOP_OK=1 后强制压 0 → 主循环断开路径(vd1_task 停/黄灯快闪/disconnect)
- RLY 刷新(RF段)与保持(hold段)短路 → 继电器保持释放, 绿灯镜像灭;
  短路放条件而非事后压 OFF(防 5ms ON/OFF 继电器抖动打火)
- coil_monitor 随 vd1_task 停摆 → 新增 coil_monitor_recover() 无条件每 10ms
  恢复监测 (f 回窗 18~156kHz 连续 5s 清 fault → LOOP_OK 恢复 → 重连确认+判稳门控)
- 默认 0 (与 V4.36.23 一致无回归); 切 1 现场验证完全断开语义
语法0 error, 4测试全绿; spec V2.41 / manual 故障表 / devlog V2.60
2026-09-07 09:33:00 +08:00

46 KiB
Raw Blame History

DLD154V4B 技术规格书

单路线圈车辆检测器 | 固件版本: V4.36.24 | 文档版本: V2.41
本文档面向工程开发、系统集成及故障深度分析


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 拨码开关逻辑

// 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 关键常量

#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 起采用单路 IIRALFA_CAP1=79 @10ms (τ≈32ms),比旧 50ms tick 的 τ≈162ms 快 5 倍:

#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 次低于阈值才判定有车。

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 灵敏度表

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.82026-08-27):SENS=3 最高档进入阈值 10→200.015%→0.031% Δf/f,ΔL/L 0.031%→0.061%),离开 9→14(滞回 90%→70%)——现场广告杆落杆时最高档易误触发(落杆机械/电磁扰动越过 0.015% 阈值),提高阈值并加大滞回。

⚠ V2.112026-08-28):PD132T 客户现场替换对齐——进入/离开表全档与 PD132T 完全一致:① 进入 216/108/36/20 → 300/60/32/210.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 优化:确认机制)

// 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 起)
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.032026-08-31)释放慢滤波(方案 AUSE_SLOW_RELEASE:现场金属板测试——灵敏度表已对齐,但释放高度 V4B 比 PD132T 低(V4B 刚离开触发位置即释放,PD132T 需离得更远)。根因:IIR 滤波时间常数差异V4B 10ms tick + α79 → τ≈32msPD132T 43.7ms tick + α79/64 → τ≈142175ms,慢 4.45.5×),释放阈值浅(进入的 20%)放大差异。修复:离开判定改用独立慢滤波值 loop1_CAPVD_slow(α=18/256 @10ms → τ≈142ms,复刻 PD132T 恢复速度,吃原始 Value 不经斜率限幅),进入路径不变。开关 USE_SLOW_RELEASETaskLoop.h,默认 1;0=原快滤波释放)。单测:τ fast=30ms/slow=140ms,释放时机差 260mstests/test_release_slow_filter.c)。⚠ 若现场 PD132T 的 SET_FLT=ON(α64 → τ≈175ms),可调 RELEASE_ALFA 15(τ≈170ms)更贴近。

⚠ V4.042026-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→+3mm0.10% 板 HR0/2 假释放消除。⚠ 待板级复测。

⚠ V4.052026-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 早 36 counts,原始表更接近;浅信号(~0.1%)加深表更接近(差 ~1.3 counts)。HR0/2 假释放结构性免疫(无悬停状态)。现场 A/B 对比后定稿,USE_SLOW_RELEASE/USE_PLANB_TABLE 两宏二选一保留。

⚠ V4.06/V4.072026-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 平坦确认次数

整数化适配: 专利原实现用 floatHz 频率值),DLD154V4B 用 uint32 定点(Origin ≈ 131K)。导数计算用 int32 整数差分,阈值 /K1、/K2 做整数除法,精度足够。

4.4 基线跟踪(M4 优化:斜率限幅 + 冻结超时)

4.4.1 斜率限幅

EMI/闪电等瞬态干扰会造成 CAPVD 瞬间跳变。物理车辆不可能让线圈频率瞬间改变 >5%:

#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 基线跟踪规则

// 仅无车 + 无离开延时中 → 跟踪基线
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 高位连续 7sENV_RESYNC_WAITV4.26 60s→10sV4.30→8sV4.31→7s)→ 判定永久环境变化 → 学习基线 B(空闲窗均值+判稳,黄灯常亮)→ 原子替换 Origin;铁块类瞬态 7s 内仍只冻结不污染

故障补偿/黄灯常亮触发幅度量化(2026-09-04 补充)

触发条件 = dev = CAPVD Origin > +4×dlt(纯比例制,无绝对 counts 门槛;dlt = Origin×SensTable[SENS]>>16),且高位连续(期间回摆进 ±4dlt 窗口或目标靠近 dev<0 均清零重来):

  • 连续 2sENV_WARN_WAIT=200)→ 黄灯常亮预判锁存(回摆不解除)
  • 连续 7sENV_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% 1.02%
1 71 0.108% +0.43% +0.87% 0.22%
2 38 0.058% +0.23% +0.46% 0.12%
3(最高灵) 25 0.038% +0.15% +0.31% 0.08%

换算依据(43nF 板口径):f = 240000/XnL = 2.533e7/(f²×C_nF) ⇒ L ∝ Xn²,小信号 dL/L ≈ 2×dXn/Xn ≈ 2×(dev/Origin)。 现场实例(SENS=3Origin=129868dlt=49):触发 CAPVD > 129868+196 = 130064+196 counts ≈ +0.15%);日志 neg_var_freeze dev=+247~+20035×~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 当前完整逻辑

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_task50ms 周期)。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 绿灯行为表

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 灭 线圈当前断开中 / 从无线圈上电
4 g_env_warng_env_resync 常亮 环境异常预判/重校准学习(V4.24/25/31;预判 2s 锁存、累计 7s 触发学习、替换后空闲 2s 灭)
5 g_coil_faultV4.26/32/36.13 一长一短 长亮 900ms / 灭 300ms / 短亮 100ms / 灭 700ms 循环 电感量不合理:1=L偏大(f<20kHz) 2=L偏小(f>125kHz)
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 正常 一切正常
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 实现

#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 或极小 黄灯快闪 / 继电器释放
电感量不合理(L偏大) 空场 f 持续 < 20 kHz(默认低频档,V4.26 黄灯一长一短g_coil_fault=1/ 持续监视 1s 防抖
电感量不合理(L偏小) 空场 f 持续 > 125 kHz 黄灯一长一短g_coil_fault=2/ 持续监视 1s 防抖

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、斜率限幅、进入确认、冻结超时+稳定性

删除的死代码:

  • 二阶差分滤波(计算但从未参与判决)
  • FltHistoryManager20+ 未用字段)
  • 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. 编译选项

// 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 看门狗机制(IWDTV2.10 新增)

AT32F421 独立看门狗(IWDT),双保险喂狗模式(对齐 DLD154Pro V3.03 方案):

环节 实现
使能 main()wdt_init():分频 16(枚举 WDT_CLK_DIV_16+ 重装载 4095 + 立即喂一次
超时 ≈ 1.64sLSI≈40kHz16×4096/40k
活性计数 TMR15 ISR 每 5ms g_wdg_counter++
喂狗 主循环每轮 poll_wdg():计数达 100500ms)才 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.92026-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→240000TMR3 实际 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≈名义66COIL_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/700msdur[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→430Ω 改动仅机理验证
V2.14 2026-09-03 更新至 V4.35:频率窗上限 92→108kHz43nF 板口径 ≈50µHV4.33 的 92@68nF 实验板→43nF 过严复核修正)
V2.15 2026-09-03 更新至 V4.36:频率窗上限 108→115kHz43nF 板口径 ≈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 4650µH)起振慢前几窗偏差大→假有车跳输出;按空场频率 f 分档抑制——f>100k 低Q 400ms / 80100k 中Q 200ms / ≤80k 高Q 0ms136/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~125kHz43nF 板口径 ≈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→1500msQ 分档抑制 高200/中300/低1500ms
V2.28 2026-09-04 V4.36.12 黄灯一长一短 长亮 300→900msdur {60,20,20,140}→{180,20,20,140}(总周期 1.8s),灭100/短亮100/灭700 不变
V2.29 2026-09-04 V4.36.13 一长一短 灭 100→300msdur {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
V2.34 2026-09-04 V4.36.18 频率窗下界 20→18kHz:放行更大电感线圈(18125kHz @43nF ≈ L 47µH1.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µH43nF 口径):L<20µHf>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→5sCOIL_FAULT_HOLD_TICKS=500):下限判定重要防误检——起振/瞬态频率冲高越界需持续 5s 才置位断开级快闪,恢复同样 5s 清除
V2.39 2026-09-04 V4.36.22 最低电感量 20→25µHCOIL_L_MIN_UH=25):频率上限 171→153kHzf@25µH=153.5k);L<25µH → 断开级快闪;test 边界 153 正常/154 偏小
V2.40 2026-09-04 V4.36.23 最低电感量 25→24µHCOIL_L_MIN_UH=24):频率上限 153→156kHzf@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 清)