feat(V4B): V4.36.44 — 铁板负偏差误释放防护(P1) + 有车最小保持定档 100ms

现场 154log260911d(22µH 铁板): 进入后 CAPVD 被磁导率抬到 dev +201/+198,
两次在 dev=+33/+96(≈2×进表dlt, 落在既有 ±4×dlt 正常跟踪窗内) 误判"离开" ⇒ 继电器掉。
修复: 有车期间 dev > +1×进表dlt ⇒ 冻结离开判定(含 band_timeout); 持续 5s ⇒ 重锚基线后放行(防锁死)。
同时 REL_MIN_HOLD_TICKS 30→10(100ms, 现场验证后正式化)。
单测场景8: 误释放 @1.04s → 冻结后 @6.04s, 正常撤板不受影响; 全套 8/8 全绿。

- P1: g_neg_rel_hold_cnt + REL_NEG_VAR_HOLD_TICKS=500; 门控普通释放与 band_timeout;
      Car_In/Car_Off 双向清零; 新增 EVT|neg_rel_hold / EVT|neg_rel_reanchor
- 边界: 真断开仍走 RELAY_HOLD_MS=1000; dev>=+4×dlt 强负 variation 仍归 V4.24 两段式环境逻辑
- 文档: devlog V2.81(+条目) / spec 头 V2.63 / manual 表 V2.20 / cmcng.h 4.36.43→4.36.44 REV 44
- 归档: docs/patches/v4.36.44-P1-negvar-hold-and-minhold-100ms.diff
This commit is contained in:
wangfq
2026-09-11 17:53:15 +08:00
parent 6c82bf61b8
commit d5e6a3d55b
8 changed files with 277 additions and 19 deletions
+33
View File
@@ -26,6 +26,38 @@
语法:待 MRS 编译确认(本机无 AT32 工具链);单测 8/8 全绿;REV 4.36.43spec V2.62 / devlog V2.80。 语法:待 MRS 编译确认(本机无 AT32 工具链);单测 8/8 全绿;REV 4.36.43spec V2.62 / devlog V2.80。
## 2026-09-11 — 铁板负偏差误释放防护(P1)+ 有车最小保持定档 100ms(固件 V4.36.44
**背景(现场 `154log260911d`,22µH 铁板测试)**:铁板进入/下降过程中出现「进入(继电器+绿灯) → 释放 → 黄灯快闪」。日志定性:
- 铁板 = **双重效应**目标:涡流分量先把 CAPVD 压低 ⇒ 正常"进入";继续贴近后**磁导率接管**,CAPVD 反向升至 `dev:+201/+198`(负 variation,铝合金不出现)
- 再压则**载波被压掉**`!LOOP_OK`)⇒ `loop_disconnect` ⇒ 黄灯快闪(断开级 200ms)。**不是软件误判,是振荡真的掉了**
- 但要修的是:**两次误释放**发生在 `dev=+33/+96`(≈2×进表 dlt),落在既有"±4×dlt 正常跟踪窗"内 ⇒ 该窗内的负偏差没有防护
**P1(本次实现)**:有车期间 CAPVD 进负偏差侧(`dev > +1×进表dlt`)⇒ **冻结离开判定**(含 band_timeout 兜底)。判定依据:真实"车走了"只会让 CAPVD **回到 Origin 附近(dev≈0**,不会把它抬到 +200。
- **防永久锁死**:负偏差持续 `REL_NEG_VAR_HOLD_TICKS`(5s) ⇒ 判为**真空位移**`origin_set_atomic()` 重锚基线后放行(单向、有界)
- **门控点**:普通释放路径 + `band_timeout``Car_In`/`Car_Off` 双向清零;新增 `EVT|neg_rel_hold` / `EVT|neg_rel_reanchor`
- **与既有逻辑的边界**:载波丢失(真断开)仍走 `RELAY_HOLD_MS=1000` 保护;`dev ≥ +4×dlt` 的强负 variation 仍由 V4.24 两段式环境逻辑接管
**G3 定档**`REL_MIN_HOLD_TICKS` 30 → **10100ms**。2026-09-11 现场以 10 跑通(`band_timeout` 归零、离开延迟 0.22~1.95s、自激未复现)后正式化。G1 已结构化消除自激,100ms 足够;若再现跳变,**第一手动作是把该常数提到 20(200ms)**。
**单测**`tests/test_vac_ref_reanchor.c` 场景 8,现场参数逐位):
| 场景 | 现状 V4.36.43 | V4.36.44 (P1) |
|---|---|---|
| 铁板停留 `dev=+96` | 释放 @**1.04s**(误释放,与现场一致) | 释放 @**6.04s**(冻结 5s 后重锚放行,仅 1 次) |
| 正常撤板 `dev→0` | 释放 ✓ | 释放 @2.04s ✓ **不受影响** |
**现场验证(待填)**
- [ ] 铁板:进入后不再"立刻释放";拿开后 ≤5s 内有界释放
- [ ] 正常车辆(含快速车/半截车/慢速车)进出不受影响
- [ ] 日志片段:
```
(待填:EVT|neg_rel_hold / EVT|neg_rel_reanchor
```
语法:待 MRS 编译确认(本机无 AT32 工具链);单测 8/8 全绿(gcc -O0 -Wall -Wextra 0 warning);REV 4.36.44spec V2.63 / devlog V2.81。
> 归档:`docs/patches/v4.36.44-P1-negvar-hold-and-minhold-100ms.diff`;铁板实证见 `docs/coil-range-alarm-design.md`(待补)。
## 2026-09-11 — 低Q 临界悬停自激根治:进/出判定参考统一 + 释放带夹紧 + 最小保持(固件 V4.36.42 ## 2026-09-11 — 低Q 临界悬停自激根治:进/出判定参考统一 + 释放带夹紧 + 最小保持(固件 V4.36.42
用户反馈:拿金属板**缓慢接近**的时候,判据**乱跳**;随后用 **35µH**128kHz)、**46µH**112kHz)线圈复测,同样现象。 用户反馈:拿金属板**缓慢接近**的时候,判据**乱跳**;随后用 **35µH**128kHz)、**46µH**112kHz)线圈复测,同样现象。
@@ -2257,6 +2289,7 @@ if (dev >= dlt_ORG × 4) {
| 版本 | 时间 | 说明 | | 版本 | 时间 | 说明 |
|------|------|------| |------|------|------|
| V2.81 | 2026-09-11 | V4.36.44 铁板负偏差误释放防护(P1): 有车期间 dev>+1×进表dlt ⇒ 冻结离开判定(含 band_timeout 兜底), 持续 5s 重锚基线后放行(防锁死); G3 最小保持 30→10(100ms) 现场验证后定档; 单测场景8 现场参数: 误释放 @1.04s → 冻结后 @6.04s, 正常撤板不受影响 |
| V2.80 | 2026-09-11 | V4.36.43 修正 V4.36.42 的 G3 放置错误: g_rel_hold_tick-- 原在"无车"分支内 ⇒ 有车期间不递减 ⇒ 正常释放被永久挡住只能 band_timeout(离开延迟 3.5~4.7s); 移到"有车"分支顶部 | | V2.80 | 2026-09-11 | V4.36.43 修正 V4.36.42 的 G3 放置错误: g_rel_hold_tick-- 原在"无车"分支内 ⇒ 有车期间不递减 ⇒ 正常释放被永久挡住只能 band_timeout(离开延迟 3.5~4.7s); 移到"有车"分支顶部 |
| V2.79 | 2026-09-11 | V4.36.42 低Q 临界悬停自激根治: vac_ref() 门控改用状态无关进表 dlt(G1) + 低Q 释放带夹紧守卫(G2, 不动 180) + 有车 300ms 最小保持(G3); 22µH/35µH 现场自激(100ms 周期)修后 300/300→1/0; 新增"非低Q不跳"判别用例 | | V2.79 | 2026-09-11 | V4.36.42 低Q 临界悬停自激根治: vac_ref() 门控改用状态无关进表 dlt(G1) + 低Q 释放带夹紧守卫(G2, 不动 180) + 有车 300ms 最小保持(G3); 22µH/35µH 现场自激(100ms 周期)修后 300/300→1/0; 新增"非低Q不跳"判别用例 |
| V2.78 | 2026-09-11 | V4.36.41 环境重校准后触发高度变低根治: 新增 origin_set_atomic() 同步真空 EMA(3 处写入点; 维持 OriginEMA ≤1×dlt 不变式) + EMA 余数累加消 ±127 counts 整数死区; 新增镜像单测 test_vac_ref_reanchor 5 场景全绿 | | V2.78 | 2026-09-11 | V4.36.41 环境重校准后触发高度变低根治: 新增 origin_set_atomic() 同步真空 EMA(3 处写入点; 维持 OriginEMA ≤1×dlt 不变式) + EMA 余数累加消 ±127 counts 整数死区; 新增镜像单测 test_vac_ref_reanchor 5 场景全绿 |
@@ -0,0 +1,137 @@
diff --git a/utilities/at32f421_freertos_demo/inc/TaskLoop.h b/utilities/at32f421_freertos_demo/inc/TaskLoop.h
index f37c3ef..f5dedf4 100644
--- a/utilities/at32f421_freertos_demo/inc/TaskLoop.h
+++ b/utilities/at32f421_freertos_demo/inc/TaskLoop.h
@@ -66,7 +66,8 @@
#define ENTRY_CONFIRM_MID 4 // 中Q(80~100k)
#define ENTRY_CONFIRM_LO 5 // 低Q(f>100k): 抖动大, 多样本防假进入
#define REL_ORIGIN_FREEZE_TICKS 100 // V4.36.26/32: 释放后 Origin 全冻结 1000ms — 残余缓离窗口不入均值窗
-#define REL_MIN_HOLD_TICKS 30 // V4.36.42(G3): 有车后最小保持 300ms 禁释放 (掐断进/出 100ms 级自激; 不延迟检出)
+#define REL_MIN_HOLD_TICKS 10 // V4.36.44: 有车后最小保持 100ms 禁释放 (V4.36.42 首发 300ms; 2026-09-11 现场以 10=100ms 验证通过后正式化; 0.2s 内必释放)
+#define REL_NEG_VAR_HOLD_TICKS 500 // V4.36.44(P1): 有车期间负偏差(铁块/异常高)持续上限 5s, 到顶重锚基线后放行(防永久锁死)
#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
diff --git a/utilities/at32f421_freertos_demo/src/TaskLoop.c b/utilities/at32f421_freertos_demo/src/TaskLoop.c
index 2e0f53b..370fbd6 100644
--- a/utilities/at32f421_freertos_demo/src/TaskLoop.c
+++ b/utilities/at32f421_freertos_demo/src/TaskLoop.c
@@ -48,6 +48,7 @@ uint16_t g_origin_freeze_tick = 0; // V4.36.26/32: 释放后 Origin 全冻
uint16_t g_origin_lowlearn_tick = 0; // V4.36.32: 冻结后降权低速补偿计数 (2s, 残余低值降权学入)
uint16_t g_rel_band_cnt = 0; // V4.36.30: 低Q 环带超时兜底计数 (离开触发深度持续 2.5s → 强制释放)
uint16_t g_rel_hold_tick = 0; // V4.36.42(G3): 有车后最小保持计数 (禁释放, 掐断进/出自激)
+uint16_t g_neg_rel_hold_cnt = 0; // V4.36.44(P1): 有车期间负偏差(>+1×dlt)持续计数
uint32_t g_vacuum_ema = 0; // V4.36.31: 真空 EMA 基线 (B3: 释放/触发参考与锚错 Origin 解耦)
static int32_t g_vac_frac = 0; // V4.37(D): EMA 余数累加器 (消 ±127 counts 整数死区)
uint16_t g_ready_hold_tick = 0; // V4.36.36: 判稳后就绪巩固期计数 (5ms tick, poll_green_led 递减; 按 Q 档置 5s/7s/10s)
@@ -289,16 +290,16 @@ uint32_t get_flt_value_rel(uint32_t new_value, uint32_t last_value)
/* V4.36.31: B3 判定参考 — min(Origin, 真空 EMA)
* Origin 可能被 env 学习锚到高位(板搁置态/过冲, J1: 130636 vs 真空 130506) → 释放线偏高
* → 撤板真空也够不着; 取 min 使参考锚向实时真空(低者=保守方向), 双侧自动正确 */
-/* V4.36.42(G1): 真空门控阈值 — 必须"状态无关"
- * 现场 20260911 日志: loop1_dlt_ORG 在进车瞬间被切成释放表值(49→23) ⇒ 同一 EMA 偏差(34)
- * 原本不触发切换、进车后却触发 ⇒ vac_ref() 从 Origin 阶跃到 EMA ⇒ 释放线瞬间浅 34 counts
- * ⇒ 深度 50~58 counts 的静止凹脉冲"进门即满足释放" ⇒ 100ms 周期自激(约 30 次/3s)
- * 修法: 门控一律用进表 dlt(与 :band_timeout 的写法统一) ⇒ 进/出车用同一参考 */
-static uint32_t vac_gate_dlt(void)
-{
- return ((uint32_t)loop1_Origin * SensTable[loop1_SensLevel]) >> 16;
-}
-
+/* V4.36.42(G1): 真空门控阈值 — 必须"状态无关"
+ * 现场 20260911 日志: loop1_dlt_ORG 在进车瞬间被切成释放表值(49→23) ⇒ 同一 EMA 偏差(34)
+ * 原本不触发切换、进车后却触发 ⇒ vac_ref() 从 Origin 阶跃到 EMA ⇒ 释放线瞬间浅 34 counts
+ * ⇒ 深度 50~58 counts 的静止凹脉冲"进门即满足释放" ⇒ 100ms 周期自激(约 30 次/3s)
+ * 修法: 门控一律用进表 dlt(与 :band_timeout 的写法统一) ⇒ 进/出车用同一参考 */
+static uint32_t vac_gate_dlt(void)
+{
+ return ((uint32_t)loop1_Origin * SensTable[loop1_SensLevel]) >> 16;
+}
+
static uint32_t vac_ref(void)
{
if (g_vacuum_ema == 0) return loop1_Origin;
@@ -597,6 +598,7 @@ void INIT_VD(void)
g_origin_freeze_tick = 0; /* V4.36.26: 释放冻结计数清零 */
g_rel_band_cnt = 0; /* V4.36.30: 环带兜底计数清零 */
g_rel_hold_tick = 0; /* V4.36.42(G3): 最小保持清零 */
+ g_neg_rel_hold_cnt = 0; /* V4.36.44(P1): 负偏差离开冻结计数清零 */
g_vacuum_ema = 0; /* V4.36.31: 真空 EMA 清零 (判稳后重建) */
g_vac_frac = 0; /* V4.37(D): 余数累加器同步清零 */
g_ready_hold_tick = 0; /* V4.36.36: 就绪巩固期清零 (重建判稳时会再置) */
@@ -1502,6 +1504,7 @@ void vd1_task(void)
g_rel_smooth = loop1_CAPVD; /* V4.36.19: 低Q 释放平滑 snap 到进入点 */
g_rel_band_cnt = 0; /* V4.36.30: 环带兜底计数进入时清零 */
g_rel_hold_tick = REL_MIN_HOLD_TICKS; /* V4.36.42(G3): 进入后 300ms 禁释放 */
+ g_neg_rel_hold_cnt = 0; /* V4.36.44(P1): 进入即重置 */
if (!SET_SAFE) {
loop1_LC_HOLD = 1;
@@ -1533,6 +1536,30 @@ void vd1_task(void)
* 有车期间永不递减 ⇒ 首次进入后 g_rel_hold_tick 常驻 ⇒ 正常释放被永久挡住, 只能靠 band_timeout
* 兜底 (现场日志 2026-09-11 17:02: 4 次 Car_OFF 全是 band_timeout, 离开延迟 3.5~4.7s) */
if (g_rel_hold_tick > 0) g_rel_hold_tick--;
+ /* V4.36.44(P1): 有车期间 CAPVD 进负偏差侧(dev > +1×进表dlt) = 铁块/环境异常高, 不是"离开"证据
+ * ⇒ 冻结离开判定(含 band_timeout 兜底); 持续 REL_NEG_VAR_HOLD_TICKS(5s) ⇒ 判为真空位移,
+ * 重锚基线后放行(防永久锁死)。真实"车走了"只让 CAPVD 回到 Origin 附近(dev≈0) ⇒ 不受影响。
+ * 现场依据: 2026-09-11 铁板日志(22µH)两次误释放发生在 dev=+96(≈2×进表dlt), 落在"-4dlt..+4dlt 正常跟踪窗"内 */
+ {
+ int32_t _neg_dev = (int32_t)loop1_CAPVD - (int32_t)loop1_Origin;
+ if (_neg_dev > (int32_t)vac_gate_dlt()) {
+ if (g_neg_rel_hold_cnt == 0) {
+ PRINT("EVT|neg_rel_hold CAPVD:%d Origin:%d dev:%d dlt:%d (离开判定冻结)\n",
+ loop1_CAPVD, loop1_Origin, (int)_neg_dev, (int)vac_gate_dlt());
+ }
+ if (g_neg_rel_hold_cnt < REL_NEG_VAR_HOLD_TICKS) {
+ g_neg_rel_hold_cnt++;
+ } else {
+ origin_set_atomic(loop1_CAPVD); /* 异常持续 5s ⇒ 判真空位移, 重锚基线 */
+ g_origin_freeze_tick = REL_ORIGIN_FREEZE_TICKS;
+ g_neg_rel_hold_cnt = 0; /* 放行: 基线已跟上, dev 归零 */
+ PRINT("EVT|neg_rel_reanchor Origin->%d (异常持续 %dms, 重锚后放行)\n",
+ loop1_Origin, REL_NEG_VAR_HOLD_TICKS * 10);
+ }
+ } else {
+ g_neg_rel_hold_cnt = 0;
+ }
+ }
#if USE_FLATNESS_EXIT
/*================================================================
* 有车状态 — 平坦性判定离开(专利 CN200910309382
@@ -1601,9 +1628,9 @@ void vd1_task(void)
loop1_dlt_ORG = ((uint32_t)loop1_Origin * SensTable_1[loop1_SensLevel]) >> 16; // 方案B(V4.06): 调浅释放表已并入 SensTable_1
#if USE_SLOW_RELEASE
- if (((loop1_Origin - loop1_dlt_ORG) < loop1_CAPVD_slow) && (g_rel_hold_tick == 0)) { // 方案A + V4.36.42(G3) 最小保持
+ if (((loop1_Origin - loop1_dlt_ORG) < loop1_CAPVD_slow) && (g_rel_hold_tick == 0) && (g_neg_rel_hold_cnt == 0)) { // 方案A + V4.36.42(G3) 最小保持
#else
- if ((g_rel_hold_tick == 0) && rel_release_hit()) { // V4.36.42(G3) 最小保持 + V4.36.19 低Q 平滑/带回加宽
+ if ((g_rel_hold_tick == 0) && (g_neg_rel_hold_cnt == 0) && rel_release_hit()) { // V4.36.42(G3) 最小保持 + V4.36.19 低Q 平滑/带回加宽
#endif
if (loop1_cnt_release == 0) {
/* 过渡事件: 第一次命中离开线 (定位"为什么开始释放") */
@@ -1630,6 +1657,7 @@ void vd1_task(void)
Hold_CNT = 0;
loop1_cnt_release = 0;
g_rel_hold_tick = 0; /* V4.36.42(G3): 释放即清保持 */
+ g_neg_rel_hold_cnt = 0; /* V4.36.44(P1): 负偏差离开冻结计数清零 */
g_origin_freeze_tick = REL_ORIGIN_FREEZE_TICKS; /* V4.36.26: 释放后 Origin 均值窗冻结 */
g_origin_lowlearn_tick = ORIGIN_LOWLEARN_TICKS; /* V4.36.32: 冻结后降权期预置 */
}
@@ -1643,7 +1671,7 @@ void vd1_task(void)
if (g_q_lo) {
uint32_t _entry_ln = vac_ref() -
(((uint32_t)loop1_Origin * SensTable[loop1_SensLevel]) >> 16); /* V4.36.31: 锚真空参考 */
- if (g_rel_smooth > _entry_ln) {
+ if ((g_rel_smooth > _entry_ln) && (g_neg_rel_hold_cnt == 0)) { /* V4.36.44(P1) */
g_rel_band_cnt++;
if (g_rel_band_cnt >= REL_BAND_TIMEOUT_TICKS) {
g_rel_band_cnt = 0;
@@ -1657,6 +1685,7 @@ void vd1_task(void)
loop1_ORG_SUM = 0;
Hold_CNT = 0;
loop1_cnt_release = 0;
+ g_neg_rel_hold_cnt = 0; /* V4.36.44(P1) */
g_origin_freeze_tick = REL_ORIGIN_FREEZE_TICKS;
g_origin_lowlearn_tick = ORIGIN_LOWLEARN_TICKS; /* V4.36.32: 冻结后降权期预置 */
}
+2 -1
View File
@@ -1,6 +1,6 @@
# DLD154V4B 产品手册 # DLD154V4B 产品手册
> 单路线圈车辆检测器 | 型号: DLD154V4B | 版本: V2.19 > 单路线圈车辆检测器 | 型号: DLD154V4B | 版本: V2.20
> 适用于停车场、收费站、交通卡口等场景的车辆到达/离开检测 > 适用于停车场、收费站、交通卡口等场景的车辆到达/离开检测
--- ---
@@ -281,6 +281,7 @@ SW_5 = ON 时:车辆(金属)持续压线超过 **4 分钟**LC_HOLD_TIME
| V2.14 | 2026-09-08 | 电感分级降级(固件 V4.36.37 方案A):f>156k 拆分——156~171k 可用级(恒判车)、f>171k 短路级快闪200ms(宏=1 等同断开);真短路阈 20µH | | V2.14 | 2026-09-08 | 电感分级降级(固件 V4.36.37 方案A):f>156k 拆分——156~171k 可用级(恒判车)、f>171k 短路级快闪200ms(宏=1 等同断开);真短路阈 20µH |
| V2.15 | 2026-09-08 | 可用级黄灯改**一长两短**(固件 V4.36.38):900/300/100/300/100/700ms 循环,与一长一短(出窗)/快闪(断开)区分 | | V2.15 | 2026-09-08 | 可用级黄灯改**一长两短**(固件 V4.36.38):900/300/100/300/100/700ms 循环,与一长一短(出窗)/快闪(断开)区分 |
| V2.16 | 2026-09-08 | 短路级宏默认=1(固件 V4.36.39,用户拍板):L<20µH 出厂即等同断开;=0 可关恢复仅指示 | | V2.16 | 2026-09-08 | 短路级宏默认=1(固件 V4.36.39,用户拍板):L<20µH 出厂即等同断开;=0 可关恢复仅指示 |
| V2.20 | 2026-09-11 | **铁板/异常高时不误释放**(固件 V4.36.44):金属板贴近环线使基线抬升期间,此前会出现"判为有车后立刻释放"(物体还在而继电器掉);本版在偏差抬升期间冻结离开判定,异常持续 5s 后重锚基线并放行。同时离开最小保持由 300ms 调整为 100ms(现场验证,离开更利落) |
| V2.19 | 2026-09-11 | **修正 V4.36.42 的离开延迟**(固件 V4.36.43):上一版在"进入后最小保持"期内因计时位置错误挡住了正常离开判定,导致离开需等环带兜底(实测 3.5~4.7s);本版恢复正常(最小保持仍 300ms) | | V2.19 | 2026-09-11 | **修正 V4.36.42 的离开延迟**(固件 V4.36.43):上一版在"进入后最小保持"期内因计时位置错误挡住了正常离开判定,导致离开需等环带兜底(实测 3.5~4.7s);本版恢复正常(最小保持仍 300ms) |
| V2.18 | 2026-09-11 | **边界悬停不再反复跳变**(固件 V4.36.42):金属板缓慢接近、或车辆停在环线边缘时,此前会出现"有车/无车"以约 100ms 周期连续反复(流量计数会重复计数);本版进入/离开判定改用同一参考,并增加进入后 300ms 最小保持(离开判别最多晚 300ms) | | V2.18 | 2026-09-11 | **边界悬停不再反复跳变**(固件 V4.36.42):金属板缓慢接近、或车辆停在环线边缘时,此前会出现"有车/无车"以约 100ms 周期连续反复(流量计数会重复计数);本版进入/离开判定改用同一参考,并增加进入后 300ms 最小保持(离开判别最多晚 300ms) |
| V2.17 | 2026-09-11 | **环境重校准后灵敏度恢复**(固件 V4.36.41):黄灯常亮故障补偿结束后,进入判定参考与基准同步;此前会残留"旧真空参考" ⇒ 金属板进入触发高度偏低、需断电重启才恢复 | | V2.17 | 2026-09-11 | **环境重校准后灵敏度恢复**(固件 V4.36.41):黄灯常亮故障补偿结束后,进入判定参考与基准同步;此前会残留"旧真空参考" ⇒ 金属板进入触发高度偏低、需断电重启才恢复 |
+2 -1
View File
@@ -1,6 +1,6 @@
# DLD154V4B 技术规格书 # DLD154V4B 技术规格书
> 单路线圈车辆检测器 | 固件版本: V4.36.43 | 文档版本: V2.62 > 单路线圈车辆检测器 | 固件版本: V4.36.44 | 文档版本: V2.63
> 本文档面向工程开发、系统集成及故障深度分析 > 本文档面向工程开发、系统集成及故障深度分析
--- ---
@@ -863,6 +863,7 @@ DLD154V4B V1.4 起实现该专利的整数化版本,用于大车通行时的
| V2.57 | 2026-09-08 | V4.36.39: COIL_UNDER_MIN_AS_OPEN 默认值 0→1 (用户拍板) —— L<20µH 短路级出厂即等同断开(判车停+继电器释放+绿灯灭) | | V2.57 | 2026-09-08 | V4.36.39: COIL_UNDER_MIN_AS_OPEN 默认值 0→1 (用户拍板) —— L<20µH 短路级出厂即等同断开(判车停+继电器释放+绿灯灭) |
| V2.58 | 2026-09-08 | V4.36.40 热切换修复: recover 恢复判定改 TMR3 实时 Xn(240000/Xn) —— 原 calc_freq_khz(冻结Origin,LPCNT) 永不回窗致换线圈死锁; 恢复后自然走重连+判稳重建 Origin | | V2.58 | 2026-09-08 | V4.36.40 热切换修复: recover 恢复判定改 TMR3 实时 Xn(240000/Xn) —— 原 calc_freq_khz(冻结Origin,LPCNT) 永不回窗致换线圈死锁; 恢复后自然走重连+判稳重建 Origin |
| V2.59 | 2026-09-08 | 注释同步: 代码/测试全部 疾闪 → 一长两短 (V2.55~58 历史版本行保留当时变更记录) | | V2.59 | 2026-09-08 | 注释同步: 代码/测试全部 疾闪 → 一长两短 (V2.55~58 历史版本行保留当时变更记录) |
| V2.63 | 2026-09-11 | **V4.36.44 铁板负偏差误释放防护(P1)**:有车期间 CAPVD 进入负偏差侧(`dev > +1×进表dlt`)= 铁块/环境异常高,不是"离开"证据 ⇒ 冻结离开判定(含 band_timeout 兜底);持续 `REL_NEG_VAR_HOLD_TICKS`(5s) ⇒ 判为真空位移,`origin_set_atomic()` 重锚基线后放行(有界、防锁死)。同时 `REL_MIN_HOLD_TICKS` 30→10(100ms) 现场验证后定档 |
| V2.62 | 2026-09-11 | **V4.36.43 修正 V4.36.42 引入的离开变慢**G3 最小保持计时器 `g_rel_hold_tick--` 误置于无车分支 ⇒ 有车期间不递减 ⇒ 释放判定恒被挡住,只能靠 band_timeout 兜底(现场实测离开延迟 3.5~4.7s)⇒ 移到有车分支顶部每 tick 递减 | | V2.62 | 2026-09-11 | **V4.36.43 修正 V4.36.42 引入的离开变慢**G3 最小保持计时器 `g_rel_hold_tick--` 误置于无车分支 ⇒ 有车期间不递减 ⇒ 释放判定恒被挡住,只能靠 band_timeout 兜底(现场实测离开延迟 3.5~4.7s)⇒ 移到有车分支顶部每 tick 递减 |
| V2.61 | 2026-09-11 | **V4.36.42 低Q 临界悬停自激根治**`vac_ref()` 门控原先用会随状态切换的 `loop1_dlt_ORG`(无车=进表 49 / 有车=释表 23)⇒ 进门瞬间参考由 Origin 阶跃到 EMA,与低Q ×1.8 释放带叠加成**反向滞回** ⇒ 深度 1.0~1.8×dlt 的静止凹脉冲自激(100ms 周期)。新增 `vac_gate_dlt()`(G1) 统一参考 + 低Q 释放带夹紧(G2) + 有车 300ms 最小保持(G3)22µH/35µH 现场实测 300/300 → 1/0 | | V2.61 | 2026-09-11 | **V4.36.42 低Q 临界悬停自激根治**`vac_ref()` 门控原先用会随状态切换的 `loop1_dlt_ORG`(无车=进表 49 / 有车=释表 23)⇒ 进门瞬间参考由 Origin 阶跃到 EMA,与低Q ×1.8 释放带叠加成**反向滞回** ⇒ 深度 1.0~1.8×dlt 的静止凹脉冲自激(100ms 周期)。新增 `vac_gate_dlt()`(G1) 统一参考 + 低Q 释放带夹紧(G2) + 有车 300ms 最小保持(G3)22µH/35µH 现场实测 300/300 → 1/0 |
| V2.60 | 2026-09-11 | **V4.36.41 环境重校准后触发高度变低根治**:进入判定用 `vac_ref()=min(Origin,真空EMA)`,环境重校准路径未同步该参考 ⇒ 新增 `origin_set_atomic()`(3 处 Origin 写入点;维持 OriginEMA ≤1×dlt 不变式)+ EMA 余数累加消 ±127 counts 整数死区;新增镜像单测 test_vac_ref_reanchor5 场景) | | V2.60 | 2026-09-11 | **V4.36.41 环境重校准后触发高度变低根治**:进入判定用 `vac_ref()=min(Origin,真空EMA)`,环境重校准路径未同步该参考 ⇒ 新增 `origin_set_atomic()`(3 处 Origin 写入点;维持 OriginEMA ≤1×dlt 不变式)+ EMA 余数累加消 ±127 counts 整数死区;新增镜像单测 test_vac_ref_reanchor5 场景) |
+57 -1
View File
@@ -244,6 +244,59 @@ static void test_lowq_limit_cycle(void)
printf(" 修后: 悬停 1/0 OK | 撤板 1/1 OK | V4.36.28 回摆仍释放 OK\n"); printf(" 修后: 悬停 1/0 OK | 撤板 1/1 OK | V4.36.28 回摆仍释放 OK\n");
} }
/* ================= 场景 8: 铁板负偏差误释放 (P1) =================
* 现场依据: 2026-09-11 154log260911d (22µH) 两次"铁板还在但被抬到 dev=+33/+96 ⇒ 释放"
* 时间线: 深压进入(dev 128) → CAPVD 回升穿过 Origin 停在 +96 (铁板仍在)
* 期望: 现状(V4.36.43) ~1.0s 即误释放; P1 冻结离开 ⇒ 持续 5s 后重锚基线再放行(1 次)
*/
#define SIM_ORG 129310u
static uint32_t tl8_iron(int i) { return (i < 100) ? (SIM_ORG - 128u) : (SIM_ORG + 96u); }
static uint32_t tl8_leave(int i) { return (i < 200) ? (SIM_ORG - 128u) : (SIM_ORG); }
static void sim_iron(int p1_on, uint32_t (*capvd_at)(int), int n, int *p_off_tick, int *p_off_total)
{
uint32_t dlt_e = gate_dlt(SIM_ORG, SENS_LEVEL);
uint32_t dlt_rel = (uint32_t)(((uint64_t)SIM_ORG * 12) >> 16);
uint32_t origin = SIM_ORG;
int i, ent = 0, rel = 0, hold = 0, neg = 0, off_tick = -1, off_total = 0;
uint8_t vd = 0;
for (i = 0; i < n; i++) {
int32_t capvd = (int32_t)capvd_at(i);
if (!vd) {
if (capvd < (int32_t)(origin - dlt_e)) { if (++ent >= 5) { vd = 1; ent = 0; hold = 10; } }
else ent = 0;
} else {
if (hold > 0) hold--;
if (p1_on) { /* P1: dev > +1×进表dlt 期间冻结离开 */
if (capvd - (int32_t)origin > (int32_t)dlt_e) {
if (neg < 500) neg++;
else { origin = (uint32_t)capvd; neg = 0; } /* 持续 5s ⇒ 重锚基线后放行 */
} else neg = 0;
}
if (hold == 0 && neg == 0) {
if (capvd > (int32_t)(origin - (dlt_rel * 180) / 100)) {
if (++rel >= 5) { vd = 0; rel = 0; off_total++; if (off_tick < 0) off_tick = i; }
} else rel = 0;
} else rel = 0;
}
}
*p_off_tick = off_tick; *p_off_total = off_total;
}
static void test_iron_neg_var_release(void)
{
int t1 = -1, c1 = 0, t2 = -1, c2 = 0, t3 = -1, c3 = 0;
sim_iron(0, tl8_iron, 2000, &t1, &c1); /* 现状: 无 P1 */
sim_iron(1, tl8_iron, 2000, &t2, &c2); /* P1: 冻结离开 */
sim_iron(1, tl8_leave, 2000, &t3, &c3); /* P1: 正常撤板(dev→0) */
printf(" 铁板停留 dev=+96: 现状 释放%d次@%.2fs | P1 释放%d次@%.2fs\n",
c1, t1 * 0.01, c2, t2 * 0.01);
printf(" P1 正常撤板(dev→0): 释放%d次@%.2fs\n", c3, t3 * 0.01);
assert(c1 >= 1 && t1 <= 200); /* 现状: ≈1s 内误释放 */
assert(c2 == 1 && t2 >= 550); /* P1: 冻结≥5s 后重锚放行, 且仅 1 次 */
assert(c3 == 1 && t3 <= 260); /* P1: 正常离开不受影响 */
}
int main(void) int main(void)
{ {
printf("test_vac_ref_reanchor (V4.36.42: A+B 同步 / D 死区 / E 单向 / G1+G2+G3 低Q自激)\n"); printf("test_vac_ref_reanchor (V4.36.42: A+B 同步 / D 死区 / E 单向 / G1+G2+G3 低Q自激)\n");
@@ -346,6 +399,9 @@ int main(void)
/* ================= 场景 7: 低Q 临界悬停自激 ================= */ /* ================= 场景 7: 低Q 临界悬停自激 ================= */
test_lowq_limit_cycle(); test_lowq_limit_cycle();
printf("ALL PASS (A+B 同步 / 护栏 / 门控回归 / 上电语义 / 死区 / 抖动 / 低Q自激)\n"); /* ================= 场景 8: 铁板负偏差误释放 (P1) ================= */
test_iron_neg_var_release();
printf("ALL PASS (A+B 同步 / 护栏 / 门控回归 / 上电语义 / 死区 / 抖动 / 低Q自激 / P1负偏差)\n");
return 0; return 0;
} }
@@ -66,7 +66,8 @@
#define ENTRY_CONFIRM_MID 4 // 中Q(80~100k) #define ENTRY_CONFIRM_MID 4 // 中Q(80~100k)
#define ENTRY_CONFIRM_LO 5 // 低Q(f>100k): 抖动大, 多样本防假进入 #define ENTRY_CONFIRM_LO 5 // 低Q(f>100k): 抖动大, 多样本防假进入
#define REL_ORIGIN_FREEZE_TICKS 100 // V4.36.26/32: 释放后 Origin 全冻结 1000ms — 残余缓离窗口不入均值窗 #define REL_ORIGIN_FREEZE_TICKS 100 // V4.36.26/32: 释放后 Origin 全冻结 1000ms — 残余缓离窗口不入均值窗
#define REL_MIN_HOLD_TICKS 30 // V4.36.42(G3): 有车后最小保持 300ms 禁释放 (掐断进/出 100ms 级自激; 不延迟检出) #define REL_MIN_HOLD_TICKS 10 // V4.36.44: 有车后最小保持 100ms 禁释放 (V4.36.42 首发 300ms; 2026-09-11 现场以 10=100ms 验证通过后正式化; 0.2s 内必释放)
#define REL_NEG_VAR_HOLD_TICKS 500 // V4.36.44(P1): 有车期间负偏差(铁块/异常高)持续上限 5s, 到顶重锚基线后放行(防永久锁死)
#define ORIGIN_LOWLEARN_TICKS 200 // V4.36.32: 冻结后降权低速补偿期 2000ms: 残余低值样本权重降 ×1/MULT #define ORIGIN_LOWLEARN_TICKS 200 // V4.36.32: 冻结后降权低速补偿期 2000ms: 残余低值样本权重降 ×1/MULT
// 仿 PD132T 慢采样等效(10ms 快采样让 5s 窗装得快, 残余易拉低 Origin; 慢学更稳) // 仿 PD132T 慢采样等效(10ms 快采样让 5s 窗装得快, 残余易拉低 Origin; 慢学更稳)
#define ORIGIN_LOWLEARN_MULT 5 // V4.36.32: 降权期均值窗放大 500→2500 样本(25s 窗), 学习速率 1/5 #define ORIGIN_LOWLEARN_MULT 5 // V4.36.32: 降权期均值窗放大 500→2500 样本(25s 窗), 学习速率 1/5
+2 -2
View File
@@ -14,11 +14,11 @@
#define __CMCNG_H__ #define __CMCNG_H__
#define PRODUCT_MODEL "DLD154" #define PRODUCT_MODEL "DLD154"
#define FIRMWARE_VER "4.36.43" // 主.子.修订 (2026-09-03 起: 小改动只增 REV; MAIN/SUB 由产品定) #define FIRMWARE_VER "4.36.44" // 主.子.修订 (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 43 #define FIRMWARE_VER_REV 44
#define HARDWARE_VER_MAIN 3 #define HARDWARE_VER_MAIN 3
#define HARDWARE_VER_SUB 0 #define HARDWARE_VER_SUB 0
@@ -48,6 +48,7 @@ uint16_t g_origin_freeze_tick = 0; // V4.36.26/32: 释放后 Origin 全冻
uint16_t g_origin_lowlearn_tick = 0; // V4.36.32: 冻结后降权低速补偿计数 (2s, 残余低值降权学入) uint16_t g_origin_lowlearn_tick = 0; // V4.36.32: 冻结后降权低速补偿计数 (2s, 残余低值降权学入)
uint16_t g_rel_band_cnt = 0; // V4.36.30: 低Q 环带超时兜底计数 (离开触发深度持续 2.5s → 强制释放) uint16_t g_rel_band_cnt = 0; // V4.36.30: 低Q 环带超时兜底计数 (离开触发深度持续 2.5s → 强制释放)
uint16_t g_rel_hold_tick = 0; // V4.36.42(G3): 有车后最小保持计数 (禁释放, 掐断进/出自激) uint16_t g_rel_hold_tick = 0; // V4.36.42(G3): 有车后最小保持计数 (禁释放, 掐断进/出自激)
uint16_t g_neg_rel_hold_cnt = 0; // V4.36.44(P1): 有车期间负偏差(>+1×dlt)持续计数
uint32_t g_vacuum_ema = 0; // V4.36.31: 真空 EMA 基线 (B3: 释放/触发参考与锚错 Origin 解耦) uint32_t g_vacuum_ema = 0; // V4.36.31: 真空 EMA 基线 (B3: 释放/触发参考与锚错 Origin 解耦)
static int32_t g_vac_frac = 0; // V4.37(D): EMA 余数累加器 (消 ±127 counts 整数死区) static int32_t g_vac_frac = 0; // V4.37(D): EMA 余数累加器 (消 ±127 counts 整数死区)
uint16_t g_ready_hold_tick = 0; // V4.36.36: 判稳后就绪巩固期计数 (5ms tick, poll_green_led 递减; 按 Q 档置 5s/7s/10s) uint16_t g_ready_hold_tick = 0; // V4.36.36: 判稳后就绪巩固期计数 (5ms tick, poll_green_led 递减; 按 Q 档置 5s/7s/10s)
@@ -597,6 +598,7 @@ void INIT_VD(void)
g_origin_freeze_tick = 0; /* V4.36.26: 释放冻结计数清零 */ g_origin_freeze_tick = 0; /* V4.36.26: 释放冻结计数清零 */
g_rel_band_cnt = 0; /* V4.36.30: 环带兜底计数清零 */ g_rel_band_cnt = 0; /* V4.36.30: 环带兜底计数清零 */
g_rel_hold_tick = 0; /* V4.36.42(G3): 最小保持清零 */ g_rel_hold_tick = 0; /* V4.36.42(G3): 最小保持清零 */
g_neg_rel_hold_cnt = 0; /* V4.36.44(P1): 负偏差离开冻结计数清零 */
g_vacuum_ema = 0; /* V4.36.31: 真空 EMA 清零 (判稳后重建) */ g_vacuum_ema = 0; /* V4.36.31: 真空 EMA 清零 (判稳后重建) */
g_vac_frac = 0; /* V4.37(D): 余数累加器同步清零 */ g_vac_frac = 0; /* V4.37(D): 余数累加器同步清零 */
g_ready_hold_tick = 0; /* V4.36.36: 就绪巩固期清零 (重建判稳时会再置) */ g_ready_hold_tick = 0; /* V4.36.36: 就绪巩固期清零 (重建判稳时会再置) */
@@ -1502,6 +1504,7 @@ void vd1_task(void)
g_rel_smooth = loop1_CAPVD; /* V4.36.19: 低Q 释放平滑 snap 到进入点 */ g_rel_smooth = loop1_CAPVD; /* V4.36.19: 低Q 释放平滑 snap 到进入点 */
g_rel_band_cnt = 0; /* V4.36.30: 环带兜底计数进入时清零 */ g_rel_band_cnt = 0; /* V4.36.30: 环带兜底计数进入时清零 */
g_rel_hold_tick = REL_MIN_HOLD_TICKS; /* V4.36.42(G3): 进入后 300ms 禁释放 */ g_rel_hold_tick = REL_MIN_HOLD_TICKS; /* V4.36.42(G3): 进入后 300ms 禁释放 */
g_neg_rel_hold_cnt = 0; /* V4.36.44(P1): 进入即重置 */
if (!SET_SAFE) { if (!SET_SAFE) {
loop1_LC_HOLD = 1; loop1_LC_HOLD = 1;
@@ -1533,6 +1536,30 @@ void vd1_task(void)
* 有车期间永不递减 ⇒ 首次进入后 g_rel_hold_tick 常驻 ⇒ 正常释放被永久挡住, 只能靠 band_timeout * 有车期间永不递减 ⇒ 首次进入后 g_rel_hold_tick 常驻 ⇒ 正常释放被永久挡住, 只能靠 band_timeout
* 兜底 (现场日志 2026-09-11 17:02: 4 次 Car_OFF 全是 band_timeout, 离开延迟 3.5~4.7s) */ * 兜底 (现场日志 2026-09-11 17:02: 4 次 Car_OFF 全是 band_timeout, 离开延迟 3.5~4.7s) */
if (g_rel_hold_tick > 0) g_rel_hold_tick--; if (g_rel_hold_tick > 0) g_rel_hold_tick--;
/* V4.36.44(P1): 有车期间 CAPVD 进负偏差侧(dev > +1×进表dlt) = 铁块/环境异常高, 不是"离开"证据
* ⇒ 冻结离开判定(含 band_timeout 兜底); 持续 REL_NEG_VAR_HOLD_TICKS(5s) ⇒ 判为真空位移,
* 重锚基线后放行(防永久锁死)。真实"车走了"只让 CAPVD 回到 Origin 附近(dev≈0) ⇒ 不受影响。
* 现场依据: 2026-09-11 铁板日志(22µH)两次误释放发生在 dev=+96(≈2×进表dlt), 落在"-4dlt..+4dlt 正常跟踪窗"内 */
{
int32_t _neg_dev = (int32_t)loop1_CAPVD - (int32_t)loop1_Origin;
if (_neg_dev > (int32_t)vac_gate_dlt()) {
if (g_neg_rel_hold_cnt == 0) {
PRINT("EVT|neg_rel_hold CAPVD:%d Origin:%d dev:%d dlt:%d (离开判定冻结)\n",
loop1_CAPVD, loop1_Origin, (int)_neg_dev, (int)vac_gate_dlt());
}
if (g_neg_rel_hold_cnt < REL_NEG_VAR_HOLD_TICKS) {
g_neg_rel_hold_cnt++;
} else {
origin_set_atomic(loop1_CAPVD); /* 异常持续 5s ⇒ 判真空位移, 重锚基线 */
g_origin_freeze_tick = REL_ORIGIN_FREEZE_TICKS;
g_neg_rel_hold_cnt = 0; /* 放行: 基线已跟上, dev 归零 */
PRINT("EVT|neg_rel_reanchor Origin->%d (异常持续 %dms, 重锚后放行)\n",
loop1_Origin, REL_NEG_VAR_HOLD_TICKS * 10);
}
} else {
g_neg_rel_hold_cnt = 0;
}
}
#if USE_FLATNESS_EXIT #if USE_FLATNESS_EXIT
/*================================================================ /*================================================================
* 有车状态 — 平坦性判定离开(专利 CN200910309382 * 有车状态 — 平坦性判定离开(专利 CN200910309382
@@ -1601,9 +1628,9 @@ void vd1_task(void)
loop1_dlt_ORG = ((uint32_t)loop1_Origin * SensTable_1[loop1_SensLevel]) >> 16; // 方案B(V4.06): 调浅释放表已并入 SensTable_1 loop1_dlt_ORG = ((uint32_t)loop1_Origin * SensTable_1[loop1_SensLevel]) >> 16; // 方案B(V4.06): 调浅释放表已并入 SensTable_1
#if USE_SLOW_RELEASE #if USE_SLOW_RELEASE
if (((loop1_Origin - loop1_dlt_ORG) < loop1_CAPVD_slow) && (g_rel_hold_tick == 0)) { // 方案A + V4.36.42(G3) 最小保持 if (((loop1_Origin - loop1_dlt_ORG) < loop1_CAPVD_slow) && (g_rel_hold_tick == 0) && (g_neg_rel_hold_cnt == 0)) { // 方案A + V4.36.42(G3) 最小保持
#else #else
if ((g_rel_hold_tick == 0) && rel_release_hit()) { // V4.36.42(G3) 最小保持 + V4.36.19 低Q 平滑/带回加宽 if ((g_rel_hold_tick == 0) && (g_neg_rel_hold_cnt == 0) && rel_release_hit()) { // V4.36.42(G3) 最小保持 + V4.36.19 低Q 平滑/带回加宽
#endif #endif
if (loop1_cnt_release == 0) { if (loop1_cnt_release == 0) {
/* 过渡事件: 第一次命中离开线 (定位"为什么开始释放") */ /* 过渡事件: 第一次命中离开线 (定位"为什么开始释放") */
@@ -1630,6 +1657,7 @@ void vd1_task(void)
Hold_CNT = 0; Hold_CNT = 0;
loop1_cnt_release = 0; loop1_cnt_release = 0;
g_rel_hold_tick = 0; /* V4.36.42(G3): 释放即清保持 */ g_rel_hold_tick = 0; /* V4.36.42(G3): 释放即清保持 */
g_neg_rel_hold_cnt = 0; /* V4.36.44(P1): 负偏差离开冻结计数清零 */
g_origin_freeze_tick = REL_ORIGIN_FREEZE_TICKS; /* V4.36.26: 释放后 Origin 均值窗冻结 */ g_origin_freeze_tick = REL_ORIGIN_FREEZE_TICKS; /* V4.36.26: 释放后 Origin 均值窗冻结 */
g_origin_lowlearn_tick = ORIGIN_LOWLEARN_TICKS; /* V4.36.32: 冻结后降权期预置 */ g_origin_lowlearn_tick = ORIGIN_LOWLEARN_TICKS; /* V4.36.32: 冻结后降权期预置 */
} }
@@ -1643,7 +1671,7 @@ void vd1_task(void)
if (g_q_lo) { if (g_q_lo) {
uint32_t _entry_ln = vac_ref() - uint32_t _entry_ln = vac_ref() -
(((uint32_t)loop1_Origin * SensTable[loop1_SensLevel]) >> 16); /* V4.36.31: 锚真空参考 */ (((uint32_t)loop1_Origin * SensTable[loop1_SensLevel]) >> 16); /* V4.36.31: 锚真空参考 */
if (g_rel_smooth > _entry_ln) { if ((g_rel_smooth > _entry_ln) && (g_neg_rel_hold_cnt == 0)) { /* V4.36.44(P1) */
g_rel_band_cnt++; g_rel_band_cnt++;
if (g_rel_band_cnt >= REL_BAND_TIMEOUT_TICKS) { if (g_rel_band_cnt >= REL_BAND_TIMEOUT_TICKS) {
g_rel_band_cnt = 0; g_rel_band_cnt = 0;
@@ -1657,6 +1685,7 @@ void vd1_task(void)
loop1_ORG_SUM = 0; loop1_ORG_SUM = 0;
Hold_CNT = 0; Hold_CNT = 0;
loop1_cnt_release = 0; loop1_cnt_release = 0;
g_neg_rel_hold_cnt = 0; /* V4.36.44(P1) */
g_origin_freeze_tick = REL_ORIGIN_FREEZE_TICKS; g_origin_freeze_tick = REL_ORIGIN_FREEZE_TICKS;
g_origin_lowlearn_tick = ORIGIN_LOWLEARN_TICKS; /* V4.36.32: 冻结后降权期预置 */ g_origin_lowlearn_tick = ORIGIN_LOWLEARN_TICKS; /* V4.36.32: 冻结后降权期预置 */
} }