feat(V4B): V4.36.19 — 低Q 释放抗抖 (平滑判释放+带回加宽)

问题: 43nF/高灵敏/低Q(≤50µH) 金属板边界试探 → 触发稳定但释放点外移
发散至锁死(绿灯长亮); 开 DEBUG 打印复现不了(阻塞降采样平均抖动) = 关键旁证
根因: 释放带回 dlt_rel=23 ≈ 低Q σ(±15~25), 快值判释放(5样本)被抖断
修复(Q 分档, 高/中Q 零影响):
- rel_release_hit(): 低Q 用 g_rel_smooth(τ50ms REL_ALFA=46) 判释放
- 低Q 释放带回 ×1.5 (REL_BAND_LO_MULT=150: 23→~35)
- g_rel_smooth: IIR 后跟随/CAPVD=0 与重连归零/Car_In snap
语法0 error, 4测试全绿; spec V2.35 / devlog V2.54
This commit is contained in:
wangfq
2026-09-04 18:42:22 +08:00
parent e1b5542296
commit ef5959d6fe
5 changed files with 82 additions and 4 deletions
@@ -42,6 +42,8 @@ uint32_t loop1_CapSum;
uint32_t loop1_Value;
uint32_t loop1_CAPVD;
uint32_t loop1_CAPVD_slow = 0; // 释放判定慢滤波值 (方案A)
uint32_t g_rel_smooth = 0; // V4.36.19: 低Q 释放平滑值 (τ≈50ms, 复刻打印降采样平均效应)
uint8_t g_q_lo = 0; // V4.36.19: 低Q 档标志 (空场 f>100kHz, update_q_confirm_need 同步)
uint32_t loop1_Origin;
uint32_t loop1_ORG_SUM;
uint16_t loop1_ORG_CNT;
@@ -253,6 +255,42 @@ uint32_t get_flt_value_slow(uint32_t new_value, uint32_t last_value)
return value_Flt;
}
/* V4.36.19: 低Q 释放平滑 (α=REL_ALFA/256≈0.18, τ≈50ms @10ms)
* 复刻 DEBUG 打印阻塞降采样的平均效应 — 低Q(高频)释放边界抖动大, 快值直接判
* 会被抖动打断计数(回滞仅 23 counts ≈ σ), 平滑后判定稳定 */
uint32_t get_flt_value_rel(uint32_t new_value, uint32_t last_value)
{
uint32_t value_Flt;
uint32_t delta = (new_value > last_value)
? (new_value - last_value)
: (last_value - new_value);
uint32_t scaled_delta = (delta * (uint32_t)REL_ALFA) >> 8;
if (new_value > last_value) {
value_Flt = last_value + scaled_delta;
} else {
value_Flt = last_value - scaled_delta;
}
return value_Flt;
}
/* V4.36.19: 释放命中判定 — 低Q(21~50µH)高灵敏释放带回仅 ~23 counts ≈ 抖动 σ,
* 快值直接判在边界试探时计数被抖断 → 释放点外移/卡死;
* 低Q 用 τ50ms 平滑值(复刻打印阻塞降采样平均效应) + 带回 ×1.5(留 σ 余量).
* 高Q/中Q 走原快值逻辑, 零影响 */
static uint8_t rel_release_hit(void)
{
uint32_t _cmp = loop1_CAPVD;
uint32_t _line = loop1_Origin - loop1_dlt_ORG;
if (g_q_lo) {
_cmp = g_rel_smooth;
_line = loop1_Origin - ((loop1_dlt_ORG * REL_BAND_LO_MULT) / 100);
}
return (_line < _cmp) ? 1 : 0;
}
/*===========================================================================
* 滑动平均基线更新
* 累加 new_value,当计数达到 window 时计算平均值并重置
@@ -480,6 +518,8 @@ void INIT_VD(void)
g_stab_step_tick = 0;
g_stab_ok_cnt = 0;
g_stab_base = 0;
g_rel_smooth = 0; /* V4.36.19: 低Q 释放平滑清零 */
g_q_lo = 0; /* V4.36.19: 低Q 档标志清零 */
loop1_CAP_OK = 0;
loop1_CAPVD = 0;
loop1_CAPVD_slow = 0; // 方案A: 释放慢滤波复位
@@ -955,6 +995,7 @@ void vd1_task(void)
*================================================================*/
if (loop1_CAPVD == 0) {
loop1_CAPVD = loop1_Value;
g_rel_smooth = 0; /* V4.36.19: 直锁时释放平滑同步归零 */
/* V4.36.5: 首样本直锁(重连重置后) → 按线圈 Q(空场频率)分档设定抑制窗
* Origin 为断开前空场基线(同线圈同环境) → f 即 Q 档;
@@ -991,6 +1032,14 @@ void vd1_task(void)
}
#endif
/* V4.36.19: 低Q 释放平滑 (τ≈50ms; 无条件跟随, 只用于低Q 释放判定) */
if (loop1_CAPVD != 0) {
if (g_rel_smooth == 0)
g_rel_smooth = loop1_CAPVD;
else
g_rel_smooth = get_flt_value_rel(loop1_CAPVD, g_rel_smooth);
}
/* V4.36.5: 重连起振抑制倒计时 (每样本 ~10ms) */
if (g_reconn_blank_ms) {
if (g_reconn_blank_ms > 10) g_reconn_blank_ms -= 10;
@@ -1265,6 +1314,7 @@ void vd1_task(void)
* 消除"定在HR0/2保持即释放"窗口(2026-09-01 仿真+现场复核) */
loop1_CAPVD_slow = loop1_CAPVD;
#endif
g_rel_smooth = loop1_CAPVD; /* V4.36.19: 低Q 释放平滑 snap 到进入点 */
if (!SET_SAFE) {
loop1_LC_HOLD = 1;
@@ -1362,7 +1412,7 @@ void vd1_task(void)
#if USE_SLOW_RELEASE
if ((loop1_Origin - loop1_dlt_ORG) < loop1_CAPVD_slow) { // 方案A: 用慢滤波值对齐 PD132T 释放手感
#else
if ((loop1_Origin - loop1_dlt_ORG) < loop1_CAPVD) { // 方案B/原逻辑: 快滤波直接判释放
if (rel_release_hit()) { // V4.36.19: 低Q 平滑值+带回加宽; 高/中Q 退回原快值逻辑
#endif
if (loop1_cnt_release == 0) {
/* 过渡事件: 第一次命中离开线 (定位"为什么开始释放") */
@@ -1408,12 +1458,15 @@ static void update_q_confirm_need(void)
if (_f > RECONNECT_Q_MID_F_KHZ) { /* 低Q f>100k */
g_entry_need = ENTRY_CONFIRM_LO;
g_release_need = REL_CONFIRM_LO;
g_q_lo = 1; /* V4.36.19: 低Q 释放抗抖档 */
} else if (_f > RECONNECT_Q_HI_F_KHZ) { /* 中Q 80~100k */
g_entry_need = ENTRY_CONFIRM_MID;
g_release_need = REL_CONFIRM_MID;
g_q_lo = 0;
} else { /* 高Q f<=80k (含 Origin=0 f=0) */
g_entry_need = ENTRY_CONFIRM_HI;
g_release_need = REL_CONFIRM_HI;
g_q_lo = 0;
}
}
@@ -1453,6 +1506,7 @@ void loop_task_function(void *pvParameters)
g_disconnect_active = 0; // 确认重连: 清除断开标记
loop1_CAPVD = 0; // 强制 IIR 从首个有效值重新收敛
loop1_CAPVD_slow = 0; // 方案A: 释放慢滤波同步收敛
g_rel_smooth = 0; // V4.36.19: 释放平滑同步收敛
g_env_wait_cnt = 0; // V4.24: 断开重连后环境学习状态复位
g_relay_hold_cnt = 0; // V4.36.3: 保持计时复位
g_relay_hold_done = 0;