32 Commits

Author SHA1 Message Date
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