feat(V4B): V4.36.3 — 有车断开继电器保持 RELAY_HOLD_MS=500ms
断开前 VD_FLAG=1(有车) → RLY 保持不释放: 500ms 内重连+有车→无缝续持, 重连+无车→vd1_task 判离释放, 超时仍断→强制释放(hold_done 防抖); 无车断开立即释放不变. ISR 5ms 计时, 宏可调(RELAY_HOLD_MS) 审查修复: done 后不加 !hold_done 会 100Hz 继电器抖动 语法0 error, 4测试全绿; spec V2.19 / manual 断开行 / devlog V2.37
This commit is contained in:
@@ -4,6 +4,46 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 2026-09-03 — 有车断开继电器保持 500ms(固件 V4.36.3)
|
||||||
|
|
||||||
|
> **固件版本:V4.36.3**(cmcng.h:FIRMWARE_VER="4.36.3",REV=3)。devlog 修订 V2.37。
|
||||||
|
|
||||||
|
### 拍板机制(2026-09-03)
|
||||||
|
|
||||||
|
线圈断开前**感应有车且继电器输出中**时,断开后**不立即释放**,改为保持 RELAY_HOLD_MS:
|
||||||
|
- **500ms 内重连 + 感应有车** → 继电器继续有车输出(无缝,从未掉电)
|
||||||
|
- **500ms 内重连 + 感应无车** → 继电器释放(vd1_task 正常离开判定,几十~数百 ms)
|
||||||
|
- **500ms 超时仍断开** → 继电器强制释放(防真故障无限保持)
|
||||||
|
- 无车断开(VD_FLAG=0)→ 立即释放(原行为,安全刚需)
|
||||||
|
|
||||||
|
**宏可调**:`RELAY_HOLD_MS`(TaskLoop.c 前部宏区,ISR 使用)
|
||||||
|
|
||||||
|
### 实现要点
|
||||||
|
|
||||||
|
- 保持计时在 **TMR15 ISR(5ms tick)**:`!LOOP_OK && VD_FLAG && power_up && !hold_done` → RLY1/2 保持 ON + cnt+=5,满 500ms 强制 OFF + hold_done=1(防重复抖动)
|
||||||
|
- loop_task 断开分支:有车断开(VD_FLAG && power_up)不立即 OFF(释放交给 ISR 兜底),无车断开照旧立即 OFF
|
||||||
|
- 重连确认重置(V4.36.2 100ms 窗)后清 cnt/done
|
||||||
|
- **审查修复**:超时释放后若不查 hold_done,每 5ms 会先 ON 再 OFF → 100Hz 继电器抖动 → 已加 `!g_relay_hold_done` 防护
|
||||||
|
|
||||||
|
### 行为时序
|
||||||
|
|
||||||
|
```
|
||||||
|
[运行 有车 VD=1 RLY ON] ──断开──▶ RLY 保持 ON (黄灯快闪照常)
|
||||||
|
├─ <500ms 重连 → 100ms 确认窗 → vd1_task: 有车→续持 / 无车→释放
|
||||||
|
└─ ≥500ms 仍断 → RLY 强制释放 (hold_done=1)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 验证
|
||||||
|
|
||||||
|
- 语法 0 error;4 组单测全 PASS(保持逻辑在 ISR/主循环,无单测耦合;待板级验证)
|
||||||
|
|
||||||
|
### 待板级验证
|
||||||
|
|
||||||
|
1. 车压线圈时拔线:继电器保持 500ms → 仍断则释放(黄灯快闪全程)
|
||||||
|
2. 车压线圈时快速拔插(<500ms):继电器不掉 → 车走正常释放
|
||||||
|
3. 无车断线:继电器立即释放(无变化)
|
||||||
|
4. RELAY_HOLD_MS 改 100/1000 复测节奏
|
||||||
|
|
||||||
## 2026-09-03 — 线圈重连确认窗 100ms(固件 V4.36.2)
|
## 2026-09-03 — 线圈重连确认窗 100ms(固件 V4.36.2)
|
||||||
|
|
||||||
> **固件版本:V4.36.2**(cmcng.h:FIRMWARE_VER="4.36.2",REV=2)。devlog 修订 V2.36。
|
> **固件版本:V4.36.2**(cmcng.h:FIRMWARE_VER="4.36.2",REV=2)。devlog 修订 V2.36。
|
||||||
@@ -1514,6 +1554,7 @@ if (dev >= dlt_ORG × 4) {
|
|||||||
|
|
||||||
| 版本 | 时间 | 说明 |
|
| 版本 | 时间 | 说明 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
|
| V2.37 | 2026-09-03 | V4.36.3 有车断开继电器保持 RELAY_HOLD_MS=500ms(ISR计时/宏可调); 无车断开立即释放不变 |
|
||||||
| V2.36 | 2026-09-03 | V4.36.2 线圈重连确认窗 100ms(防抖动重复计数/首样本毛刺); 断开判定不加防抖 |
|
| V2.36 | 2026-09-03 | V4.36.2 线圈重连确认窗 100ms(防抖动重复计数/首样本毛刺); 断开判定不加防抖 |
|
||||||
| V2.35 | 2026-09-03 | 版本体系增加修订号: 4.36.1 (MAIN/SUB 产品定, 小改只增 REV); 启动打印 fw 行 |
|
| V2.35 | 2026-09-03 | 版本体系增加修订号: 4.36.1 (MAIN/SUB 产品定, 小改只增 REV); 启动打印 fw 行 |
|
||||||
| V2.34 | 2026-09-03 | V4.36 频率窗上限: 108→115kHz(43nF板≈44µH, 放行~48µH小线圈) |
|
| V2.34 | 2026-09-03 | V4.36 频率窗上限: 108→115kHz(43nF板≈44µH, 放行~48µH小线圈) |
|
||||||
|
|||||||
@@ -176,7 +176,7 @@ DLD154V4B 是一款基于 ARM Cortex-M4 微控制器的**单通道环形线圈
|
|||||||
|
|
||||||
| 故障类型 | 红灯 | 绿灯 | 黄灯 | 说明 |
|
| 故障类型 | 红灯 | 绿灯 | 黄灯 | 说明 |
|
||||||
|---------|------|------|------|------|
|
|---------|------|------|------|------|
|
||||||
| 线圈断开(当前) | 呼吸 | 灭 | **快闪** (200ms) | 检查线圈连接 |
|
| 线圈断开(当前) | 呼吸 | 灭 | **快闪** (200ms) | 检查线圈连接。**断开前有车:继电器保持 RELAY_HOLD_MS=500ms 后仍断才释放**(防瞬时断开误释放,宏可调) |
|
||||||
| 线圈电感量不合理(V4.26/V4.33) | 呼吸 | 灭(无车) | **一长一短** (300ms亮/100ms灭/100ms亮/700ms灭 循环) | 空场频率出 20~115kHz(默认低频档):L偏大(f<20k)/L偏小(f>115k),检查线圈匝数/尺寸 |
|
| 线圈电感量不合理(V4.26/V4.33) | 呼吸 | 灭(无车) | **一长一短** (300ms亮/100ms灭/100ms亮/700ms灭 循环) | 空场频率出 20~115kHz(默认低频档):L偏大(f<20k)/L偏小(f>115k),检查线圈匝数/尺寸 |
|
||||||
| 线圈重连,断开 1 次 | 呼吸 | 正常 | **1 短闪** + 1.2s 灭 | 发生过 1 次断开,已恢复 |
|
| 线圈重连,断开 1 次 | 呼吸 | 正常 | **1 短闪** + 1.2s 灭 | 发生过 1 次断开,已恢复 |
|
||||||
| 线圈重连,断开 2 次 | 呼吸 | 正常 | **2 短闪** + 1.2s 灭 | 发生过 2 次断开,已恢复 |
|
| 线圈重连,断开 2 次 | 呼吸 | 正常 | **2 短闪** + 1.2s 灭 | 发生过 2 次断开,已恢复 |
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# DLD154V4B 技术规格书
|
# DLD154V4B 技术规格书
|
||||||
|
|
||||||
> 单路线圈车辆检测器 | 固件版本: V4.36.2 | 文档版本: V2.18
|
> 单路线圈车辆检测器 | 固件版本: V4.36.3 | 文档版本: V2.19
|
||||||
> 本文档面向工程开发、系统集成及故障深度分析
|
> 本文档面向工程开发、系统集成及故障深度分析
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -784,3 +784,4 @@ DLD154V4B V1.4 起实现该专利的整数化版本,用于大车通行时的
|
|||||||
| V2.16 | 2026-09-03 | 文档同步(V4.30~36 参数全面对齐):黄灯行为表模式 5 一长一短 300/100/100/700ms、模式 4 常亮 2s/7s/2s、COIL_F_OK_MAX_KHZ 115、故障表 f>115k |
|
| V2.16 | 2026-09-03 | 文档同步(V4.30~36 参数全面对齐):黄灯行为表模式 5 一长一短 300/100/100/700ms、模式 4 常亮 2s/7s/2s、COIL_F_OK_MAX_KHZ 115、故障表 f>115k |
|
||||||
| V2.17 | 2026-09-03 | 固件版本体系增加修订号:**V4.36.1**(MAIN/SUB 由产品定,小改动只增 REV);启动日志打印 fw 行 |
|
| V2.17 | 2026-09-03 | 固件版本体系增加修订号:**V4.36.1**(MAIN/SUB 由产品定,小改动只增 REV);启动日志打印 fw 行 |
|
||||||
| V2.18 | 2026-09-03 | **V4.36.2 重连确认窗**:载波连续恢复 ~100ms 才确认重连重置(防接触抖动重复计数/首样本毛刺);断开判定不加防抖(释放速度安全刚需) |
|
| 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 判离释放;超时仍断 → 强制释放(宏可调) |
|
||||||
|
|||||||
@@ -14,11 +14,11 @@
|
|||||||
#define __CMCNG_H__
|
#define __CMCNG_H__
|
||||||
|
|
||||||
#define PRODUCT_MODEL "DLD154"
|
#define PRODUCT_MODEL "DLD154"
|
||||||
#define FIRMWARE_VER "4.36.2" // 主.子.修订 (2026-09-03 起: 小改动只增 REV; MAIN/SUB 由产品定)
|
#define FIRMWARE_VER "4.36.3" // 主.子.修订 (2026-09-03 起: 小改动只增 REV; MAIN/SUB 由产品定)
|
||||||
#define HARDWARE_VER "3.00"
|
#define HARDWARE_VER "3.00"
|
||||||
#define FIRMWARE_VER_MAIN 4
|
#define FIRMWARE_VER_MAIN 4
|
||||||
#define FIRMWARE_VER_SUB 36
|
#define FIRMWARE_VER_SUB 36
|
||||||
#define FIRMWARE_VER_REV 2
|
#define FIRMWARE_VER_REV 3
|
||||||
#define HARDWARE_VER_MAIN 3
|
#define HARDWARE_VER_MAIN 3
|
||||||
#define HARDWARE_VER_SUB 0
|
#define HARDWARE_VER_SUB 0
|
||||||
|
|
||||||
|
|||||||
@@ -54,6 +54,14 @@ uint8_t loop1_entry_cnt;
|
|||||||
uint16_t loop1_freeze_cnt;
|
uint16_t loop1_freeze_cnt;
|
||||||
uint32_t loop1_freeze_ref;
|
uint32_t loop1_freeze_ref;
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
* 断开保持/重连参数 (ISR 5ms tick 使用, 须定义于 TMR15 ISR 之前)
|
||||||
|
*===========================================================================*/
|
||||||
|
#define RELAY_HOLD_MS 500 /* V4.36.3: 有车断开继电器保持超时(可调宏, ms)
|
||||||
|
* 断开前感应有车且继电器输出中 → 不断开而保持,
|
||||||
|
* 超时仍断开才释放(防瞬时断开误释放/防砸);
|
||||||
|
* 保持期内重连且有车 → 输出无缝续持 */
|
||||||
|
|
||||||
/*===========================================================================
|
/*===========================================================================
|
||||||
* 全局状态变量 — 标志位
|
* 全局状态变量 — 标志位
|
||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
@@ -139,6 +147,8 @@ uint8_t g_disconnect_count = 0;
|
|||||||
uint8_t g_disconnect_active = 0;
|
uint8_t g_disconnect_active = 0;
|
||||||
uint8_t g_reconn_candidate = 0; // V4.36.2: 重连确认窗候选(载波上升沿进入)
|
uint8_t g_reconn_candidate = 0; // V4.36.2: 重连确认窗候选(载波上升沿进入)
|
||||||
uint16_t g_reconn_cnt = 0; // V4.36.2: 载波连续恢复计数 (确认窗 ~100ms)
|
uint16_t g_reconn_cnt = 0; // V4.36.2: 载波连续恢复计数 (确认窗 ~100ms)
|
||||||
|
uint16_t g_relay_hold_cnt = 0; // V4.36.3: 有车断开继电器保持计时(ms, ISR 5ms 累加)
|
||||||
|
uint8_t g_relay_hold_done = 0; // V4.36.3: 本次有车断开已兜底释放(防重复OFF)
|
||||||
uint8_t g_fault_phase = 0;
|
uint8_t g_fault_phase = 0;
|
||||||
uint16_t g_fault_tick = 0;
|
uint16_t g_fault_tick = 0;
|
||||||
uint8_t g_coil_fault = 0; // V4.26: 线圈电感量异常 0=正常 1=L偏大(f<20kHz) 2=L偏小(f>120kHz)
|
uint8_t g_coil_fault = 0; // V4.26: 线圈电感量异常 0=正常 1=L偏大(f<20kHz) 2=L偏小(f>120kHz)
|
||||||
@@ -744,6 +754,25 @@ void TMR15_GLOBAL_IRQHandler(void)
|
|||||||
loop1_LOOP_OK = 0;
|
loop1_LOOP_OK = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*--- V4.36.3: 有车断开 → 继电器保持 (5ms tick, 500ms 兜底释放) ---
|
||||||
|
* 断开前感应有车(VD_FLAG)且已上电 → RLY 不断开, 保持输出:
|
||||||
|
* - 500ms 内重连(经 100ms 确认窗) + vd1_task 判有车 → 输出无缝续持
|
||||||
|
* - 500ms 内重连 + 判无车 → vd1_task 正常离开释放
|
||||||
|
* - 超时仍断开 → 强制释放(防真故障无限保持)
|
||||||
|
* 无车断开(VD_FLAG=0)不受影响, 仍立即释放 */
|
||||||
|
if (!loop1_LOOP_OK && loop1_VD_FLAG && g_loop_power_up_state && !g_relay_hold_done) {
|
||||||
|
RLY1_ON; /* 保持: 防止瞬时断开继电器抖落 */
|
||||||
|
RLY2_ON;
|
||||||
|
g_relay_hold_cnt += 5;
|
||||||
|
if (g_relay_hold_cnt >= RELAY_HOLD_MS) {
|
||||||
|
RLY1_OFF; /* 兜底: 超时仍断开 → 释放 */
|
||||||
|
RLY2_OFF;
|
||||||
|
g_relay_hold_done = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
g_relay_hold_cnt = 0; /* 载波正常或非有车态 → 不保持 */
|
||||||
|
}
|
||||||
|
|
||||||
/*--- 硬件驱动:呼吸灯 + 指示灯 ---*/
|
/*--- 硬件驱动:呼吸灯 + 指示灯 ---*/
|
||||||
poll_red_pwm();
|
poll_red_pwm();
|
||||||
poll_green_led();
|
poll_green_led();
|
||||||
@@ -1282,6 +1311,8 @@ void loop_task_function(void *pvParameters)
|
|||||||
loop1_CAPVD = 0; // 强制 IIR 从首个有效值重新收敛
|
loop1_CAPVD = 0; // 强制 IIR 从首个有效值重新收敛
|
||||||
loop1_CAPVD_slow = 0; // 方案A: 释放慢滤波同步收敛
|
loop1_CAPVD_slow = 0; // 方案A: 释放慢滤波同步收敛
|
||||||
g_env_wait_cnt = 0; // V4.24: 断开重连后环境学习状态复位
|
g_env_wait_cnt = 0; // V4.24: 断开重连后环境学习状态复位
|
||||||
|
g_relay_hold_cnt = 0; // V4.36.3: 保持计时复位
|
||||||
|
g_relay_hold_done = 0;
|
||||||
env_resync_abort();
|
env_resync_abort();
|
||||||
PRINT("EVT|loop_reconnect confirmed %dms\n",
|
PRINT("EVT|loop_reconnect confirmed %dms\n",
|
||||||
RECONNECT_CONFIRM_TICKS * 10);
|
RECONNECT_CONFIRM_TICKS * 10);
|
||||||
@@ -1308,9 +1339,13 @@ void loop_task_function(void *pvParameters)
|
|||||||
/* V4.36.2: 掉线即取消重连候选 (抖动免疫: 每次掉线重新计确认窗) */
|
/* V4.36.2: 掉线即取消重连候选 (抖动免疫: 每次掉线重新计确认窗) */
|
||||||
g_reconn_candidate = 0;
|
g_reconn_candidate = 0;
|
||||||
g_reconn_cnt = 0;
|
g_reconn_cnt = 0;
|
||||||
/* 注意: 不清除 loop1_VD_FLAG,保留断开前的检测状态 */
|
/* V4.36.3: 有车断开 → 继电器保持(ISR 计时, RELAY_HOLD_MS 兜底释放);
|
||||||
|
* 无车断开 → 立即释放 (原行为) */
|
||||||
|
if (!(loop1_VD_FLAG && g_loop_power_up_state)) {
|
||||||
RLY1_OFF;
|
RLY1_OFF;
|
||||||
RLY2_OFF;
|
RLY2_OFF;
|
||||||
|
}
|
||||||
|
/* 注意: 不清除 loop1_VD_FLAG,保留断开前的检测状态 */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 断开计数规则:
|
* 断开计数规则:
|
||||||
|
|||||||
Reference in New Issue
Block a user