Files
DLD154Pro/docs/devlog.md
T

11 KiB
Raw Blame History

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 3CAPVD → 电感

线圈振荡频率 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_sensINIT_VD() 移到 para_store_init() 从存储的 g_loop_cng_unit.sensitvity 读取:(sensitvity > 0) ? (sensitvity - 1) : 0
  • dbn_ble_srv.c: unpack_pkg_set_cjq_param() 中同样增加 g_freq_sens 同步更新, 确保 BLE 小程序实时修改后立即生效

有限存在时间公式对齐

dbn_ble_srv.cg_hold_time 计算写的是 exist_mode * 30 * 20para_store_init() 中用的是 exist_mode * 20 * 550ms tick)。 统一为 20 * 5(对应参数值 × 100ms × 5s 基础周期)。

版本号

  • 固件: 4.013.00
  • 硬件: 1.003.01

2026-07-21 — 项目初始化:从 DLD110SV4 复制基线 + 按硬件资源文档调整 IO

背景

DLD154Pro 是 DLD110SV4 的硬件升级版(同 MCU CH591R),核心变更:

  • 继电器 双路→单路(删 RLY2
  • 删除拨码开关(灵敏度改由小程序设置)
  • 线圈调频 两级→一级(删 PA13 FLEVEL_L
  • 新增 RS485 接口(PA14/PA15/PA13,协议待定)
  • 新增光耦输入(PB10,逻辑待定)
  • 指示灯从单色→双色(LEDA 绿 + LEDB 红呼吸灯)
  • DEBUG UART0 被 RS485 占用,删除全部

仓库

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/HIGH
  • g_flag_output, g_xn_counter 全局变量
  • DEBUG UART0 初始化 (gpio_uart_init#ifdef DEBUG 块)
  • Main_Circulation#ifdef DEBUG PRINT 块
  • TMR1_ISR 中 _cnt / g_flag_output DEBUG 定时器
  • TMR0_ISR 中 g_xn_counter DEBUG 计数器
  • 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/OFFPB23,低电平有效)
  • 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.hLoop_ACS_Info.relay2_cng/relay2_state 字段保留,默认值=0
  • dbn_ble_srv.c:468 上报字节 relay2 位自动为 0(字段初始化为 0 后无写入)

待办

  • RS485 通信协议定义 + UART0 中断/收发实现 (2026-07-24 完成)
  • 光耦输入逻辑(与其他检测器联动 / 综合判断)
  • IAP/OTA 项目文件中的 DLD110S 引用更新(592OnlyUpdateApp_*
  • .mrs/ 工作区文件清理(大量 DLD110S 历史快照)

2026-07-2324 — 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 (新增)

踩坑记录

  1. UART0 API 不兼容 — CH592 SDK 中 UART0_GetITFlag() 是无参宏(非函数),UART0_ClearITFlag() 不存在。改用 switch(UART0_GetITFlag()) 标准模式,参考 UART1 例程。

  2. while(R8_UART0_TFC == 0) 死循环 — TX FIFO 空时条件永真,主循环卡死导致地感不工作。修正为 != 0(等 FIFO 空再写下一字节)。

  3. rs485_init() 从未被调用gpio_uart_init() 只写了注释 /* 由 rs485_init() 统一初始化 */ 但未实际调用,UART0/GPIO 未配置。修复:替换注释为函数调用。

  4. 频率始终为 0g_loop_acs_info.frequent 只在 BLE 报告路径 usart_packet_processing_acs_loop 中更新,BLE 断开时永不执行 → freq=0。

  5. 频率非实时 — 改用 g_loop_acs_info.loop_capvd 仍有问题:该值被 flag_change 门控冻结(上电/车辆进出时 flag_change=1→capvd 不更新,清零只在 BLE 报告路径)。最终方案:直接使用 loop1_CAPVDvd1_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。


2026-07-24 (傍晚) — 光耦输入复位功能 & mstick() 时间单位修正

光耦输入复位 (opt_input_poll)

项目 说明
引脚 PB10 (IN_1), 内部上拉, 光耦干接点输入
使能条件 g_fm_radar_input_disable == 1
触发逻辑 干接点接通(PB10=0) ≥500ms → 断开(上升沿) → SYS_ResetExecute()
消抖 <500ms 短脉冲上升沿清零计时, 不触发

关键修复:PB10 数字输入使能

R32_PIN_CONFIG2 寄存器中 RB_PIN_PB10_15_DIS 默认置位(关闭数字输入省电)。GPIOB_ModeCfg(..., GPIO_ModeIN_PU) 只配置了上下拉和方向,数字输入通路在更底层被掐断。修复:R32_PIN_CONFIG2 &= ~(1UL << 26)

mstick() 时间单位修正

mstick() = TimingDelayInc,在 TMR1 ISR (5ms 间隔) 中递增。单位是 5ms/tick,不是毫秒。

位置 原来 修正后 实际时间
opt_input_poll 阈值 >= 500 >= 100 500ms
RS485_HEARTBEAT_MS 5000 1000 5s
RS485_FAULT_MS 1000 200 1s

帧超时 mstick() - _rx_last_tick > 10(=50ms)保留未改,对 9600 波特率够用。