Files
DLD154Pro/docs/devlog.md
T

226 lines
7.7 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.
# 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 的物理关系分析
### 参数表
```c
// sens_in: 进入阈值, sens_out: 离开阈值 (0=低, 2=高)
SensTable = { 108, 54, 28 }; // 进入
SensTable1 = { 81, 32, 16 }; // 离开
```
### 计算链路
**Step 1:阈值差值**
```c
loop1_dlt_ORG = (Origin * sens) >> 16; // = Origin × sens / 65536
```
**Step 2:进入判定**
```c
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 |
### 物理验证
典型 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) : 0`
- `dbn_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/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/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` 字段保留,默认值=0
- `dbn_ble_srv.c:468` 上报字节 relay2 位自动为 0(字段初始化为 0 后无写入)
### 待办
- [ ] RS485 通信协议定义 + UART0 中断/收发实现
- [ ] 光耦输入逻辑(与其他检测器联动 / 综合判断)
- [ ] IAP/OTA 项目文件中的 DLD110S 引用更新(`592OnlyUpdateApp_*`
- [ ] `.mrs/` 工作区文件清理(大量 DLD110S 历史快照)