fix(V4B): V4.36.40 — 短路级热切换线圈死锁修复

用户实测: <20µH 短路级强制断开后, 不断电换正常线圈不恢复(拨码不重启), 只能断电.
根因: 强制期 ISR 847 每5ms压 LOOP_OK=0 → vd1_task 停摆 → Origin/LPCNT 冻结在旧短路线圈值;
      recover 用 calc_freq_khz(冻结Origin,LPCNT) 判回窗永远>171k → 死锁.
修复: recover 恢复判定改 TMR3 捕获 ISR 实时 Xn (f=240000/Xn, 每振荡周期新鲜);
      换线圈后 f 回窗连续5s → 实时置档 → ISR 847 停压 LOOP_OK 自然回位 →
      主循环 0→1 沿检测自动发起 reconnect confirmed → 无车判稳门控 → Origin 判稳重建.
spec V2.58 / devlog V2.76
语法0 error, 4测试全绿
This commit is contained in:
wangfq
2026-09-09 11:16:10 +08:00
parent b4aa7402a5
commit 41a4577fa7
4 changed files with 19 additions and 8 deletions
+1
View File
@@ -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.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.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 实时置档 | | V2.73 | 2026-09-08 | V4.36.37 电感分级降级(方案A): fault2=156~171k疾闪100ms恒判车 / fault3=f>171k短路级断开快闪(宏作用域移171k), recover 实时置档 |
+3 -2
View File
@@ -1,6 +1,6 @@
# DLD154V4B 技术规格书 # 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,用户拍板)——指示与功能解耦:** > **V2.55 注:电感低于下限的分级(V4.36.37 方案A,用户拍板)——指示与功能解耦:**
> - **可用级 fault==2156~171kL 20~24µH**:黄灯**一长两短**900/300/100/300/100/700ms 循环,V4.36.38);判定/继电器/绿灯**恒照常**(不随宏)——23µH 类"低但可用"线圈不误杀 > - **可用级 fault==2156~171kL 20~24µH**:黄灯**一长两短**900/300/100/300/100/700ms 循环,V4.36.38);判定/继电器/绿灯**恒照常**(不随宏)——23µH 类"低但可用"线圈不误杀
> - **短路级 fault==3f>171kL<20µH**:黄灯**快闪 200ms**(与断开同款)——功能随 `COIL_UNDER_MIN_AS_OPEN`(宏作用域 V4.36.37 从 156k 移到 171k): > - **短路级 fault==3f>171kL<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(可选关):仍正常判车,快闪仅作"真短路/损坏"提示 > - =0(可选关):仍正常判车,快闪仅作"真短路/损坏"提示
> - 防抖:越界/恢复均 COIL_FAULT_HOLD_TICKS=5005sV4.36.21 > - 防抖:越界/恢复均 COIL_FAULT_HOLD_TICKS=5005sV4.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.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.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.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 |
+2 -2
View File
@@ -14,11 +14,11 @@
#define __CMCNG_H__ #define __CMCNG_H__
#define PRODUCT_MODEL "DLD154" #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 HARDWARE_VER "3.00"
#define FIRMWARE_VER_MAIN 4 #define FIRMWARE_VER_MAIN 4
#define FIRMWARE_VER_SUB 36 #define FIRMWARE_VER_SUB 36
#define FIRMWARE_VER_REV 39 #define FIRMWARE_VER_REV 40
#define HARDWARE_VER_MAIN 3 #define HARDWARE_VER_MAIN 3
#define HARDWARE_VER_SUB 0 #define HARDWARE_VER_SUB 0
@@ -1035,14 +1035,18 @@ static void coil_monitor_recover(void)
if (!(COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 3)) if (!(COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 3))
return; /* 非强制断开期 → 原 coil_monitor 负责 */ return; /* 非强制断开期 → 原 coil_monitor 负责 */
f_khz = calc_freq_khz(loop1_Origin, loop1_LPCNT); /* V4.36.40 热切换修复: 强制断开期 vd1_task 停摆 → Origin/LPCNT 冻结在旧短路线圈值,
if (f_khz == 0 || f_khz < COIL_F_OK_MIN_KHZ || f_khz > COIL_L_SHORT_F_KHZ) { * calc_freq_khz(Origin, LPCNT) 线(, ).
g_coil_bad_cnt = 0; /* 仍短路级/载波无效 → 继续等 (V4.36.37: 回窗改为 ≤171k) */ * 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; return;
} }
g_coil_bad_cnt++; g_coil_bad_cnt++;
if (g_coil_bad_cnt >= COIL_FAULT_HOLD_TICKS) { if (g_coil_bad_cnt >= COIL_FAULT_HOLD_TICKS) {
PRINT("EVT|coil_ok f:%d kHz (recover from L<min as-open)\n", f_khz); PRINT("EVT|coil_ok f:%d kHz (recover from L<20uH, hot-swap OK)\n", f_khz);
/* V4.36.37: 按当前 f 实时置档(非清 0) — 避免回 156~171k 可用级/125~156k 出窗区 /* V4.36.37: 按当前 f 实时置档(非清 0) — 避免回 156~171k 可用级/125~156k 出窗区
* 5s ( 0 coil_monitor ) */ * 5s ( 0 coil_monitor ) */
g_coil_fault = (f_khz < COIL_F_OK_MIN_KHZ) ? 1 : g_coil_fault = (f_khz < COIL_F_OK_MIN_KHZ) ? 1 :
@@ -1050,6 +1054,11 @@ static void coil_monitor_recover(void)
(f_khz > COIL_L_MIN_F_KHZ) ? 2 : (f_khz > COIL_L_MIN_F_KHZ) ? 2 :
(f_khz > COIL_F_OK_MAX_KHZ) ? 1 : 0; (f_khz > COIL_F_OK_MAX_KHZ) ? 1 : 0;
g_coil_bad_cnt = 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 . */
} }
} }