From e0b86e9f6eb1960489af37ca00ef93def6c56ce6 Mon Sep 17 00:00:00 2001 From: wangfq Date: Mon, 7 Sep 2026 10:01:12 +0800 Subject: [PATCH] =?UTF-8?q?feat(V4B):=20V4.36.25=20=E2=80=94=20=E7=94=B5?= =?UTF-8?q?=E6=84=9F=E9=87=8F=E4=B8=89=E5=88=86=E8=AF=AD=E4=B9=89:=20?= =?UTF-8?q?=E5=90=88=E7=90=86=E7=AA=97=2018~125k=20+=20=E5=87=BA=E7=AA=97?= =?UTF-8?q?=E4=B8=80=E9=95=BF=E4=B8=80=E7=9F=AD=20+=20=E4=BD=8E=E4=BA=8E?= =?UTF-8?q?=E4=B8=8B=E9=99=90=E5=BF=AB=E9=97=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用户设计拍板: 纠正 V4.36.22/23 把合理窗上限随下限推到 153/156 的偏差 - COIL_F_OK_MAX_KHZ 156→125 (恢复合理窗 18~125kHz=V4.36.9 口径, >125k=38µH 偏小) - 新增 COIL_L_MIN_F_KHZ=156 (=COIL_L_MIN_UH 24µH, 43nF f@24µH=156.7k) - coil_monitor want 三分: f<18k→1; f>156k→2(快闪断开级); 125k1.15mH) + - 125k156k)** → 黄灯**快闪**(断开级,coil_fault=2,COIL_UNDER_MIN_AS_OPEN 切完全断开) + +- 宏:COIL_F_OK_MAX_KHZ 156→125(恢复合理窗);新增 COIL_L_MIN_F_KHZ 156(=COIL_L_MIN_UH 24µH) +- coil_monitor want 三分;打印 too_large/too_small/below_l_min +- coil_monitor_recover 判据 18~156(解除强制后 125~156 由原路径转一长一短) +- test:126→1 / 156→1 / 157→2 全绿 +语法 0 error、4 测试全绿;REV 4.36.25;spec V2.42 / devlog V2.61。 + ## 2026-09-04 — L<下限双模式:COIL_UNDER_MIN_AS_OPEN 宏(固件 V4.36.24) 用户需求:低于电感量下限(24µH)后,当前行为=黄灯快闪但绿灯/继电器照常工作; @@ -1985,6 +1999,7 @@ if (dev >= dlt_ORG × 4) { | 版本 | 时间 | 说明 | |------|------|------| +| V2.61 | 2026-09-04 | V4.36.25 电感量三分: 合理窗回 125k; 125~156k 一长一短(修正误归正常); f>156k=L<24µH 快闪; recover 判据同步 | | 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 | diff --git a/docs/product-manual.md b/docs/product-manual.md index 4dfb4b0..c6f2860 100644 --- a/docs/product-manual.md +++ b/docs/product-manual.md @@ -186,8 +186,8 @@ SW_5 = ON 时:车辆(金属)持续压线超过 **4 分钟**(LC_HOLD_TIME | 故障类型 | 红灯 | 绿灯 | 黄灯 | 说明 | |---------|------|------|------|------| -| 线圈断开(当前)或 **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) 不在此模式,见上行断开快闪** | +| 线圈断开(当前)或 **L<24µH**(V4.36.25:f>156kHz 低于最低工作电感 24µH) | 呼吸 | 灭 | **快闪** (200ms) | 宏 COIL_UNDER_MIN_AS_OPEN:0=仅黄灯快闪(判定/继电器/绿灯照常);1=视为断开完全态(继电器保持释放+绿灯不亮+判定停)。检查线圈连接。**断开前有车:继电器保持 RELAY_HOLD_MS=1000ms 后仍断才释放**(防瞬时断开误释放,宏可调)。**重连后无车判稳门控**:值稳定(600ms 无漂移)且回带内才放行检测,判稳期黄灯保持快闪,Origin 自动对齐新空场 | +| 线圈电感量不合理(V4.26/V4.36.25) | 呼吸 | 灭(无车) | **一长一短** (900ms亮/300ms灭/100ms亮/700ms灭 循环) | 空场频率出合理窗 18~125kHz(43nF):f<18k → L 偏大(>1.15mH);125k156k) 为下限以下→快闪,见上行** | | 线圈重连,断开 1 次 | 呼吸 | 正常 | **1 短闪** + 1.2s 灭 | 发生过 1 次断开,已恢复 | | 线圈重连,断开 2 次 | 呼吸 | 正常 | **2 短闪** + 1.2s 灭 | 发生过 2 次断开,已恢复 | | 线圈重连,断开 3+ 次 | 呼吸 | 正常 | **3 短闪** + 1.2s 灭 | 多次断开,建议检查接头 | diff --git a/docs/technical-spec.md b/docs/technical-spec.md index 521f92b..2819b9a 100644 --- a/docs/technical-spec.md +++ b/docs/technical-spec.md @@ -1,6 +1,6 @@ # DLD154V4B 技术规格书 -> 单路线圈车辆检测器 | 固件版本: V4.36.24 | 文档版本: V2.41 +> 单路线圈车辆检测器 | 固件版本: V4.36.25 | 文档版本: V2.42 > 本文档面向工程开发、系统集成及故障深度分析 --- @@ -830,3 +830,4 @@ DLD154V4B V1.4 起实现该专利的整数化版本,用于大车通行时的 | 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 或 125k156k(L<24µH)→ coil_fault=2 快闪断开级;coil_monitor_recover 判据同步(回 18~156 解除强制,125~156 由原路径接管为一长一短);test 126→1/156→1/157→2 | diff --git a/tests/test_coil_range.c b/tests/test_coil_range.c index 61c88b3..b3a085e 100644 --- a/tests/test_coil_range.c +++ b/tests/test_coil_range.c @@ -15,7 +15,8 @@ #include #define COIL_F_OK_MIN_KHZ 18 -#define COIL_F_OK_MAX_KHZ 156 +#define COIL_F_OK_MAX_KHZ 125 +#define COIL_L_MIN_F_KHZ 156 #define COIL_FAULT_HOLD_TICKS 500 #define COIL_DEF_C_NF 66 @@ -29,8 +30,10 @@ static void coil_step(uint32_t f_khz) if (f_khz < COIL_F_OK_MIN_KHZ) want = 1; - else if (f_khz > COIL_F_OK_MAX_KHZ) + else if (f_khz > COIL_L_MIN_F_KHZ) want = 2; + else if (f_khz > COIL_F_OK_MAX_KHZ) + want = 1; if (want == g_coil_fault) { g_coil_bad_cnt = 0; @@ -90,10 +93,11 @@ static void test_boundaries(void) run_ticks(17, 500); assert(g_coil_fault == 1); /* 17 → 偏大 */ run_ticks(62, 500); assert(g_coil_fault == 0); /* 62 正常(恢复) */ run_ticks(18, 500); assert(g_coil_fault == 0); /* 边界 18 正常 */ - run_ticks(125, 500); assert(g_coil_fault == 0); /* 中间 125 正常 (窗内) */ - run_ticks(156, 500); assert(g_coil_fault == 0); /* 边界 156 (=L 24.21µH) 正常 */ - run_ticks(157, 500); assert(g_coil_fault == 2); /* 157 → L<24µH 偏小(断开级) */ - printf("4. 边界 17/18/156/157 OK\n"); + run_ticks(125, 500); assert(g_coil_fault == 0); /* 边界 125 正常(窗内) */ + run_ticks(126, 500); assert(g_coil_fault == 1); /* 126 → L偏小出窗, 一长一短级 */ + run_ticks(156, 500); assert(g_coil_fault == 1); /* 156 → 出窗但仍≥24µH, 一长一短级 */ + run_ticks(157, 500); assert(g_coil_fault == 2); /* 157 → L<24µH 下限, 快闪(断开级) */ + printf("4. 边界 17/18/125/126/156/157 OK\n"); } static void test_jitter_no_alarm(void) @@ -114,6 +118,6 @@ int main(void) test_recover(); test_boundaries(); test_jitter_no_alarm(); - printf("\nALL PASS (窗口 18~156kHz=L 24µH, 防抖 5s)\n"); + printf("\nALL PASS (合理窗18~125kHz=L≥38µH; 126~156=一长一短; >156k=L<24µH快闪; 防抖 5s)\n"); return 0; } diff --git a/utilities/at32f421_freertos_demo/inc/TaskLoop.h b/utilities/at32f421_freertos_demo/inc/TaskLoop.h index 3549913..a320499 100644 --- a/utilities/at32f421_freertos_demo/inc/TaskLoop.h +++ b/utilities/at32f421_freertos_demo/inc/TaskLoop.h @@ -63,11 +63,12 @@ #define ENV_WARN_WAIT 200 // 环境预判 (V4.31): dev>+4dlt 高位连续 ~2s → 黄灯预判锁存(回摆保持) #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_L_MIN_UH 24 // V4.36.23/25: 最低工作电感量 µH (43nF 口径, 对应 COIL_L_MIN_F_KHZ=156): L<此值 → 黄灯快闪(断开级), 可 COIL_UNDER_MIN_AS_OPEN 切完全断开 #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_F_OK_MAX_KHZ 125 // 线圈频率合理窗上限 (V4.36.25 恢复): >125kHz(43nF≈38µH) → L偏小不合理 → 黄灯一长一短 (V4.36.9 口径不变) +#define COIL_L_MIN_F_KHZ 156 // V4.36.25: 低于下限频率 (43nF: L=2.533e7/(f²×43), f@24µH=156.7k): f>此值 → L156kHz→断开级快闪, V4.36.23) +uint8_t g_coil_fault = 0; // V4.26/25: 电感量异常 0=正常 1=出合理窗18~125kHz→一长一短(f<18k L偏大 / 125k156kHz, COIL_L_MIN_F_KHZ)→断开级快闪 uint16_t g_coil_bad_cnt = 0; // V4.26: 电感异常防抖计数 (V4.36.21: 500tick=5s 置位/清除, 宏 COIL_FAULT_HOLD_TICKS) /*=========================================================================== @@ -421,9 +421,10 @@ void poll_yellow_led(void) return; } - /*--- V4.26 模式5: 线圈电感量不合理(L 偏大) → 一长一短 + /*--- V4.26/25 模式5: 线圈电感量出合理窗(18~125kHz) → 一长一短 * 长亮900ms(180tick) → 灭300ms(60) → 短亮100ms(20) → 灭700ms(140), 循环 - * g_coil_fault: 1=L偏大(f<18kHz, 一长一短); 2=L<24µH 已在模式1 断开级快闪(V4.36.20/23) + * g_coil_fault: 1=f<18k L偏大 或 125k156k) 已在模式1 断开级快闪(V4.36.20/25) * 优先级: 断开(1) > 环境(4) > 电感量(5) > N短闪(3) > 灭 ---*/ if (g_coil_fault == 1) { static const uint16_t dur[4] = { 180, 60, 20, 140 }; // 900/300/100/700ms (V4.36.13: 灭 100→300ms) @@ -948,10 +949,16 @@ static void coil_monitor(void) if (loop1_Origin == 0 || f_khz == 0) return; /* 无有效基准 → 维持原状 */ + /* V4.36.25 三分语义 (43nF): + * f<18k → want=1 L偏大(>合理窗) → 一长一短 + * f>156k → want=2 L<24µH 下限以下 → 快闪(断开级) + * 125k合理上限) */ + want = 1; /* L 偏大 */ + else if (f_khz > COIL_L_MIN_F_KHZ) + want = 2; /* L<下限 → 断开级快闪 */ else if (f_khz > COIL_F_OK_MAX_KHZ) - want = 2; /* L 偏小 (<合理下限) */ + want = 1; /* L 偏小(出合理窗, 不低于下限) → 一长一短 */ if (want == g_coil_fault) { g_coil_bad_cnt = 0; /* 状态一致 → 计时复位 */ @@ -961,7 +968,8 @@ static void coil_monitor(void) if (g_coil_fault == 0) PRINT("EVT|coil_fault f:%d kHz L~%lu uH Xn:%d %s\n", f_khz, coil_l_uH(f_khz), loop1_Xn, - want == 1 ? "too_large" : "too_small"); + (want == 2) ? "below_l_min" : + (f_khz < COIL_F_OK_MIN_KHZ) ? "too_large" : "too_small"); else PRINT("EVT|coil_ok f:%d kHz\n", f_khz); g_coil_fault = want; @@ -982,8 +990,8 @@ static void coil_monitor_recover(void) 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; /* 仍越界/载波无效 → 继续等 */ + if (f_khz == 0 || f_khz < COIL_F_OK_MIN_KHZ || f_khz > COIL_L_MIN_F_KHZ) { + g_coil_bad_cnt = 0; /* 仍低于下限/载波无效 → 继续等 */ return; } g_coil_bad_cnt++;