- 删除根目录 DEVELOPMENT_LOG.md - 灵敏度分析更新为 4 档 (新增最高档 sens_in=14 sens_out=12) - 追加 RS485 700BS 协议实现踩坑全记录 - 标记 RS485 待办为已完成
9.8 KiB
DLD154Pro 开发日志
MCU: CH591R (RISC-V, BLE) @60MHz | 线圈通道: 1路 | 调试口: RS485 / BLE
2026-07-22 — BLE 新增 RS485 地址/波特率读写 + 空闲关蓝牙超时 + 功能码细分
新增 BLE 命令
CMD_DBN_RW_UART_BAUD (0x31) — 读写 RS485 通信参数:
| 字节偏移 | 字段 | 说明 |
|---|---|---|
| [4] | RW | 0=读, 1=写 |
| [5] | BT_close_min | 蓝牙空闲超时关闭时间 (分钟), 0=不关闭 |
| [6:8] | baud_rate | RS485 波特率 (3 字节, little-endian) |
| [9] | rs485_id | RS485 从机地址 (1-247) |
| [10:12] | reserved | 预留 |
- 读:返回当前存储值 + status=0
- 写:写入 RAM 并持久化到 DataFlash (
ADDR_BT_Close_TIMEOUT_Offset起 5 字节)
Flash 存储布局
0x10 ADDR_BT_Close_TIMEOUT_Offset 1B 蓝牙空闲超时 (分钟)
0x11 Addr_RS485_Baud_Offset 3B RS485 波特率 (LE32)
0x14 Addr_RS485_ID_Offset 1B RS485 从机地址
出厂默认:RS485 ID=1, 波特率=9600, 蓝牙超时=0(不关闭)
功能码细分 (g_function_mode)
g_function_mode 取自 direction_mode 高 4 位,低 2 位细分:
| bit | 字段 | 0 | 1 |
|---|---|---|---|
| bit0 | g_fm_700bs_disable |
700BS 协议 | Modbus 协议 |
| bit1 | g_fm_radar_input_disable |
光耦输入使能 | 光耦输入复位 |
RS485 将支持两种协议:700BS(后续上传)和 Modbus。通过小程序设置
direction_mode高 4 位的 bit0 切换。
文件变更
| 文件 | 变更 |
|---|---|
dbn_ble_srv.h |
+CMD_DBN_RW_UART_BAUD 0x31 |
cmcng.h |
+extern 声明: fm_700bs_disable, fm_radar_input_disable, uart/bt 配置 |
storage.h |
+Flash 地址宏: BT_timeout, RS485_baud, RS485_ID |
peripheral_main.c |
+全局变量定义, factory_dev 默认值, para_store_init 恢复 |
dbn_ble_srv.c |
+CMD_DBN_RW_UART_BAUD handler, unpack 中解析 function_mode bits |
待办
- RS485 700BS 协议定义
- RS485 Modbus 协议定义
- RS485 串口中断收发实现 (UART0)
- 蓝牙空闲超时自动关闭逻辑
2026-07-21 — 灵敏度等级与 ΔL/L 的物理关系分析
参数表
// sens_in: 进入阈值, sens_out: 离开阈值 (0=最低, 3=最高)
SensTable = { 108, 54, 28, 14 }; // 进入
SensTable1 = { 81, 32, 16, 12 }; // 离开
计算链路
Step 1:阈值差值
loop1_dlt_ORG = (Origin * sens) >> 16; // = Origin × sens / 65536
Step 2:进入判定
if (CAPVD < Origin - dlt_ORG) // ← ΔCAPVD / Origin > sens / 65536
Step 3:CAPVD → 电感
线圈振荡频率 f ∝ 1/√L,周期 T ∝ √L。测量窗 CAPVD 正比于平均周期:
ΔCAPVD / Origin = ΔT / T₀ = (√L - √L₀) / √L₀
对微小变化泰勒展开:dT/T ≈ dL/(2L),即:
ΔL / L ≈ 2 × ΔCAPVD / Origin
Step 4:最终 ΔL/L 公式
ΔL/L_entry = 2 × sens_in / 65536
ΔL/L_exit = 2 × sens_out / 65536
灵敏度等级对应 ΔL/L
| 等级 | sens_in | ΔL/L 进入 | sens_out | ΔL/L 离开 | 迟滞比 |
|---|---|---|---|---|---|
| 低 (0) | 108 | 0.330% | 81 | 0.247% | 1.33 |
| 中 (1) | 54 | 0.165% | 32 | 0.098% | 1.69 |
| 高 (2) | 28 | 0.085% | 16 | 0.049% | 1.75 |
| 最高(3) | 14 | 0.043% | 12 | 0.037% | 1.17 |
物理验证
典型 100μH 线圈:
- 现代轿车经过:ΔL/L ≈ 5%–15%,任一灵敏度均能可靠触发
- 高灵敏度 0.085%:足够敏感,需注意温漂(~20°C 引起约 0.1% 的感量偏移)和邻道串扰
- 迟滞比 1.33–1.75:防止车辆边界状态反复跳变,低灵敏度迟滞最小
快速换算
sens 值直接对应 千分之 2×sens 的感量变化百分比——除以 1000 就是 ΔL/L(%)。
2026-07-21 (午后) — 修复灵敏度 bug + 有限存在时间 + 版本号
BLE 灵敏度无法修改
根因: 硬件适配时删了 poll_sens_key(),在 INIT_VD() 中硬编码了 g_freq_sens = 2,
但未在 BLE 参数解包 unpack_pkg_set_cjq_param() 中同步更新,导致小程序修改灵敏度无效。
修复:
peripheral_main.c:g_freq_sens从INIT_VD()移到para_store_init(), 从存储的g_loop_cng_unit.sensitvity读取:(sensitvity > 0) ? (sensitvity - 1) : 0dbn_ble_srv.c:unpack_pkg_set_cjq_param()中同样增加g_freq_sens同步更新, 确保 BLE 小程序实时修改后立即生效
有限存在时间公式对齐
dbn_ble_srv.c 中 g_hold_time 计算写的是 exist_mode * 30 * 20,
但 para_store_init() 中用的是 exist_mode * 20 * 5(50ms tick)。
统一为 20 * 5(对应参数值 × 100ms × 5s 基础周期)。
版本号
- 固件:
4.01→3.00 - 硬件:
1.00→3.01
2026-07-21 — 项目初始化:从 DLD110SV4 复制基线 + 按硬件资源文档调整 IO
背景
DLD154Pro 是 DLD110SV4 的硬件升级版(同 MCU CH591R),核心变更:
- 继电器 双路→单路(删 RLY2)
- 删除拨码开关(灵敏度改由小程序设置)
- 线圈调频 两级→一级(删 PA13 FLEVEL_L)
- 新增 RS485 接口(PA14/PA15/PA13,协议待定)
- 新增光耦输入(PB10,逻辑待定)
- 指示灯从单色→双色(LEDA 绿 + LEDB 红呼吸灯)
- DEBUG UART0 被 RS485 占用,删除全部
仓库
- 远程: http://118.178.252.17:3000/wangfq/DLD154Pro
- 本地:
/home/wfq/projects/vd_detector/DLD154Pro - commit
5f5f697: init 基线 - commit
91ba844: feat 硬件适配
IO 宏重定义
| 引脚 | 旧(DLD110SV4) | 新(DLD154Pro) |
|---|---|---|
| PA8 | RLY1 (存在) | RLY1 (存在,不变) |
| PB23 | RLY2 (功能/脉冲) | LEDB (红色呼吸灯) |
| PA12 | FLEVEL_H (33nF) | FLEVEL (33nF,一级) |
| PA13 | FLEVEL_L (10nF) | UART0_RE (RS485 方向) |
| PA14 | KEY_SA1 / DEBUG_TX | UART0_TX (RS485) |
| PA15 | KEY_SA2 / DEBUG_RX | UART0_RX (RS485) |
| PB10 | - | IN_1 (光耦输入) |
| PB22 | LEDA (绿色) | LEDA (绿色,不变) |
删除项
RLY2_ON/OFF宏及全部 RLY2 输出逻辑KEY_SA1/KEY_SA2宏及poll_sens_key()函数FLEVEL_L_LOW/HIGH,FLEVEL_H_LOW/HIGH→ 改为FLEVEL_LOW/HIGHg_flag_output,g_xn_counter全局变量- DEBUG UART0 初始化 (
gpio_uart_init中#ifdef DEBUG块) Main_Circulation中#ifdef DEBUGPRINT 块- TMR1_ISR 中
_cnt/g_flag_outputDEBUG 定时器 - TMR0_ISR 中
g_xn_counterDEBUG 计数器 para_store_init()中频率四档 switch → 双档 if/else
新增/预留
- RS485 引脚宏:
RS485_TX_PIN,RS485_RX_PIN,RS485_RE_PIN,RS485_RE_TX(),RS485_RE_RX()(仅初始化引脚,协议待定) - 光耦输入宏:
OPT_IN1(仅初始化 PB10 输入上拉,逻辑待定) - LEDB 宏:
LEDB_ON/OFF(PB23,低电平有效) g_freq_sens = 2默认最高灵敏度(取代 poll_sens_key 拨码逻辑)
继电器输出简化
| 模式 | 旧 (双继电器) | 新 (单继电器) |
|---|---|---|
| case 0: 存在输出 | RLY1 跟随 VD, RLY2 跟随 VD | RLY1 跟随 VD |
| case 1: 进入脉冲 | RLY2=存在, RLY1=进入脉冲 | RLY1=进入脉冲 |
| case 2: 离开脉冲 | RLY2=存在, RLY1=离开脉冲 | RLY1=离开脉冲 |
| default | RLY2=存在 | RLY1=存在 |
保留(协议兼容)
storage.h的Loop_ACS_Info.relay2_cng/relay2_state字段保留,默认值=0dbn_ble_srv.c:468上报字节 relay2 位自动为 0(字段初始化为 0 后无写入)
待办
- RS485 通信协议定义 + UART0 中断/收发实现
(2026-07-24 完成) - 光耦输入逻辑(与其他检测器联动 / 综合判断)
- IAP/OTA 项目文件中的 DLD110S 引用更新(
592OnlyUpdateApp_*) .mrs/工作区文件清理(大量 DLD110S 历史快照)
2026-07-23~24 — RS485 700BS 协议实现 & 四级灵敏度
RS485 700BS 从机协议
| 项目 | 说明 |
|---|---|
| 物理层 | RS485 半双工, 9600 8N1, PA14=TX PA15=RX PA13=RE |
| 帧格式 | 主机 3 字节 (STX ADDR XOR), 从机 3~9 字节变长 |
| 心跳 | 空闲 5s / 故障(线圈断开) 1s / 事件(car_state翻转)立即 |
| 命令 | 0xFA 查询状态, 0x1B 查询频率, 0x2C 复位线圈, 0x3D 查询DIP |
文件: APP/rs485_700bs.c (新增), APP/include/rs485_700bs.h (新增)
踩坑记录
-
UART0 API 不兼容 — CH592 SDK 中
UART0_GetITFlag()是无参宏(非函数),UART0_ClearITFlag()不存在。改用switch(UART0_GetITFlag())标准模式,参考 UART1 例程。 -
while(R8_UART0_TFC == 0)死循环 — TX FIFO 空时条件永真,主循环卡死导致地感不工作。修正为!= 0(等 FIFO 空再写下一字节)。 -
rs485_init()从未被调用 —gpio_uart_init()只写了注释/* 由 rs485_init() 统一初始化 */但未实际调用,UART0/GPIO 未配置。修复:替换注释为函数调用。 -
频率始终为 0 —
g_loop_acs_info.frequent只在 BLE 报告路径usart_packet_processing_acs_loop中更新,BLE 断开时永不执行 → freq=0。 -
频率非实时 — 改用
g_loop_acs_info.loop_capvd仍有问题:该值被flag_change门控冻结(上电/车辆进出时flag_change=1→capvd 不更新,清零只在 BLE 报告路径)。最终方案:直接使用loop1_CAPVD(vd1_task()每次实时 IIR 滤波值),不经过 BLE 通道。
最终频率计算:
freq = (uint64_t)FREQ_SYS * loop1_LPCNT / loop1_CAPVD + 360
四级灵敏度
MAX_LOOP_SENS_AMOUNT: 3 → 4
新增第四档:进入阈值 14, 离开阈值 12 (ΔL/L≈0.04%),适用于极高灵敏度场景(如摩托车/小型车辆检测)。需注意温漂影响——20°C 温度变化可引起约 0.1% 感量偏移,第四档信噪比余量仅约 2:1。