Commit Graph
42 Commits
Author SHA1 Message Date
wangfq 97a7fb2dba fix(V4B): 方案A现场复核修正 V4.04 — RELEASE_ALFA 18→21(精确τ117ms对齐PD132T) + 进入snap消除HR0/2假释放
现场金属板复测两现象:
1. 慢速抬板释放高度 V4B 仍比 PD132T 高一点(跟手速有关) — 根因: τ对齐用了近似口径
   (α18 精确τ≈137ms vs PD132T α79@43.7ms 精确τ≈118ms, α=79时 T×256/α 高估19.6%)
   + V4B 3次确认30ms。修正: RELEASE_ALFA 18→21 (精确τ≈117ms)。
2. 定在HR0/2(释放高度一半)保持~1s V4B释放、PD132T不释放 — 根因: 双滤波进入瞬态假释放
   (快滤波30ms确认进入, 慢滤波还悬在基线附近, 残余信号0.032%~0.044%时释放条件瞬时为真)。
   修正: 进入确认瞬间 snap loop1_CAPVD_slow = loop1_CAPVD (进入线恒深于离开线, 释放条件结构性为假)。

验证: gcc单测 τ fast=30ms/slow=120ms, 释放时机差 200ms ✓
仿真: 3s抬升高度差 +9mm→+3mm; 0.10%板HR0/2假释放消除 ✓
文档: devlog V2.13 + technical-spec §4.3.3
2026-09-01 09:46:55 +08:00
wangfq 9391e1b808 feat(V4B): 释放手感对齐 PD132T — 释放慢滤波(方案A, 固件 V4.03)
现场金属板测试: 灵敏度表已对齐, 但释放高度 V4B 比 PD132T 低
(刚离开触发位置即释放 vs 需离更远)。根因: IIR 滤波时间常数差异
(V4B 10ms+α79→τ32ms vs PD132T 43.7ms+α79/64→τ142~175ms),
释放阈值浅(进入20%)放大差异。

修复(USE_SLOW_RELEASE 开关, 默认 1):
- 新增独立慢滤波 loop1_CAPVD_slow(α=18/256 @10ms→τ≈142ms),
  吃原始 Value 不经斜率限幅, 复刻 PD132T 恢复速度
- 离开判定改用慢滤波值, 进入路径不变
- RELEASE_ALFA=18 可调(PD132T SET_FLT=ON 时用 15≈τ170ms)
- 同步: INIT_VD/稳定期/线圈重连
- 版本 V4.03(顺带修正 cmcng.h 字符串"4.00"与数字 4/2 不一致)

验证: gcc 单测 tests/test_release_slow_filter.c
τ fast=30ms/slow=140ms; 释放时机差 260ms ✓
文档: technical-spec §4.3.3 + devlog V2.12
待板级: 真机金属板测试 + MRS 编译
2026-08-31 16:52:45 +08:00
wangfq f0f2c29a04 V2.11: 灵敏度表全档与PD132T完全一致{300,60,32,21}/{60,32,21,14}(用户本机已调) + 全文档同步 2026-08-28 17:39:07 +08:00
wangfq e3fe373fe5 V2.11: 离开表改回分档{60,32,21,14}——现场确认SENUP标贴OFF=SET_ASB=1(出厂默认) + 文档同步 2026-08-28 11:55:30 +08:00
wangfq 7b2de21ef4 V2.11: 离开表恒14对齐PD132T默认(ASB=OFF), 进入+离开双向对齐 + 文档同步 2026-08-28 11:40:49 +08:00
wangfq b3bbb29300 feat(DLD154V4B): V2.11 灵敏度 0/1 档对齐 PD132T(216/108→300/60)
PD132T 客户现场替换平滑交付:
- SensTable {216,108,36,20} → {300,60,36,20}
  0/1 档严格对齐 PD132T (Δf/f 0.33%/0.16%→0.46%/0.09%)
  2/3 档保持 V4B 优化值 (与 PD132T 32/21 几乎一致)
