feat(V4B): V4.36.37 — 电感分级降级 (方案A 用户拍板)

低于下限拆两级, COIL_UNDER_MIN_AS_OPEN 作用域 156k→171k:
- fault=2: 156~171k (L 20~24µH) 可用级 → 黄灯疾闪 100ms(与断开200ms区分), 判定恒照常
- fault=3: f>171k (L<20µH) 短路级 → 断开级快闪 200ms; 宏=1 等同断开(判车停+RLY释放+绿灯灭)
- coil_monitor_recover: 回窗≤171k(非156k) + 恢复实时置档(原清0有5s黄灯空档)
- tests 镜像四分: 157/171→2, 172→3; 文案同步
- spec V2.55 / manual V2.14 / devlog V2.73
语法0 error, 4测试全绿
This commit is contained in:
wangfq
2026-09-09 09:30:12 +08:00
parent 7ab0010055
commit 2be9e3c208
7 changed files with 80 additions and 42 deletions
@@ -81,9 +81,13 @@
#define ENV_WARN_WAIT 200 // 环境预判 (V4.31): dev>+4dlt 高位连续 ~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_L_MIN_UH 24 // V4.36.23/25: 最低工作电感量 µH (43nF 口径, 对应 COIL_L_MIN_F_KHZ=156): L<此值 → 黄灯快闪(断开级), 可 COIL_UNDER_MIN_AS_OPEN 切完全断开
#define COIL_UNDER_MIN_AS_OPEN 0 // V4.36.24: L<下限 是否视为线圈断开完全状态: 1=黄灯快闪+继电器保持释放+绿灯不亮(同真正断开, 判定停);
// 0=仅黄灯快闪(断开级指示), 绿灯/继电器/判定照常工作
#define COIL_L_MIN_UH 24 // V4.36.23/25: 出窗偏小指示阈值 µH (对应 COIL_L_MIN_F_KHZ=156): L<此值 → 黄灯疾闪 100ms(独立节奏), 判定恒照常
#define COIL_L_SHORT_UH 20 // V4.36.37: 真短路级阈值 µH (方案A 分级): L<20µH(f>171k) → 断开级快闪(200ms, 与真断开同款), COIL_UNDER_MIN_AS_OPEN 作用于此级
#define COIL_L_SHORT_F_KHZ 171 // V4.36.37: f@20µH=171.6k 取 171: f>此值 → L<20µH 短路级
#define COIL_UNDER_MIN_AS_OPEN 0 // V4.36.24/37: L<20µH(f>171k, 短路级) 是否视为线圈断开完全状态(方案A 作用域从 156k 移到 171k):
// 1=黄灯快闪+继电器保持释放+绿灯不亮(同真正断开, 判定停)+专职恢复监测;
// 0=仅黄灯快闪(断开级指示), 绿灯/继电器/判定照常
// 156~171k(L 20~24µH) 恒判车照常+疾闪, 不随此宏
#define COIL_FAULT_HOLD_TICKS 500 // V4.36.21: 电感量越界/恢复防抖 500tick=5s (原100=1s; 下限判定重要, 加长防误检瞬态冲高)
#define COIL_F_OK_MAX_KHZ 125 // 线圈频率合理窗上限 (V4.36.25 恢复): >125kHz(43nF≈38µH) → L偏小不合理 → 黄灯一长一短 (V4.36.9 口径不变)
#define COIL_L_MIN_F_KHZ 156 // V4.36.25: 低于下限频率 (43nF: L=2.533e7/(f²×43), f@24µH=156.7k): f>此值 → L<COIL_L_MIN_UH → 黄灯快闪(断开级)
+2 -2
View File
@@ -14,11 +14,11 @@
#define __CMCNG_H__
#define PRODUCT_MODEL "DLD154"
#define FIRMWARE_VER "4.36.36" // 主.子.修订 (2026-09-03 起: 小改动只增 REV; MAIN/SUB 由产品定)
#define FIRMWARE_VER "4.36.37" // 主.子.修订 (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 36
#define FIRMWARE_VER_REV 37
#define HARDWARE_VER_MAIN 3
#define HARDWARE_VER_SUB 0
+39 -19
View File
@@ -177,7 +177,7 @@ uint32_t g_stab_base = 0; // V4.36.15: 步进比较基准 CAPVD
uint8_t g_release_need = 3; // V4.36.8: 释放确认样本数 (按Q档, 高3/中4/低5)
uint8_t g_fault_phase = 0;
uint16_t g_fault_tick = 0;
uint8_t g_coil_fault = 0; // V4.26/25: 电感量异常 0=正常 1=出合理窗18~125kHz→一长一短(f<18k L偏大 / 125k<f≤156k L偏小) 2=L<24µH(f>156kHz, COIL_L_MIN_F_KHZ)→断开级快闪
uint8_t g_coil_fault = 0; // V4.26/25/37: 电感量异常 0=正常 1=出合理窗→一长一短(f<18k L偏大 / 125k<f≤156k L偏小) 2=156<f≤171k L20~24µH→疾闪100ms(恒判车) 3=f>171k L<20µH短路级→断开级快闪(宏=1 等同断开)
uint16_t g_coil_bad_cnt = 0; // V4.26: 电感异常防抖计数 (V4.36.21: 500tick=5s 置位/清除, 宏 COIL_FAULT_HOLD_TICKS)
/*===========================================================================
@@ -419,9 +419,9 @@ void poll_yellow_led(void)
* !loop1_LOOP_OK: 上电无线圈 + 运行中断开 (5ms 实时, 不等 loop_task 150ms 慢拍
* 置 disconnect_active; 上电 phase power_up=0 时不置位, 由本条件兜底)
* g_reconn_stab: 运行中无车重连判稳门控
* g_coil_fault==2: 电感量 < COIL_L_MIN_UH(24µH, f>156kHz) → 按线圈断开状态指示
* g_coil_fault==3: 电感量 < COIL_L_SHORT_UH(20µH, f>171kHz, V4.36.37 短路级) → 按线圈断开状态指示
* 上电有线圈/判稳中: LOOP_OK=1 → 黄灯不闪, 自检指示归绿灯慢闪 ---*/
if (!loop1_LOOP_OK || g_reconn_stab || g_coil_fault == 2) {
if (!loop1_LOOP_OK || g_reconn_stab || g_coil_fault == 3) {
if (g_fault_tick >= FLT_FAST_HALF) {
g_fault_tick = 0;
LED_YELLOW_GPIO->odt ^= LED_YELLOW_PIN; // toggle
@@ -441,11 +441,22 @@ void poll_yellow_led(void)
return;
}
/*--- V4.36.37 模式6: 电感量低于下限可用级(156~171k, L 20~24µH) → 疾闪 100ms
* 与断开/短路级快闪(200ms) 区分 — 现场可见"电感偏低但可用", 判定恒照常 ---*/
if (g_coil_fault == 2) {
if (g_fault_tick >= 20) { // 100ms (20 × 5ms)
g_fault_tick = 0;
LED_YELLOW_GPIO->odt ^= LED_YELLOW_PIN; // toggle
}
g_fault_phase = 0;
return;
}
/*--- V4.26/25 模式5: 线圈电感量出合理窗(18~125kHz) → 一长一短
* 长亮900ms(180tick) → 灭300ms(60) → 短亮100ms(20) → 灭700ms(140), 循环
* g_coil_fault: 1=f<18k L偏大 或 125k<f≤156k L偏小(均一长一短);
* 2=L<24µH(f>156k) 已在模式1 断开级快闪(V4.36.20/25)
* 优先级: 断开(1) > 环境(4) > 电感量(5) > N短闪(3) > 灭 ---*/
* 2=156~171k 疾闪(V4.36.37); 3=L<20µH 短路级已在模式1 断开级快闪
* 优先级: 断开(1) > 环境(4) > 疾闪(6) > 电感量(5) > N短闪(3) > 灭 ---*/
if (g_coil_fault == 1) {
static const uint16_t dur[4] = { 180, 60, 20, 140 }; // 900/300/100/700ms (V4.36.13: 灭 100→300ms)
if (g_fault_phase > 3) g_fault_phase = 0;
@@ -827,10 +838,10 @@ void TMR15_GLOBAL_IRQHandler(void)
/* V4.36.24: L<下限视为断开完全态(宏=1) — 载波强制为断:
* 主循环走断开路径(vd1_task 停/黄灯快闪), RLY 刷新短路保持释放, 绿灯镜像灭 */
if (COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 2)
if (COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 3)
loop1_LOOP_OK = 0;
if (loop1_LC_Reset == 0 && !(COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 2)) {
if (loop1_LC_Reset == 0 && !(COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 3)) {
/* 继电器 2(辅助/方向) */
if (loop1_VD_FLAG)
RLY2_ON;
@@ -864,7 +875,7 @@ void TMR15_GLOBAL_IRQHandler(void)
* - 超时仍断开 → 强制释放(防真故障无限保持)
* 无车断开(VD_FLAG=0)不受影响, 仍立即释放 */
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: 强制期不保持(保持释放) */
&& !(COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 3)) { /* V4.36.24: 强制期不保持(保持释放) */
RLY1_ON; /* 保持: 防止瞬时断开继电器抖落 */
RLY2_ON;
g_relay_hold_cnt += 5;
@@ -963,7 +974,7 @@ static uint32_t coil_l_uH(uint32_t f_khz)
* 拍板规格: 默认低频档口径, 空场频率合理窗 20~120kHz, 出界即判定电感量不合理
* (黄灯"一长一短"告警, 见 poll_yellow_led 模式5)
* 调用点保证: 仅稳定 + 无车空闲 + 未断开时执行 (车压/自检/断开不判)
* g_coil_fault: 0=正常 1=L偏大(f<20kHz) 2=L偏小(f>120kHz)
* g_coil_fault: 0=正常 1=出窗一长一短 2=156~171k疾闪(可用级) 3=f>171k短路级(断开级快闪)
* 防抖: 越界/恢复均连续 COIL_FAULT_HOLD_TICKS(500tick=5s, V4.36.21) 才置位/清除 — 下限判定重要, 加长防误检
*===========================================================================*/
static void coil_monitor(void)
@@ -974,14 +985,17 @@ static void coil_monitor(void)
if (loop1_Origin == 0 || f_khz == 0)
return; /* 无有效基准 → 维持原状 */
/* V4.36.25分语义 (43nF):
* f<18k → want=1 L偏大(>合理窗) → 一长一短
* f>156k → want=2 L<24µH 下限以下 → 快闪(断开级)
* 125k<f≤156k → want=1 L偏小(出合理窗但不低于下限) → 一长一短 */
/* V4.36.25/37 四分语义 (43nF, 方案A 分级):
* f<18k → want=1 L偏大 → 一长一短
* 125k<f≤156k → want=1 L偏小(出窗) → 一长一短
* 156k<f≤171k → want=2 L 20~24µH 低于下限可用级 → 疾闪100ms(与断开区分), 判定恒照常
* f>171k → want=3 L<20µH 短路级 → 断开级快闪(200ms), COIL_UNDER_MIN_AS_OPEN 决定功能 */
if (f_khz < COIL_F_OK_MIN_KHZ)
want = 1; /* L 偏大 */
else if (f_khz > COIL_L_SHORT_F_KHZ)
want = 3; /* L<20µH 短路级 → 断开级快闪 */
else if (f_khz > COIL_L_MIN_F_KHZ)
want = 2; /* L<下限 → 断开级快闪 */
want = 2; /* 156~171k L20~24µH → 疾闪(可用级) */
else if (f_khz > COIL_F_OK_MAX_KHZ)
want = 1; /* L 偏小(出合理窗, 不低于下限) → 一长一短 */
@@ -993,7 +1007,8 @@ static void coil_monitor(void)
if (g_coil_fault == 0)
PRINT("EVT|coil_fault f:%d kHz L~%lu uH Xn:%d %s\n",
f_khz, coil_l_uH(f_khz), loop1_Xn,
(want == 2) ? "below_l_min" :
(want == 3) ? "below_l_short" :
(want == 2) ? "below_l_min_20_24u" :
(f_khz < COIL_F_OK_MIN_KHZ) ? "too_large" : "too_small");
else
PRINT("EVT|coil_ok f:%d kHz\n", f_khz);
@@ -1011,18 +1026,23 @@ static void coil_monitor_recover(void)
{
uint32_t f_khz;
if (!(COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 2))
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_MIN_F_KHZ) {
g_coil_bad_cnt = 0; /* 仍低于下限/载波无效 → 继续等 */
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) */
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;
/* V4.36.37: 按当前 f 实时置档(非清 0) — 避免回 156~171k 可用级/125~156k 出窗区
* 后黄灯空档 5s (原清 0 等 coil_monitor 重判有小瑕疵) */
g_coil_fault = (f_khz < COIL_F_OK_MIN_KHZ) ? 1 :
(f_khz > COIL_L_SHORT_F_KHZ) ? 3 :
(f_khz > COIL_L_MIN_F_KHZ) ? 2 :
(f_khz > COIL_F_OK_MAX_KHZ) ? 1 : 0;
g_coil_bad_cnt = 0;
}
}