From 55ac432c698c71750e58cb109776c46be74a30d6 Mon Sep 17 00:00:00 2001 From: wangfq Date: Fri, 4 Sep 2026 09:43:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(V4B):=20V4.36.4=20=E2=80=94=20=E7=BB=BF?= =?UTF-8?q?=E7=81=AF=3DRLY1=20=E7=BB=A7=E7=94=B5=E5=99=A8=E5=AE=9E?= =?UTF-8?q?=E9=99=85=E8=BE=93=E5=87=BA=E7=8A=B6=E6=80=81=E6=8C=87=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 现场误判根因: 断开时 poll_green_led 强制绿灯灭, 而 V4.36.3 保持 逻辑下继电器仍吸合 → 灯/继电器脱节 → 误判继电器释放 改动: 稳定后绿灯镜像 RLY1_GPIO->odt (吸合亮/释放灭), 删断开 强制灭分支 → 有车断开保持期绿灯亮(与继电器一致); 自检期慢闪不变 语法0 error, 4测试全绿; spec V2.20 / manual 灯表 / devlog V2.38 --- docs/devlog.md | 37 +++++++++++++++++++ docs/product-manual.md | 6 ++- docs/technical-spec.md | 3 +- utilities/at32f421_freertos_demo/inc/cmcng.h | 4 +- .../at32f421_freertos_demo/src/TaskLoop.c | 30 +++++++-------- 5 files changed, 60 insertions(+), 20 deletions(-) diff --git a/docs/devlog.md b/docs/devlog.md index 81f1bac..4befd5a 100644 --- a/docs/devlog.md +++ b/docs/devlog.md @@ -4,6 +4,42 @@ --- +## 2026-09-03 — 绿灯=继电器状态指示(固件 V4.36.4) + +> **固件版本:V4.36.4**(cmcng.h:FIRMWARE_VER="4.36.4",REV=4)。devlog 修订 V2.38。 + +### 现场误判(用户报告) + +车压线圈拔线测试:**继电器实际未释放**(V4.36.3 保持逻辑工作正常),但**绿灯灭了**—— +原 poll_green_led 在 `g_disconnect_active` 时强制绿灯灭(黄灯快闪负责故障指示), +而继电器在有车断开时保持吸合 → 灯(灭)与继电器(吸)脱节 → 误判"继电器立刻释放"。 + +### 改动 + +**绿灯语义改为 = RLY1 继电器实际输出状态**(稳定后): +- 读 `RLY1_GPIO->odt & RLY1_PIN`(与 RLY1_ON/OFF 宏同源 = 真实驱动状态) +- 吸合(高) → 绿灯亮(PA9 低电平点亮);释放 → 绿灯灭 +- **删除 `g_disconnect_active` 强制灭分支** → 断开时绿灯跟随继电器: + - 有车断开保持(RELAY_HOLD_MS)期间 → 绿灯保持亮(与继电器一致) + - 断开超时释放/无车断开 → 绿灯灭 +- 自检/判稳期(INI_LOOP/!power_up/!stable)保持 200ms 慢闪(就绪过程指示,该阶段继电器未驱动) + +### 输出覆盖(模式自适应) + +- 存在模式:有车/离开延时输出 → RLY1 吸合 → 绿灯亮;无车 → 灭 +- 脉冲模式:进出脉冲输出中 → 绿灯短亮;平时灭(真实输出指示) + +### 验证 + +- 语法 0 error;4 组单测全 PASS(绿灯为 poll 层,无单测耦合;待板级验证) + +### 待板级验证 + +1. 车压线圈拔线:绿灯保持亮 500ms(与继电器同步)→ 超时释放后灭 +2. 车压快速拔插(<500ms):绿灯不掉,车走继电器释放 → 绿灯灭 +3. 上电判稳期:绿灯慢闪 → 稳定后灭(无车)/ 有车亮 +4. 脉冲模式:进出车时绿灯短亮脉冲 + ## 2026-09-03 — 有车断开继电器保持 500ms(固件 V4.36.3) > **固件版本:V4.36.3**(cmcng.h:FIRMWARE_VER="4.36.3",REV=3)。devlog 修订 V2.37。 @@ -1554,6 +1590,7 @@ if (dev >= dlt_ORG × 4) { | 版本 | 时间 | 说明 | |------|------|------| +| V2.38 | 2026-09-03 | V4.36.4 绿灯=RLY1 继电器实际输出状态(吸合亮/释放灭), 删断开强制灭分支; 自检期慢闪不变 | | V2.37 | 2026-09-03 | V4.36.3 有车断开继电器保持 RELAY_HOLD_MS=500ms(ISR计时/宏可调); 无车断开立即释放不变 | | V2.36 | 2026-09-03 | V4.36.2 线圈重连确认窗 100ms(防抖动重复计数/首样本毛刺); 断开判定不加防抖 | | V2.35 | 2026-09-03 | 版本体系增加修订号: 4.36.1 (MAIN/SUB 产品定, 小改只增 REV); 启动打印 fw 行 | diff --git a/docs/product-manual.md b/docs/product-manual.md index b874965..a379b68 100644 --- a/docs/product-manual.md +++ b/docs/product-manual.md @@ -169,8 +169,10 @@ DLD154V4B 是一款基于 ARM Cortex-M4 微控制器的**单通道环形线圈 | 状态 | 红灯 (PB1) | 绿灯 (LEDA/PA9) | 黄灯 (LEDC/PA10) | |------|-----------|-----------------|-------------------| | 上电自检中 | 呼吸 | **慢闪** (200ms),基准值稳定后停止 (约2~5s) | 快闪 (200ms) | -| 正常运行,无车 | 呼吸 | 灭 | 灭 | -| 正常运行,有车 | 呼吸 | **亮** | 灭 | +| 正常运行,无车(继电器释放) | 呼吸 | 灭 | 灭 | +| 正常运行,有车(继电器吸合) | 呼吸 | **亮**(=RLY1 状态) | 灭 | +| 线圈断开,断开前有车(继电器保持 500ms) | 呼吸 | **亮**(继电器未释放) | 快闪 | +| 线圈断开,继电器已释放/无车断开 | 呼吸 | 灭 | 快闪 | ### 5.2 故障状态 diff --git a/docs/technical-spec.md b/docs/technical-spec.md index 4cf768b..aa296bc 100644 --- a/docs/technical-spec.md +++ b/docs/technical-spec.md @@ -1,6 +1,6 @@ # DLD154V4B 技术规格书 -> 单路线圈车辆检测器 | 固件版本: V4.36.3 | 文档版本: V2.19 +> 单路线圈车辆检测器 | 固件版本: V4.36.4 | 文档版本: V2.20 > 本文档面向工程开发、系统集成及故障深度分析 --- @@ -785,3 +785,4 @@ DLD154V4B V1.4 起实现该专利的整数化版本,用于大车通行时的 | V2.17 | 2026-09-03 | 固件版本体系增加修订号:**V4.36.1**(MAIN/SUB 由产品定,小改动只增 REV);启动日志打印 fw 行 | | V2.18 | 2026-09-03 | **V4.36.2 重连确认窗**:载波连续恢复 ~100ms 才确认重连重置(防接触抖动重复计数/首样本毛刺);断开判定不加防抖(释放速度安全刚需) | | V2.19 | 2026-09-03 | **V4.36.3 有车断开继电器保持 RELAY_HOLD_MS=500ms**:断开前 VD_FLAG=1 → RLY 保持不释放;500ms 内重连+有车 → 无缝续持;重连+无车 → vd1_task 判离释放;超时仍断 → 强制释放(宏可调) | +| V2.20 | 2026-09-03 | **V4.36.4 绿灯=继电器状态指示**:稳定后绿灯镜像 RLY1(PA6) 实际输出——吸合亮/释放灭;删除断开时绿灯强制灭分支(与保持逻辑一致,消除"拔线绿灯灭=误判继电器释放");自检/判稳期仍 200ms 慢闪 | diff --git a/utilities/at32f421_freertos_demo/inc/cmcng.h b/utilities/at32f421_freertos_demo/inc/cmcng.h index a3157f8..a086e18 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.3" // ..޶ (2026-09-03 : СĶֻ REV; MAIN/SUB ɲƷ) +#define FIRMWARE_VER "4.36.4" // ..޶ (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 3 +#define FIRMWARE_VER_REV 4 #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 53fcc58..134e189 100644 --- a/utilities/at32f421_freertos_demo/src/TaskLoop.c +++ b/utilities/at32f421_freertos_demo/src/TaskLoop.c @@ -274,9 +274,13 @@ void LEDA_ON_OFF(void) * * 模式: * 自检/稳定中 (loop1_INI_LOOP || 线圈未连 || !g_loop_stable): - * → 慢闪 (200ms 亮 / 200ms 灭) - * 正常工作: - * → 有车亮 (VD_FLAG==1), 无车灭 + * → 慢闪 (200ms 亮 / 200ms 灭) — 就绪过程指示, 此阶段继电器未驱动 + * 稳定后 (V4.36.4): + * → 绿灯 = RLY1 继电器实际输出状态 (镜像 PA6 odt): + * 吸合(PA6 高) → 绿灯亮; 释放(PA6 低) → 绿灯灭 + * - 有车/离开延时(存在模式) → 亮; 脉冲输出中 → 短亮 + * - 有车断开保持(RELAY_HOLD_MS)期间 → 保持亮 (与继电器一致) + * - 断开超时释放/无车 → 灭 *===========================================================================*/ void poll_green_led(void) { @@ -284,14 +288,7 @@ void poll_green_led(void) static uint16_t _slow_tick = 0; - /*--- 线圈断开中 → 灭(黄灯快闪负责故障指示) ---*/ - if (g_disconnect_active) { - LEDA_OFF; - _slow_tick = 0; - return; - } - - /*--- 自检阶段:慢闪 ---*/ + /*--- 自检阶段:慢闪(就绪过程指示;此阶段继电器未驱动) ---*/ if (loop1_INI_LOOP || !g_loop_power_up_state || !g_loop_stable) { _slow_tick++; if (_slow_tick >= GREEN_SLOW_HALF) { @@ -301,12 +298,15 @@ void poll_green_led(void) return; } - /*--- 正常工作:车辆存在指示 ---*/ + /*--- 稳定后: 绿灯 = RLY1 继电器实际输出状态 (V4.36.4) --- + * 读 RLY1_GPIO->odt (与 RLY1_ON/OFF 宏同源, 即真实驱动状态): + * 吸合(高) → 绿灯亮; 释放(低) → 绿灯灭 + * 断开时无强制灭分支 → 与继电器保持逻辑一致 (防误判"继电器释放") */ _slow_tick = 0; - if (loop1_VD_FLAG) - LEDA_ON; + if (RLY1_GPIO->odt & RLY1_PIN) + LEDA_ON; // 继电器吸合 → 绿灯亮 (PA9 低电平点亮) else - LEDA_OFF; + LEDA_OFF; // 继电器释放 → 绿灯灭 } /*===========================================================================