Files
DLD110SV4B/docs/devlog.md
T

259 lines
15 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-08-26 — V4.31:断开次数双变量拆分(LED 3次上限 vs BLE 持续累计)
### 背景
V4.30 代码合并整理时,peripheral_main.c 出现了两处回退(删 `g_loop_cut_last = 0` + 加回 3 次上限)。核对 1815caf 后确认:**删掉 `g_loop_cut_last = 0` 会让第二次断开不再计数**FLAG_CUT 0→1 时 last 仍为 1,边沿检测失败)。且 3 次上限原意是给 LED 快闪,但小程序要读"上电后持续累计的断开次数"——**一个变量无法同时满足两个需求,拆成两个**。
### 改动(王工确认方案)
| 文件 | 改动 |
|------|------|
| `peripheral_main.c` | ① 恢复重连分支 `g_loop_cut_last = 0`(边沿记忆同步,1815caf 修复回归防御);② 新增 `uint32_t g_loop_cut_total`(上电持续累计,不截断);③ 断开计数处 `g_loop_cut_amount++`3 次截断,LED 用)+ `g_loop_cut_total++`(不截断) |
| `cmcng.h` | extern `g_loop_cut_total` |
| `dbn_ble_srv.c` | 0xC0 偏移 4-63B)与 0x24 偏移 5-62B)上报改用 `g_loop_cut_total` |
| `docs/ble-protocol.md` | 固件版本 V4.20→V4.31;断开次数字段标注"上电持续累计,不截断" |
| `docs/product-manual.md` | 版本历史补 V4.30/V4.31 |
| `docs/technical-spec.md` | cut_amount 语义更新 + V4.31 变更说明 + 修订记录 V1.1 |
### 要点
- **双变量语义**`g_loop_cut_amount`(≤3= LED 黄灯快闪指示;`g_loop_cut_total`(uint32 无上限)= 小程序读的真实断开次数
- 上电未连线圈时两个变量上报值仍为 1(`g_loop_power_up_state == 0 ? 1 : ...`
- `INIT_VD()` 不复位两个计数变量(BLE 上报语义),仅边沿记忆 `g_loop_cut_last` 在重连分支复位
- 版本号 cmcng.h `FIRMWARE_VER` = "4.31"V4.30 合并整理由王工在 MRS 完成,本仓库同步 bump)
---
## 2026-08-26 — 0x24 追加归一化基数 LOOP_MEASURE_BASE(协议 V1.1
### 背景
小程序评估 DLD110S 上报数据时发现归一化基数 bug:用 DLD154V4B 的 MEASUREMENT_BASE=131072 归一化 variationDLD110S 实为 5242882^19 @60MHz)→ 所有百分比放大 4 倍(ΔL/L 报 8.85% 实为 2.21%)。根治方案(王工确认方案 A):**固件显式上报基数,第三方不猜**。
### 改动
| 文件 | 改动 |
|------|------|
| `APP/include/cmcng.h` | 新增 `#define LOOP_MEASURE_BASE 524288L`(注释标明必须与 peripheral_main.c MEASUREMENT_BASE 同步) |
| `APP/dbn_ble_srv.c` | 0x24 读参响应尾部追加 3B LE:`LOOP_MEASURE_BASE`(响应 8B→11B,仍单包 ≤14B,无分包) |
| `docs/ble-protocol.md` | §5.4 响应表加偏移 8-10 + 换算公式 + 背景说明(协议 V1.1) |
### 要点
- **换算公式**`Δf/f ≈ variation / LOOP_MEASURE_BASE``ΔL/L ≈ -2 × variation / LOOP_MEASURE_BASE`
- **向后兼容**:老小程序只读前 8B 不受影响;新小程序读 11B 拿基数
- **零分包风险**0x24 响应 11B data < MAX_BLE_DAT_RESPONSE_LEN=14,单包不变;0xC0 未动(加实时 Origin 需 13→16B 会触发分包,本轮不做)
- 未 bump 固件版本号(V4.20 → 用户确认 V4.30 有部分代码更新,晚点统一同步)
- 上报缺陷(0xC0 无 Origin)已确认:第三方用频率基线或本基数均可,固件暂不扩 0xC0
---
## 2026-08-26 — 环路线圈健康评估设计依据归档 + 小程序评估报告核验
### 背景
王工上传《环路线圈健康评估_第三方应用设计依据_V1.1.md》(FHWA/NEMA 口径),要求归档到 DLD110S 项目;随后上传小程序《车检器环境诊断报告》(DLD110S E04E7AA1E88C30s 评估),要求按设计依据核验上报数据评估有无问题。
### 归档文件
| 文件 | 内容 |
|------|------|
| `docs/coil-eval-design-basis.md` | 原设计依据 V1.1(原样归档) |
| `docs/coil-eval-design-basis-review.md` | 技术评审 + DLD110S 字段映射(8 项参数→实际上报字段) |
| `docs/coil-eval-report-20260826.md` | 小程序评估报告核验结论 |
### 关键发现
1. **🚨 小程序归一化基数 bug(放大 4 倍)**:DLD110S 固件 `MEASUREMENT_BASE=524288`2^19, CH591R @60MHz),小程序却用 DLD154V4B 的 `131072`2^17)做 variation 归一化 → 车辆 ΔL/L 报 8.85% 实为 **2.21%**,无车波动报 0.11% 实为 **0.0277%**。验证:`2×5801/131072=8.85%` 逐位吻合。本次结论侥幸不变(2.21% 仍 ≥1% 正常),但临界车(真实 0.5%)会被报成 2% 误判正常。**教训:跨产品照搬常数(同类 DLD154V4B→DLD110S 的 MEASUREMENT_BASE 差异),与协议文档防错同一模式。**
2. **判据空洞**:小程序自创无车波动阈值 `<0.1%/0.3~1%/>1%`0.1~0.3% 无定义且 0.11% 不在正常区间却判正常;设计依据 §3.2.3 是 ±10%/±20% 频率判据,两套体系需对齐
3. **DLD110S 低频档(FLEVEL=3) 电容=76nF 实锤**45980Hz ↔ 157.648μH ↔ 76nF 三者自洽(正算差 0Hz),印证设计依据四档电容 33/43/66/76nF
4. **DLD110S 上报缺陷确认**0xC0 只有 frequency+variation**无 Origin/CAPVD** → 第三方算 ΔL/L 只能走频率基线路径(Δf/f≈variation/Origin≈-(1/2)ΔL/L),建议固件后续版本补报 Origin
5. 待确认:报告软件版本 4.30ble-protocol 记录 4.20)、"灵敏度模式 AI"DLD110S 拨码 3 档无 AI 模式)
### 涉及文件
| 文件 | 内容 |
|------|------|
| `docs/coil-eval-design-basis.md` | 新增(原文档 V1.1 归档) |
| `docs/coil-eval-design-basis-review.md` | 新增(评审映射 + 小程序检查清单) |
| `docs/coil-eval-report-20260826.md` | 新增(本次评估核验报告) |
---
## 2026-08-25 — 蓝牙小程序接口协议文档
### 背景
根据 `dbn_ble_srv.c`+ peripheral.c/gattprofile.c/peripheral_main.c/storage.h/cmcng.h)整理蓝牙小程序与芯片交互的完整接口协议。
### 文档要点
| 章节 | 内容 |
|------|------|
| 开头差异表 | **与 DLD154Pro 的三处关键差异** |
| §1 BLE 服务 | 0xFFE0 服务;Char1(0xFFE1 RW 命令下发)、Char4(0xFFE4 Notify);设备名 DLD110S |
| §2-3 帧格式/分包 | Magic(8F/7F)+Header+Len+CMD+Data+XOR+SUM14B 写死分包 |
| §4-5 命令 | 0x10/0x1F/0x23/0x24/0x8A/0x92/0xC5 逐字段(**无 0x31** |
| §6 主动上报 | 0xC0 线圈动态(type=5 |
| §7 坑清单 | 10 条源码事实 |
### 关键发现(源码事实)
1. **⚠ 灵敏度由硬件拨码 KEY_SA1/SA2 决定**`poll_sens_key` peripheral_main.c:263):检测阈值 = `g_loop_sens_list.sens[g_freq_sens]`**0x23 设置的 sensitvity 仅存档不生效**0x24 回读 = 拨码档位+11~3
2. **3 档灵敏度**MAX_LOOP_SENS_AMOUNT=3):默认 `{108,54,28}` / `{81,32,16}`DLD154Pro 为 4 档)
3. **无 0x31**DLD110SV4 无 RS485
4. 0x24 偏移 7 是 `g_function_mode`DLD154Pro 为 direction_mode
5. g_hold_time = exist_mode × 600 tickDLD154Pro ×100)——产品差异
6. 0xC5 超时疑似 bug`timeout_min × 60 × 100`(应 ×1000?待现场验证)
### 涉及文件
| 文件 | 内容 |
|------|------|
| `docs/ble-protocol.md` | 新增(固件 V4.20 / 硬件 V4.01 / 型号 DLD110S |
---
## 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 |