diff --git a/docs/devlog.md b/docs/devlog.md index 8cee592..66496c2 100644 --- a/docs/devlog.md +++ b/docs/devlog.md @@ -4,6 +4,26 @@ --- +## 2026-09-03 — 低Q 释放抗抖(固件 V4.36.19) + +> **固件版本:V4.36.19**。devlog 修订 V2.54。spec V2.35 / manual 已同步。 + +**问题**:43nF 低频、高灵敏、低Q(50µH 以下) 线圈——金属板感应边界反复试探 +(快释放停住→缓慢离开),触发高度稳定但释放高度越拉越远,最终绿灯长亮释放不了; +高Q 无此问题。关键旁证:**开 DEBUG 打印复现不了、禁打印可复现**——PRINT 阻塞 +把 vd1_task 样本间隔从 10ms 拉到 50ms+,等效低通,抖动被平均。 + +**根因**:释放带回仅 dlt_rel=23 counts(0.018%@128k)≈ 低Q 抖动 σ(±15~25), +快值直接判释放(`CAPVD>Origin-23` 连续 5 样本)在边界试探时被抖动反复打断 +→ 释放点外移/卡死。 + +**修复(Q 分档,高/中Q 零影响)**: +1. `rel_release_hit()`:低Q(g_q_lo, f>100kHz) 用 g_rel_smooth(τ≈50ms, + REL_ALFA=46,复刻打印平均效应)判释放 +2. 低Q 释放带回 ×1.5(REL_BAND_LO_MULT=150,23→~35)提前释放留 σ 余量 +3. g_rel_smooth:IIR 后每样本跟随;CAPVD=0/重连/INIT 归零;Car_In snap=CAPVD +语法 0 error、4 测试全绿。 + ## 2026-09-03 — 频率窗下界 20→18kHz(固件 V4.36.18) > **固件版本:V4.36.18**(cmcng.h:FIRMWARE_VER="4.36.18",REV=18)。devlog 修订 V2.53。 @@ -1902,6 +1922,7 @@ if (dev >= dlt_ORG × 4) { | 版本 | 时间 | 说明 | |------|------|------| +| V2.54 | 2026-09-03 | V4.36.19 低Q 释放抗抖: τ50ms 平滑判释放+带回×1.5 (REL_ALFA/REL_BAND_LO_MULT), 高/中Q 零影响 | | V2.53 | 2026-09-03 | V4.36.18 频率窗下界 20→18kHz (18~125kHz) | | V2.52 | 2026-09-03 | 安全复位观感勘误(无代码): 绿灯镜像继电器后复位指示变化; manual 4.5/spec 对齐实际行为 | | V2.51 | 2026-09-03 | V4.36.17 修复上电无线圈黄灯不闪: 黄灯模式1 改 !LOOP_OK(5ms 实时) | diff --git a/docs/technical-spec.md b/docs/technical-spec.md index ce926f4..98ef2c5 100644 --- a/docs/technical-spec.md +++ b/docs/technical-spec.md @@ -1,6 +1,6 @@ # DLD154V4B 技术规格书 -> 单路线圈车辆检测器 | 固件版本: V4.36.18 | 文档版本: V2.34 +> 单路线圈车辆检测器 | 固件版本: V4.36.19 | 文档版本: V2.35 > 本文档面向工程开发、系统集成及故障深度分析 --- @@ -805,3 +805,4 @@ DLD154V4B V1.4 起实现该专利的整数化版本,用于大车通行时的 | V2.32 | 2026-09-03 | **V4.36.16 上电自检与重连灯语义分离**:黄灯模式1 去 !power_up(上电有线圈黄灯不闪,自检归绿灯慢闪);无线圈由 disconnect_active 覆盖仍双闪;判稳门控触发加 g_loop_stable(上电/安全复位不判稳);运行中重连仍黄灯接管 | | V2.33 | 2026-09-03 | **V4.36.17 修复上电无线圈黄灯不闪**:断开分支置位条件含 power_up(上电 phase 故意不置 disconnect_active),V4.36.16 去 !power_up 后裸奔 → 黄灯模式1 改 `!LOOP_OK || g_reconn_stab`(5ms 实时载波缺失判定,同时让运行中断开黄灯反应从 150ms 加快到 5ms) | | V2.34 | 2026-09-03 | **V4.36.18 频率窗下界 20→18kHz**:放行更大电感线圈(18~125kHz @43nF ≈ L 47µH~1.15mH);test 边界 17 偏大/18 正常;参数表同步修正历史滞后(MAX 125 / C_NF 43) | +| V2.35 | 2026-09-03 | **V4.36.19 低Q 释放抗抖**:低Q(21~50µH)高灵敏边界试探释放点外移/锁死(释放带回 23≈σ,快值判释放被抖断);τ50ms 平滑(REL_ALFA=46, 打印降采样平均效应工程版)+带回×1.5(REL_BAND_LO_MULT) 仅低Q 生效,高/中Q 零影响 | diff --git a/utilities/at32f421_freertos_demo/inc/TaskLoop.h b/utilities/at32f421_freertos_demo/inc/TaskLoop.h index 130242f..f0b2580 100644 --- a/utilities/at32f421_freertos_demo/inc/TaskLoop.h +++ b/utilities/at32f421_freertos_demo/inc/TaskLoop.h @@ -36,6 +36,8 @@ *===========================================================================*/ #define ALFA_CAP1 79 // IIR α = 79/256 ≈ 0.31 (@10ms → τ≈32ms) #define RELEASE_ALFA 21 // 释放慢滤波 α = 21/256 ≈ 0.082 (@10ms → 精确τ≈117ms, V4.04: 对齐 PD132T α79@43.7ms 精确τ≈118ms; 原18→精确τ137ms偏慢) +#define REL_ALFA 46 // V4.36.19: 低Q 释放平滑 α=46/256≈0.18 (@10ms → τ≈50ms): 复刻打印降采样平均效应, 只用于低Q 释放判定抗抖 +#define REL_BAND_LO_MULT 150 // V4.36.19: 低Q 释放带回加宽 % (dlt_rel×1.5: 23→35@SENS3): 释放提前+σ余量, 防边界试探锁死 #define USE_SLOW_RELEASE 0 // 方案A总开关: 1=释放走慢滤波(对齐PD132T) 0=原快滤波释放 #define USE_PLANB_TABLE 1 // 方案B (V4.06): 快滤波释放 + 灵敏度表现场调校 // 1=进入加深/释放调浅双表(见 TaskLoop.c, SENS=3: 25/12 现场实测接近PD132T) diff --git a/utilities/at32f421_freertos_demo/inc/cmcng.h b/utilities/at32f421_freertos_demo/inc/cmcng.h index 8017972..6a10fb4 100644 --- a/utilities/at32f421_freertos_demo/inc/cmcng.h +++ b/utilities/at32f421_freertos_demo/inc/cmcng.h @@ -14,11 +14,11 @@ #define __CMCNG_H__ #define PRODUCT_MODEL "DLD154" -#define FIRMWARE_VER "4.36.18" // ..޶ (2026-09-03 : СĶֻ REV; MAIN/SUB ɲƷ) +#define FIRMWARE_VER "4.36.19" // ..޶ (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 18 +#define FIRMWARE_VER_REV 19 #define HARDWARE_VER_MAIN 3 #define HARDWARE_VER_SUB 0 diff --git a/utilities/at32f421_freertos_demo/src/TaskLoop.c b/utilities/at32f421_freertos_demo/src/TaskLoop.c index 9f3f771..248010c 100644 --- a/utilities/at32f421_freertos_demo/src/TaskLoop.c +++ b/utilities/at32f421_freertos_demo/src/TaskLoop.c @@ -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;