Files
DLD110SV4B/docs/devlog.md
T

143 lines
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# DLD110SV4 开发日志
> MCU: CH591R (RISC-V, BLE) @60MHz | 通道: 1 路线圈 | 调试口: UART0 (DEBUG 编译, 230400)
## 2026-07-20 — variation 3 字节上报 + 编码 GBK→UTF-8 + 线圈重连对齐 DLD154V4B spec
### variation 上报升级
- `int16_t``int32_t`:去掉 ±32767 截断,保留完整诊断信号(线圈漂移/老化等异常场景下 variation
可远超 32767
- BLE 上报 2 → 3 字节(小端序 int24),与 `frequent`/`cut_amount` 统一宽度
- `storage.h` 结构体大小不变(原 int16_t 后 uint32_t 有 2B padding,改为 int32_t 后 padding 消失)
### 全项目编码 GBK → UTF-8
62 个 `.c`/`.h` 源文件全部从 GBK 转换为 UTF-8(保留 CRLF 行尾),消除 patch 工具乱码问题。
### 补充 g_sys_freq 全局变量定义
`dbn_ble_srv.h:93` 声明了 `extern uint32_t g_sys_freq;`,但 `.c` 中漏了定义导致
`undefined reference`。在 `peripheral_main.c` 全局变量区补上 `uint32_t g_sys_freq = 0;`
### RLY1 脉冲输出 (进入脉冲 / 离开脉冲)
原代码中 `case 1`(进入脉冲)和 `case 2`(离开脉冲)的 `switch` 逻辑正确,
问题为 `output_mode` 配置未正确写入 flash 导致始终走 `case 0`(存在输出)。
修复后现场验证通过。
### 线圈重连逻辑对齐 DLD154V4B spec (第 8 章)
**问题**:旧逻辑断开时清零 `loop1_VD_FLAG`,重连时调 `INIT_VD()` 全复位重建基线,
无法恢复断开前有车状态。
**修复** (对齐 DLD154V4B technical-spec.md §8)
| 改动 | 旧行为 | 新行为 |
|------|--------|--------|
| 断开时 VD_FLAG | 清零 | **保留**(车在线圈上时不丢状态) |
| 重连后 | INIT_VD 全复位 | **CAPVD=0 直锁首个样本**快速收敛 |
| 断开跟踪 | 无 | 新增 `g_disconnect_active` 状态位 |
| 断开次数上限 | 255 | **3**(对齐 spec |
| LED 断开指示 | `loop1_FLAG_CUT` 150ms 闪 | `g_disconnect_active` 200ms 快闪 |
**行为变化**:线圈断开时继电器释放,但保留 `loop1_VD_FLAG`。重连后 CAPVD=0
触发首个样本直锁 + 丢弃断开期间的 ORG_SUM/CNT 过期数据:
- 车仍在 → VD_FLAG=1,继续走有车分支,恢复继电器输出 ✓
- 车已离开 → 走离开检测(cnt_release 递增),正常释放 ✓
> **注意**:此改动推翻了移植日志(2026-07-18)中的"断线重连不再恢复车辆状态"说明。
---
## 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. **断线重连不再尝试恢复断开前的车辆状态**, 一律重建基线 (~1.1s 稳定期 + 绿灯快闪)。
重连时若线圈上有车, 基线落在占用值, 不输出存在信号 — 与断开即释放的行为一致。
2. 安全复位 (loopSafe_Timeout) 从"配置存在但不生效"变为真正生效, 升级存量设备时
注意该参数配置值。
3. 灵敏度滑动开关运行时切换即时生效, 不再需要重新上电。
### 待现场验证
- [ ] 各频率档下 LPCNT / 实测窗长 / CAPVD 幅值 (示波器 + DEBUG 串口)
- [ ] 平坦性离开阈值 SLOPE_FLAT_THRESH=350, MIN_DELTA2=18, MIN_DELTA3=7
- [ ] ENV_ACT_TH=30 (condition 上报的灵敏程度)
- [ ] BLE 频率读数 +360 偏移是否仍准确 (测量方案已变)
- [ ] 小程序 variation 显示幅值 (基准放大 8×)
---
## 修订记录
| 版本 | 时间 | 说明 |
|------|------|------|
| V1.1 | 2026-07-20 | variation 3B上报 + GBK→UTF-8 + RLY1脉冲 + 线圈重连对齐DLD154V4B spec |
| V1.0 | 2026-07-18 | 建仓; 算法移植 DLD154V4B V2.0, 删除旧线圈算法; FIRMWARE_VER 4.00→4.20 |