diff --git a/docs/devlog.md b/docs/devlog.md index acb5b1d..cffe47c 100644 --- a/docs/devlog.md +++ b/docs/devlog.md @@ -2151,6 +2151,7 @@ if (dev >= dlt_ORG × 4) { | 版本 | 时间 | 说明 | |------|------|------| +| V2.76 | 2026-09-08 | V4.36.40 热切换修复: fault3 强制期 Origin/LPCNT 冻结 → recover 改 TMR3 实时 Xn 判回窗(240000/Xn); 恢复后 LOOP_OK 回位自动发起重连确认+判稳重建 Origin, 换线圈不断电 ~6s 自愈 | | V2.75 | 2026-09-08 | V4.36.39: COIL_UNDER_MIN_AS_OPEN 默认 0→1 (用户拍板) —— L<20µH 短路级出厂等同断开 | | V2.74 | 2026-09-08 | V4.36.38: fault2 可用级黄灯 疾闪100ms → 一长两短(900/300/100/300/100/700ms 6相, 用户定) | | V2.73 | 2026-09-08 | V4.36.37 电感分级降级(方案A): fault2=156~171k疾闪100ms恒判车 / fault3=f>171k短路级断开快闪(宏作用域移171k), recover 实时置档 | diff --git a/docs/technical-spec.md b/docs/technical-spec.md index 99a1c2a..fa3ace2 100644 --- a/docs/technical-spec.md +++ b/docs/technical-spec.md @@ -1,6 +1,6 @@ # DLD154V4B 技术规格书 -> 单路线圈车辆检测器 | 固件版本: V4.36.39 | 文档版本: V2.57 +> 单路线圈车辆检测器 | 固件版本: V4.36.40 | 文档版本: V2.58 > 本文档面向工程开发、系统集成及故障深度分析 --- @@ -539,7 +539,7 @@ void poll_green_led(void) { > **V2.55 注:电感低于下限的分级(V4.36.37 方案A,用户拍板)——指示与功能解耦:** > - **可用级 fault==2(156~171k,L 20~24µH)**:黄灯**一长两短**(900/300/100/300/100/700ms 循环,V4.36.38);判定/继电器/绿灯**恒照常**(不随宏)——23µH 类"低但可用"线圈不误杀 > - **短路级 fault==3(f>171k,L<20µH)**:黄灯**快闪 200ms**(与断开同款)——功能随 `COIL_UNDER_MIN_AS_OPEN`(宏作用域 V4.36.37 从 156k 移到 171k): -> - **=1(默认,V4.36.39 用户拍板)**:等同线圈断开完全态——判车暂停(vd1_task 挂起)+ 继电器保持释放 + 绿灯不亮;恢复=coil_monitor_recover 无条件监测,f 回窗 ≤171k 连续 5s → 按当前 f 实时置档+重连确认+判稳 +> - **=1(默认,V4.36.39 用户拍板)**:等同线圈断开完全态——判车暂停(vd1_task 挂起)+ 继电器保持释放 + 绿灯不亮;恢复=coil_monitor_recover 无条件监测(**V4.36.40 热切换修复**:强制期 Origin 冻结→改用 TMR3 实时 Xn 判回窗 240000/Xn),f 回窗 ≤171k 连续 5s → 实时置档 → LOOP_OK 自然回位 → 上升沿自动发起重连确认+无车判稳重建 Origin → 新线圈正常即全恢复(换线圈不断电 ~6s 自动恢复,无需重启) > - =0(可选关):仍正常判车,快闪仅作"真短路/损坏"提示 > - 防抖:越界/恢复均 COIL_FAULT_HOLD_TICKS=500(5s,V4.36.21) @@ -861,3 +861,4 @@ DLD154V4B V1.4 起实现该专利的整数化版本,用于大车通行时的 | V2.55 | 2026-09-08 | **V4.36.37 电感分级降级(方案A, 用户拍板)**:低于下限拆两级——156~171k(L20~24µH)=fault2 疾闪100ms(恒判车, 与断开区分);f>171k(L<20µH)=fault3 短路级断开快闪(COIL_UNDER_MIN_AS_OPEN 作用域 156k→171k);recover 回窗≤171k 且恢复实时置档(原清0有5s黄灯空档) | | V2.56 | 2026-09-08 | V4.36.38: fault2 可用级黄灯指示 疾闪100ms → **一长两短** (900/300/100/300/100/700ms 循环, 用户定节奏) | | V2.57 | 2026-09-08 | V4.36.39: COIL_UNDER_MIN_AS_OPEN 默认值 0→1 (用户拍板) —— L<20µH 短路级出厂即等同断开(判车停+继电器释放+绿灯灭) | +| V2.58 | 2026-09-08 | V4.36.40 热切换修复: recover 恢复判定改 TMR3 实时 Xn(240000/Xn) —— 原 calc_freq_khz(冻结Origin,LPCNT) 永不回窗致换线圈死锁; 恢复后自然走重连+判稳重建 Origin | diff --git a/utilities/at32f421_freertos_demo/inc/cmcng.h b/utilities/at32f421_freertos_demo/inc/cmcng.h index d3d957e..0b4fd52 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.39" // ..޶ (2026-09-03 : СĶֻ REV; MAIN/SUB ɲƷ) +#define FIRMWARE_VER "4.36.40" // ..޶ (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 39 +#define FIRMWARE_VER_REV 40 #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 34bef26..e610a1d 100644 --- a/utilities/at32f421_freertos_demo/src/TaskLoop.c +++ b/utilities/at32f421_freertos_demo/src/TaskLoop.c @@ -1035,14 +1035,18 @@ static void coil_monitor_recover(void) if (!(COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 3)) 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_L_SHORT_F_KHZ) { - g_coil_bad_cnt = 0; /* 仍短路级/载波无效 → 继续等 (V4.36.37: 回窗改为 ≤171k) */ + /* V4.36.40 热切换修复: 强制断开期 vd1_task 停摆 → Origin/LPCNT 冻结在旧短路线圈值, + * calc_freq_khz(Origin, LPCNT) 永远算不回窗 → 换正常线圈也无法恢复(死锁, 只能断电). + * 改由 TMR3 捕获 ISR 实时更新的 Xn 直接计算 f (240000/Xn, 每振荡周期新鲜) — + * 换线圈后下一周期即反映新频率. */ + f_khz = 240000UL / loop1_Xn; + if (loop1_Xn == 0 || f_khz < COIL_F_OK_MIN_KHZ || f_khz > COIL_L_SHORT_F_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 COIL_L_MIN_F_KHZ) ? 2 : (f_khz > COIL_F_OK_MAX_KHZ) ? 1 : 0; g_coil_bad_cnt = 0; + /* V4.36.40: 置档后 ISR 847 停止压 LOOP_OK → 主循环自然回 if(LOOP_OK) 路径; + * 强制期断开路径已置 disconnect_active=1 + g_prev_ok=0 → 顶部沿检测自动发起 + * g_reconn_candidate=1 → reconnect confirmed(100ms) → 无车判稳门控 → + * CAPVD 重收敛 + Origin 判稳重建(换线圈后基准必须重学) → coil_monitor 按新线圈重判. + * 此后新线圈正常(fault=0)完全恢复; 仍短路则 coil_monitor 重判 fault3 稳定态不循环. */ } }