- 离开表不动 (3 次确认+滞回已更稳)
- 文档同步: technical-spec/product-manual/release-notes/devlog (V2.11)
- 完整交付分析: vd-analysis/docs/pd132t-to-v4b-delivery-alignment.md
2026-08-28 10:38:02 +08:00
wangfq 794e097587 fix(DLD154V4B): 修复 WDT_DIV 分频枚举传值 bug — 实际分频 4 导致 410ms 超时不断复位
现场实测 LIMIT=100 (500ms 喂狗) 不断复位重启, 改 50 正常。
根因: wdt_divider_set() 参数是枚举值 (WDT_CLK_DIV_16=0x02),
宏误传 16 (0b10000) -> 3bit 寄存器截断为 0 = WDT_CLK_DIV_4
-> 实际分频 4, 超时 4x4096/40k = 410ms < 500ms 喂狗周期。
修复: WDT_DIV=2 (枚举值) + (wdt_division_type) 显式转换。
隔离测试 mock 升级为 3bit 截断+反推分频, 复现 bug 并断言修复。
vd960Loop 原实现用 WDT_CLK_DIV_64 枚举写法, 无此问题。
2026-08-28 09:08:42 +08:00
wangfq 8f43f8f1c9 feat(DLD154V4B): V2.10 新增 IWDT 硬件看门狗(超时≈1.64s,双保险喂狗)
- 对齐 DLD154Pro V3.03 方案: TMR15 ISR 5ms 递增 g_wdg_counter,
  主循环 poll_wdg() 每 500ms 喂狗, 超时 16×4096/40k ≈ 1.64s
- 双保险: ISR 死→计数不涨→永不喂狗; 主循环死→poll_wdg 不执行→复位
- main() 使能后立即喂一次, 给 FreeRTOS 启动留足时间
- 隔离测试 5 项断言全过 (init 配置/10s 喂狗 20 次/ISR 死不喂/边界 99-100 tick)
- 文档同步: technical-spec(架构图+§13.1 机制) / release-notes(V2.10)
  / product-manual(特性+版本) / roadmap / devlog
2026-08-28 08:56:33 +08:00
wangfq 859842aba0 feat(DLD154V4B): V2.9 平坦性离开判定默认关闭(现场实测不理想)+ 全量文档同步
- TaskLoop.h: USE_FLATNESS_EXIT 1→0,离开判定切回简单滞回 3 次防抖
  (与 DLD154Pro 一致);平坦性代码保留 #if 内可一行开启
- technical-spec: 模式1标默认(V2.9起)/模式2标禁用;修正模式1伪代码
  方向错误(CAPVD<Origin+dlt → (Origin-dlt)<CAPVD);延迟/误检率表同步
- product-manual/release-notes: 离开判定口径改'滞回+连续确认(平坦性可选)',
  最高档灵敏度 0.015%→0.031%(V2.8 残留);版本历史补 V2.7/V2.8 缺行
- roadmap: V2.6→V2.9 行更新 + 突破表离开判定
- devlog: 置顶 2026-08-28 条目(背景/决定/同步清单)
2026-08-28 08:45:34 +08:00
wangfq 50dbb07dde feat(DLD154V4B): 灵敏度最高档调整 SENS=3 10→20 + 文档同步
- src/TaskLoop.c: SensTable[3] 10→20 (Δf/f 0.015%→0.031%,
  ΔL/L 0.031%→0.061%), SensTable_1[3] 9→14 (滞回 90%→70%) —
  最高档原阈值贴近噪声底易误触发, 提高并加大滞回
- src/main.c: 注释掉重复定义 g_input_div=1 (TaskLoop.c:23 已有, 清理 ODR)
- docs/technical-spec.md §4.3.1 灵敏度表+表格+口径说明
- docs/reference_analysis.md §5.6 灵敏度表
- docs/devlog.md 置顶 2026-08-27 条目 + 修订记录 V2.8
2026-08-27 16:22:58 +08:00
wangfq 8f951b356f tune: 稳定期基线窗口 500→100, 开机 Origin 收敛加速
稳定期用 100 样本 × 10ms = 1s 快速收敛, 开机即用。
稳定后切换为 WINDOW_ORIGIN=500 (5s) 提供更强的噪声抑制。
2026-06-29 18:45:29 +08:00
wangfq e839943436 refactor: 去掉快速 IIR,单路 IIR ALFA_CAP1=79 @10ms (τ≈32ms)
ALFA_CAP1=79 @10ms, τ≈32ms — 已足够快,无需双路 IIR 的复杂度。
保留所有 V2 保护机制: 斜率限幅、进入确认、冻结超时+稳定性检查。

