diff --git a/docs/devlog.md b/docs/devlog.md index 6a73bc5..b0869a4 100644 --- a/docs/devlog.md +++ b/docs/devlog.md @@ -4,6 +4,19 @@ --- +## 2026-09-04 — 释放后分级补偿:仿 PD132T 慢采样等效(固件 V4.36.32) + +用户对比 PD132T(无"不易释放/释放越来越远")提出:132T 采样比 154V4 慢,Origin 学习等效慢 → 残余学入慢 → 更稳。 + +**机理确认(代码依据)**:update_moving_average 是满窗替换——每满 500 样本(5s) Origin 一次性替换为窗口均值。快采样(10ms)让 5s 窗装得快;释放后无车段板缓离(CAPVD 低)持续 ≥5s → Origin 被残余均值整窗拉低。132T 慢采样 ≈ 25s 才装满等效窗 → 残余影响小 5 倍。 + +**V4.36.32 分级落地**(全宏可调): +1. 全冻结 1s:REL_ORIGIN_FREEZE_TICKS 50→100(残余缓离窗口样本完全不进均值窗) +2. 降权低速补偿 2s:ORIGIN_LOWLEARN_TICKS=200 + ORIGIN_LOWLEARN_MULT=5(均值窗 500→2500 样本=25s,学习速率 1/5,≈132T 慢采样等效)——残余低值仍可学但权重 ×1/5 +3. g_origin_lowlearn_tick 预置在 Car_OFF(普通+环带兜底两处);递减:冻结结束才递减降权期;均值窗守卫 window 按阶段切换;INIT 清零 +- EMA/触发/释放判定零影响;B3 vac_ref 不变 +语法 0 error、4 测试全绿;REV 4.36.32;spec V2.48 / devlog V2.67。 + ## 2026-09-04 — B3 真空 EMA 重锚:判定参考与锚错 Origin 解耦(固件 V4.36.31) 用户拍板 B3 为主 / A2 可选加严(存档不默认上,防拖慢真实环境适应)。 @@ -2082,6 +2095,7 @@ if (dev >= dlt_ORG × 4) { | 版本 | 时间 | 说明 | |------|------|------| +| V2.67 | 2026-09-04 | V4.36.32 释放后分级补偿(冻结1s+降权2s×1/5): 仿132T 慢采样防残余整窗拉低 Origin | | V2.66 | 2026-09-04 | V4.36.31 B3 真空 EMA 重锚: vac_ref=min(Origin,EMA) 判定参考解耦; A2 存档 | | V2.65 | 2026-09-04 | V4.36.30 环带超时兜底(时间回滞): 撤容差4; 低Q 离开触发深度持续2.5s 强制释放; 试探卡死根治 | | V2.64 | 2026-09-04 | V4.36.29 释放容差 REL_LO_TOL=4: Origin 过冲残留(34)被 VD 冻结→释放线偏高→RSM 差 1 count 卡 75s → 容差破死锁 | diff --git a/docs/technical-spec.md b/docs/technical-spec.md index 5c8a7ea..b8f152f 100644 --- a/docs/technical-spec.md +++ b/docs/technical-spec.md @@ -1,6 +1,6 @@ # DLD154V4B 技术规格书 -> 单路线圈车辆检测器 | 固件版本: V4.36.31 | 文档版本: V2.47 +> 单路线圈车辆检测器 | 固件版本: V4.36.32 | 文档版本: V2.48 > 本文档面向工程开发、系统集成及故障深度分析 --- @@ -836,3 +836,4 @@ DLD154V4B V1.4 起实现该专利的整数化版本,用于大车通行时的 | V2.45 | 2026-09-04 | **V4.36.29 低Q 释放判定容差 REL_LO_TOL=4**(J1 日志 75s 延迟释放根因):Origin 过冲残留(拿起板 env 学高 34 counts, 释放后均值窗 7s 收敛)被 VD 冻结 → 释放线偏高 → 撤板后真空 CAPVD 距线仅 7 counts、RSM 平滑差 1 count 卡 75s。容差 4 = 等效释放线 Origin-45(回滞 49-45=4 counts, σ1-2 安全);板停触发深处(dev-49)不误释放;正常撤板余量不变 | | V2.46 | 2026-09-04 | **V4.36.30 环带超时兜底替代容差**(用户反馈 V4.36.29 容差致"抬一点就释放"):撤 REL_LO_TOL=4(回滞恢复 8 counts);新增 REL_BAND_TIMEOUT_TICKS=250——低Q 触发后若 CAPVD 平滑 > 进入线(已离开触发深度)持续 2.5s → 强制释放。空间回滞带内停住(试探卡死)不再永久锁;真实车深压不触发;J1 撤板 2.5s 内释放(原 75s) | | V2.47 | 2026-09-04 | **V4.36.31 真空 EMA 重锚(B3)**:无车 dev 窗维护 g_vacuum_ema(α=128, τ≈1.28s, 判稳建立);判定参考 vac_ref()=min(Origin, EMA)——进入线/低Q 释放线/环带兜底线全部锚真空参考。Origin 被 env 学习锚高(板搁置态 130636 vs 真空 130506)时释放线不再偏高;撤板真空即释放。DBG 加 VEM/RLN 显示真空锚定线。A2(学入步长限 1%)存档可选加严 | +| V2.48 | 2026-09-04 | **V4.36.32 释放后分级补偿(仿 PD132T 慢采样)**:均值窗是满窗替换(500 样本/5s)——快采样 10ms 让窗装得快, 释放残余(板缓离低 CAPVD)易整窗拉低 Origin。分级:释放后全冻结 1s(REL_ORIGIN_FREEZE_TICKS 50→100) → 降权低速补偿 2s(ORIGIN_LOWLEARN_TICKS=200, 窗 500→2500=25s, 学习速率 1/5, ORIGIN_LOWLEARN_MULT=5) → 正常。全宏可调;EMA/判定零影响 | diff --git a/utilities/at32f421_freertos_demo/inc/TaskLoop.h b/utilities/at32f421_freertos_demo/inc/TaskLoop.h index d66beac..19d20de 100644 --- a/utilities/at32f421_freertos_demo/inc/TaskLoop.h +++ b/utilities/at32f421_freertos_demo/inc/TaskLoop.h @@ -61,7 +61,10 @@ #define ENTRY_CONFIRM_HI 3 // 高Q(f<=80k) 进入确认样本 #define ENTRY_CONFIRM_MID 4 // 中Q(80~100k) #define ENTRY_CONFIRM_LO 5 // 低Q(f>100k): 抖动大, 多样本防假进入 -#define REL_ORIGIN_FREEZE_TICKS 50 // V4.36.26: 释放后 Origin 均值窗冻结 500ms(@10ms): 切断"释放残余→Origin 学入→释放线漂移" cycle 间正反馈 (低Q 边界试探发散治本项) +#define REL_ORIGIN_FREEZE_TICKS 100 // V4.36.26/32: 释放后 Origin 全冻结 1000ms — 残余缓离窗口不入均值窗 +#define ORIGIN_LOWLEARN_TICKS 200 // V4.36.32: 冻结后降权低速补偿期 2000ms: 残余低值样本权重降 ×1/MULT + // 仿 PD132T 慢采样等效(10ms 快采样让 5s 窗装得快, 残余易拉低 Origin; 慢学更稳) +#define ORIGIN_LOWLEARN_MULT 5 // V4.36.32: 降权期均值窗放大 500→2500 样本(25s 窗), 学习速率 1/5 #define REL_CONFIRM_HI 3 // 高Q 释放确认样本 #define REL_CONFIRM_MID 4 // 中Q #define REL_CONFIRM_LO 5 // 低Q: 释放边界抖动, 多样本防输出抖落 diff --git a/utilities/at32f421_freertos_demo/inc/cmcng.h b/utilities/at32f421_freertos_demo/inc/cmcng.h index 07cff93..51da3c7 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.31" // ..޶ (2026-09-03 : СĶֻ REV; MAIN/SUB ɲƷ) +#define FIRMWARE_VER "4.36.32" // ..޶ (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 31 +#define FIRMWARE_VER_REV 32 #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 6fb51c0..bbcfe47 100644 --- a/utilities/at32f421_freertos_demo/src/TaskLoop.c +++ b/utilities/at32f421_freertos_demo/src/TaskLoop.c @@ -44,7 +44,8 @@ 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 同步) -uint16_t g_origin_freeze_tick = 0; // V4.36.26: 释放后 Origin 均值窗冻结计数 (500ms, 切断 cycle 正反馈) +uint16_t g_origin_freeze_tick = 0; // V4.36.26/32: 释放后 Origin 全冻结计数 (1s) +uint16_t g_origin_lowlearn_tick = 0; // V4.36.32: 冻结后降权低速补偿计数 (2s, 残余低值降权学入) uint16_t g_rel_band_cnt = 0; // V4.36.30: 低Q 环带超时兜底计数 (离开触发深度持续 2.5s → 强制释放) uint32_t g_vacuum_ema = 0; // V4.36.31: 真空 EMA 基线 (B3: 释放/触发参考与锚错 Origin 解耦) uint32_t loop1_Origin; @@ -537,6 +538,7 @@ void INIT_VD(void) g_origin_freeze_tick = 0; /* V4.36.26: 释放冻结计数清零 */ g_rel_band_cnt = 0; /* V4.36.30: 环带兜底计数清零 */ g_vacuum_ema = 0; /* V4.36.31: 真空 EMA 清零 (判稳后重建) */ + g_origin_lowlearn_tick = 0; /* V4.36.32: 降权期计数清零 */ loop1_CAP_OK = 0; loop1_CAPVD = 0; loop1_CAPVD_slow = 0; // 方案A: 释放慢滤波复位 @@ -1212,6 +1214,8 @@ void vd1_task(void) /* V4.36.26: 释放后冻结计时 — 挡释放瞬间残余学入 Origin (板缓离仍在感应边缘) */ if (g_origin_freeze_tick > 0) g_origin_freeze_tick--; + else if (g_origin_lowlearn_tick > 0) /* V4.36.32: 冻结结束 → 降权期开始递减 */ + g_origin_lowlearn_tick--; /*--- 基线跟踪(仿 TLD-110:有车时冻结) * V4.20 修复: 双向对称保护 — 负偏差(负variation)也冻结基线 @@ -1245,8 +1249,11 @@ void vd1_task(void) } /* V4.36.26: 释放后冻结期内 Origin 均值窗不更新 (切断 cycle 间正反馈) */ if (g_origin_freeze_tick == 0) { + uint16_t _win = WINDOW_ORIGIN; + if (g_origin_lowlearn_tick > 0) /* V4.36.32: 降权期放大窗(500→2500=25s) */ + _win = (uint16_t)((uint32_t)WINDOW_ORIGIN * ORIGIN_LOWLEARN_MULT); update_moving_average(&loop1_ORG_SUM, &loop1_ORG_CNT, - &loop1_Origin, loop1_CAPVD, WINDOW_ORIGIN); + &loop1_Origin, loop1_CAPVD, _win); /* V4.36.31: 真空 EMA 同步更新 (同条件同守卫; α=128 τ≈1.28s) */ if (g_vacuum_ema == 0) g_vacuum_ema = loop1_CAPVD; @@ -1508,6 +1515,7 @@ void vd1_task(void) Hold_CNT = 0; loop1_cnt_release = 0; g_origin_freeze_tick = REL_ORIGIN_FREEZE_TICKS; /* V4.36.26: 释放后 Origin 均值窗冻结 */ + g_origin_lowlearn_tick = ORIGIN_LOWLEARN_TICKS; /* V4.36.32: 冻结后降权期预置 */ } } else { if (loop1_cnt_release > 0) loop1_cnt_release = 0; @@ -1534,6 +1542,7 @@ void vd1_task(void) Hold_CNT = 0; loop1_cnt_release = 0; g_origin_freeze_tick = REL_ORIGIN_FREEZE_TICKS; + g_origin_lowlearn_tick = ORIGIN_LOWLEARN_TICKS; /* V4.36.32: 冻结后降权期预置 */ } } else { g_rel_band_cnt = 0;