feat(V4B): V4.31 — 故障补偿时序再调: 预判2s + 补偿7s (总恢复 ~15s)

V4.30 基础上现场手感再收紧: ENV_WARN_WAIT 300→200(2s);
ENV_RESYNC_WAIT 800→700(7s); 恢复确认 200(2s) 不变
时序: 2s 黄灯预判锁存 → 7s 进入学习 → 6s 学完原子替换 → 2s 确认灭
test_env_resync.c 同步 → 5 场景 ALL PASS (warn@200, applied@1300, 灭@1500)
文档: devlog V2.29 / spec V2.10 / design doc v0.8
This commit is contained in:
wangfq
2026-09-03 16:16:37 +08:00
parent 4200d96250
commit 7983bfd72d
7 changed files with 59 additions and 29 deletions
+1
View File
@@ -14,6 +14,7 @@
| v0.5 | 2026-09-03 | **L 估算标定(V4.28**:五组 LCR 实测反推振荡回路等效谐振电容 C_eff=41.3~45.5nF(均值 43),与名义 66nF 明显不符 → 固件改标定值 COIL_CAL_C_NF=43L_uH=2.533e7/(f²×C_eff));COIL_DEF_C_NF 保留为名义口径。残差 ±6% 内,待多线圈/标定电感进一步收口 |
| v0.6 | 2026-09-03 | **硬件修复后定稿(V4.29**:拨码三极管 5.1K→0Ω → 低频档并联全导通,C_eff=68.1~68.9(均值 68.4)≈名义 66。v0.5 的 43 为 5.1K 旧板带病特性(开关未饱和),**作废**COIL_CAL_C_NF 43→68,残差 ≤1.5%。33nF 档标定 34(旧板数据)待 0Ω 板复测 |
| v0.7 | 2026-09-03 | **故障补偿时序(V4.30**:预判 3sENV_WARN_WAIT 300)→ 补偿 8sENV_RESYNC_WAIT 800)→ 学习 3×2s → 替换后空闲 2s 恢复确认(ENV_RECOVER_WAIT 200)黄灯灭;总恢复 ~16s |
| v0.8 | 2026-09-03 | **故障补偿时序再调(V4.31**:预判 2sENV_WARN_WAIT 200)→ 补偿 7sENV_RESYNC_WAIT 700)→ 学习 3×2s → 替换后空闲 2s 恢复确认黄灯灭;总恢复 ~15s |
## 1. 背景
+28
View File
@@ -4,6 +4,33 @@
---
## 2026-09-03 — 故障补偿时序再调:预判2s + 补偿7s(固件 V4.31
> **固件版本:V4.31**cmcng.hFIRMWARE_VER="4.31" + MAIN=4/SUB=31)。devlog 修订 V2.29。
### 拍板规格(2026-09-03V4.30 基础上现场手感再收紧)
1. **黄灯预判 3s → 2s**ENV_WARN_WAIT 300→200):高位持续 2s 黄灯预判锁存常亮
2. **故障补偿 8s → 7s**ENV_RESYNC_WAIT 800→700):累计 7s 高位进入基线学习
3. 恢复确认保持 **2s**ENV_RECOVER_WAIT 200 不变)
时序:2s 黄灯亮 → 7s 触发学习 → 6s(3×200tick)学完替换 → 2s 确认灭;总恢复 **~15s**
### 验证(test_env_resync.c 同步,5 场景 ALL PASS
| 场景 | 期望 | 实测 |
|------|------|------|
| 永久变化 | warn@200 / applied@~1300 / 替换后 200tick 灭 | warn_at=200 ✓ applied_at=1300 ✓ 灭 ✓ |
| 瞬态 6s(<7s) | 锁存不学, 空闲 2s 灭 | ✓ |
| 学习期压线 | 搁置不退出 → 学完替换 | ✓ (applied_at=1301) |
| 不稳学习 | 预算放弃, 不污染 | abort ✓ Origin 不变 ✓ |
| 替换后稳态 | 无重复学习 | ✓ |
### 待现场验证
- A 拿走:~2s 黄灯亮 → ~13s 基线切 B → ~15s 黄灯灭
- 补偿触发提前到 7s:持续 7~10s 强磁干扰会触发学习(原 10s/8s 边界继续提前)——黄灯 2s 预警先亮
## 2026-09-03 — 故障补偿时序调整:预判3s + 补偿8s + 恢复2s(固件 V4.30
> **固件版本:V4.30**cmcng.hFIRMWARE_VER="4.30" + MAIN=4/SUB=30)。devlog 修订 V2.28。
@@ -1263,6 +1290,7 @@ if (dev >= dlt_ORG × 4) {
| 版本 | 时间 | 说明 |
|------|------|------|
| V2.29 | 2026-09-03 | V4.31 故障补偿时序再调: 预判2s(200)/补偿7s(700)/恢复2s, 总 ~15s |
| V2.28 | 2026-09-03 | V4.30 故障补偿时序: 预判3s(300)/补偿8s(800)/恢复2s(200), 总 ~16s |
| V2.27 | 2026-09-03 | V4.29 硬件修复(拨码三极管5.1K→0Ω)后 C_eff=68.1~68.9nF≈名义66, COIL_CAL_C_NF 43→68 (旧43为5.1K带病特性作废) |
| V2.26 | 2026-09-03 | V4.28 电感量估算引入标定 COIL_CAL_C_NF=43(名义 66nF vs 实测 C_eff≈435 组反推 41.3~45.5nF);残差 ±6% |
+6 -5
View File
@@ -1,6 +1,6 @@
# DLD154V4B 技术规格书
> 单路线圈车辆检测器 | 固件版本: V4.30 | 文档版本: V2.9
> 单路线圈车辆检测器 | 固件版本: V4.31 | 文档版本: V2.10
> 本文档面向工程开发、系统集成及故障深度分析
---
@@ -365,7 +365,7 @@ if (!VD_FLAG) {
| 4× 冻结阈值 | 防止异常 CAPVD 上升污染基线(V1.5 |
| 5% 斜率限幅 | 过滤 EMI/闪电尖峰,保护 IIRV2.0 |
| 冻结超时 + 稳定性检查 | 防止永久冻结死锁(V2.3~2.5 |
| 环境重校准(V4.24/26/30 | dev>+4×dlt 高位连续 8sENV_RESYNC_WAITV4.26 60s→10sV4.30→8s)→ 判定永久环境变化 → 学习基线 B(空闲窗均值+判稳,黄灯常亮)→ 原子替换 Origin;铁块类瞬态 8s 内仍只冻结不污染 |
| 环境重校准(V4.24/26/30/31 | dev>+4×dlt 高位连续 7sENV_RESYNC_WAITV4.26 60s→10sV4.30→8sV4.31→7s)→ 判定永久环境变化 → 学习基线 B(空闲窗均值+判稳,黄灯常亮)→ 原子替换 Origin;铁块类瞬态 7s 内仍只冻结不污染 |
#### 4.4.3 基线更新速率(两阶段)
@@ -450,9 +450,9 @@ if (dev < dlt_ORG * 4) {
| STABLE_SETTLE_WINDOWS | 2 | ~2 s | 连续窗口漂移达标数 |
| STABLE_MAX_SAMPLES | 500 tick | **~5 s** | 自检硬兜底上限(超时强制判稳) |
| FREEZE_TIMEOUT | 1000 | **~10 s** | 基线冻结超时(连续稳定后更新 Origin) |
| ENV_WARN_WAIT | 300 tick | **~3 s** | 环境预判锁存(V4.30):dev>+4×dlt 高位连续 3s → 黄灯常亮预判(锁存) |
| ENV_RECOVER_WAIT | 200 tick | ~2 s | 恢复确认(V4.30):新基线替换后 环境空闲连续 2s 才解除预判锁存、黄灯灭(回摆/目标靠近保持常亮) |
| ENV_RESYNC_WAIT | 800 tick | **~8 s** | 环境重校准等待:dev>+4×dlt 高位连续 8s 判定永久环境变化(V4.30 拍板:60s→10s→8s |
| ENV_WARN_WAIT | 200 tick | **~2 s** | 环境预判锁存(V4.31):dev>+4×dlt 高位连续 2s → 黄灯常亮预判(锁存) |
| ENV_RECOVER_WAIT | 200 tick | ~2 s | 恢复确认(V4.31):新基线替换后 环境空闲连续 2s 才解除预判锁存、黄灯灭(回摆/目标靠近保持常亮) |
| ENV_RESYNC_WAIT | 700 tick | **~7 s** | 环境重校准等待:dev>+4×dlt 高位连续 7s 判定永久环境变化(V4.31 拍板:60s→10s→8s→7s |
| ENV_LEARN_WINDOW | 200 tick | ~2 s | 环境学习窗口(基线 B 均值窗,学习期黄灯常亮) |
| ENV_LEARN_MAX_TICKS | 3000 tick | **~30 s** | 学习预算:窗口不稳超时放弃,保留旧 Origin(防死锁) |
| COIL_F_OK_MIN_KHZ | 20 kHz | — | 线圈频率合理窗下界(V4.26):默认低频档口径,f<20kHz → L偏大告警 |
@@ -775,3 +775,4 @@ DLD154V4B V1.4 起实现该专利的整数化版本,用于大车通行时的
| V2.7 | 2026-09-03 | 更新至 V4.28L 估算引入标定等效谐振电容 COIL_CAL_C_NF=43(名义 66nF 与实测 C_eff≈43 不符;5 组实测 41.3~45.5nF |
| V2.8 | 2026-09-03 | 更新至 V4.29:硬件修复(拨码三极管 5.1K→0Ω)使低频档并联全导通,C_eff 43→68.4≈名义66COIL_CAL_C_NF 43→68 |
| V2.9 | 2026-09-03 | 更新至 V4.30:故障补偿时序 预判 5s→3s(300)/补偿 10s→8s(800)/恢复确认 5s→2s(200),总恢复 ~16s |
| V2.10 | 2026-09-03 | 更新至 V4.31:预判 3s→2s(200)/补偿 8s→7s(700),总恢复 ~16s→~15s |
+18 -18
View File
@@ -1,13 +1,13 @@
/*
* test_env_resync.c (线) gcc (DLD154V4B V4.30)
* test_env_resync.c (线) gcc (DLD154V4B V4.31)
*
* = TaskLoop.c vd1_task() dev>0 (V4.24/25/26/30), :
* = TaskLoop.c vd1_task() dev>0 (V4.24/25/26/30/31), :
* - dev>+4dlt: (g_env_wait_cnt) ENV_WARN_WAIT g_env_warn
* - ENV_RESYNC_WAIT g_env_resync(; 线/=)
* - : 200 /, 0.1% 2 env_resync_apply
* - ENV_LEARN_MAX_TICKS abort
* - dev>-dlt ENV_RECOVER_WAIT g_env_warn ()
* V4.30 : 3s + 8s + 2s
* V4.31 : 2s + 7s + 2s
* ( ENV_* !)
*/
#include <stdio.h>
@@ -17,9 +17,9 @@
#include <stdint.h>
/* ===== 镜像固件宏 (TaskLoop.c/TaskLoop.h 同步) ===== */
#define ENV_WARN_WAIT 300 /* V4.30: 预判 3s */
#define ENV_WARN_WAIT 200 /* V4.31: 预判 2s */
#define ENV_RECOVER_WAIT 200 /* V4.30: 替换后空闲 2s 恢复确认 */
#define ENV_RESYNC_WAIT 800 /* V4.30: 补偿(学习等待) 8s */
#define ENV_RESYNC_WAIT 700 /* V4.31: 补偿(学习等待) 7s */
#define ENV_LEARN_WINDOW 200
#define ENV_LEARN_MAX_TICKS 3000
#define STABLE_ORIGIN_PPT 1
@@ -164,7 +164,7 @@ static void reset_all(void)
sim_tick_cnt = 0;
}
/* ===== 场景 1: 永久变化 (A 拿走) — 3s 预判 → 8s 触发 → 3窗学完 ~14s 替换 → +2s 灭 ===== */
/* ===== 场景 1: 永久变化 (A 拿走) — 2s 预判 → 7s 触发 → 3窗学完 ~13s 替换 → +2s 灭 ===== */
static void test_permanent_change_recovers(void)
{
int tick, warn_at = 0;
@@ -179,9 +179,9 @@ static void test_permanent_change_recovers(void)
if (sim_applied_cnt)
break;
}
printf("1. 永久变化: warn_at=%d learn_start=%d applied_at=%d Origin=%u (期望 300 / 1 / ~1400 / 128856)\n",
printf("1. 永久变化: warn_at=%d learn_start=%d applied_at=%d Origin=%u (期望 200 / 1 / ~1300 / 128856)\n",
warn_at, sim_learn_start_cnt, (int)sim_tick_cnt, sim_Origin);
assert(warn_at == 300);
assert(warn_at == 200);
assert(sim_learn_start_cnt == 1);
assert(sim_applied_cnt == 1);
assert(sim_Origin == 128856UL);
@@ -204,11 +204,11 @@ static void test_transient_keeps_warn(void)
int loop;
reset_all();
for (loop = 0; loop < 700; loop++) { /* 7s 高位 */
for (loop = 0; loop < 600; loop++) { /* 6s 高位 */
sim_CAPVD = 128856UL;
sim_tick();
}
printf("2. 瞬态 7s 高位: warn=%d learn=%d (期望 1 / 0)\n", g_env_warn, sim_learn_start_cnt);
printf("2. 瞬态 6s 高位: warn=%d learn=%d (期望 1 / 0)\n", g_env_warn, sim_learn_start_cnt);
assert(env_warn_active() == 1);
assert(sim_learn_start_cnt == 0);
@@ -226,14 +226,14 @@ static void test_transient_keeps_warn(void)
assert(g_env_warn == 0);
assert(sim_learn_start_cnt == 0);
for (loop = 0; loop < 700; loop++) { /* 再 7s 高位 → 重新锁存, 仍不学 */
for (loop = 0; loop < 600; loop++) { /* 再 6s 高位 → 重新锁存, 仍不学 */
sim_CAPVD = 128856UL;
sim_tick();
}
printf(" 二次 7s 高位: warn=%d learn=%d (期望 1 / 0)\n", g_env_warn, sim_learn_start_cnt);
printf(" 二次 6s 高位: warn=%d learn=%d (期望 1 / 0)\n", g_env_warn, sim_learn_start_cnt);
assert(g_env_warn == 1);
assert(sim_learn_start_cnt == 0);
printf("2. 瞬态高位(<8s)不学, 锁存保持, 恢复确认后灭 OK\n");
printf("2. 瞬态高位(<7s)不学, 锁存保持, 恢复确认后灭 OK\n");
}
/* ===== 场景 3: 学习期目标压线 = 搁置(不退出) → 走后再学完 → 替换 ===== */
@@ -243,7 +243,7 @@ static void test_interrupted_learn_recomputes(void)
int applied_at = 0;
reset_all();
for (loop = 0; loop < 800; loop++) { /* 8s → 学习开始 */
for (loop = 0; loop < 700; loop++) { /* 7s → 学习开始 */
sim_CAPVD = 128856UL;
sim_tick();
}
@@ -287,7 +287,7 @@ static void test_unstable_learn_gives_up(void)
int i;
reset_all();
for (loop = 0; loop < 800; loop++) {
for (loop = 0; loop < 700; loop++) {
sim_CAPVD = 128856UL;
sim_tick();
}
@@ -314,7 +314,7 @@ static void test_no_repeat_learn(void)
int loop;
reset_all();
for (loop = 0; loop < 800; loop++) {
for (loop = 0; loop < 700; loop++) {
sim_CAPVD = 128856UL;
sim_tick();
}
@@ -343,12 +343,12 @@ static void test_no_repeat_learn(void)
int main(void)
{
printf("test_env_resync (V4.30: 预判3s/补偿8s/恢复2s)\n");
printf("test_env_resync (V4.31: 预判2s/补偿7s/恢复2s)\n");
test_permanent_change_recovers();
test_transient_keeps_warn();
test_interrupted_learn_recomputes();
test_unstable_learn_gives_up();
test_no_repeat_learn();
printf("ALL PASS (ENV_WARN 300 / RESYNC 800 / RECOVER 200)\n");
printf("ALL PASS (ENV_WARN 200 / RESYNC 700 / RECOVER 200)\n");
return 0;
}
@@ -46,8 +46,8 @@
#define ENTRY_CONFIRM 3 // 进入确认: 连续 N 次低于阈值才判定有车
#define FREEZE_TIMEOUT 1000 // 基线冻结超时: ~10s @ 10ms/tick, 持续偏高且稳定后强制更新基线
#define FREEZE_STABILITY_RATE 2 // 冻结稳定性窗口: 参考值的 ±2% (CAPVD 需在此范围内才累计超时)
#define ENV_WARN_WAIT 300 // 环境预判 (V4.30): dev>+4dlt 高位连续 ~3s → 黄灯预判锁存(回摆保持)
#define ENV_RECOVER_WAIT 200 // 恢复确认 (V4.30): 新基线替换后 环境空闲连续 ~2s 才解除预判, 黄灯灭
#define ENV_WARN_WAIT 200 // 环境预判 (V4.31): dev>+4dlt 高位连续 ~2s → 黄灯预判锁存(回摆保持)
#define ENV_RECOVER_WAIT 200 // 恢复确认 (V4.31): 新基线替换后 环境空闲连续 ~2s 才解除预判, 黄灯灭
#define COIL_F_OK_MIN_KHZ 20 // 线圈频率合理窗 (V4.26): 默认低频档口径, <20kHz → L偏大
#define COIL_F_OK_MAX_KHZ 120 // 线圈频率合理窗 (V4.26): >120kHz → L偏小
#define COIL_CAL_C_NF 68 // 标定等效谐振电容 nF (V4.29): 0Ω板 低频档(66nF名义)实测 C_eff=68.1~68.9 (均值68.4)
+2 -2
View File
@@ -14,10 +14,10 @@
#define __CMCNG_H__
#define PRODUCT_MODEL "DLD154"
#define FIRMWARE_VER "4.30"
#define FIRMWARE_VER "4.31"
#define HARDWARE_VER "3.00"
#define FIRMWARE_VER_MAIN 4
#define FIRMWARE_VER_SUB 30
#define FIRMWARE_VER_SUB 31
#define HARDWARE_VER_MAIN 3
#define HARDWARE_VER_SUB 0
@@ -875,7 +875,7 @@ void vd1_task(void)
#define STABLE_ORIGIN_PPT 1 // 基准稳定判据: 窗口均值漂移 ≤ Origin×1/1000 (0.1%)
#define STABLE_SETTLE_WINDOWS 2 // 连续 2 个窗口(每窗100样本≈1s)漂移达标 → 判稳
#define STABLE_MAX_SAMPLES 500 // 硬兜底: 5s 未判稳强制结束自检(防绿灯无限闪)
#define ENV_RESYNC_WAIT 800 // V4.30: dev>+4dlt 高位连续 8s → 判定永久环境变化 (拍板: 预判3s + 补偿8s + 恢复2s)
#define ENV_RESYNC_WAIT 700 // V4.31: dev>+4dlt 高位连续 7s → 判定永久环境变化 (拍板: 预判2s + 补偿7s + 恢复2s)
#define ENV_LEARN_WINDOW 200 // V4.24: 环境学习窗口 2s (200×10ms)
#define ENV_LEARN_MAX_TICKS 3000 // V4.24: 学习预算 30s, 超时放弃 (防黄灯常亮死锁)
@@ -1018,7 +1018,7 @@ void vd1_task(void)
} else {
/* 负variation (CAPVD高于Origin, 特殊铁块磁导率主导/异常高)
* V4.24 :
* 10s(ENV_RESYNC_WAIT): , Origin
* 7s(ENV_RESYNC_WAIT): , Origin
* (36321a1 : Origin )
* 60s "永久环境变化"(A拿走)
* : B + settle Origin