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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user