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
+2 -2
View File
@@ -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
@@ -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<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 出窗区
* 后黄灯空档 5s (原清 0 等 coil_monitor 重判有小瑕疵) */
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_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 稳定态不循环. */
}
}