- 自适应测量窗 2^19 (~8.74ms @60MHz), IIR 79/256 + 斜率限幅 5% - 稳定期 128 窗快速收敛; 基线跟踪窗 500 + 冻结保护(超时+稳定性双条件) - 进入确认 3 次; 平坦性三条件离开 (CN200910309382), 阈值按新幅值基准缩放 - 删除 FltHistoryManager/SecondOrderState/StageRangeConfig/二次判断/FUNCTION_A/B - 断线重连/有限存在超时: 全复位重建基线; 安全复位恢复启用; 灵敏度开关运行时生效 - BLE: loop_capvd 去掉 <<5, condition 改用 g_env_activity, variation 幅值基准 8x - 修复 update_moving_average window uint8 截断; 稳定期计数器改全局可复位 - FIRMWARE_VER 4.00 -> 4.20; 新增 README.md 与 docs/devlog.md
5.2 KiB
5.2 KiB
DLD110SV4 开发日志
MCU: CH591R (RISC-V, BLE) @60MHz | 通道: 1 路线圈 | 调试口: UART0 (DEBUG 编译, 230400)
2026-07-18 — 检测算法移植 DLD154V4B (V2.0)
背景
DLD110SV4 原固件 (V4.x) 使用旧一代算法: 一阶滤波 + 二阶变化量 + FltHistoryManager 多时间窗基准 + 二次判断 (FUNCTION_A/B) + 快速变化检测等多套机制叠加, 分支复杂、 参数纠缠, 现场调优困难。DLD154V4B 已在 AT32F421 上完成算法精简重构 (对齐 M1H 参考 实现 + M4 优化), 本次将其整体移植到 CH591R, 旧线圈算法代码全部删除。
移植内容
| 模块 | 旧实现 | 新实现 (移植后) |
|---|---|---|
| 测量窗 | LPCNT=(32768/Xn)<<6, Value=ΣXn>>5 (~65536, 窗长 ~35ms) |
LPCNT=2^19/Xn, Value=ΣXn (~524288, 窗长 ~8.74ms) |
| 滤波 | IIR 79/256, 无限幅 | IIR 79/256 + 斜率限幅 5% (EMI 尖峰拒绝) |
| 开机收敛 | INIT_SAMPLE_COUNT=10 累加平均 | 稳定期 128 窗, 小窗口 100, 绕过 IIR |
| 基线跟踪 | 窗口 50, 有车冻结 | 窗口 500, 冻结保护 (超时 ~8.7s + 稳定性 ±2% 双条件) |
| 进入判定 | 单次阈值 (FUNCTION_B 时 3 次) | 连续 3 次确认 (ENTRY_CONFIRM) |
| 离开判定 | 滞回 + check_flat_leave + 二次判断嵌套 | 平坦性三条件 (CN200910309382), 滞回阈值 sens_out |
| 有限存在超时 | FLAG_HOLD_TIMEOUT → INIT_VD + 快速补偿窗 | 同思路保留: 全复位重建基线 |
| 断线重连 | flt_mgr.flag_loop_reconnect 多阶段恢复 (保留断开前 Origin 重判) | 简化为全复位重建基线 (断开时继电器已释放, 行为对齐 M1H) |
| 安全复位 | 代码存在但 LC_HOLD 激活被注释 (实际不生效) | 恢复启用: loopSafe_Timeout 非 0 时进车启动计时 |
| 灵敏度切换 | 仅开机读取 (主循环 poll 被注释) | 每个测量窗轮询滑动开关, 运行时即时生效 |
删除的旧算法模块
SecondOrderState / get_second_order / FltHistoryManager (flt_mgr) /
StageRangeConfig (stage_config) / update_flt_history / check_flt_by_stage /
check_flat_leave / update_lower_upper / reload_lower_upper /
rapid_change 快速变化检测 / relay_on(off)_confirm 多重确认 / FUNCTION_A/B 分支。
FUNCTION_* 宏与 g_function_mode 保留 (BLE 协议 direction_mode 高 4 位仍读写),
但算法不再消费。
参数适配 (CH591R @60MHz)
| 参数 | DLD154V4B (@120MHz, 10ms) | DLD110SV4 (@60MHz) | 说明 |
|---|---|---|---|
| MEASUREMENT_BASE | 131072 (2^17) | 524288 (2^19) | 窗长 2^19/60M ≈ 8.74ms, 接近 10ms 任务节拍 |
| ALFA_CAP1 | 79 (τ≈32ms) | 79 (τ≈24ms) | |
| WINDOW_ORIGIN | 500 (5s) | 500 (~4.4s) | |
| FREEZE_TIMEOUT | 1000 (10s) | 1000 (~8.7s) | |
| SLOPE_FLAT_THRESH | 100 | 350 | 幅值基准放大 4×、窗周期 0.87×, 净缩放 ~3.5× |
| MIN_DELTA2 / MIN_DELTA3 | 5 / 2 | 18 / 7 | 同上缩放, 待现场验证 |
| VARIATION_EVENT_TH | — | 40 | BLE variation 事件阈值, 对应旧代码的 5 (幅值 8×) |
BLE 接口适配 (dbn_ble_srv.c)
loop_capvd上报: 旧值为ΣXn>>5, BLE 端<<5还原; 新值直接ΣXn, 删除<<5。频率公式freq = g_sys_freq / (loop_capvd / LPCNT) + 360结构不变 (+360 为硬件校准偏移, 待现场复核)。condition(线圈环境评估 0~15): 旧源flt_mgr.cnt_not_idle; 新源g_env_activity(CAPVD 相邻差 > ENV_ACT_TH=30 累加 / 否则衰减, 阈值待现场验证)。variation= Origin − CAPVD, 有符号, 饱和到 ±32767; 幅值基准变为 2^19, 小程序端若有固定阈值需同步放大 8×。
顺手修复
update_moving_average的window参数 uint8_t → uint16_t (500 会被截断为 244, DLD154V4B 已知 pitfall)。- DLD154V4B 的
_stable_cnt为函数内 static, 二次进入稳定期时不清零 → 1 个样本即判稳。 移植版改为全局loop1_stable_cnt, 稳定期结束与 INIT_VD/安全复位时清零。 (DLD154V4B 侧同样的隐患待回改) - TMR0 ISR 增加 Xn==0 保护 (除零) 与 LPCNT>65535 保护 (Xn 毛刺)。
- 进入判定成立时平坦性差分基准
g_prev_capvd以当前 CAPVD 播种, 避免离开检测 第一帧出现虚假大斜率。
行为变化说明 (现场注意)
- 断线重连不再尝试恢复断开前的车辆状态, 一律重建基线 (~1.1s 稳定期 + 绿灯快闪)。 重连时若线圈上有车, 基线落在占用值, 不输出存在信号 — 与断开即释放的行为一致。
- 安全复位 (loopSafe_Timeout) 从"配置存在但不生效"变为真正生效, 升级存量设备时 注意该参数配置值。
- 灵敏度滑动开关运行时切换即时生效, 不再需要重新上电。
待现场验证
- 各频率档下 LPCNT / 实测窗长 / CAPVD 幅值 (示波器 + DEBUG 串口)
- 平坦性离开阈值 SLOPE_FLAT_THRESH=350, MIN_DELTA2=18, MIN_DELTA3=7
- ENV_ACT_TH=30 (condition 上报的灵敏程度)
- BLE 频率读数 +360 偏移是否仍准确 (测量方案已变)
- 小程序 variation 显示幅值 (基准放大 8×)
修订记录
| 版本 | 时间 | 说明 |
|---|---|---|
| V1.0 | 2026-07-18 | 建仓; 算法移植 DLD154V4B V2.0, 删除旧线圈算法; FIRMWARE_VER 4.00→4.20 |