改动:
- ALFA_CAP1: 18→79
- 删除 CAPVD_fast 变量及双路 IIR 逻辑
- 进入检测改用 CAPVD 直接判定(仍保留 ENTRY_CONFIRM=3)
- 净删 50 行,架构更简洁
2026-06-29 18:35:13 +08:00
wangfq 3ddde99273 fix: 快速 IIR 斜率限幅参考改为 CAPVD_fast,解决 ALFA_CAP1=18 响应慢
根因: 斜率限幅 max_step = CAPVD × 5%,但 CAPVD 受 ALFA_CAP1=18
拖累(τ=135ms),在车辆骤入时移动不足,导致 clamped_value 被过度砍削。
快速 IIR 吃到的 fast_input 已经是"被慢速 CAPVD 限制过的值"。

修复: 快速路径独立做斜率限幅,参考 CAPVD_fast (τ=28ms)。
两路各用各的参考基准,快慢解耦:
  慢速: clamped = clamp(Value, CAPVD ± 5%)  → IIR_slow → CAPVD
  快速: fast_input = clamp(Value, CAPVD_fast ± 5%) → IIR_fast

ALFA_CAP1 只影响基线跟踪,不再拖累进入检测速度。
2026-06-29 17:56:38 +08:00
wangfq ee00176cdd fix: 快速 IIR 输入改为限幅后原始值,不再经慢速 IIR 滞后
根因: CAPVD_fast = (CAPVD_fast + CAPVD) / 2 中 CAPVD 已被
ALFA_CAP1=18 (τ=135ms) 严重滞后。快速 IIR 的 α=0.5 无法
恢复前级丢失的响应速度,导致 ALFA_CAP1=18 的实际进入灵敏度
显著低于 ALFA_CAP1=79(旧设计)。

修复: 快速 IIR 直接吃斜率限幅后的 clamped_value / Value,
完全跳过慢速 IIR,真正实现 τ≈28ms 的响应速度。

数据流:
  旧: Value → 斜率限幅 → IIR_slow(α=18/256) → CAPVD
                                           └→ CAPVD_fast = avg(CAPVD_fast, CAPVD)  ← 滞后
  新: Value → 斜率限幅 → IIR_slow(α=18/256) → CAPVD
                       └→ CAPVD_fast = avg(CAPVD_fast, clamped_value)               ← 快速
2026-06-29 17:27:10 +08:00
wangfq f988f08ead clean: 删除死代码 ALFA_FAST — 快速 IIR 用 (old+new)/2 等价实现
快速 IIR α=128/256=0.5, 公式: new = old + (delta * 128) >> 8
等价于: new = (old + new_val) / 2  (当 α=0.5 时数学恒等)

后者无需乘法和移位,更高效。ALFA_FAST 宏从未被引用。
2026-06-29 17:16:46 +08:00
wangfq 353fd575fc fix: update_moving_average window 参数 uint8_t→uint16_t
WINDOW_ORIGIN=500 超出 uint8_t 范围,会被截断为 244。
改为 uint16_t 支持 WINDOW_ORIGIN 最大到 60000+。
2026-06-29 15:55:58 +08:00
wangfq 9391d46ff4 tune: WINDOW_ORIGIN 100→500, 基线更新 1s→5s 对齐 M1H
- 新增 WINDOW_ORIGIN 宏,替换硬编码 100
- 500 × 10ms = 5s, 与 M1H 原始设计一致
- 500 样本滑动平均提供更强的噪声抑制
- vd960Loop 同步修改
2026-06-29 15:37:10 +08:00
wangfq df8e59803a tune: 冻结超时 30s→10s (FREEZE_TIMEOUT 3000→1000) 2026-06-29 10:48:48 +08:00
wangfq fec67d6f20 feat: 冻结超时增加稳定性检查 — CAPVD波动超±2%则重置计数
问题: 上次提交仅计数冻结持续时长,若CAPVD在冻结期间大幅波动
(如车辆缓慢驶入过程中CAPVD持续爬升),30s后也会被误认为"环境变化"。

