15 KiB
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-6(3B)与 0x24 偏移 5-6(2B)上报改用 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 归一化 variation,DLD110S 实为 524288(2^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 E04E7AA1E88C,30s 评估),要求按设计依据核验上报数据评估有无问题。
归档文件
| 文件 | 内容 |
|---|---|
docs/coil-eval-design-basis.md |
原设计依据 V1.1(原样归档) |
docs/coil-eval-design-basis-review.md |
技术评审 + DLD110S 字段映射(8 项参数→实际上报字段) |
docs/coil-eval-report-20260826.md |
小程序评估报告核验结论 |
关键发现
- 🚨 小程序归一化基数 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 差异),与协议文档防错同一模式。 - 判据空洞:小程序自创无车波动阈值
<0.1%/0.3~1%/>1%,0.1~0.3% 无定义且 0.11% 不在正常区间却判正常;设计依据 §3.2.3 是 ±10%/±20% 频率判据,两套体系需对齐 - DLD110S 低频档(FLEVEL=3) 电容=76nF 实锤:45980Hz ↔ 157.648μH ↔ 76nF 三者自洽(正算差 0Hz),印证设计依据四档电容 33/43/66/76nF
- DLD110S 上报缺陷确认:0xC0 只有 frequency+variation,无 Origin/CAPVD → 第三方算 ΔL/L 只能走频率基线路径(Δf/f≈variation/Origin≈-(1/2)ΔL/L),建议固件后续版本补报 Origin
- 待确认:报告软件版本 4.30(ble-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+SUM;14B 写死分包 |
| §4-5 命令 | 0x10/0x1F/0x23/0x24/0x8A/0x92/0xC5 逐字段(无 0x31) |
| §6 主动上报 | 0xC0 线圈动态(type=5) |
| §7 坑清单 | 10 条源码事实 |
关键发现(源码事实)
- ⚠ 灵敏度由硬件拨码 KEY_SA1/SA2 决定(
poll_sens_keyperipheral_main.c:263):检测阈值 =g_loop_sens_list.sens[g_freq_sens],0x23 设置的 sensitvity 仅存档不生效,0x24 回读 = 拨码档位+1(1~3) - 3 档灵敏度(MAX_LOOP_SENS_AMOUNT=3):默认
{108,54,28}/{81,32,16}(DLD154Pro 为 4 档) - 无 0x31(DLD110SV4 无 RS485)
- 0x24 偏移 7 是
g_function_mode(DLD154Pro 为 direction_mode) - g_hold_time = exist_mode × 600 tick(DLD154Pro ×100)——产品差异
- 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.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.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 |