feat(V4B): V4.36.3 — 有车断开继电器保持 RELAY_HOLD_MS=500ms
断开前 VD_FLAG=1(有车) → RLY 保持不释放: 500ms 内重连+有车→无缝续持, 重连+无车→vd1_task 判离释放, 超时仍断→强制释放(hold_done 防抖); 无车断开立即释放不变. ISR 5ms 计时, 宏可调(RELAY_HOLD_MS) 审查修复: done 后不加 !hold_done 会 100Hz 继电器抖动 语法0 error, 4测试全绿; spec V2.19 / manual 断开行 / devlog V2.37
This commit is contained in:
@@ -54,6 +54,14 @@ uint8_t loop1_entry_cnt;
|
||||
uint16_t loop1_freeze_cnt;
|
||||
uint32_t loop1_freeze_ref;
|
||||
|
||||
/*===========================================================================
|
||||
* 断开保持/重连参数 (ISR 5ms tick 使用, 须定义于 TMR15 ISR 之前)
|
||||
*===========================================================================*/
|
||||
#define RELAY_HOLD_MS 500 /* V4.36.3: 有车断开继电器保持超时(可调宏, ms)
|
||||
* 断开前感应有车且继电器输出中 → 不断开而保持,
|
||||
* 超时仍断开才释放(防瞬时断开误释放/防砸);
|
||||
* 保持期内重连且有车 → 输出无缝续持 */
|
||||
|
||||
/*===========================================================================
|
||||
* 全局状态变量 — 标志位
|
||||
*===========================================================================*/
|
||||
@@ -139,6 +147,8 @@ uint8_t g_disconnect_count = 0;
|
||||
uint8_t g_disconnect_active = 0;
|
||||
uint8_t g_reconn_candidate = 0; // V4.36.2: 重连确认窗候选(载波上升沿进入)
|
||||
uint16_t g_reconn_cnt = 0; // V4.36.2: 载波连续恢复计数 (确认窗 ~100ms)
|
||||
uint16_t g_relay_hold_cnt = 0; // V4.36.3: 有车断开继电器保持计时(ms, ISR 5ms 累加)
|
||||
uint8_t g_relay_hold_done = 0; // V4.36.3: 本次有车断开已兜底释放(防重复OFF)
|
||||
uint8_t g_fault_phase = 0;
|
||||
uint16_t g_fault_tick = 0;
|
||||
uint8_t g_coil_fault = 0; // V4.26: 线圈电感量异常 0=正常 1=L偏大(f<20kHz) 2=L偏小(f>120kHz)
|
||||
@@ -744,6 +754,25 @@ void TMR15_GLOBAL_IRQHandler(void)
|
||||
loop1_LOOP_OK = 0;
|
||||
}
|
||||
|
||||
/*--- V4.36.3: 有车断开 → 继电器保持 (5ms tick, 500ms 兜底释放) ---
|
||||
* 断开前感应有车(VD_FLAG)且已上电 → RLY 不断开, 保持输出:
|
||||
* - 500ms 内重连(经 100ms 确认窗) + vd1_task 判有车 → 输出无缝续持
|
||||
* - 500ms 内重连 + 判无车 → vd1_task 正常离开释放
|
||||
* - 超时仍断开 → 强制释放(防真故障无限保持)
|
||||
* 无车断开(VD_FLAG=0)不受影响, 仍立即释放 */
|
||||
if (!loop1_LOOP_OK && loop1_VD_FLAG && g_loop_power_up_state && !g_relay_hold_done) {
|
||||
RLY1_ON; /* 保持: 防止瞬时断开继电器抖落 */
|
||||
RLY2_ON;
|
||||
g_relay_hold_cnt += 5;
|
||||
if (g_relay_hold_cnt >= RELAY_HOLD_MS) {
|
||||
RLY1_OFF; /* 兜底: 超时仍断开 → 释放 */
|
||||
RLY2_OFF;
|
||||
g_relay_hold_done = 1;
|
||||
}
|
||||
} else {
|
||||
g_relay_hold_cnt = 0; /* 载波正常或非有车态 → 不保持 */
|
||||
}
|
||||
|
||||
/*--- 硬件驱动:呼吸灯 + 指示灯 ---*/
|
||||
poll_red_pwm();
|
||||
poll_green_led();
|
||||
@@ -1282,6 +1311,8 @@ void loop_task_function(void *pvParameters)
|
||||
loop1_CAPVD = 0; // 强制 IIR 从首个有效值重新收敛
|
||||
loop1_CAPVD_slow = 0; // 方案A: 释放慢滤波同步收敛
|
||||
g_env_wait_cnt = 0; // V4.24: 断开重连后环境学习状态复位
|
||||
g_relay_hold_cnt = 0; // V4.36.3: 保持计时复位
|
||||
g_relay_hold_done = 0;
|
||||
env_resync_abort();
|
||||
PRINT("EVT|loop_reconnect confirmed %dms\n",
|
||||
RECONNECT_CONFIRM_TICKS * 10);
|
||||
@@ -1308,9 +1339,13 @@ void loop_task_function(void *pvParameters)
|
||||
/* V4.36.2: 掉线即取消重连候选 (抖动免疫: 每次掉线重新计确认窗) */
|
||||
g_reconn_candidate = 0;
|
||||
g_reconn_cnt = 0;
|
||||
/* V4.36.3: 有车断开 → 继电器保持(ISR 计时, RELAY_HOLD_MS 兜底释放);
|
||||
* 无车断开 → 立即释放 (原行为) */
|
||||
if (!(loop1_VD_FLAG && g_loop_power_up_state)) {
|
||||
RLY1_OFF;
|
||||
RLY2_OFF;
|
||||
}
|
||||
/* 注意: 不清除 loop1_VD_FLAG,保留断开前的检测状态 */
|
||||
RLY1_OFF;
|
||||
RLY2_OFF;
|
||||
|
||||
/*
|
||||
* 断开计数规则:
|
||||
|
||||
Reference in New Issue
Block a user