方案:
- 新增 loop1_freeze_ref: 记录进入冻结时的CAPVD值
- 每tick检查 |CAPVD - freeze_ref| > freeze_ref * 2%
- 波动超限 → 重置计数并以当前值重新开始计时
- 只有CAPVD连续30s稳定在±2%窗口内 → 才更新Origin

这确保了"连续稳定的新值"而非"连续偏高但波动的值"才会触发基线更新。
2026-06-29 10:30:01 +08:00
wangfq 269fa7f4cc feat: 基线冻结超时 — 持续偏高30s后强制更新Origin
问题: 原点保护冻结基线后,若CAPVD因环境变化(温度、器件老化等)
稳定在新的高频值,Origin永远不会更新,导致永久误判有车。

方案:
- 新增 FREEZE_TIMEOUT=3000 (~30s @ 10ms/tick)
- CAPVD偏离时 loop1_freeze_cnt 逐帧递增
- 超时后强制 Origin = CAPVD(当前稳定值),视为新常态
- 中途若CAPVD回归正常范围,计数清零,继续正常跟踪
- 车辆进入时同步清零冻结计数
2026-06-29 10:24:53 +08:00
wangfq 16090a48fa fix: 稳定期内绕过斜率限幅和 IIR,直接用 Value 建立基线
根因: 首测 CAPVD=177406 是瞬态高值 (~38% 偏高),
5% 斜率限幅让 CAPVD 在 128 tick 稳定期内无法充分收敛,
100 窗口滑动平均被前半段高值污染:
  Origin=149755 vs 真实值~128688, 差值 21067 >> dlt_ORG=82

修复: 稳定期内直接将 CAPVD/CAPVD_fast 设为 raw Value,
不做斜率限幅和 IIR, 使基线 100 窗口快速收敛到真实值。
稳定期结束后恢复正常 IIR+斜率限幅用于检测。
2026-06-26 16:23:47 +08:00
wangfq e0e79db40e fix: CAPVD_fast 初始化条件错误导致始终为 0
根因: TMR3 ISR 首次捕获时直接设置 loop1_CAPVD (不为 0),
导致 vd1_task 的 if(CAPVD==0) 分支永远不执行,
CAPVD_fast 保持 INIT_VD 的 0 值。

修复: CAPVD_fast 判断改为 ==0 时首次锁定为当前 CAPVD 值,
后续正常执行快速 IIR 更新。
2026-06-26 16:17:01 +08:00
wangfq 17e4b07860 feat: M4 核心优化 V2.0 — 双路 IIR + 斜率限幅 + 进入确认
三项改进突破 8051 时代限制:
1. 10ms tick + 双路 IIR
   - CAPVD (慢速): α=18/256, τ=135ms — 基线跟踪,等效原 50ms 设计
   - CAPVD_fast (快速): α=0.5, τ=28ms — 检测判定,比原快 5×

2. 斜率限幅 (MAX_SLOPE_RATE=5%)
   - EMI/闪电瞬态尖峰被截断
   - 真实车辆缓慢频率漂移不受影响

3. 进入确认 (ENTRY_CONFIRM=3)
   - 连续 3 次 CAPVD_fast 低于阈值才判有车
   - 单次干扰无法通过 → 误触发率大幅降低

