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:
@@ -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 实时置档 |
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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 稳定态不循环. */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user