From 6a0a39f8ee5cbfad71389340ae3f39f787e913bf Mon Sep 17 00:00:00 2001 From: wangfq Date: Fri, 4 Sep 2026 10:45:24 +0800 Subject: [PATCH] =?UTF-8?q?feat(V4B):=20V4.36.8=20=E2=80=94=20=E8=BF=9B?= =?UTF-8?q?=E5=85=A5/=E9=87=8A=E6=94=BE=E7=A1=AE=E8=AE=A4=E6=8C=89=20Q=20?= =?UTF-8?q?=E6=A1=A3=E5=88=86=E6=A1=A3=20(A+B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Q 分档心智沿用至判定: 低Q(高频小L)抖动大 → 确认样本加长防误判 进入确认: 高3/中4/低5 样本 (原固定3) 释放确认: 高3/中4/低5 样本 (原固定3) update_q_confirm_need() 每样本按空场 f 更新; dlt 已比例化无需分档 语法0 error, 4测试全绿; spec V2.24 / devlog V2.42 --- docs/devlog.md | 43 +++++++++++++++++++ docs/technical-spec.md | 3 +- .../at32f421_freertos_demo/inc/TaskLoop.h | 9 +++- utilities/at32f421_freertos_demo/inc/cmcng.h | 4 +- .../at32f421_freertos_demo/src/TaskLoop.c | 29 ++++++++++++- 5 files changed, 82 insertions(+), 6 deletions(-) diff --git a/docs/devlog.md b/docs/devlog.md index b2ea4a1..9ce59a2 100644 --- a/docs/devlog.md +++ b/docs/devlog.md @@ -4,6 +4,48 @@ --- +## 2026-09-03 — 进入/释放确认按 Q 档分档(固件 V4.36.8) + +> **固件版本:V4.36.8**(cmcng.h:FIRMWARE_VER="4.36.8",REV=8)。devlog 修订 V2.42。 + +### 用户拍板(Q 分档心智沿用到有/无车判定) + +V4.36.5~7 重连抑制分档效果好 → 用户提出沿用到日常判定减少误判。 +分析结论:dlt 已比例化(Origin×SensTable>>16)无需分档;真正与 Q(噪声抖动)相关的是 +**进入确认样本数** 与 **释放确认样本数**。 + +### 改动(A+B 两处) + +| Q 档 | 频率 | 进入确认(样本) | 释放确认(样本) | +|------|------|--------------|--------------| +| 高Q | f≤80k | 3 | 3(维持原响应) | +| 中Q | 80~100k | 4 | 4 | +| 低Q | f>100k | **5** | **5**(防假进入/输出抖落) | + +- 新增 `update_q_confirm_need()`:每样本按空场频率 `calc_freq_khz(Origin, LPCNT)` 更新 + `g_entry_need/g_release_need`(Origin=0 归高Q 3,不干扰上电判稳) +- 进入确认:`loop1_entry_cnt >= ENTRY_CONFIRM` → `>= g_entry_need` +- 释放确认:`loop1_cnt_release >= 3` → `>= g_release_need` +- 宏:ENTRY_CONFIRM_HI/MID/LO、REL_CONFIRM_HI/MID/LO(TaskLoop.h) + +### 权衡 + +- 低Q(高频小L):进入/释放各 +20ms(5 vs 3 样本)——判车延迟 50ms@10ms,几乎无感 +- 高Q(低频大L):行为零变化(仍 3 样本快响应) +- 真车误判面:进入抖动需持续 ≥5 样本(50ms) 压低超 dlt 才误判——低Q 空场抖动若远小于 dlt 则无感 + +### 验证 + +- 语法 0 error;4 组单测全 PASS(判定确认在主路径,无单测耦合;待板级验证) +- 前置声明修正 1 处(static 定义在使用后) + +### 待板级验证 + +1. 低Q 小线圈(46µH) 反复慢速压车/移走:进出响应正常(无漏检/无抖动),时间略长 20ms 无感 +2. 高Q 线圈(136µH) 行为与 V4.36.7 完全一致 +3. 行人/铁板边缘扫过:误判应比 3 样本版更少 +4. DBG 观察 Car_In/Car_OFF 打印节奏 + ## 2026-09-03 — 断开保持/抑制窗参数调整(固件 V4.36.7) > **固件版本:V4.36.7**(cmcng.h:FIRMWARE_VER="4.36.7",REV=7)。devlog 修订 V2.41。 @@ -1661,6 +1703,7 @@ if (dev >= dlt_ORG × 4) { | 版本 | 时间 | 说明 | |------|------|------| +| V2.42 | 2026-09-03 | V4.36.8 进入/释放确认按Q档(高3/中4/低5样本), dlt已比例化无需分档 | | V2.41 | 2026-09-03 | V4.36.7 参数: RELAY_HOLD 1s; Q抑制 高200/中300/低400ms | | V2.40 | 2026-09-03 | V4.36.6 高Q 抑制窗 0→100ms(短兜底), 分档终值 100/200/400ms | | V2.39 | 2026-09-03 | V4.36.5 重连起振抑制按Q分档(f>100k低Q 400ms/80~100k中Q 200ms/≤80k高Q 0ms), 进入确认挂起 | diff --git a/docs/technical-spec.md b/docs/technical-spec.md index a2cbaaf..fe2d36e 100644 --- a/docs/technical-spec.md +++ b/docs/technical-spec.md @@ -1,6 +1,6 @@ # DLD154V4B 技术规格书 -> 单路线圈车辆检测器 | 固件版本: V4.36.7 | 文档版本: V2.23 +> 单路线圈车辆检测器 | 固件版本: V4.36.8 | 文档版本: V2.24 > 本文档面向工程开发、系统集成及故障深度分析 --- @@ -789,3 +789,4 @@ DLD154V4B V1.4 起实现该专利的整数化版本,用于大车通行时的 | V2.21 | 2026-09-03 | **V4.36.5 重连起振抑制按 Q 分档**:低Q(高频小L 46~50µH)起振慢前几窗偏差大→假有车跳输出;按空场频率 f 分档抑制——f>100k 低Q 400ms / 80~100k 中Q 200ms / ≤80k 高Q 0ms(136/210µH 实测无需);抑制期仅挂起进入确认累计 | | V2.22 | 2026-09-03 | **V4.36.6 高Q 档抑制窗 0→100ms**:高Q(≤80kHz 大L) 增加 100ms 短兜底窗(覆盖起振/插头瞬态),分档完整为 高Q 100ms/中Q 200ms/低Q 400ms | | V2.23 | 2026-09-03 | **V4.36.7 参数调整**:RELAY_HOLD_MS 500→**1000**(有车断开继电器保持);抑制窗 高Q 100→**200** / 中Q 200→**300** / 低Q 400 不变 → 分档 200/300/400ms | +| V2.24 | 2026-09-03 | **V4.36.8 Q 档判定参数**:进入确认 ENTRY_CONFIRM 按 Q 档(高3/中4/低5 样本)+ 释放确认同表分档——低Q 抖动大防假进入/输出抖落;dlt 已比例化无需分档;update_q_confirm_need 每样本按空场 f 更新 | diff --git a/utilities/at32f421_freertos_demo/inc/TaskLoop.h b/utilities/at32f421_freertos_demo/inc/TaskLoop.h index 75cc13d..084c4d4 100644 --- a/utilities/at32f421_freertos_demo/inc/TaskLoop.h +++ b/utilities/at32f421_freertos_demo/inc/TaskLoop.h @@ -43,7 +43,14 @@ // 历史: V4.05 曾用 ReleaseTable_B 加深释放表(实验失败, 方向反) // V4.06 改为 SENS=3 进入21→25+释放14→12, 等比推全档 #define MAX_SLOPE_RATE 5 // 斜率限幅: 单次最大变化 5% (物理限制, 拒绝 EMI 尖峰) -#define ENTRY_CONFIRM 3 // 进入确认: 连续 N 次低于阈值才判定有车 +/* V4.36.8: 进入/释放确认样本数 — 按线圈 Q 档 (Q∝1/f 代理, 低Q抖动大需更多样本防误判) */ +#define ENTRY_CONFIRM 3 // 进入确认基准(高Q): 连续 N 次低于阈值才判定有车 +#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_CONFIRM_HI 3 // 高Q 释放确认样本 +#define REL_CONFIRM_MID 4 // 中Q +#define REL_CONFIRM_LO 5 // 低Q: 释放边界抖动, 多样本防输出抖落 #define FREEZE_TIMEOUT 1000 // 基线冻结超时: ~10s @ 10ms/tick, 持续偏高且稳定后强制更新基线 #define FREEZE_STABILITY_RATE 2 // 冻结稳定性窗口: 参考值的 ±2% (CAPVD 需在此范围内才累计超时) #define ENV_WARN_WAIT 200 // 环境预判 (V4.31): dev>+4dlt 高位连续 ~2s → 黄灯预判锁存(回摆保持) diff --git a/utilities/at32f421_freertos_demo/inc/cmcng.h b/utilities/at32f421_freertos_demo/inc/cmcng.h index c6d6f4d..3201eb0 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.7" // ..޶ (2026-09-03 : СĶֻ REV; MAIN/SUB ɲƷ) +#define FIRMWARE_VER "4.36.8" // ..޶ (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 7 +#define FIRMWARE_VER_REV 8 #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 f164844..90db9ad 100644 --- a/utilities/at32f421_freertos_demo/src/TaskLoop.c +++ b/utilities/at32f421_freertos_demo/src/TaskLoop.c @@ -160,6 +160,8 @@ uint16_t g_reconn_cnt = 0; // V4.36.2: 载波连续恢复计数 (确 uint16_t g_relay_hold_cnt = 0; // V4.36.3: 有车断开继电器保持计时(ms, ISR 5ms 累加) uint8_t g_relay_hold_done = 0; // V4.36.3: 本次有车断开已兜底释放(防重复OFF) uint16_t g_reconn_blank_ms = 0; // V4.36.5: 重连起振抑制倒计时(ms, 按Q分档, vd1_task 每样本-10) +uint8_t g_entry_need = 3; // V4.36.8: 进入确认样本数 (按Q档, 高3/中4/低5) +uint8_t g_release_need = 3; // V4.36.8: 释放确认样本数 (按Q档, 高3/中4/低5) 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) @@ -912,6 +914,8 @@ static void coil_monitor(void) * 2. 无车时:基线跟踪 + 进入检测 * 3. 有车时:离开检测(带滞回) *===========================================================================*/ +static void update_q_confirm_need(void); // V4.36.8 前置声明 (定义在 loop_task 上方) + void vd1_task(void) { #define STABLE_SAMPLES 128 // 稳定期最少样本数 (128×10ms≈1.3s) @@ -975,6 +979,9 @@ void vd1_task(void) else g_reconn_blank_ms = 0; } + /* V4.36.8: 进入/释放确认样本数按 Q 档更新 (每样本; Origin=0 时归高Q 3) */ + update_q_confirm_need(); + /*--- 2. 稳定期:绕过 IIR 和斜率限幅,小窗口快速收敛; * 基准值稳定(连续窗口 Origin 漂移达标)后才结束自检 ---*/ if (!g_loop_stable) { @@ -1167,7 +1174,7 @@ void vd1_task(void) calc_freq_khz(loop1_CAPVD, loop1_LPCNT), loop1_LPCNT, loop1_Xn); } loop1_entry_cnt++; - if (loop1_entry_cnt >= ENTRY_CONFIRM) { + if (loop1_entry_cnt >= g_entry_need) { // V4.36.8: 按Q档 (高3/中4/低5) PRINT("Car_In, Value:%d, CAPVD:%d, Origin:%d, dlt:%d\\n", loop1_Value, loop1_CAPVD, loop1_Origin, loop1_dlt_ORG); @@ -1294,7 +1301,7 @@ void vd1_task(void) calc_freq_khz(loop1_CAPVD, loop1_LPCNT), loop1_LPCNT, loop1_Xn); } loop1_cnt_release++; - if (loop1_cnt_release >= 3) { + if (loop1_cnt_release >= g_release_need) { // V4.36.8: 按Q档 (高3/中4/低5) PRINT("Car_OFF, Value:%d CAPVD:%d Origin:%d dlt:%d\n", loop1_Value, loop1_CAPVD, loop1_Origin, loop1_dlt_ORG); loop1_VD_FLAG = 0; @@ -1316,6 +1323,24 @@ void vd1_task(void) /*=========================================================================== * loop_task_function — FreeRTOS 主任务(对齐 M1H main 循环) *===========================================================================*/ +/* V4.36.8: 按 Q 档(空场频率代理)更新进入/释放确认样本数 — 每样本调用一次 + * 低Q(高频小L): 测量抖动大 → 多样本防假进入/输出抖落 + * 高Q(低频大L): 信号稳 → 维持快响应 (3 样本) */ +static void update_q_confirm_need(void) +{ + uint32_t _f = calc_freq_khz(loop1_Origin, loop1_LPCNT); + if (_f > RECONNECT_Q_MID_F_KHZ) { /* 低Q f>100k */ + g_entry_need = ENTRY_CONFIRM_LO; + g_release_need = REL_CONFIRM_LO; + } else if (_f > RECONNECT_Q_HI_F_KHZ) { /* 中Q 80~100k */ + g_entry_need = ENTRY_CONFIRM_MID; + g_release_need = REL_CONFIRM_MID; + } else { /* 高Q f<=80k (含 Origin=0 f=0) */ + g_entry_need = ENTRY_CONFIRM_HI; + g_release_need = REL_CONFIRM_HI; + } +} + #define RECONNECT_CONFIRM_TICKS 10 /* V4.36.2: 重连确认窗 10×10ms=100ms * 载波连续恢复满窗才确认重连重置; * 抖动断开↔恢复每掉线取消重新计 */