进入响应 ~530ms (比原 550ms 还快), 基线稳定性不变
2026-06-26 16:05:00 +08:00
wangfq 0abb7f2b21 fix: vTaskDelay 10→50ms 对齐 TMR15 5ms×10 原始设计 2026-06-26 14:40:06 +08:00
wangfq c73c9dae2b docs: 添加产品发布说明 (V1.6 release notes) 2026-06-24 10:13:26 +08:00
wangfq 2f6cb54847 fix: 时序参数修正 — OUT/PULSE_DELAY 均为500ms
- OUT_DELAY: 1.9s→500ms (10 tick), SW_4=ON时生效, OFF时为0
- PULSE_DELAY: 950ms→500ms (10 tick), 固定不变
- 删除 OUT_DELAY_FAST/PULSE_DELAY_FAST, 仅保留一组值
- SW_4 语义: 0=无离开延时, 1=500ms离开延时
- 同步更新产品手册、技术规格书、README、devlog
2026-06-24 09:13:46 +08:00
wangfq 034a82f024 fix: SW4 快速模式 — 离开和脉冲延时均缩短为500ms
- TaskLoop.h: 新增 OUT_DELAY_FAST=10, PULSE_DELAY_FAST=10
- TaskLoop.h: SET_DLY 注释从"延时"改为"快速模式"
- TaskLoop.c: FLAG_OUT 不再跳过延时,改为 OUT_DELAY_FAST 计数
- TaskLoop.c: FLAG_PLUSE 改用 PULSE_DELAY_FAST 计数
- 旧行为: SET_DLY=1 时 FLAG_OUT 立即跳到 FLAG_PLUSE
- 新行为: SET_DLY=1 时两者均用 10 tick (500ms) 快速延迟
2026-06-24 09:07:01 +08:00
wangfq a83674f77b fix: 防止异常上升污染基线 — Origin跟踪冻结保护
- CAPVD异常上升时暂停基线跟踪 (dev > dlt_ORG×4)
- 防止Xn先增大再减小导致Origin被顶到虚高
- 虚高Origin + 有车冻结 → 离开时永远无法释放
- 冻结阈值跟随灵敏度自动缩放
2026-06-23 18:10:29 +08:00
wangfq 86d09eb953 feat: USE_FLATNESS_EXIT 宏开关 — 平坦性/简单防抖可切换
- TaskLoop.h 新增 #define USE_FLATNESS_EXIT 1
- #if USE_FLATNESS_EXIT 包裹所有平坦性状态变量和逻辑
- #else 回退到 cnt_release>=3 简单防抖
- 置 0 即可切回传统离开判定
2026-06-23 17:24:46 +08:00
wangfq aff6aa9a2b feat: 移植 CN200910309382 平坦性离开判定
- 进入: 保持单一阈值法 f-f_b > Δ1
- Phase 1 (g_exit_state=0): 追踪第一上升坡面 max |f'|, |f''|
- Phase 2 (g_exit_state=1): 三条件平坦性
  |f-f_b| < Δ1 (SensTable_1)  &&  |f'| < Δ2  &&  |f''| < Δ3
