feat(V4B): V4.36.2 — 线圈重连确认窗 100ms (防抖动重复计数/首样本毛刺)

RF 上升沿仅进候选; 载波连续恢复 RECONNECT_CONFIRM_TICKS=10 (100ms)
才确认重连重置; 确认窗内 disconnect_active 保持 → 黄灯快闪/计数不重复,
不跑 vd1_task; 任何掉线取消候选 → 抖动免疫
断开判定不加防抖(释放速度安全刚需)
语法0 error, 4测试全绿; spec V2.18 / devlog V2.36
This commit is contained in:
wangfq
2026-09-04 08:50:25 +08:00
parent 798801d881
commit 18db4bf762
4 changed files with 87 additions and 21 deletions
+40 -18
View File
@@ -137,6 +137,8 @@ uint16_t g_safe_max_cnt = LC_HOLD_TIME;
uint8_t g_loop_power_up_state = 0;
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)
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)
@@ -1251,6 +1253,9 @@ void vd1_task(void)
/*===========================================================================
* loop_task_function — FreeRTOS 主任务(对齐 M1H main 循环)
*===========================================================================*/
#define RECONNECT_CONFIRM_TICKS 10 /* V4.36.2: 重连确认窗 10×10ms=100ms
* 载波连续恢复满窗才确认重连重置;
* 抖动断开↔恢复每掉线取消重新计 */
void loop_task_function(void *pvParameters)
{
g_sys_freq = g_crm_clocks_freq_struct.sclk_freq;
@@ -1259,33 +1264,50 @@ void loop_task_function(void *pvParameters)
while (1) {
if (loop1_LOOP_OK) {
/*--- 线圈重连 ---*/
/*--- 线圈重连: V4.36.2 确认窗 (载波连续恢复 ~100ms 才确认重置) ---
* RF 上升沿仅进入候选; 期间保持 g_disconnect_active=1 → 黄灯仍快闪,
* 断开计数不重复; 抖动(断开↔恢复快速交替)每次掉线取消候选 → 免疫.
* 确认后才: 清断开标记 / CAPVD 强制重收敛(首样本此时已干净, 无斜率限幅绕过风险) */
if (!loop1_LOOP_OK0) {
loop1_LOOP_OK0 = 1;
g_disconnect_active = 0; // 重连,清除断开标记
loop1_CAPVD = 0; // 强制 IIR 从首个有效值重新收敛
loop1_CAPVD_slow = 0; // 方案A: 释放慢滤波同步收敛
g_env_wait_cnt = 0; // V4.24: 断开重连后环境学习状态复位
env_resync_abort();
PRINT("EVT|loop_reconnect\n");
g_reconn_candidate = 1;
g_reconn_cnt = 0;
}
if (loop1_CAP_OK) {
loop1_CAP_OK = 0;
/* 首次成功测量 → 标记线圈已连接 */
if (!g_loop_power_up_state) {
g_loop_power_up_state = 1;
if (g_reconn_candidate) {
g_reconn_cnt++;
if (g_reconn_cnt >= RECONNECT_CONFIRM_TICKS) {
g_reconn_candidate = 0;
g_reconn_cnt = 0;
g_disconnect_active = 0; // 确认重连: 清除断开标记
loop1_CAPVD = 0; // 强制 IIR 从首个有效值重新收敛
loop1_CAPVD_slow = 0; // 方案A: 释放慢滤波同步收敛
g_env_wait_cnt = 0; // V4.24: 断开重连后环境学习状态复位
env_resync_abort();
PRINT("EVT|loop_reconnect confirmed %dms\n",
RECONNECT_CONFIRM_TICKS * 10);
}
/* 确认窗内: 等载波稳定, 不跑检测 (黄灯由 disconnect_active=1 维持快闪) */
} else {
if (loop1_CAP_OK) {
loop1_CAP_OK = 0;
/* 核心检测算法 */
vd1_task();
/* 首次成功测量 → 标记线圈已连接 */
if (!g_loop_power_up_state) {
g_loop_power_up_state = 1;
}
/* 拨码开关轮询 */
poll_sw_state();
/* 核心检测算法 (确认窗结束后 CAPVD=0 → 首样本干净重建) */
vd1_task();
/* 拨码开关轮询 */
poll_sw_state();
}
}
} else {
/*--- 线圈断开 ---*/
/* V4.36.2: 掉线即取消重连候选 (抖动免疫: 每次掉线重新计确认窗) */
g_reconn_candidate = 0;
g_reconn_cnt = 0;
/* 注意: 不清除 loop1_VD_FLAG,保留断开前的检测状态 */
RLY1_OFF;
RLY2_OFF;