Files
DLD110SV4B/docs/devlog.md
T
wangfq eaec1bd1bd docs(DLD110SV4): 新增蓝牙小程序接口协议文档 (依据 dbn_ble_srv.c)
- 与 DLD154Pro 三处关键差异: 拨码灵敏度/3档表/无0x31
- §1 BLE 服务: 0xFFE0, Char1(0xFFE1 RW)/Char4(0xFFE4 Notify), 设备名 DLD110S
- §2-3 帧格式/分包: Magic(8F/7F)+Header+Len+CMD+Data+XOR+SUM; 14B 写死分包
- §4-5 命令: 0x10/0x1F/0x23/0x24/0x8A/0x92/0xC5 逐字段
- §6 主动上报 0xC0: type=5 线圈动态
- §7 坑清单: 拨码灵敏度不生效/3档/0x24偏移7=g_function_mode/0xC5超时疑bug
- devlog 置顶 2026-08-25 条目
2026-08-25 17:05:36 +08:00

9.1 KiB
Raw Blame History

DLD110SV4 开发日志

MCU: CH591R (RISC-V, BLE) @60MHz | 通道: 1 路线圈 | 调试口: UART0 (DEBUG 编译, 230400)

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. 无 0x31DLD110SV4 无 RS485
  4. 0x24 偏移 7 是 g_function_modeDLD154Pro 为 direction_mode
  5. g_hold_time = exist_mode × 600 tickDLD154Pro ×100)——产品差异
  6. 0xC5 超时疑似 bugtimeout_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_tint32_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_averagewindow 参数 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