- Δ2 = max_slope / 8, Δ3 = max_slope_rate / 8 (动态阈值)
- 连续3次平坦确认后释放, 防大车多峰误触发
- 安全复位时重置平坦性状态
2026-06-23 16:17:19 +08:00
wangfq affc9ad532 fix: 线圈断开期间绿灯灭, 黄灯快闪负责故障指示 2026-06-23 15:56:53 +08:00
wangfq 3b2c4dea87 feat: 线圈重连后保持检测状态
- 断开时不丢 VD_FLAG,保留断开前的检测状态
- 重连时 CAPVD=0 强制 IIR 从首个有效值重新收敛
- vd1_task 首个样本直接锁定 Value,后续 IIR 正常跟踪
- 重连后: 有车→绿灯亮, 无车→绿灯灭, 自动接续
2026-06-23 15:45:45 +08:00
wangfq 69bb28cf58 fix: 上电后稳定期 — 128样本(~128ms)仅跟踪基线不检测
- 新增 g_loop_stable 标志,Origin确立后持续慢闪
- vd1_task 稳定期内只做 IIR + 基线跟踪,跳过进入检测
- 稳定期 128 样本 (~128ms) 后自动启用检测
- 绿灯慢闪延续到稳定期结束
- 安全复位时重置 g_loop_stable
2026-06-23 14:40:38 +08:00
wangfq 8439f2e72b fix: LEDA宏指向绿灯PA9, 删除LEDB宏
- LEDA_ON/LEDA_OFF → 控制绿灯 (PA9, LED_GREEN)
- 删除 LEDB_ON/LEDB_OFF 宏 (无实际IO)
- 红灯(PB1)由TMR14 PWM直接驱动, 不需GPIO宏
- 更新 board_init 注释
2026-06-23 14:29:02 +08:00
wangfq 6dfa9ee831 fix: 黄灯逻辑 — 断开中快闪, 重连后N短闪
- 线圈断开中: 快闪 (200ms), 无论断开多少次
- 线圈重连后: 按断开次数显示 N 短闪 (1/2/3次)
- 无线圈上电后首次接线: 不计入, 黄灯灭
- 判定条件: g_disconnect_active || !g_loop_power_up_state → 快闪
2026-06-23 14:18:07 +08:00
wangfq c4b514c547 fix: 绿灯自检闪烁改为200ms, 修正LED命名注释
- LEDA=绿灯(PA9), 自检慢闪 200ms亮/200ms灭
- 红灯(PB1)始终PWM呼吸, 不干预
- LEDB宏无实际IO, 仅命名遗留
2026-06-23 14:00:04 +08:00
wangfq f59baac571 feat: 绿灯行为 — 自检慢闪 + 车辆存在指示
- 自检阶段 (loop1_INI_LOOP 或线圈未稳定): 绿灯慢闪 (500ms)
- 正常工作: 有车亮, 无车灭
- 绿灯统一由 TMR15 ISR poll_green_led() 驱动, 单点控制
- 移除 vd1_task 和 loop_task 中所有手动 LEDB_ON/OFF
- 移除线圈重连时的 6 次绿灯闪烁 (由黄灯故障码替代)
2026-06-23 13:55:53 +08:00
wangfq f61e2e3cc0 refactor: 重写黄灯故障指示 — 断开次数编码闪烁
- 无线圈上电: 黄灯快闪 (200ms)
- 线圈断开 N 次: N 短闪 (80ms亮/200ms灭 × N, 1.2s间隔)
- 不计入上电前未接线的情况
- 删除旧状态机 (g_led_loop_reconnect 等 4 个变量)
- 新增 g_disconnect_count/active + g_fault_phase/tick
2026-06-23 13:47:27 +08:00
wangfq eff59c9ba9 perf: 提高测量精度和响应速度
- TIM3 分频 DIV_4→DIV_2(中断率×2,CPU仍<3%)
- 去掉 XNSUM_FOR_ORIGIN_FACTOR (>>6),保留全部采样精度
- LPCNT = MEASUREMENT_BASE(131072)/Xn,替代 (32768<<6)/Xn
- 测量窗口 17.5ms→~1ms(快16倍)
- Origin 范围 32K→131K,灵敏度阈值自动按比例缩放
- 离开增加 cnt_release>=3 防抖,防瞬间噪声误落杆
2026-06-23 11:02:12 +08:00
wangfq 95bf13a5ef refactor: 精简检测算法,对齐 M1H/TLD-110 参考实现
- 删除二阶差分滤波(计算但从未参与判决)
- 删除 FltHistoryManager 死代码(20+ 未用字段)
- 删除 StageRangeConfig(区间约束计算后未引用)
- 删除动态窗口切换,改为 M1H 固定 100 窗口基线
- 修复 LPCNT 计算溢出 (32768/Xn<<6 改为乘除顺序)
- 进入/离开判决对齐 M1H:单次检测 + TMR15 时序防抖
- 时序状态机简化:去掉 PLUSE_IN_F/PLUSE_IN 中间层
- 拨码去抖次数对齐 M1H: 10→5
- 代码量: 1177→706 行 (-40%)
2026-06-23 08:39:48 +08:00
wangfq 1d1e7fbc19 refactor: 对齐 DLD154V4B 规格和 M1H 参考
- 灵敏度表改为 M1H 值: {216,108,36,10} / {108,72,18,9}
- 时序参数对齐: OUT_DELAY 39→38, PULSE_DELAY 10→19
- LED 宏命名对齐 154V4B: LEDA=红(PB1), LEDB=绿(PA9), LEDC=黄(PA10)
- RLY1/RLY2 引脚交换: PA6=RLY1, PA5=RLY2
2026-06-22 19:52:46 +08:00
wangfq 7b95eb1183 init: DLD154V4B 单路车检器项目 2026-06-22 18:20:37 +08:00