From 5a3ab667bc7b36ceed1270dbfda65e3fd29874e8 Mon Sep 17 00:00:00 2001 From: wangfq Date: Mon, 7 Sep 2026 09:33:00 +0800 Subject: [PATCH] =?UTF-8?q?feat(V4B):=20V4.36.24=20=E2=80=94=20L<=E4=B8=8B?= =?UTF-8?q?=E9=99=90=E5=8F=8C=E6=A8=A1=E5=BC=8F=E5=AE=8F=20COIL=5FUNDER=5F?= =?UTF-8?q?MIN=5FAS=5FOPEN?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用户需求: 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 --- docs/devlog.md | 16 ++++++++ docs/product-manual.md | 4 +- docs/technical-spec.md | 3 +- .../at32f421_freertos_demo/inc/TaskLoop.h | 2 + utilities/at32f421_freertos_demo/inc/cmcng.h | 4 +- .../at32f421_freertos_demo/src/TaskLoop.c | 37 ++++++++++++++++++- 6 files changed, 59 insertions(+), 7 deletions(-) diff --git a/docs/devlog.md b/docs/devlog.md index 67e5fed..4c0fad3 100644 --- a/docs/devlog.md +++ b/docs/devlog.md @@ -4,6 +4,21 @@ --- +## 2026-09-04 — L<下限双模式:COIL_UNDER_MIN_AS_OPEN 宏(固件 V4.36.24) + +用户需求:低于电感量下限(24µH)后,当前行为=黄灯快闪但绿灯/继电器照常工作; +定义宏切换是否视为**线圈断开完全状态**(黄灯快闪同断开 + 继电器保持释放 + 绿灯不亮)。 + +- `COIL_UNDER_MIN_AS_OPEN`:0=仅黄灯快闪(断开级指示),判定/继电器/绿灯照常(默认,与 V4.36.23 一致); + 1=完全断开态: + - ISR RF 分支置 LOOP_OK=1 后强制压 0 → 主循环走断开路径(vd1_task 停、黄灯快闪、disconnect 流程) + - RLY 刷新(RF 段)与保持(hold 段)短路 → 继电器保持释放;绿灯=RLY2 镜像 → 灭; + 短路放刷新条件而非事后压 OFF(避免 5ms ON/OFF 继电器抖动打火) + - coil_monitor 原调用点随 vd1_task 停摆 → 新增 coil_monitor_recover() 无条件每 10ms 恢复监测 + (f 回窗 18~156kHz 连续 5s → 清 fault → ISR 恢复 LOOP_OK → 走正常重连确认+判稳门控) +- 恢复路径验证:换好线圈后 LOOP_OK 恢复上升沿 → 100ms 确认窗 → 判稳门控 → 正常放行 +语法 0 error、4 测试全绿;REV 4.36.24;spec V2.41 / devlog V2.60。 + ## 2026-09-04 — 最低电感量下限 25µH → 24µH(固件 V4.36.23) 用户拍板:COIL_L_MIN_UH 25 → 24(43nF 口径)。 @@ -1970,6 +1985,7 @@ if (dev >= dlt_ORG × 4) { | 版本 | 时间 | 说明 | |------|------|------| +| V2.60 | 2026-09-04 | V4.36.24 L<下限双模式 COIL_UNDER_MIN_AS_OPEN: 0=仅黄灯快闪/1=完全断开(RLY释放+绿灯灭+判定停, ISR 强制 LOOP_OK+RLY 短路防抖); 恢复走 coil_monitor_recover | | V2.59 | 2026-09-04 | V4.36.23 最低电感量 25→24µH: 频率上限 156kHz; L<24µH 断开级快闪; test 156/157 | | V2.58 | 2026-09-04 | V4.36.22 最低电感量 20→25µH: 频率上限 153kHz; L<25µH 断开级快闪; test 153/154 | | V2.57 | 2026-09-04 | V4.36.21 电感量判定防抖 1s→5s (COIL_FAULT_HOLD_TICKS=500): 越界/恢复均 5s, 防瞬态误检 | diff --git a/docs/product-manual.md b/docs/product-manual.md index 236a9b2..4dfb4b0 100644 --- a/docs/product-manual.md +++ b/docs/product-manual.md @@ -186,7 +186,7 @@ SW_5 = ON 时:车辆(金属)持续压线超过 **4 分钟**(LC_HOLD_TIME | 故障类型 | 红灯 | 绿灯 | 黄灯 | 说明 | |---------|------|------|------|------| -| 线圈断开(当前)或 **L<24µH**(V4.36.23:f>156kHz 最低工作电感以下,按断开指示) | 呼吸 | 灭 | **快闪** (200ms) | 检查线圈连接。**断开前有车:继电器保持 RELAY_HOLD_MS=1000ms 后仍断才释放**(防瞬时断开误释放,宏可调)。**重连后无车判稳门控**:值稳定(600ms 无漂移)且回带内才放行检测,判稳期黄灯保持快闪,Origin 自动对齐新空场 | +| 线圈断开(当前)或 **L<24µH**(V4.36.23/24:f>156kHz 最低工作电感以下,按断开指示) | 呼吸 | 灭 | **快闪** (200ms) | 宏 COIL_UNDER_MIN_AS_OPEN:0=仅黄灯快闪(判定/继电器/绿灯照常);1=视为断开完全态(继电器保持释放+绿灯不亮+判定停)。检查线圈连接。**断开前有车:继电器保持 RELAY_HOLD_MS=1000ms 后仍断才释放**(防瞬时断开误释放,宏可调)。**重连后无车判稳门控**:值稳定(600ms 无漂移)且回带内才放行检测,判稳期黄灯保持快闪,Origin 自动对齐新空场 | | 线圈电感量不合理(V4.26/V4.36.13/20) | 呼吸 | 灭(无车) | **一长一短** (900ms亮/300ms灭/100ms亮/700ms灭 循环) | 空场频率 <18kHz → L 偏大(>合理上限),检查线圈匝数/尺寸;**L<24µH(f>156k) 不在此模式,见上行断开快闪** | | 线圈重连,断开 1 次 | 呼吸 | 正常 | **1 短闪** + 1.2s 灭 | 发生过 1 次断开,已恢复 | | 线圈重连,断开 2 次 | 呼吸 | 正常 | **2 短闪** + 1.2s 灭 | 发生过 2 次断开,已恢复 | @@ -286,4 +286,4 @@ SW_5 = ON 时:车辆(金属)持续压线超过 **4 分钟**(LC_HOLD_TIME --- -> **技术规格书**(算法详情、IO 分配、电气参数等)请参阅 [技术规格书](technical-spec.md) +> **技术规格书**(算法详情、IO 分配、电气参数等)请参阅 [技术规格书](technical-spec.md) \ No newline at end of file diff --git a/docs/technical-spec.md b/docs/technical-spec.md index a59da54..521f92b 100644 --- a/docs/technical-spec.md +++ b/docs/technical-spec.md @@ -1,6 +1,6 @@ # DLD154V4B 技术规格书 -> 单路线圈车辆检测器 | 固件版本: V4.36.23 | 文档版本: V2.40 +> 单路线圈车辆检测器 | 固件版本: V4.36.24 | 文档版本: V2.41 > 本文档面向工程开发、系统集成及故障深度分析 --- @@ -829,3 +829,4 @@ DLD154V4B V1.4 起实现该专利的整数化版本,用于大车通行时的 | 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 清) | diff --git a/utilities/at32f421_freertos_demo/inc/TaskLoop.h b/utilities/at32f421_freertos_demo/inc/TaskLoop.h index acd0cc6..3549913 100644 --- a/utilities/at32f421_freertos_demo/inc/TaskLoop.h +++ b/utilities/at32f421_freertos_demo/inc/TaskLoop.h @@ -64,6 +64,8 @@ #define ENV_RECOVER_WAIT 200 // 恢复确认 (V4.31): 新基线替换后 环境空闲连续 ~2s 才解除预判, 黄灯灭 #define COIL_F_OK_MIN_KHZ 18 // 线圈频率合理窗 (V4.36.18): 默认低频档口径, <18kHz → L偏大 (≈双 250µH+ 大线圈放行) #define COIL_L_MIN_UH 24 // V4.36.23: 最低工作电感量 µH (43nF 低频档口径): L<此值 → 按线圈断开快闪指示 (25→24µH) +#define COIL_UNDER_MIN_AS_OPEN 0 // V4.36.24: L<下限 是否视为线圈断开完全状态: 1=黄灯快闪+继电器保持释放+绿灯不亮(同真正断开, 判定停); + // 0=仅黄灯快闪(断开级指示), 绿灯/继电器/判定照常工作 #define COIL_FAULT_HOLD_TICKS 500 // V4.36.21: 电感量越界/恢复防抖 500tick=5s (原100=1s; 下限判定重要, 加长防误检瞬态冲高) #define COIL_F_OK_MAX_KHZ 156 // 线圈频率合理窗 (V4.36.23): >156kHz → L<24µH(COIL_L_MIN_UH) 断开级偏小 (43nF: L=2.533e7/(f²×43); 153=25µH→156=24µH) #define COIL_CAL_C_NF 43 // 标定等效谐振电容 nF (V4.34): 三极管库存板 低频档(66nF名义, R19在/R27空)实测 C_eff≈43 (41.3~45.5; 0Ω板68仅实验口径, 产品不用) diff --git a/utilities/at32f421_freertos_demo/inc/cmcng.h b/utilities/at32f421_freertos_demo/inc/cmcng.h index f4b7e49..0b14e1c 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.23" // ..޶ (2026-09-03 : СĶֻ REV; MAIN/SUB ɲƷ) +#define FIRMWARE_VER "4.36.24" // ..޶ (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 23 +#define FIRMWARE_VER_REV 24 #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 b883d3c..fd36ace 100644 --- a/utilities/at32f421_freertos_demo/src/TaskLoop.c +++ b/utilities/at32f421_freertos_demo/src/TaskLoop.c @@ -799,7 +799,12 @@ void TMR15_GLOBAL_IRQHandler(void) loop1_LOOP_OK = 1; loop1_RF_FLAG = 0; - if (loop1_LC_Reset == 0) { + /* V4.36.24: L<下限视为断开完全态(宏=1) — 载波强制为断: + * 主循环走断开路径(vd1_task 停/黄灯快闪), RLY 刷新短路保持释放, 绿灯镜像灭 */ + if (COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 2) + loop1_LOOP_OK = 0; + + if (loop1_LC_Reset == 0 && !(COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 2)) { /* 继电器 2(辅助/方向) */ if (loop1_VD_FLAG) RLY2_ON; @@ -832,7 +837,8 @@ void TMR15_GLOBAL_IRQHandler(void) * - 500ms 内重连 + 判无车 → vd1_task 正常离开释放 * - 超时仍断开 → 强制释放(防真故障无限保持) * 无车断开(VD_FLAG=0)不受影响, 仍立即释放 */ - if (!loop1_LOOP_OK && loop1_VD_FLAG && g_loop_power_up_state && !g_relay_hold_done) { + if (!loop1_LOOP_OK && loop1_VD_FLAG && g_loop_power_up_state && !g_relay_hold_done + && !(COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 2)) { /* V4.36.24: 强制期不保持(保持释放) */ RLY1_ON; /* 保持: 防止瞬时断开继电器抖落 */ RLY2_ON; g_relay_hold_cnt += 5; @@ -964,6 +970,30 @@ static void coil_monitor(void) } } +/* V4.36.24: 强制断开期(L<下限视为断开, 宏=1)的恢复监测 — 无条件每 10ms 主循环调用 + * coil_fault==2 时 ISR 压 LOOP_OK=0 → vd1_task 停摆, 原 coil_monitor(稳定无车空闲点) + * 不再执行 → 换好线圈后频率恢复无法清除故障 → 死锁. + * 此点只做恢复方向(f 回窗连续 5s 清 fault), 载波无效(LPCNT/Origin=0)不算恢复 */ +static void coil_monitor_recover(void) +{ + uint32_t f_khz; + + if (!(COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 2)) + return; /* 非强制断开期 → 原 coil_monitor 负责 */ + + f_khz = calc_freq_khz(loop1_Origin, loop1_LPCNT); + if (f_khz == 0 || f_khz < COIL_F_OK_MIN_KHZ || f_khz > COIL_F_OK_MAX_KHZ) { + g_coil_bad_cnt = 0; /* 仍越界/载波无效 → 继续等 */ + return; + } + g_coil_bad_cnt++; + if (g_coil_bad_cnt >= COIL_FAULT_HOLD_TICKS) { + PRINT("EVT|coil_ok f:%d kHz (recover from L