From 75b1ee8acb258c2abef045e7ce788d8fbbb112c7 Mon Sep 17 00:00:00 2001 From: wangfq Date: Fri, 4 Sep 2026 14:00:32 +0800 Subject: [PATCH] =?UTF-8?q?fix(V4B):=20V4.36.14=20=E2=80=94=20=E9=87=8D?= =?UTF-8?q?=E8=BF=9E=E7=A1=AE=E8=AE=A4=E7=AA=97=E6=BC=8F=E7=BD=91=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E4=BF=AE=E5=A4=8D=20(=E4=B8=BB=E5=BE=AA=E7=8E=AF?= =?UTF-8?q?=E6=8B=8D=E7=BA=A7=E4=B8=8A=E5=8D=87=E6=B2=BF)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 现场 21µH: 三段重连仅无窗段跳 (无 reconnect/blank 打印直接 Car_In) 根因: 上升沿用 ISR LOOP_OK0(5ms), 断开时主循环 150ms 慢 tick, 插头抖动可致 LOOP_OK0 卡 1 → 恢复漏触发确认窗 → CAPVD 不重置直接判定 → 插回瞬态假有车. 干净断开重连走窗则被抑制(验证 2/3 段无跳) 改动: loop_task while 顶部 g_prev_ok 主循环拍级(10ms)上升沿检测, 任何 0→1 恢复强制进确认窗+blank; 抖动免疫保留; LOOP_OK0 仅供安全复位 语法0 error, 4测试全绿; spec V2.30 / devlog V2.48 --- docs/devlog.md | 38 +++++++++++++++++++ docs/technical-spec.md | 3 +- utilities/at32f421_freertos_demo/inc/cmcng.h | 4 +- .../at32f421_freertos_demo/src/TaskLoop.c | 21 +++++++--- 4 files changed, 57 insertions(+), 9 deletions(-) diff --git a/docs/devlog.md b/docs/devlog.md index b675b80..45e0bb5 100644 --- a/docs/devlog.md +++ b/docs/devlog.md @@ -4,6 +4,43 @@ --- +## 2026-09-03 — 重连确认窗漏网路径修复(固件 V4.36.14) + +> **固件版本:V4.36.14**(cmcng.h:FIRMWARE_VER="4.36.14",REV=14)。devlog 修订 V2.48。 + +### 现场复现(用户 21µH/164kHz 线圈, 临时改 LO 抑制 3000ms 测试) + +日志三段重连仅第一段跳:disconnect(cnt=1) → 4s 后 enter_try/Car_In/Car_OFF(1.96s), +**前后无 reconnect confirmed / reconn_blank 打印** → 假车没走抑制窗。 + +### 根因:确认窗漏网路径(LOOP_OK0 拍级竞态) + +重连上升沿用 ISR(5ms) 维护的 `loop1_LOOP_OK0`,而主循环断开时 150ms 慢 tick: +插头抖动(断开↔恢复数拍)可使 LOOP_OK0 停在 1 → 恢复时 `!LOOP_OK0` 不触发 +→ 跳过 candidate/确认窗/blank → CAPVD 不重置、直接正常判定 → 插回瞬态 +(CAPVD 大跌 700+ counts) 判假车跳输出。干净断开→干净重连则走窗被抑制(②③无跳)。 + +### 改动 + +loop_task while 顶部**主循环拍级(10ms)自身上升沿检测**: +```c +if (loop1_LOOP_OK && !g_prev_ok) { g_prev_ok = 1; candidate=1; cnt=0; } +else if (!loop1_LOOP_OK) g_prev_ok = 0; +``` +任何 0→1 恢复(无论 LOOP_OK0 状态)都强制进确认窗 + blank 抑制; +确认窗内掉线仍取消候选(抖动免疫保留)。ISR LOOP_OK0 维护保留(供安全复位路径,不再驱动候选)。 + +### 验证 + +- 语法 0 error;4 组单测全 PASS(重连在主循环,无单测耦合;待板级验证) + +### 待板级验证 + +1. 21µH(或 46µH) 快速抖动拔插:每次恢复都应看到 `loop_reconnect confirmed` + `reconn_blank`, + 无直接 Car_In 跳输出(尤其"断开几拍又恢复"的抖动场景) +2. 正常拔插重连:行为同 V4.36.13(100ms 确认 + 分档抑制) +3. 抑制窗值:git 基线 LO=1500ms(用户临时 3000 是否转正待定) + ## 2026-09-03 — 一长一短 灭 100→300ms(固件 V4.36.13) > **固件版本:V4.36.13**(cmcng.h:FIRMWARE_VER="4.36.13",REV=13)。devlog 修订 V2.47。 @@ -1747,6 +1784,7 @@ if (dev >= dlt_ORG × 4) { | 版本 | 时间 | 说明 | |------|------|------| +| V2.48 | 2026-09-03 | V4.36.14 重连确认窗漏网路径修复: 主循环拍级上升沿检测替代 ISR LOOP_OK0 | | V2.47 | 2026-09-03 | V4.36.13 一长一短 灭 100→300ms (dur 180/60/20/140, 周期2.0s) | | V2.46 | 2026-09-03 | V4.36.12 一长一短长亮 300→900ms (dur 180/20/20/140, 周期1.8s) | | V2.45 | 2026-09-03 | V4.36.11 低Q 重连抑制窗 400→1500ms (分档 200/300/1500ms) | diff --git a/docs/technical-spec.md b/docs/technical-spec.md index e1b2137..fabe3e6 100644 --- a/docs/technical-spec.md +++ b/docs/technical-spec.md @@ -1,6 +1,6 @@ # DLD154V4B 技术规格书 -> 单路线圈车辆检测器 | 固件版本: V4.36.13 | 文档版本: V2.29 +> 单路线圈车辆检测器 | 固件版本: V4.36.14 | 文档版本: V2.30 > 本文档面向工程开发、系统集成及故障深度分析 --- @@ -795,3 +795,4 @@ DLD154V4B V1.4 起实现该专利的整数化版本,用于大车通行时的 | V2.27 | 2026-09-03 | **V4.36.11 低Q 重连抑制窗 400→1500ms**:Q 分档抑制 高200/中300/**低1500**ms | | V2.28 | 2026-09-03 | **V4.36.12 黄灯一长一短 长亮 300→900ms**:dur {60,20,20,140}→{180,20,20,140}(总周期 1.8s),灭100/短亮100/灭700 不变 | | V2.29 | 2026-09-03 | **V4.36.13 一长一短 灭 100→300ms**:dur {180,20,20,140}→{180,60,20,140}=900/300/100/700ms(总周期 2.0s) | +| V2.30 | 2026-09-03 | **V4.36.14 重连确认窗漏网路径修复**:主循环拍级自身上升沿检测(g_prev_ok)替代 ISR LOOP_OK0——插头抖动致 LOOP_OK0 卡 1 时恢复不再漏触发确认窗(现场 21µH 无窗直接 Car_In 复现);LO 抑制窗仍 1500ms(用户临时 3000 未入库) | diff --git a/utilities/at32f421_freertos_demo/inc/cmcng.h b/utilities/at32f421_freertos_demo/inc/cmcng.h index df58c81..aefd025 100644 --- a/utilities/at32f421_freertos_demo/inc/cmcng.h +++ b/utilities/at32f421_freertos_demo/inc/cmcng.h @@ -14,11 +14,11 @@ #define __CMCNG_H__ #define PRODUCT_MODEL "DLD154" -#define FIRMWARE_VER "4.36.13" // ..޶ (2026-09-03 : СĶֻ REV; MAIN/SUB ɲƷ) +#define FIRMWARE_VER "4.36.14" // ..޶ (2026-09-03 : СĶֻ REV; MAIN/SUB ɲƷ) #define HARDWARE_VER "3.00" #define FIRMWARE_VER_MAIN 4 #define FIRMWARE_VER_SUB 36 -#define FIRMWARE_VER_REV 13 +#define FIRMWARE_VER_REV 14 #define HARDWARE_VER_MAIN 3 #define HARDWARE_VER_SUB 0 diff --git a/utilities/at32f421_freertos_demo/src/TaskLoop.c b/utilities/at32f421_freertos_demo/src/TaskLoop.c index 28d142b..1f5f6ef 100644 --- a/utilities/at32f421_freertos_demo/src/TaskLoop.c +++ b/utilities/at32f421_freertos_demo/src/TaskLoop.c @@ -161,6 +161,7 @@ uint16_t g_relay_hold_cnt = 0; // V4.36.3: 有车断开继电器保持 uint8_t g_relay_hold_done = 0; // V4.36.3: 本次有车断开已兜底释放(防重复OFF) uint16_t g_reconn_blank_ms = 0; // V4.36.5: 重连起振抑制倒计时(ms, 按Q分档, vd1_task 每样本-10) uint8_t g_entry_need = 3; // V4.36.8: 进入确认样本数 (按Q档, 高3/中4/低5) +uint8_t g_prev_ok = 0; // V4.36.14: loop_task 主循环拍级上一拍 LOOP_OK (自身上升沿检测) uint8_t g_release_need = 3; // V4.36.8: 释放确认样本数 (按Q档, 高3/中4/低5) uint8_t g_fault_phase = 0; uint16_t g_fault_tick = 0; @@ -1354,16 +1355,24 @@ void loop_task_function(void *pvParameters) INIT_VD(); while (1) { + /*--- V4.36.14: 主循环拍级 RF 上升沿检测 (不依赖 ISR LOOP_OK0) --- + * 原 !LOOP_OK0 依赖 ISR 5ms 拍与主循环 150ms 慢 tick 的竞态: + * 插头抖动(断开↔恢复几拍)可使 LOOP_OK0 卡 1 → 恢复时漏触发确认窗 + * → CAPVD 不重置直接跑判定 → 插回瞬态假"有车"跳输出 (现场 21µH 复现) + * 现每 10ms 主循环拍自采样 LOOP_OK: 任何 0→1 恢复都强制进确认窗 */ + if (loop1_LOOP_OK && !g_prev_ok) { + g_prev_ok = 1; + g_reconn_candidate = 1; + g_reconn_cnt = 0; + } else if (!loop1_LOOP_OK) { + g_prev_ok = 0; + } + if (loop1_LOOP_OK) { /*--- 线圈重连: V4.36.2 确认窗 (载波连续恢复 ~100ms 才确认重置) --- - * RF 上升沿仅进入候选; 期间保持 g_disconnect_active=1 → 黄灯仍快闪, + * RF 上升沿(顶部检测)仅进入候选; 期间保持 g_disconnect_active=1 → 黄灯仍快闪, * 断开计数不重复; 抖动(断开↔恢复快速交替)每次掉线取消候选 → 免疫. * 确认后才: 清断开标记 / CAPVD 强制重收敛(首样本此时已干净, 无斜率限幅绕过风险) */ - if (!loop1_LOOP_OK0) { - loop1_LOOP_OK0 = 1; - g_reconn_candidate = 1; - g_reconn_cnt = 0; - } if (g_reconn_candidate) { g_reconn_cnt++; if (g_reconn_cnt >= RECONNECT_CONFIRM_TICKS) {