feat(V4B): V4.36.24 — L<下限双模式宏 COIL_UNDER_MIN_AS_OPEN

用户需求: L<24µH 后 0=仅黄灯快闪(现状, 判定/继电器/绿灯照常);
1=视为线圈断开完全状态: 黄灯快闪+继电器保持释放+绿灯不亮
- ISR RF 分支置 LOOP_OK=1 后强制压 0 → 主循环断开路径(vd1_task 停/黄灯快闪/disconnect)
- RLY 刷新(RF段)与保持(hold段)短路 → 继电器保持释放, 绿灯镜像灭;
  短路放条件而非事后压 OFF(防 5ms ON/OFF 继电器抖动打火)
- coil_monitor 随 vd1_task 停摆 → 新增 coil_monitor_recover() 无条件每 10ms
  恢复监测 (f 回窗 18~156kHz 连续 5s 清 fault → LOOP_OK 恢复 → 重连确认+判稳门控)
- 默认 0 (与 V4.36.23 一致无回归); 切 1 现场验证完全断开语义
语法0 error, 4测试全绿; spec V2.41 / manual 故障表 / devlog V2.60
This commit is contained in:
wangfq
2026-09-07 09:33:00 +08:00
parent 7b68daa472
commit 5a3ab667bc
6 changed files with 59 additions and 7 deletions
+16
View File
@@ -4,6 +4,21 @@
--- ---
## 2026-09-04 — L<下限双模式:COIL_UNDER_MIN_AS_OPEN 宏(固件 V4.36.24
用户需求:低于电感量下限(24µH)后,当前行为=黄灯快闪但绿灯/继电器照常工作;
定义宏切换是否视为**线圈断开完全状态**(黄灯快闪同断开 + 继电器保持释放 + 绿灯不亮)。
- `COIL_UNDER_MIN_AS_OPEN`:0=仅黄灯快闪(断开级指示),判定/继电器/绿灯照常(默认,与 V4.36.23 一致);
1=完全断开态:
- ISR RF 分支置 LOOP_OK=1 后强制压 0 → 主循环走断开路径(vd1_task 停、黄灯快闪、disconnect 流程)
- RLY 刷新(RF 段)与保持(hold 段)短路 → 继电器保持释放;绿灯=RLY2 镜像 → 灭;
短路放刷新条件而非事后压 OFF(避免 5ms ON/OFF 继电器抖动打火)
- coil_monitor 原调用点随 vd1_task 停摆 → 新增 coil_monitor_recover() 无条件每 10ms 恢复监测
f 回窗 18~156kHz 连续 5s → 清 fault → ISR 恢复 LOOP_OK → 走正常重连确认+判稳门控)
- 恢复路径验证:换好线圈后 LOOP_OK 恢复上升沿 → 100ms 确认窗 → 判稳门控 → 正常放行
语法 0 error、4 测试全绿;REV 4.36.24spec V2.41 / devlog V2.60。
## 2026-09-04 — 最低电感量下限 25µH → 24µH(固件 V4.36.23 ## 2026-09-04 — 最低电感量下限 25µH → 24µH(固件 V4.36.23
用户拍板:COIL_L_MIN_UH 25 → 2443nF 口径)。 用户拍板:COIL_L_MIN_UH 25 → 2443nF 口径)。
@@ -1970,6 +1985,7 @@ if (dev >= dlt_ORG × 4) {
| 版本 | 时间 | 说明 | | 版本 | 时间 | 说明 |
|------|------|------| |------|------|------|
| 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.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 | | V2.58 | 2026-09-04 | V4.36.22 最低电感量 20→25µH: 频率上限 153kHz; L<25µH 断开级快闪; test 153/154 |
| V2.57 | 2026-09-04 | V4.36.21 电感量判定防抖 1s→5s (COIL_FAULT_HOLD_TICKS=500): 越界/恢复均 5s, 防瞬态误检 | | V2.57 | 2026-09-04 | V4.36.21 电感量判定防抖 1s→5s (COIL_FAULT_HOLD_TICKS=500): 越界/恢复均 5s, 防瞬态误检 |
+1 -1
View File
@@ -186,7 +186,7 @@ SW_5 = ON 时:车辆(金属)持续压线超过 **4 分钟**LC_HOLD_TIME
| 故障类型 | 红灯 | 绿灯 | 黄灯 | 说明 | | 故障类型 | 红灯 | 绿灯 | 黄灯 | 说明 |
|---------|------|------|------|------| |---------|------|------|------|------|
| 线圈断开(当前)或 **L<24µH**V4.36.23f>156kHz 最低工作电感以下,按断开指示) | 呼吸 | 灭 | **快闪** (200ms) | 检查线圈连接。**断开前有车:继电器保持 RELAY_HOLD_MS=1000ms 后仍断才释放**(防瞬时断开误释放,宏可调)。**重连后无车判稳门控**:值稳定(600ms 无漂移)且回带内才放行检测,判稳期黄灯保持快闪,Origin 自动对齐新空场 | | 线圈断开(当前)或 **L<24µH**V4.36.23/24f>156kHz 最低工作电感以下,按断开指示) | 呼吸 | 灭 | **快闪** (200ms) | 宏 COIL_UNDER_MIN_AS_OPEN0=仅黄灯快闪(判定/继电器/绿灯照常);1=视为断开完全态(继电器保持释放+绿灯不亮+判定停)。检查线圈连接。**断开前有车:继电器保持 RELAY_HOLD_MS=1000ms 后仍断才释放**(防瞬时断开误释放,宏可调)。**重连后无车判稳门控**:值稳定(600ms 无漂移)且回带内才放行检测,判稳期黄灯保持快闪,Origin 自动对齐新空场 |
| 线圈电感量不合理(V4.26/V4.36.13/20 | 呼吸 | 灭(无车) | **一长一短** (900ms亮/300ms灭/100ms亮/700ms灭 循环) | 空场频率 <18kHz → L 偏大(>合理上限),检查线圈匝数/尺寸;**L<24µH(f>156k) 不在此模式,见上行断开快闪** | | 线圈电感量不合理(V4.26/V4.36.13/20 | 呼吸 | 灭(无车) | **一长一短** (900ms亮/300ms灭/100ms亮/700ms灭 循环) | 空场频率 <18kHz → L 偏大(>合理上限),检查线圈匝数/尺寸;**L<24µH(f>156k) 不在此模式,见上行断开快闪** |
| 线圈重连,断开 1 次 | 呼吸 | 正常 | **1 短闪** + 1.2s 灭 | 发生过 1 次断开,已恢复 | | 线圈重连,断开 1 次 | 呼吸 | 正常 | **1 短闪** + 1.2s 灭 | 发生过 1 次断开,已恢复 |
| 线圈重连,断开 2 次 | 呼吸 | 正常 | **2 短闪** + 1.2s 灭 | 发生过 2 次断开,已恢复 | | 线圈重连,断开 2 次 | 呼吸 | 正常 | **2 短闪** + 1.2s 灭 | 发生过 2 次断开,已恢复 |
+2 -1
View File
@@ -1,6 +1,6 @@
# DLD154V4B 技术规格书 # DLD154V4B 技术规格书
> 单路线圈车辆检测器 | 固件版本: V4.36.23 | 文档版本: V2.40 > 单路线圈车辆检测器 | 固件版本: V4.36.24 | 文档版本: V2.41
> 本文档面向工程开发、系统集成及故障深度分析 > 本文档面向工程开发、系统集成及故障深度分析
--- ---
@@ -829,3 +829,4 @@ DLD154V4B V1.4 起实现该专利的整数化版本,用于大车通行时的
| V2.38 | 2026-09-04 | **V4.36.21 电感量判定防抖 1s→5s**COIL_FAULT_HOLD_TICKS=500):下限判定重要防误检——起振/瞬态频率冲高越界需持续 5s 才置位断开级快闪,恢复同样 5s 清除 | | V2.38 | 2026-09-04 | **V4.36.21 电感量判定防抖 1s→5s**COIL_FAULT_HOLD_TICKS=500):下限判定重要防误检——起振/瞬态频率冲高越界需持续 5s 才置位断开级快闪,恢复同样 5s 清除 |
| V2.39 | 2026-09-04 | **V4.36.22 最低电感量 20→25µH**COIL_L_MIN_UH=25):频率上限 171→153kHzf@25µH=153.5k);L<25µH → 断开级快闪;test 边界 153 正常/154 偏小 | | V2.39 | 2026-09-04 | **V4.36.22 最低电感量 20→25µH**COIL_L_MIN_UH=25):频率上限 171→153kHzf@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→156kHzf@24µH=156.7k);L<24µH → 断开级快闪;test 边界 156 正常/157 偏小 | | V2.40 | 2026-09-04 | **V4.36.23 最低电感量 25→24µH**COIL_L_MIN_UH=24):频率上限 153→156kHzf@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 清) |
@@ -64,6 +64,8 @@
#define ENV_RECOVER_WAIT 200 // 恢复确认 (V4.31): 新基线替换后 环境空闲连续 ~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_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: 最低工作电感量 µH (43nF 低频档口径): L<此值 → 按线圈断开快闪指示 (25→24µH)
#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_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 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_CAL_C_NF 43 // 标定等效谐振电容 nF (V4.34): 三极管库存板 低频档(66nF名义, R19在/R27空)实测 C_eff≈43 (41.3~45.5; 0Ω板68仅实验口径, 产品不用) #define COIL_CAL_C_NF 43 // 标定等效谐振电容 nF (V4.34): 三极管库存板 低频档(66nF名义, R19在/R27空)实测 C_eff≈43 (41.3~45.5; 0Ω板68仅实验口径, 产品不用)
+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.23" // 主.子.修订 (2026-09-03 起: 小改动只增 REV; MAIN/SUB 由产品定) #define FIRMWARE_VER "4.36.24" // 主.子.修订 (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 23 #define FIRMWARE_VER_REV 24
#define HARDWARE_VER_MAIN 3 #define HARDWARE_VER_MAIN 3
#define HARDWARE_VER_SUB 0 #define HARDWARE_VER_SUB 0
@@ -799,7 +799,12 @@ void TMR15_GLOBAL_IRQHandler(void)
loop1_LOOP_OK = 1; loop1_LOOP_OK = 1;
loop1_RF_FLAG = 0; loop1_RF_FLAG = 0;
if (loop1_LC_Reset == 0) { /* V4.36.24: L<下限视为断开完全态(宏=1) — 载波强制为断:
* (vd1_task /), RLY , 绿 */
if (COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 2)
loop1_LOOP_OK = 0;
if (loop1_LC_Reset == 0 && !(COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 2)) {
/* 继电器 2(辅助/方向) */ /* 继电器 2(辅助/方向) */
if (loop1_VD_FLAG) if (loop1_VD_FLAG)
RLY2_ON; RLY2_ON;
@@ -832,7 +837,8 @@ void TMR15_GLOBAL_IRQHandler(void)
* - 500ms + vd1_task * - 500ms + vd1_task
* - () * - ()
* (VD_FLAG=0), */ * (VD_FLAG=0), */
if (!loop1_LOOP_OK && loop1_VD_FLAG && g_loop_power_up_state && !g_relay_hold_done) { if (!loop1_LOOP_OK && loop1_VD_FLAG && g_loop_power_up_state && !g_relay_hold_done
&& !(COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 2)) { /* V4.36.24: 强制期不保持(保持释放) */
RLY1_ON; /* 保持: 防止瞬时断开继电器抖落 */ RLY1_ON; /* 保持: 防止瞬时断开继电器抖落 */
RLY2_ON; RLY2_ON;
g_relay_hold_cnt += 5; g_relay_hold_cnt += 5;
@@ -964,6 +970,30 @@ static void coil_monitor(void)
} }
} }
/* V4.36.24: 强制断开期(L<下限视为断开, 宏=1)的恢复监测 — 无条件每 10ms 主循环调用
* coil_fault==2 ISR LOOP_OK=0 vd1_task , coil_monitor()
* 线 .
* (f 5s fault), (LPCNT/Origin=0) */
static void coil_monitor_recover(void)
{
uint32_t f_khz;
if (!(COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 2))
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; /* 仍越界/载波无效 → 继续等 */
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);
g_coil_fault = 0;
g_coil_bad_cnt = 0;
}
}
/*=========================================================================== /*===========================================================================
* vd1_task M1H VD1_TASK * vd1_task M1H VD1_TASK
* *
@@ -1481,6 +1511,9 @@ void loop_task_function(void *pvParameters)
INIT_VD(); INIT_VD();
while (1) { while (1) {
/* V4.36.24: 强制断开期(L<下限)恢复监测 — 无条件, 必须在 LOOP_OK 分支前 */
coil_monitor_recover();
/*--- V4.36.14: 主循环拍级 RF 上升沿检测 (不依赖 ISR LOOP_OK0) --- /*--- V4.36.14: 主循环拍级 RF 上升沿检测 (不依赖 ISR LOOP_OK0) ---
* !LOOP_OK0 ISR 5ms 150ms tick : * !LOOP_OK0 ISR 5ms 150ms tick :
* ()使 LOOP_OK0 1 * ()使 LOOP_OK0 1