diff --git a/docs/devlog.md b/docs/devlog.md index aabacac..fe6103e 100644 --- a/docs/devlog.md +++ b/docs/devlog.md @@ -4,6 +4,48 @@ --- +## 2026-09-03 — 线圈重连确认窗 100ms(固件 V4.36.2) + +> **固件版本:V4.36.2**(cmcng.h:FIRMWARE_VER="4.36.2",REV=2)。devlog 修订 V2.36。 + +### 背景(抗干扰性分析结论) + +断开/重连链路原设计:RF 恢复**第 1 拍**即触发重连重置(清断开标记 + CAPVD=0 重收敛), +存在三个裸奔点: +1. **接触不良抖动**(断开↔恢复几十 ms 交替)→ 每个边沿重复计数 + 反复重收敛 +2. **首样本直锁绕过斜率限幅**(CAPVD==0 直锁 Value)→ 恢复首拍毛刺直接进基线 +3. 断开判定 5ms 无防抖——但释放速度是安全刚需,**保持现状不加**防抖 + +### 改动(确认窗方案) + +- **RF 上升沿仅进入候选**(g_reconn_candidate),不再立即重置 +- 载波**连续恢复 10×10ms=100ms**(RECONNECT_CONFIRM_TICKS=10)才确认重连: + - 清断开标记(黄灯从快闪切 N 短闪/灭) + - CAPVD=0 / CAPVD_slow=0 强制重收敛(首样本此时载波已稳定 100ms → 干净) + - env 复位 + env_resync_abort() +- **确认窗内**:disconnect_active 保持 1 → 黄灯维持快闪、断开计数不重复; + 不跑 vd1_task(等载波稳定) +- **任何掉线**(else 分支)→ 取消候选、计数清零 → 抖动免疫(每次恢复重新计满窗才确认) + +### 行为变化 + +| 场景 | V4.36.1 | V4.36.2 | +|------|---------|---------| +| 正常断开→重连 | 恢复即重置 | 恢复后 ~100ms 确认重置(EVT|loop_reconnect confirmed 100ms) | +| 接触不良抖动 | 每 cycle 计数+1、反复重收敛 | 候选被反复取消,**不计数不重置**,恢复稳定后才确认一次 | +| 恢复首样本 | 可能含毛刺直锁 | 载波稳定 100ms 后重建,干净 | +| 上电首次接线圈 | 恢复即进入 | 多 100ms 候选(判稳 1.3s+ 流程内可忽略) | + +### 验证 + +- 语法 0 error;4 组单测全 PASS(重连逻辑在主循环 loop_task,无单测耦合;待板级验证) + +### 待板级验证 + +1. 拔插线圈:快闪持续到重连确认后切短闪/灭(比旧版多 ~100ms) +2. 手动快速抖动插头:断开计数不应乱跳(≤真实断开次数) +3. 重连后检测正常(Origin 沿用旧值;若断开期间环境大改走 2s/7s 环境学习) + ## 2026-09-03 — 版本体系增加修订号:4.36.1(固件 V4.36.1) > **固件版本:V4.36.1**(cmcng.h:FIRMWARE_VER="4.36.1",MAIN=4/SUB=36/**REV=1**)。devlog 修订 V2.35。 @@ -1472,6 +1514,7 @@ if (dev >= dlt_ORG × 4) { | 版本 | 时间 | 说明 | |------|------|------| +| V2.36 | 2026-09-03 | V4.36.2 线圈重连确认窗 100ms(防抖动重复计数/首样本毛刺); 断开判定不加防抖 | | V2.35 | 2026-09-03 | 版本体系增加修订号: 4.36.1 (MAIN/SUB 产品定, 小改只增 REV); 启动打印 fw 行 | | V2.34 | 2026-09-03 | V4.36 频率窗上限: 108→115kHz(43nF板≈44µH, 放行~48µH小线圈) | | V2.33 | 2026-09-03 | V4.35 频率窗上限复核: 92→108kHz(43nF板口径≈50µH, 92@43nF≈70µH过严) | diff --git a/docs/technical-spec.md b/docs/technical-spec.md index c999475..ad9ce96 100644 --- a/docs/technical-spec.md +++ b/docs/technical-spec.md @@ -1,6 +1,6 @@ # DLD154V4B 技术规格书 -> 单路线圈车辆检测器 | 固件版本: V4.36.1 | 文档版本: V2.17 +> 单路线圈车辆检测器 | 固件版本: V4.36.2 | 文档版本: V2.18 > 本文档面向工程开发、系统集成及故障深度分析 --- @@ -783,3 +783,4 @@ DLD154V4B V1.4 起实现该专利的整数化版本,用于大车通行时的 | 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-03 | 固件版本体系增加修订号:**V4.36.1**(MAIN/SUB 由产品定,小改动只增 REV);启动日志打印 fw 行 | +| V2.18 | 2026-09-03 | **V4.36.2 重连确认窗**:载波连续恢复 ~100ms 才确认重连重置(防接触抖动重复计数/首样本毛刺);断开判定不加防抖(释放速度安全刚需) | diff --git a/utilities/at32f421_freertos_demo/inc/cmcng.h b/utilities/at32f421_freertos_demo/inc/cmcng.h index f9aa6b4..a090cfa 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.1" // ..޶ (2026-09-03 : СĶֻ REV; MAIN/SUB ɲƷ) +#define FIRMWARE_VER "4.36.2" // ..޶ (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 1 +#define FIRMWARE_VER_REV 2 #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 7a7bda4..98bbf1d 100644 --- a/utilities/at32f421_freertos_demo/src/TaskLoop.c +++ b/utilities/at32f421_freertos_demo/src/TaskLoop.c @@ -137,6 +137,8 @@ uint16_t g_safe_max_cnt = LC_HOLD_TIME; uint8_t g_loop_power_up_state = 0; uint8_t g_disconnect_count = 0; uint8_t g_disconnect_active = 0; +uint8_t g_reconn_candidate = 0; // V4.36.2: 重连确认窗候选(载波上升沿进入) +uint16_t g_reconn_cnt = 0; // V4.36.2: 载波连续恢复计数 (确认窗 ~100ms) uint8_t g_fault_phase = 0; uint16_t g_fault_tick = 0; uint8_t g_coil_fault = 0; // V4.26: 线圈电感量异常 0=正常 1=L偏大(f<20kHz) 2=L偏小(f>120kHz) @@ -1251,6 +1253,9 @@ void vd1_task(void) /*=========================================================================== * loop_task_function — FreeRTOS 主任务(对齐 M1H main 循环) *===========================================================================*/ +#define RECONNECT_CONFIRM_TICKS 10 /* V4.36.2: 重连确认窗 10×10ms=100ms + * 载波连续恢复满窗才确认重连重置; + * 抖动断开↔恢复每掉线取消重新计 */ void loop_task_function(void *pvParameters) { g_sys_freq = g_crm_clocks_freq_struct.sclk_freq; @@ -1259,33 +1264,50 @@ void loop_task_function(void *pvParameters) while (1) { if (loop1_LOOP_OK) { - /*--- 线圈重连 ---*/ + /*--- 线圈重连: V4.36.2 确认窗 (载波连续恢复 ~100ms 才确认重置) --- + * RF 上升沿仅进入候选; 期间保持 g_disconnect_active=1 → 黄灯仍快闪, + * 断开计数不重复; 抖动(断开↔恢复快速交替)每次掉线取消候选 → 免疫. + * 确认后才: 清断开标记 / CAPVD 强制重收敛(首样本此时已干净, 无斜率限幅绕过风险) */ if (!loop1_LOOP_OK0) { loop1_LOOP_OK0 = 1; - g_disconnect_active = 0; // 重连,清除断开标记 - loop1_CAPVD = 0; // 强制 IIR 从首个有效值重新收敛 - loop1_CAPVD_slow = 0; // 方案A: 释放慢滤波同步收敛 - g_env_wait_cnt = 0; // V4.24: 断开重连后环境学习状态复位 - env_resync_abort(); - PRINT("EVT|loop_reconnect\n"); + g_reconn_candidate = 1; + g_reconn_cnt = 0; } - - if (loop1_CAP_OK) { - loop1_CAP_OK = 0; - - /* 首次成功测量 → 标记线圈已连接 */ - if (!g_loop_power_up_state) { - g_loop_power_up_state = 1; + if (g_reconn_candidate) { + g_reconn_cnt++; + if (g_reconn_cnt >= RECONNECT_CONFIRM_TICKS) { + g_reconn_candidate = 0; + g_reconn_cnt = 0; + g_disconnect_active = 0; // 确认重连: 清除断开标记 + loop1_CAPVD = 0; // 强制 IIR 从首个有效值重新收敛 + loop1_CAPVD_slow = 0; // 方案A: 释放慢滤波同步收敛 + g_env_wait_cnt = 0; // V4.24: 断开重连后环境学习状态复位 + env_resync_abort(); + PRINT("EVT|loop_reconnect confirmed %dms\n", + RECONNECT_CONFIRM_TICKS * 10); } + /* 确认窗内: 等载波稳定, 不跑检测 (黄灯由 disconnect_active=1 维持快闪) */ + } else { + if (loop1_CAP_OK) { + loop1_CAP_OK = 0; - /* 核心检测算法 */ - vd1_task(); + /* 首次成功测量 → 标记线圈已连接 */ + if (!g_loop_power_up_state) { + g_loop_power_up_state = 1; + } - /* 拨码开关轮询 */ - poll_sw_state(); + /* 核心检测算法 (确认窗结束后 CAPVD=0 → 首样本干净重建) */ + vd1_task(); + + /* 拨码开关轮询 */ + poll_sw_state(); + } } } else { /*--- 线圈断开 ---*/ + /* V4.36.2: 掉线即取消重连候选 (抖动免疫: 每次掉线重新计确认窗) */ + g_reconn_candidate = 0; + g_reconn_cnt = 0; /* 注意: 不清除 loop1_VD_FLAG,保留断开前的检测状态 */ RLY1_OFF; RLY2_OFF;