Compare commits
14
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5f7082c0ba | ||
|
|
d6a50893dd | ||
|
|
2e4e40935c | ||
|
|
befe99bb1a | ||
|
|
692b406d0f | ||
|
|
d1fde88dd1 | ||
|
|
16f5e9b738 | ||
|
|
fcbe7698a3 | ||
|
|
1757674318 | ||
|
|
1da7b984f1 | ||
|
|
e2099ae12f | ||
|
|
1790a9fd42 | ||
|
|
7be0c83cb1 | ||
|
|
0fbb2cb461 |
@@ -635,6 +635,10 @@ void manage_dbn_ble_default(uint8_t *pkg, uint8_t len)
|
||||
tmp_ble_buf[i++] = (g_loop_power_up_state == 0) ? 1 : ((uint8_t)(g_loop_cut_amount));
|
||||
tmp_ble_buf[i++] = (uint8_t)(g_loop_cut_amount >> 8);
|
||||
tmp_ble_buf[i++] = g_loop_cng_unit.direction_mode;
|
||||
/* V3.04: 追加归一化基数 LOOP_MEASURE_BASE (2^19=524288, LE), 供第三方 variation 换算 dL/L */
|
||||
tmp_ble_buf[i++] = (uint8_t)(LOOP_MEASURE_BASE);
|
||||
tmp_ble_buf[i++] = (uint8_t)(LOOP_MEASURE_BASE >> 8);
|
||||
tmp_ble_buf[i++] = (uint8_t)(LOOP_MEASURE_BASE >> 16);
|
||||
|
||||
set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, i);
|
||||
// PRINT("\nGet_Cjq_param\n");
|
||||
|
||||
@@ -17,10 +17,13 @@
|
||||
*/
|
||||
|
||||
#define PRODUCT_MODEL "DLD154Pro"
|
||||
#define FIRMWARE_VER "3.02"
|
||||
#define FIRMWARE_VER "3.05"
|
||||
#define HARDWARE_VER "3.01"
|
||||
#define FIRMWARE_VER_MAIN 3
|
||||
#define FIRMWARE_VER_SUB 2
|
||||
#define FIRMWARE_VER_SUB 5
|
||||
|
||||
/* 归一化基数: variation 换算 dL/L 时除以该值 (2^19=524288, 必须与 peripheral_main.c MEASUREMENT_BASE 同步) */
|
||||
#define LOOP_MEASURE_BASE 524288L
|
||||
#define HARDWARE_VER_MAIN 3
|
||||
#define HARDWARE_VER_SUB 1
|
||||
|
||||
|
||||
@@ -39,8 +39,9 @@
|
||||
#define MB_FULL_DATA_FRAME_LEN 43
|
||||
|
||||
/* FC 0x03/0x04 读寄存器缓冲 (Modbus 标准: max qty = 0x007D = 125) */
|
||||
#define MB_MAX_READ_REGS 125 /* 单次读取最大寄存器数 */
|
||||
#define MB_MAX_DATA_BYTES 250 /* 125 × 2 字节 */
|
||||
/* ⚠ 40/80 匹配: 40 寄存器 × 2B = 80B 缓冲 (2026-08-27 省 Flash 减配, 原 60 会越界 40B) */
|
||||
#define MB_MAX_READ_REGS 40 //125 /* 单次读取最大寄存器数 */
|
||||
#define MB_MAX_DATA_BYTES 80 //250 /* 40 × 2 字节 */
|
||||
#define MB_RESP_BUF_SIZE (5 + MB_MAX_DATA_BYTES) /* addr+fc+bc+data+crc */
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
@@ -729,7 +729,8 @@ static void simpleProfileChangeCB(uint8_t paramID, uint8_t *pValue, uint16_t len
|
||||
g_ble_rcv_buf.buf[3] == 'O' && g_ble_rcv_buf.buf[4] == 'T' && g_ble_rcv_buf.buf[5] == 'A'){
|
||||
// 0x4F, 0x54, 0x41
|
||||
// PRINT("jump OTA \n");
|
||||
mDelaymS(5);
|
||||
WWDG_ResetCfg(DISABLE);
|
||||
// mDelaymS(5);
|
||||
Jump_OTA();
|
||||
}
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include "cmcng.h"
|
||||
#include "dbn_ble_srv.h"
|
||||
#include "CH59x_pwm.h"
|
||||
#include "CH59x_sys.h" /* WWDG 看门狗 */
|
||||
#include "rs485_700bs.h"
|
||||
#include "rs485_modbus.h"
|
||||
|
||||
@@ -53,7 +54,7 @@ uint8_t g_rs485_id = 0;
|
||||
* PA8 : RLY1 存在继电器 (单刀双掷, 低电平有效)
|
||||
* PB22 : LEDA 绿色指示灯 (有车亮/无车灭, 低电平有效)
|
||||
* PB23 : LEDB 红色指示灯 (呼吸灯, 低电平有效)
|
||||
* PA12 : FLEVEL 线圈调频 (一级, 0=33nF, 1=0nF)
|
||||
* PA12 : FLEVEL 线圈调频 (一级, 0=66nF(低频), 1=33nF(高频))
|
||||
* PA14 : UART0_Tx RS485发送 (700BS 协议)
|
||||
* PA15 : UART0_Rx RS485接收 (700BS 协议)
|
||||
* PA13 : UART0_RE RS485方向控制 (700BS 协议)
|
||||
@@ -83,20 +84,29 @@ uint8_t g_rs485_id = 0;
|
||||
#define OPT_IN1 (GPIOB_ReadPortPin(GPIO_Pin_10))
|
||||
|
||||
/*===========================================================================
|
||||
* LEDB 红色呼吸灯 (PB23, PWM11) — 快速心跳指示 (~2s 周期)
|
||||
* LEDB 红色呼吸灯 (PB23, PWM11) — 心跳指示
|
||||
* PWM freq ≈ 60MHz / (PWM_CLK_DIV * 128) ≈ 5.86kHz @DIV=80
|
||||
* 周期 = 16步渐亮 + 3tick高亮 + 16步渐灭 + 3tick低亮
|
||||
* ≈ (16*50ms)*2 + 150ms*2 ≈ 1.9s
|
||||
* 无光耦信号: 周期 ≈ 16步×2 + 3tick×2 ≈ 1.9s (DUTY_STEP=8, HOLD=3)
|
||||
* 光耦有信号: 周期 ≈ 4步×2 + 1tick×2 ≈ 0.5s (DUTY_STEP=32, HOLD=1)
|
||||
* 复位模式(6)除外,光耦有信号不加速
|
||||
*===========================================================================*/
|
||||
#define PWM_CLK_DIV 80
|
||||
#define PWM_CYCLE 128 // 7-bit 分辨率 (0~127)
|
||||
#define BREATH_STEP_DELAY 1 // 每 50ms 更新一次
|
||||
#define BREATH_DUTY_STEP 8 // 每步跳 8 级占空比
|
||||
#define BREATH_HOLD_TICKS 3 // 高/低电平保持 tick 数
|
||||
#define BREATH_FADE_IN 0
|
||||
#define BREATH_HOLD_HIGH 1
|
||||
#define BREATH_FADE_OUT 2
|
||||
#define BREATH_HOLD_LOW 3
|
||||
|
||||
/* 光耦有信号时加速参数 (周期 ~1s) */
|
||||
#define BREATH_OPTO_DUTY_STEP 64 // 步长 8x → 渐亮/渐灭各 2 步 (~0.55s 周期, 光耦有信号加速)
|
||||
#define BREATH_OPTO_HOLD_TICKS 1 // 保持 50ms
|
||||
|
||||
/* 看门狗超时: Fsys=60MHz, WDOG_CLK=Fsys/131072≈458Hz, 0xFF≈558ms */
|
||||
#define WDOG_TIMEOUT 0xFF
|
||||
|
||||
static uint8_t g_breath_phase = BREATH_FADE_IN;
|
||||
static uint8_t g_breath_duty = 0;
|
||||
static uint8_t g_breath_tick = 0;
|
||||
@@ -129,7 +139,6 @@ uint32_t mstick(void){
|
||||
return TimingDelayInc;
|
||||
}
|
||||
|
||||
uint32_t u32CountWdt = 0;
|
||||
uint8_t g_loop_cut_last = 0;
|
||||
uint32_t g_loop_cut_amount = 0;
|
||||
|
||||
@@ -160,6 +169,8 @@ uint8_t Flt_Reg = 0;
|
||||
uint8_t TM1cnt = 0;
|
||||
uint16_t g_hold_time = 0;
|
||||
|
||||
uint16_t g_wdg_counter = 0;
|
||||
|
||||
/*===========================================================================
|
||||
* 捕获 & 测量
|
||||
*===========================================================================*/
|
||||
@@ -349,7 +360,7 @@ void para_store_init(void)
|
||||
g_freq_level = 0;
|
||||
#endif
|
||||
|
||||
// DLD154Pro: 一级调频, 0=33nF(低频), 1=0nF(高频)
|
||||
// DLD154Pro: 一级调频, 0=66nF(低频), 1=33nF(高频)
|
||||
if (g_freq_level == 0) {
|
||||
FLEVEL_LOW;
|
||||
} else {
|
||||
@@ -404,7 +415,7 @@ void gpio_uart_init(void)
|
||||
/*--- 线圈调频 (PA12=FLEVEL, 一级) ---*/
|
||||
GPIOA_SetBits(GPIO_Pin_12);
|
||||
GPIOA_ModeCfg(GPIO_Pin_12, GPIO_ModeOut_PP_5mA);
|
||||
FLEVEL_LOW; // 默认接入 33nF
|
||||
FLEVEL_LOW; // 默认接入 66nF (低频)
|
||||
|
||||
/*--- 继电器 (PA8=RLY1) ---*/
|
||||
GPIOA_SetBits(GPIO_Pin_8);
|
||||
@@ -631,12 +642,18 @@ void vd1_task(void){
|
||||
*================================================================*/
|
||||
loop1_dlt_ORG = ((uint32_t)loop1_Origin * g_loop_sens_list.sens[g_freq_sens].sens_in) >> 16;
|
||||
{
|
||||
/* V4B V4.20 同步: 双向对称保护 — 负variation(铁块磁导率)也冻结基线
|
||||
* 原单边只挡 dev>+4×dlt, 负variation会把Origin污染抬高 → 离开时假进入 → 锁死不释放
|
||||
* 修复: ① 对称窗口 [-4×dlt, +4×dlt] ② 负偏差只冻结永不超时更新 */
|
||||
int32_t dev = (int32_t)loop1_CAPVD - (int32_t)loop1_Origin;
|
||||
if (dev < (int32_t)(loop1_dlt_ORG * 4)) {
|
||||
int32_t freeze_band = (int32_t)(loop1_dlt_ORG * 4);
|
||||
if (dev < freeze_band && dev > -freeze_band) {
|
||||
/* 对称窗口内 → 正常基线跟踪 */
|
||||
loop1_freeze_cnt = 0;
|
||||
loop1_freeze_ref = 0;
|
||||
update_moving_average(&loop1_ORG_SUM, &loop1_ORG_CNT, &loop1_Origin, loop1_CAPVD, WINDOW_ORIGIN);
|
||||
} else {
|
||||
/*--- CAPVD 异常偏高: 暂停跟踪, 冻结超时 + 稳定性双条件 ---*/
|
||||
} else if (dev < 0) {
|
||||
/* 正variation (疑似车) → 冻结, 保留超时兜底更新 */
|
||||
if (loop1_freeze_cnt == 0) {
|
||||
loop1_freeze_ref = loop1_CAPVD;
|
||||
} else {
|
||||
@@ -655,6 +672,15 @@ void vd1_task(void){
|
||||
}
|
||||
loop1_ORG_CNT = 0;
|
||||
loop1_ORG_SUM = 0;
|
||||
} else {
|
||||
/* 负variation (CAPVD高于Origin, 特殊铁块磁导率主导) → 只冻结, 永不更新 Origin */
|
||||
if (loop1_freeze_cnt == 0) {
|
||||
loop1_freeze_ref = loop1_CAPVD;
|
||||
}
|
||||
loop1_freeze_cnt++;
|
||||
if (loop1_freeze_cnt > FREEZE_TIMEOUT) loop1_freeze_cnt = FREEZE_TIMEOUT;
|
||||
loop1_ORG_CNT = 0;
|
||||
loop1_ORG_SUM = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1016,6 +1042,15 @@ static void opt_input_poll(void)
|
||||
}
|
||||
}
|
||||
|
||||
void poll_wdg(void)
|
||||
{
|
||||
if(g_wdg_counter >= 100) //500ms
|
||||
{
|
||||
g_wdg_counter = 0;
|
||||
WWDG_SetCounter(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*********************************************************************
|
||||
* @fn Main_Circulation
|
||||
@@ -1050,6 +1085,8 @@ void Main_Circulation()
|
||||
g_dbn_ble_state_acs_enable.enable = 0;
|
||||
}
|
||||
}
|
||||
|
||||
poll_wdg(); // 喂狗
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1093,6 +1130,11 @@ int main(void)
|
||||
HAL_Init();
|
||||
GAPRole_PeripheralInit();
|
||||
Peripheral_Init();
|
||||
|
||||
/* 使能看门狗复位: 超时 ~558ms, 主循环喂狗 */
|
||||
WWDG_ResetCfg(ENABLE);
|
||||
WWDG_SetCounter(0);
|
||||
|
||||
Main_Circulation();
|
||||
}
|
||||
|
||||
@@ -1196,7 +1238,7 @@ void TMR1_IRQHandler(void)
|
||||
}
|
||||
|
||||
TimingDelayInc++;
|
||||
u32CountWdt++;
|
||||
g_wdg_counter++;
|
||||
|
||||
/*--- LED: 断开中 200ms 快闪; 稳定期 200ms 慢闪 ---*/
|
||||
if(g_disconnect_active || !g_loop_power_up_state)
|
||||
@@ -1335,49 +1377,62 @@ void TMR1_IRQHandler(void)
|
||||
}
|
||||
}
|
||||
|
||||
/*--- LEDB 红色呼吸灯 (PWM11, 50ms tick, ~1.9s 心跳周期) ---*/
|
||||
/*--- LEDB 红色呼吸灯 (PWM11, 50ms tick, 光耦有信号时加速 ~1s) ---*/
|
||||
{
|
||||
uint8_t _step, _hold;
|
||||
|
||||
/* 非复位模式下光耦有信号 → 红灯快闪 (现场判断光耦是否正常) */
|
||||
if (g_opt_trigger && g_output_radar_mode != OUTPUT_MODE_LOOP_X_RESET) {
|
||||
_step = BREATH_OPTO_DUTY_STEP;
|
||||
_hold = BREATH_OPTO_HOLD_TICKS;
|
||||
} else {
|
||||
_step = BREATH_DUTY_STEP;
|
||||
_hold = BREATH_HOLD_TICKS;
|
||||
}
|
||||
|
||||
g_breath_tick++;
|
||||
switch (g_breath_phase) {
|
||||
case BREATH_FADE_IN: // 渐亮 0 → max, ~800ms
|
||||
case BREATH_FADE_IN:
|
||||
if (g_breath_tick >= BREATH_STEP_DELAY) {
|
||||
g_breath_tick = 0;
|
||||
if (g_breath_duty + BREATH_DUTY_STEP >= PWM_CYCLE) {
|
||||
if (g_breath_duty + _step >= PWM_CYCLE) {
|
||||
g_breath_duty = PWM_CYCLE - 1;
|
||||
g_breath_phase = BREATH_HOLD_HIGH;
|
||||
g_breath_tick = 0;
|
||||
} else {
|
||||
g_breath_duty += BREATH_DUTY_STEP;
|
||||
g_breath_duty += _step;
|
||||
}
|
||||
PWM11_ActDataWidth(g_breath_duty);
|
||||
}
|
||||
break;
|
||||
case BREATH_HOLD_HIGH: // 最亮保持 ~150ms
|
||||
if (g_breath_tick >= 3) {
|
||||
case BREATH_HOLD_HIGH:
|
||||
if (g_breath_tick >= _hold) {
|
||||
g_breath_phase = BREATH_FADE_OUT;
|
||||
g_breath_tick = 0;
|
||||
}
|
||||
break;
|
||||
case BREATH_FADE_OUT: // 渐灭 max → 0, ~800ms
|
||||
case BREATH_FADE_OUT:
|
||||
if (g_breath_tick >= BREATH_STEP_DELAY) {
|
||||
g_breath_tick = 0;
|
||||
if (g_breath_duty <= BREATH_DUTY_STEP) {
|
||||
if (g_breath_duty <= _step) {
|
||||
g_breath_duty = 0;
|
||||
g_breath_phase = BREATH_HOLD_LOW;
|
||||
g_breath_tick = 0;
|
||||
} else {
|
||||
g_breath_duty -= BREATH_DUTY_STEP;
|
||||
g_breath_duty -= _step;
|
||||
}
|
||||
PWM11_ActDataWidth(g_breath_duty);
|
||||
}
|
||||
break;
|
||||
case BREATH_HOLD_LOW: // 最暗保持 ~150ms
|
||||
if (g_breath_tick >= 3) {
|
||||
case BREATH_HOLD_LOW:
|
||||
if (g_breath_tick >= _hold) {
|
||||
g_breath_phase = BREATH_FADE_IN;
|
||||
g_breath_tick = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*--- 线圈载波检测 & 继电器输出刷新 (每 5ms) ---*/
|
||||
if(loop1_RF_FLAG)
|
||||
|
||||
@@ -62,7 +62,7 @@ void rs485_init(void)
|
||||
|
||||
RS485_RE_RX(); // 默认接收模式
|
||||
_hb_last_ms = mstick(); // 对齐心跳起始时刻,避免首次立即触发
|
||||
PRINT("RS485: init ok, addr=%d, baud=%d\n", g_rs485_id, RS485_BAUD);
|
||||
// PRINT("RS485: init ok, addr=%d, baud=%d\n", g_rs485_id, RS485_BAUD);
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
@@ -126,7 +126,7 @@ static void handle_query_freq(uint8_t addr)
|
||||
static void handle_reset_init(uint8_t addr)
|
||||
{
|
||||
SYS_ResetExecute();
|
||||
PRINT("RS485: coil reset init\n");
|
||||
// PRINT("RS485: coil reset init\n");
|
||||
}
|
||||
|
||||
/* 0x3D — 查询拨码 DIP1-5 (DLD154Pro 无物理拨码, 从 BLE 配置映射) */
|
||||
@@ -222,7 +222,7 @@ static void rs485_process_frame(void)
|
||||
uint8_t xorr = _rx_buf[2];
|
||||
|
||||
if ((stx ^ addr) != xorr) {
|
||||
PRINT("RS485: XOR fail %02X %02X %02X\n", stx, addr, xorr);
|
||||
// PRINT("RS485: XOR fail %02X %02X %02X\n", stx, addr, xorr);
|
||||
_rx_len = 0;
|
||||
return;
|
||||
}
|
||||
@@ -237,9 +237,9 @@ static void rs485_process_frame(void)
|
||||
case CMD_QUERY_STATUS: handle_query_status(addr); break;
|
||||
case CMD_QUERY_FREQ: handle_query_freq(addr); break;
|
||||
case CMD_RESET_INIT: handle_reset_init(addr); break;
|
||||
case CMD_QUERY_DIP: handle_query_dip(addr); break;
|
||||
// case CMD_QUERY_DIP: handle_query_dip(addr); break;
|
||||
default:
|
||||
PRINT("RS485: unknown cmd 0x%02X\n", stx);
|
||||
// PRINT("RS485: unknown cmd 0x%02X\n", stx);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -439,24 +439,24 @@ static uint8_t read_ir_register(uint16_t addr, uint8_t *hi, uint8_t *lo)
|
||||
*hi = (uint8_t)(loop1_Origin >> 24); *lo = (uint8_t)(loop1_Origin >> 16); return 1;
|
||||
case 0x0005: /* Origin Lo */
|
||||
*hi = (uint8_t)(loop1_Origin >> 8); *lo = (uint8_t)(loop1_Origin); return 1;
|
||||
case 0x0006: /* Variation Hi */
|
||||
var = (int32_t)(loop1_CAPVD - loop1_Origin);
|
||||
val32 = (uint32_t)var;
|
||||
*hi = (uint8_t)(val32 >> 24); *lo = (uint8_t)(val32 >> 16); return 1;
|
||||
case 0x0007: /* Variation Lo */
|
||||
var = (int32_t)(loop1_CAPVD - loop1_Origin);
|
||||
val32 = (uint32_t)var;
|
||||
*hi = (uint8_t)(val32 >> 8); *lo = (uint8_t)(val32); return 1;
|
||||
// case 0x0006: /* Variation Hi */
|
||||
// var = (int32_t)(loop1_CAPVD - loop1_Origin);
|
||||
// val32 = (uint32_t)var;
|
||||
// *hi = (uint8_t)(val32 >> 24); *lo = (uint8_t)(val32 >> 16); return 1;
|
||||
// case 0x0007: /* Variation Lo */
|
||||
// var = (int32_t)(loop1_CAPVD - loop1_Origin);
|
||||
// val32 = (uint32_t)var;
|
||||
// *hi = (uint8_t)(val32 >> 8); *lo = (uint8_t)(val32); return 1;
|
||||
case 0x0008: /* FW Version (BCD: v3.01 → 0x0301) */
|
||||
*hi = FIRMWARE_VER_MAIN; *lo = FIRMWARE_VER_SUB; return 1;
|
||||
case 0x0009: /* HW Version */
|
||||
*hi = HARDWARE_VER_MAIN; *lo = HARDWARE_VER_SUB; return 1;
|
||||
case 0x000A: /* Freq Sens */
|
||||
*hi = 0; *lo = g_loop_cng_unit.sensitvity & 0x0F; return 1;
|
||||
case 0x000B: /* Condition */
|
||||
*hi = 0; *lo = g_loop_acs_info.condition; return 1;
|
||||
case 0x000C: /* DIP Virtual: bit[7:4]=function_mode, bit[3:0]=fusion_mode */
|
||||
*hi = 0; *lo = (g_function_mode << 4) | (g_output_radar_mode & 0x0F); return 1;
|
||||
// case 0x000A: /* Freq Sens */
|
||||
// *hi = 0; *lo = g_loop_cng_unit.sensitvity & 0x0F; return 1;
|
||||
// case 0x000B: /* Condition */
|
||||
// *hi = 0; *lo = g_loop_acs_info.condition; return 1;
|
||||
// case 0x000C: /* DIP Virtual: bit[7:4]=function_mode, bit[3:0]=fusion_mode */
|
||||
// *hi = 0; *lo = (g_function_mode << 4) | (g_output_radar_mode & 0x0F); return 1;
|
||||
|
||||
/* 全数据块 0x0100–0x0112 — 热路径, 直接计算 */
|
||||
default:
|
||||
@@ -615,34 +615,34 @@ static void handle_write_single_reg(const uint8_t *rx, uint8_t rx_len)
|
||||
|
||||
/* 值校验 & 写入 */
|
||||
switch (reg_addr) {
|
||||
case 0x0000: /* Sensitivity: 0-3 */
|
||||
if (reg_val > 3) { send_exception(0x06, 0x03); return; }
|
||||
g_loop_cng_unit.sensitvity = (uint8_t)reg_val;
|
||||
break;
|
||||
case 0x0001: /* Fusion Mode: 0-6 */
|
||||
if (reg_val > 6) { send_exception(0x06, 0x03); return; }
|
||||
g_output_radar_mode = (uint8_t)reg_val;
|
||||
g_loop_cng_unit.direction_mode = (g_function_mode << 4) | (g_output_radar_mode & 0x0F);
|
||||
break;
|
||||
case 0x0002: /* Hold Time: 0-255 */
|
||||
g_loop_cng_unit.exist_mode = (uint8_t)reg_val;
|
||||
g_hold_time = (uint16_t)reg_val * 20 * 5;
|
||||
break;
|
||||
case 0x0003: /* Output Delay: 0-255 */
|
||||
g_loop_cng_unit.delay_time = (uint8_t)reg_val;
|
||||
break;
|
||||
case 0x0004: /* Freq Level: 0-1 */
|
||||
if (reg_val > 1) { send_exception(0x06, 0x03); return; }
|
||||
g_freq_level = (uint8_t)reg_val;
|
||||
g_loop_cng_unit.loopFreq_Level = g_freq_level + 1;
|
||||
break;
|
||||
case 0x0009: /* BT Timeout: 0-255 */
|
||||
g_max_counter_bt_min = (uint8_t)reg_val;
|
||||
g_max_counter_bt_timeout = (uint32_t)reg_val * 60 * 1000;
|
||||
break;
|
||||
case 0x000A: /* Safe Timeout: 0-255 */
|
||||
g_loop_cng_unit.loopSafe_Timeout = (uint8_t)reg_val;
|
||||
break;
|
||||
// case 0x0000: /* Sensitivity: 0-3 */
|
||||
// if (reg_val > 3) { send_exception(0x06, 0x03); return; }
|
||||
// g_loop_cng_unit.sensitvity = (uint8_t)reg_val;
|
||||
// break;
|
||||
// case 0x0001: /* Fusion Mode: 0-6 */
|
||||
// if (reg_val > 6) { send_exception(0x06, 0x03); return; }
|
||||
// g_output_radar_mode = (uint8_t)reg_val;
|
||||
// g_loop_cng_unit.direction_mode = (g_function_mode << 4) | (g_output_radar_mode & 0x0F);
|
||||
// break;
|
||||
// case 0x0002: /* Hold Time: 0-255 */
|
||||
// g_loop_cng_unit.exist_mode = (uint8_t)reg_val;
|
||||
// g_hold_time = (uint16_t)reg_val * 20 * 5;
|
||||
// break;
|
||||
// case 0x0003: /* Output Delay: 0-255 */
|
||||
// g_loop_cng_unit.delay_time = (uint8_t)reg_val;
|
||||
// break;
|
||||
// case 0x0004: /* Freq Level: 0-1 */
|
||||
// if (reg_val > 1) { send_exception(0x06, 0x03); return; }
|
||||
// g_freq_level = (uint8_t)reg_val;
|
||||
// g_loop_cng_unit.loopFreq_Level = g_freq_level + 1;
|
||||
// break;
|
||||
// case 0x0009: /* BT Timeout: 0-255 */
|
||||
// g_max_counter_bt_min = (uint8_t)reg_val;
|
||||
// g_max_counter_bt_timeout = (uint32_t)reg_val * 60 * 1000;
|
||||
// break;
|
||||
// case 0x000A: /* Safe Timeout: 0-255 */
|
||||
// g_loop_cng_unit.loopSafe_Timeout = (uint8_t)reg_val;
|
||||
// break;
|
||||
case 0x0010: /* Auto Rpt Enable: 0-1 */
|
||||
if (reg_val > 1) { send_exception(0x06, 0x03); return; }
|
||||
_auto_rpt_enable = (uint8_t)reg_val;
|
||||
@@ -833,11 +833,11 @@ void modbus_poll(void)
|
||||
if (crc_rx == crc_calc) {
|
||||
switch (fc) {
|
||||
case 0x02: handle_read_discrete_inputs(rx, len); break;
|
||||
case 0x03: handle_read_holding_regs(rx, len); break;
|
||||
// case 0x03: handle_read_holding_regs(rx, len); break;
|
||||
case 0x04: handle_read_input_regs(rx, len); break;
|
||||
case 0x06: handle_write_single_reg(rx, len); break;
|
||||
case 0x10: handle_write_multiple_regs(rx, len); break;
|
||||
case 0x11: handle_report_slave_id(rx, len); break;
|
||||
// case 0x10: handle_write_multiple_regs(rx, len); break;
|
||||
// case 0x11: handle_report_slave_id(rx, len); break;
|
||||
default: send_exception(fc, 0x01); break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,11 +57,37 @@ DLD154Tool/
|
||||
├── serial_client.py # 串口抽象层 (扫描/连接/收发)
|
||||
├── protocol_700bs.py # 700BS 协议编解码
|
||||
├── protocol_modbus.py # Modbus RTU 协议编解码 + CRC16
|
||||
├── DLD154Tool.spec # PyInstaller 打包配置
|
||||
├── requirements.txt # pyside6, pyserial
|
||||
├── .gitignore
|
||||
├── dist/ # 打包产物 (gitignored)
|
||||
└── README.md
|
||||
```
|
||||
|
||||
## 打包为可执行文件
|
||||
|
||||
PyInstaller **不支持跨平台交叉编译**,需要在目标系统上执行。
|
||||
|
||||
### Linux
|
||||
|
||||
```bash
|
||||
pip install pyinstaller
|
||||
pyinstaller DLD154Tool.spec
|
||||
# → dist/DLD154Tool (69MB, 单文件 ELF x86-64)
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
```cmd
|
||||
python -m venv venv
|
||||
venv\Scripts\activate
|
||||
pip install -r requirements.txt pyinstaller
|
||||
pyinstaller DLD154Tool.spec
|
||||
:: → dist\DLD154Tool.exe (单文件,双击运行)
|
||||
```
|
||||
|
||||
> spec 文件已预置,无需重新生成。产物 `dist/` 目录已加入 `.gitignore`。
|
||||
|
||||
## RS485 接线
|
||||
|
||||
```
|
||||
|
||||
@@ -34,7 +34,7 @@ DLD154Pro是一个单线圈的蓝牙车辆检测器功能说明:
|
||||
|
||||
| 引脚 | 标识 | 功能 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| PA12 | F1, FLEVEL\_H | 33nF | 调频电容,0=33nF,1=0nF |
|
||||
| PA12 | F1, FLEVEL_H | 66nF/33nF | 调频电容,0=66nF(低频),1=33nF(高频) |
|
||||
|
||||
### 继电器
|
||||
|
||||
|
||||
@@ -0,0 +1,247 @@
|
||||
# DLD154Pro 蓝牙小程序接口协议
|
||||
|
||||
> 依据源码整理:`BLE/DLD154Pro_Peripheral_28K/APP/dbn_ble_srv.c`(主逻辑)、`peripheral.c`/`Profile/gattprofile.c`(BLE 服务)、`include/storage.h`(配置结构)、`include/cmcng.h`(常量)
|
||||
> 固件版本:V3.05(cmcng.h `FIRMWARE_VER`)| 硬件版本:V3.01 | 产品型号:DLD154Pro
|
||||
|
||||
---
|
||||
|
||||
## 1. BLE 服务与特征
|
||||
|
||||
| 服务/特征 | UUID | 属性 | 长度 | 用途 |
|
||||
|-----------|------|------|------|------|
|
||||
| 服务 SIMPLEPROFILE | 0xFFE0 | — | — | 广播服务 UUID |
|
||||
| Char1 | 0xFFE1 | 读写 (RW) | 64B | **小程序 → 芯片:命令下发** |
|
||||
| Char2 | 0xFFE2 | 读 | 1B | 预留 |
|
||||
| Char3 | 0xFFE3 | 写 | 8B | 预留 |
|
||||
| Char4 | 0xFFE4 | **通知 (Notify)** | 32B | **芯片 → 小程序:命令响应 + 主动上报** |
|
||||
| Char5 | 0xFFE5 | 读 | 5B | 预留 |
|
||||
|
||||
- 设备名:`DLD154Pro`(广播 + GATT Device Name)
|
||||
- **MTU**:默认 23,连接后协商(`ATT_MTU_UPDATED_EVENT` → `peripheralMTU = clientRxMTU`)。notify 单包 payload ≤ `peripheralMTU − 3`(peripheral.c:677 强制检查,超限返回 FAIL 不发送)
|
||||
- **交互模型**:小程序写 Char1 下发命令帧 → 芯片处理 → Char4 notify 返回响应帧;芯片主动上报也走 Char4
|
||||
|
||||
---
|
||||
|
||||
## 2. 帧格式与校验
|
||||
|
||||
```
|
||||
| Magic 1B | Header 1B | Len 1B | CMD 1B | Data N B | XOR 1B | SUM 1B |
|
||||
```
|
||||
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
| Magic | `0x8F` = 车检器默认协议;`0x7F` = 透传(显示屏/地感/探头协议) |
|
||||
| Header | 单包 = `0x00`;分包 = `(pkg_amount << 4) \| pkg_seq`(高 4 位总包数,低 4 位当前序号,seq 从 1 起) |
|
||||
| Len | `1(CMD)+ N(Data 字节数)` |
|
||||
| CMD | 命令码,见 §4 |
|
||||
| XOR | 异或校验:从 Header 到 Data 末尾逐字节 XOR |
|
||||
| SUM | 和校验:从 Header 到 Data 末尾逐字节求和(低 8 位) |
|
||||
|
||||
**校验示例**(`compute_ckb`,dbn_ble_srv.c:168):
|
||||
```c
|
||||
dxor = Header ^ Len ^ CMD ^ Data[0] ^ ... ^ Data[N-1];
|
||||
dsum = Header + Len + CMD + Data[0] + ... + Data[N-1]; // 取低 8 位
|
||||
// 发送顺序: [dxor] [dsum & 0xFF]
|
||||
```
|
||||
|
||||
**接收校验**(`check_pkg`,dbn_ble_srv.c:75):最小帧长 6;`Len + 5 < 实际长度` 判非法;XOR/SUM 任一不符丢弃。
|
||||
|
||||
---
|
||||
|
||||
## 3. 分包机制
|
||||
|
||||
- **发送(响应/上报)**:`set_response_buf()` 按 `MAX_BLE_DAT_RESPONSE_LEN = 14`(= BLE_BUFF_MAX_LEN−4,基于 MTU=23 的旧假设)计算 `pkg_amount = ceil(dat_len / 14)`。多包时 Header = `(amount<<4)|seq`,seq 从 1 递增,最后一包 `amount == seq` 后清除响应缓冲。
|
||||
- **接收(命令)**:`unpack_packs()` 支持按 `(amount<<4)|seq` 重组分包,校验 amount/cmd/seq 连续性,异常时清空缓冲。DLD154Pro 当前仅 0x1C/0x1D 使用(已注释),其余命令单包即可。
|
||||
- **⚠ 分包粒度写死 14**:即使 MTU 协商到更大(如 96/185),分包仍按 14B 切——不丢包但效率低。小程序侧按 Header 分包重组即可。
|
||||
|
||||
---
|
||||
|
||||
## 4. 命令总览
|
||||
|
||||
| CMD | 名称 | 方向 | 说明 |
|
||||
|-----|------|------|------|
|
||||
| 0x10 | GET_DEV_INFO | 小程序→芯片 | 读设备信息(MAC/版本/型号) |
|
||||
| 0x1F | RESET_DEV | 小程序→芯片 | 复位设备(SYS_ResetExecute) |
|
||||
| 0x23 | SET_CJQ_PARAM | 小程序→芯片 | 设置车检器参数(灵敏度/频率/延时/输出等) |
|
||||
| 0x24 | GET_CJQ_PARAM | 小程序→芯片 | 读车检器参数 |
|
||||
| 0x31 | RW_UART_BAUD | 小程序→芯片 | 读写 RS485 波特率/地址/蓝牙空闲超时 |
|
||||
| 0x8A | LOOP_SENS_LIST | 小程序→芯片 | 读写灵敏度表(sens_in/sens_out) |
|
||||
| 0x92 | SET_CJQ_FACTORY | 小程序→芯片 | 恢复出厂 |
|
||||
| 0xC5 | SENS_ACS_ENABLE | 小程序→芯片 | 主动上报使能 |
|
||||
| 0xC0 | SUB_SENS_REPORT | 芯片→小程序 | 主动上报线圈动态(不可下发) |
|
||||
|
||||
**未实现(源码已注释)**:0x1C 校验密码 / 0x1D 修改密码 / 0x1E 出厂 / 0x20-0x22 notify 与子功能 / 0x6D 复位 / 0x87 采样参数 / 0x88 平衡参数 / 0x89 释放参数。小程序不应下发,芯片无响应。
|
||||
|
||||
---
|
||||
|
||||
## 5. 命令详述
|
||||
|
||||
### 5.1 0x10 读设备信息
|
||||
|
||||
无 Data。响应 Data:
|
||||
|
||||
| 偏移 | 字节 | 内容 |
|
||||
|------|------|------|
|
||||
| 0-5 | 6 | MAC 地址(MACAddr[6]) |
|
||||
| 6-7 | 2 | 硬件版本 MAIN/SUB(V3.01 → 03 01) |
|
||||
| 8-9 | 2 | 固件版本 MAIN/SUB(V3.05 → 03 05) |
|
||||
| 10 | 1 | 产品型号长度 |
|
||||
| 11.. | N | 产品型号 ASCII("DLD154Pro") |
|
||||
| .. | 6 | 设备编号(g_dev_number[6]) |
|
||||
| .. | 2 | sub_code(固定 0) |
|
||||
| .. | 2 | 总线设备数(固定 0) |
|
||||
|
||||
### 5.2 0x1F 复位设备
|
||||
|
||||
无 Data。芯片执行 `SYS_ResetExecute()`(整机冷复位),**无响应帧**。
|
||||
|
||||
### 5.3 0x23 设置车检器参数
|
||||
|
||||
Data(5B):
|
||||
|
||||
| 偏移 | 内容 |
|
||||
|------|------|
|
||||
| 0 | `sensitvity(低4位) \| loopFreq_Level(高4位)` |
|
||||
| 1 | delay_time(离开延时) |
|
||||
| 2 | `output_mode(低2位) \| loopSafe_Timeout(高5位)` |
|
||||
| 3 | exist_mode(有限存在时长,单位 10s) |
|
||||
| 4 | direction_mode(低 4 位=输出融合模式;高 4 位=功能模式) |
|
||||
|
||||
**sensitvity 语义(DLD154Pro 特有)**:协议层 **1~4**(1=最低灵敏度,4=最高),内部 `g_freq_sens = sensitvity − 1`(0~3)索引灵敏度表。与 vd960Loop 的 0~3 不同,**小程序发送 1~4**。
|
||||
|
||||
**direction_mode 解析**(unpack_pkg_set_cjq_param,dbn_ble_srv.c:431):
|
||||
```
|
||||
g_function_mode = direction_mode >> 4 (功能模式)
|
||||
g_fm_700bs_disable = g_function_mode & 0x01 (0=700BS协议, 1=Modbus)
|
||||
g_output_radar_mode = direction_mode & 0x0F (输出融合模式, 见 DLD_OUTPUT_MODE)
|
||||
g_hold_time = exist_mode * 20 * 5 (tick)
|
||||
```
|
||||
|
||||
处理:更新全局 → `write_cfg_to_store(4, tmp, 7)` 写 flash → `para_store_init()` 重载。响应:1B status(固定 0)。
|
||||
|
||||
### 5.4 0x24 读车检器参数
|
||||
|
||||
无 Data。响应 Data(11B):
|
||||
|
||||
| 偏移 | 内容 |
|
||||
|------|------|
|
||||
| 0 | `(g_freq_sens + 1) \| (loopFreq_Level << 4)`(sensitvity 回读为 1~4) |
|
||||
| 1 | delay_time |
|
||||
| 2 | `output_mode \| (loopSafe_Timeout << 3)` |
|
||||
| 3 | exist_mode |
|
||||
| 4 | `sens_list.total << 4`(灵敏度档数,高 4 位) |
|
||||
| 5 | 线圈断开次数低字节(g_loop_cut_amount,上电持续累计) |
|
||||
| 6 | 线圈断开次数高字节 |
|
||||
| 7 | direction_mode |
|
||||
| 8-10 | **归一化基数 LOOP_MEASURE_BASE(3B LE,= 524288)**(V3.04 追加) |
|
||||
|
||||
> ⚠ **偏移 8-10 用途(V3.04,2026-08-26 追加)**:variation 换算 ΔL/L 的归一化基数。
|
||||
> 第三方应用连接后读一次 0x24 缓存该值:`Δf/f ≈ variation / LOOP_MEASURE_BASE`,`ΔL/L ≈ -2 × variation / LOOP_MEASURE_BASE`。
|
||||
> **背景**:DLD154Pro 的 MEASUREMENT_BASE = 524288(2^19 @60MHz),与 DLD110S 相同、与 DLD154V4B 的 131072 不同。固件显式上报后第三方无需猜测(曾出现照搬 131072 导致百分比放大 4 倍的问题,DLD110S 2026-08-26 实测发现)。
|
||||
> 向后兼容:老小程序只读前 8B 不受影响;新小程序读 11B。
|
||||
|
||||
### 5.5 0x31 读写 UART 参数
|
||||
|
||||
Data:`[rw] [status] ...`
|
||||
|
||||
**读(rw=0)**:响应 Data(8B):
|
||||
```
|
||||
[0] rw=0
|
||||
[1] status=0
|
||||
[2] 蓝牙空闲超时(分钟, g_max_counter_bt_min)
|
||||
[3-5] RS485 波特率 3B LE (g_storage_uart_baud)
|
||||
[6] RS485 从机地址 (g_rs485_id)
|
||||
[7-9] Reserved 3B
|
||||
```
|
||||
|
||||
**写(rw≠0)**:Data 后续:`[bt_timeout] [baud 3B LE] [rs485_id] [3B reserved]`,共 5B 有效写入 `write_cfg_to_store(0x10, 5B)`。响应回读当前值(同读格式)。
|
||||
|
||||
### 5.6 0x8A 读写灵敏度表
|
||||
|
||||
**读(pkg[4]=0)**:响应 Data:
|
||||
```
|
||||
[0] 0x10 (读标志)
|
||||
[1] total (灵敏度档数)
|
||||
[2..] total × [sens_in 2B LE | sens_out 2B LE]
|
||||
```
|
||||
|
||||
**写(pkg[4]≠0)**:Data 从 pkg[5] 起:`[total] [sens0_in LE2 | sens0_out LE2] [sens1...]`。写 flash `Addr_Loop_Sens_List_Offset(0x20)` + `para_store_init()` 重载。**注意:写路径不直接改 RAM 的 g_loop_sens_list,依赖 para_store_init 从 flash 重读生效**。
|
||||
|
||||
出厂默认 4 档(storage.c):`{108,54,28,14}`(sens_in)/ `{81,32,16,12}`(sens_out,滞回 ~75/59/57/86%)。
|
||||
|
||||
### 5.7 0x92 恢复出厂
|
||||
|
||||
无 Data。执行 `set_factory_param() + factory_dev()` → flash 重写出厂配置 → `para_store_init()` 重载。响应:1B status=0。
|
||||
|
||||
### 5.8 0xC5 主动上报使能
|
||||
|
||||
Data:`[enable] [interval] [timeout_min]`
|
||||
- enable:1=开启,0=关闭
|
||||
- interval:上报间隔系数,实际 `interval × 0x7F`(127)
|
||||
- timeout_min:超时分钟数(0=不限时)
|
||||
|
||||
处理(dbn_ble_srv.c:830):开启时 `timeout_counter = timeout_min × 60 × 100`(**源码 TODO 标注 min→ms,60×100=6000 疑应为 60000**,若按 6000 则实际超时 = timeout_min 分钟 ÷ 10,注意现场验证)。关闭时 flag=0。
|
||||
|
||||
---
|
||||
|
||||
## 6. 主动上报 0xC0(芯片 → 小程序)
|
||||
|
||||
组包:`usart_packet_processing_acs_loop()`(dbn_ble_srv.c:452),type = 5(SENS_LOOP_DYNAMIC)。
|
||||
|
||||
| 偏移 | 字节 | 内容 |
|
||||
|------|------|------|
|
||||
| 0 | 1 | `0x05`(SENS_LOOP_DYNAMIC 线圈动态) |
|
||||
| 1 | 1 | `loop_num<<6 \| freq_level<<4 \| condition&0x0F` |
|
||||
| 2 | 1 | `relay2_state<<6 \| relay2_cng<<4 \| relay1_state<<2 \| relay1_cng&0x3` |
|
||||
| 3 | 1 | `loop1_FLAG_CUT<<7 \| car_state<<4 \| direction&0x0F` |
|
||||
| 4-6 | 3 | 线圈断开次数(LE,power_up_state==0 时为 1) |
|
||||
| 7-9 | 3 | 实际频率(LE,`freq = sclk_freq/CAPVD×LPCNT + 360` 补偿) |
|
||||
| 10-12 | 3 | variation 变化量(**3B 有符号补码 LE**,正=车/金属进入方向) |
|
||||
|
||||
**触发条件**(report_sens_acs,dbn_ble_srv.c:531):
|
||||
- 事件:`flag_event` 置位(车进出等事件)立即上报
|
||||
- 周期:`report_counter >= 120` 周期上报(120 × 50ms ≈ 6s)
|
||||
- 前提:`g_dbn_ble_state_acs_enable.enable == 1`(0xC5 开启)
|
||||
|
||||
**variation 接收端注意**:int32_t 截断 3B,负值需符号扩展(`if (v & 0x800000) v |= 0xFF000000`),与 vd960Loop V1.05 同口径。
|
||||
|
||||
**condition**:环境状态评估值 0~15(`g_env_activity/10`,>150 取 15;线圈断开强制 15),值越大干扰越大。
|
||||
|
||||
---
|
||||
|
||||
## 7. 实现细节与坑(对照源码)
|
||||
|
||||
1. **sensitvity 1~4 vs 0~3**:DLD154Pro 协议层 1~4,内部 `g_freq_sens = sensitvity-1`。0x24 回读 `+1`。**与 vd960Loop(0~3)不一致,小程序需按产品区分**
|
||||
2. **分包粒度 14B 写死**:`MAX_BLE_DAT_RESPONSE_LEN = BLE_BUFF_MAX_LEN - 4 = 14`(基于 MTU 23);MTU 协商更大后不重新分包——正确但低效
|
||||
3. **0xC5 超时疑似 bug**:`timeout_min × 60 × 100`,若意图 ms 则应为 ×1000(待现场验证)
|
||||
4. **0x8A 写灵敏度表不直接更新 RAM**:依赖 `para_store_init()` 重读 flash;写完立即读可能拿到旧值
|
||||
5. **0xC0 frequent +360 补偿**:`_current_freq = freq_tmp + 360`(经验补偿值,示波器标定用)
|
||||
6. **0x1F/0x1E 无响应**:复位/出厂类命令执行后设备重启,小程序不应等待响应帧
|
||||
7. **notify 超限静默丢弃**:`peripheralChar4Notify` 中 `len > (peripheralMTU-3)` 时返回 FAIL,不重发——长响应必须分包
|
||||
8. **密码命令未实现**:0x1C/0x1D 已注释,小程序不应依赖加密鉴权
|
||||
|
||||
---
|
||||
|
||||
## 8. 交互示例
|
||||
|
||||
**读取设备信息**(无 Data,Len=1):
|
||||
```
|
||||
下发: 8F 00 01 10 11 11
|
||||
│ │ │ │ │ └ SUM = 0x00+0x01+0x10 = 0x11
|
||||
│ │ │ │ └─ XOR = 0x00^0x01^0x10 = 0x11
|
||||
│ │ │ └─ CMD = 0x10
|
||||
│ │ └─ Len = 1 (CMD only)
|
||||
│ └─ Header = 0 (单包)
|
||||
└─ Magic = 0x8F
|
||||
|
||||
芯片 → Char4 notify: 8F 00 10 XX [MAC6][03 01][03 04][0A "DLD154Pro"][dev_no6][00 00][00 00] [XOR] [SUM]
|
||||
Len=0x10(16): CMD + 15B Data
|
||||
```
|
||||
|
||||
**设置灵敏度为 2 档(协议值 2)**:
|
||||
```
|
||||
下发: 8F 00 06 23 20 00 00 00 00 [XOR] [SUM]
|
||||
Len=6: CMD(0x23)+Data5
|
||||
Data[0]=0x20: sensitvity=2(低4位) | freq_level=0(高4位)
|
||||
Data[1..4]=延时/输出/存在/方向模式
|
||||
```
|
||||
@@ -0,0 +1,73 @@
|
||||
# DLD154Pro 小程序现场评估报告分析(2026-08-27)
|
||||
|
||||
> 设备: DLD154Pro | SN: E04E7AA1DEA4 | HW 3.01 | **FW V3.05**
|
||||
> 评估窗口: 2026-08-27 13:10:51 ~ 13:11:51(60s)
|
||||
> 原始报告: 小程序导出 `DLD154Pro_Report_1787807522640.md`(本文件为技术核对归档)
|
||||
|
||||
---
|
||||
|
||||
## 1. 结论速览
|
||||
|
||||
| 项 | 结论 |
|
||||
|---|---|
|
||||
| **归一化基数(LOOP_MEASURE_BASE)** | ✅ **正确使用 524288**(V3.04 协议对齐生效) |
|
||||
| 检测功能 | ✅ 2 次车辆事件正常触发,灵敏度阈值判定正确 |
|
||||
| 线圈状态 | ✅ 已连接、稳定(基线漂移 ±2Hz)、窗口内无断开 |
|
||||
| 环境评估 | ✅ 良好(2/15),无车波动基本正常 |
|
||||
| **电容档识别(评估端)** | ⚠ **错误**:判 76nF(DLD110S 的档),154Pro 实际两档 **33/66nF**,当前低频档=66nF |
|
||||
| **实测电感** | ✅ 121.276μH 正确(66nF 低频档反推零误差) |
|
||||
|
||||
## 2. 关键数字溯源
|
||||
|
||||
### 2.1 归一化基数 ✅(本次最核心验证)
|
||||
|
||||
```
|
||||
有车峰值 variation = 12352
|
||||
ΔL/L = 2 × 12352 / 524288 = 4.7119% ← 报告 4.71% 逐位吻合
|
||||
若照搬 131072(DLD154V4B/vd960Loop): 2×12352/131072 = 18.85% ← 错误场景
|
||||
```
|
||||
|
||||
- 无车最大瞬态 483 → `483/524288 = 0.0921%`(报告 0.1%)
|
||||
- 有车频域交叉验证:Δf/f = (57607−56255)/56255 = +2.40% ≈ variation/524288 = 2.36% ✓
|
||||
|
||||
**结论:小程序正确读取了 0x24 偏移 8-10 的 LOOP_MEASURE_BASE=524288,V3.04 协议对齐闭环。**
|
||||
|
||||
### 2.2 电容档 ⚠(评估端缺陷)
|
||||
|
||||
```
|
||||
报告检测表: f=56255Hz, L=121.276μH → C = 1/(4π²×56255²×121.276e-6) = 66.00nF 零误差
|
||||
报告几何表: 识别电容档 76nF(用理论 L=110.84μH 反推 C=72.2nF → 匹配档表 76nF)
|
||||
```
|
||||
|
||||
- **154Pro 固件实际**:PA12 FLEVEL 一级调频,**0=66nF(低频,默认)、1=33nF(高频)**(2026-08-27 勘误确认,代码+文档 9 处已修正)
|
||||
- **76nF 是 DLD110S 的档**(两级调频低频档)——评估端把 vd960Loop 四档表 {33,43,66,76} 通用到 154Pro,判定逻辑自相矛盾
|
||||
- 正确判定:当前低频档 66nF → L=121.276μH 正确,电感偏差 (121.276−110.84)/110.84 = 9.42% 正常 ✓
|
||||
|
||||
### 2.3 灵敏度验证 ✅
|
||||
|
||||
- 配置 SENS=2 级(协议层,内部索引 1 → sens_in=54 → ΔL/L 触发 = 2×54/65536 = 0.165%)
|
||||
- 实际触发 variation=464 → ΔL/L=0.177% > 阈值 ✓ 正常触发
|
||||
- 两次事件峰值:第一次 ~3.95%(variation 10348)、第二次 **4.71%**(variation 12352)→ 轿车信号强度正常
|
||||
|
||||
### 2.4 线圈稳定性 ✅
|
||||
|
||||
- 无车基线 56256Hz vs 当前 56254Hz,漂移 ±2Hz(0.004%)
|
||||
- 断开次数:上电累计 1 次(装线圈时)vs 评估窗口 0 次(语义正确,V3.04 双变量)
|
||||
- 直流电阻实测 0.65Ω(理论 1.09Ω,±50% 内正常)
|
||||
|
||||
## 3. 次要发现
|
||||
|
||||
1. **无车波动 0.1% 擦边**:判据 `<0.1% 正常`,报告 0.1%(最大 0.08%)。溯源:最大瞬态 483(0.092%)出现在 13:09:50,紧邻 13:09:53 车辆事件前 3 秒——是**车辆接近前兆**而非环境干扰。排除前兆段实际 <0.01%。**建议:无车窗口排除车辆进入前 2~3s 前兆段**
|
||||
2. **频率 +360 补偿未减**:0xC0 上报 `freq = 实测 + 360`(dbn_ble_srv.c:477),评估端反推 L/C 前应先减 360(0.64% 系统误差,影响小)
|
||||
|
||||
## 4. 待办
|
||||
|
||||
- [ ] 小程序"识别电容档"改为**按产品型号配置档表**:154Pro={33,66}nF、110S={76,…}、vd960Loop={33,43,66,76};用实测 f 减 360 后反推 C 再匹配
|
||||
- [ ] 无车窗口排除车辆前兆段
|
||||
- [ ] (已闭环)154Pro 代码/文档电容档勘误 9 处 → commit `2e4e409`
|
||||
|
||||
## 5. 相关
|
||||
|
||||
- 固件 V3.05 发布: `d1fde88`(RS485 减配)/ `692b406`(协议 V1.8 标注)/ `befe99b`(呼吸灯注释)/ `2e4e409`(电容档勘误)
|
||||
- 归一化基数对齐背景: `vehicle-detector-development` skill → `references/measure-base-cross-product-trap.md`
|
||||
- 检查清单: `loop-measure-base-alignment` skill(E 段 18/19 条为本次新增)
|
||||
+166
-22
@@ -4,40 +4,184 @@
|
||||
|
||||
---
|
||||
|
||||
## 2026-08-27 — 电容档位勘误:一级调频实为 33nF/66nF(现场评估实锤)
|
||||
|
||||
### 背景
|
||||
|
||||
小程序现场评估报告(E04E7AA1DEA4, V3.05)检测频率 56255Hz + 电感 121.276μH → 反推 `C = 1/(4π²f²L) = 66.00nF` **零误差**;用户确认 154Pro 只有两档 **33nF / 66nF**。此前代码与文档全部标注"0=33nF(低频), 1=0nF(高频)"为**错误认知**(高频不接电容不可能振荡,当时注释就存疑)。
|
||||
|
||||
### 实际档位(用户确认 + 报告反推实锤)
|
||||
|
||||
| FLEVEL (PA12) | 电容 | 档位 | 证据 |
|
||||
|---|---|---|---|
|
||||
| 0 (FLEVEL_LOW) | **66nF** | **低频(默认)** | 报告 f=56255Hz, L=121.276μH → C=66.00nF 零误差 |
|
||||
| 1 (FLEVEL_HIGH) | **33nF** | 高频 | 两档 33/66nF(用户确认) |
|
||||
|
||||
### 修正(9 处)
|
||||
|
||||
| 文件 | 处数 | 内容 |
|
||||
|------|------|------|
|
||||
| `APP/peripheral_main.c` | 3 | 引脚注释 / 调频逻辑注释 / 默认接入注释 |
|
||||
| `docs/DLD154Pro硬件资源.md` | 1 | FLEVEL 行 |
|
||||
| `docs/product-manual.md` | 2 | §3 频率档位说明 / §4 配置表 |
|
||||
| `docs/technical-spec.md` | 3 | 架构图 / 电气参数 / 引脚表 |
|
||||
|
||||
### 影响
|
||||
|
||||
- 报告 L=121.276μH **正确**(66nF 低频档);此前按旧注释推 33nF→242μH 是错判方向
|
||||
- 小程序"识别电容档"逻辑仍有缺陷:报告内部不一致(检测表隐含 66nF、几何表判 76nF——76nF 是 DLD110S 的档),**需按产品档表(33/66nF)修正,不能通用 vd960Loop 四档表 {33,43,66,76}**
|
||||
- 频率上报 +360 补偿评估端未减(0.64% 系统误差,影响小)
|
||||
- devlog 2026-07 历史条目"33nF"为早期认知,保留
|
||||
|
||||
---
|
||||
|
||||
## 2026-08-27 — RS485 协议省 Flash 减配(文档如实标注未实现,V3.05 固件 + 协议 V1.8)
|
||||
|
||||
### 背景
|
||||
|
||||
本地调整 RS485 侧代码减少 Flash 占用:注释掉一批低频/非核心协议分支与调试打印。**原则:代码未实现的功能,协议文档在相应指令旁如实标注"未实现"**,避免文档承诺 ≠ 固件实现。
|
||||
|
||||
### 固件改动(本地,未提交)
|
||||
|
||||
| 文件 | 改动 |
|
||||
|------|------|
|
||||
| `APP/include/cmcng.h` | 版本 **V3.04 → V3.05**(FIRMWARE_VER 字符串 + SUB 宏同步) |
|
||||
| `APP/rs485_modbus.c` | FC 0x03(读保持寄存器)/0x10(批量写)/0x11(Report Slave ID)分发注释;IR 0x0006/0x0007(Variation)/0x000A(Freq Sens)/0x000B(Condition)/0x000C(DIP Virtual)注释;HR 0x0000–0x0004/0x0009/0x000A 写 case 注释(FC 0x06 仅剩 0x0010/0x0011/0x0012) |
|
||||
| `APP/include/rs485_modbus.h` | `MB_MAX_READ_REGS 125→60→40`、`MB_MAX_DATA_BYTES 250→80`(40×2=80 匹配,原 60 会越界 40B,同日修正) |
|
||||
| `APP/rs485_700bs.c` | 0x3D DIP 查询分支注释 + 4 处调试 PRINT 注释 |
|
||||
| `APP/peripheral_main.c` | `BREATH_OPTO_DUTY_STEP 32→64`(注释"~0.5s 周期"未同步,实际 2 步≈0.25s) |
|
||||
| `APP/peripheral.c` | OTA 跳转前 `mDelaymS(5)` 注释 |
|
||||
|
||||
### 文档同步(本次落地)
|
||||
|
||||
| 文件 | 标注 |
|
||||
|------|------|
|
||||
| `docs/rs485-modbus-protocol.md` V1.7→**V1.8** | §3.1 DI 0x0008 Init Flag 未实现(恒 0);§3.2 IR 0x0006/0x0007/0x000A/0x000B/0x000C 未实现(Variation 改读全数据块 0x010A/0x010B);§3.3 HR 全部标注(FC 0x06 仅 0x0010/0x0011/0x0012 可写);§4.3/4.5/4.8 未实现横幅;§5 功能码矩阵 0x03/0x10/0x11 → ✗;§6.3 仅 0x06;§7 0x3D/Init_B 对照标注;§8 版本历史 V1.8 |
|
||||
| `docs/rs485-700bs-protocol.md` | §4.4 0x3D 未实现注记(V3.05 起减配不响应);§5 速查表 + §6 兼容对照同步 |
|
||||
|
||||
### 保留能力(减配后仍可用)
|
||||
|
||||
- FC 0x02 读离散输入(车辆/故障/继电器/光耦)✅
|
||||
- FC 0x04 读输入寄存器 + **全数据块 0x0100–0x0112**(含 Variation 0x010A/0x010B)✅
|
||||
- FC 0x06 写:0x0010 主动上报使能 / 0x0011 活动阈值 / 0x0012 复位(0x2C2C)✅
|
||||
- 700BS 0xFA / 0x1B / 0x2C / 0xAA 心跳 ✅
|
||||
|
||||
### ⚠ 遗留提醒
|
||||
|
||||
1. ~~**宏越界**:`MB_MAX_READ_REGS=60` 但 `MB_MAX_DATA_BYTES=80` → 主机查 60 寄存器时 `data_buf` 越界 40B。~~ ✅ **已修(同日)**:`MB_MAX_READ_REGS 60→40`,40 寄存器 × 2B = 80B 缓冲匹配;全数据块 19 寄存器不受影响
|
||||
2. 协议文档 V1.8 已标注;`DLD154Tool` GUI 若暴露 FC 0x03/0x10/0x11 按钮需同步禁用(三层一致性)
|
||||
|
||||
---
|
||||
|
||||
## 2026-08-26 — V3.04:0x24 追加 LOOP_MEASURE_BASE 归一化基数(与 DLD110S 对齐)
|
||||
|
||||
### 背景
|
||||
|
||||
DLD110S 2026-08-26 实测发现小程序评估把 variation 归一化基数写错(照搬 DLD154V4B 的 131072,DLD110S/154Pro 实为 524288 2^19 @60MHz)→ 所有百分比放大 4 倍。根治方案:固件 0x24 显式上报基数。DLD110S 已完成(协议 V1.1),**DLD154Pro 同步对齐**。
|
||||
|
||||
### 改动
|
||||
|
||||
| 文件 | 改动 |
|
||||
|------|------|
|
||||
| `APP/include/cmcng.h` | 版本 V3.03→V3.04;新增 `#define LOOP_MEASURE_BASE 524288L` |
|
||||
| `APP/dbn_ble_srv.c` | 0x24 读参响应尾部追加 3B LE:LOOP_MEASURE_BASE(响应 8B→11B,仍单包 ≤14B,无分包) |
|
||||
| `docs/ble-protocol.md` | §5.4 响应表加偏移 8-10 + 换算公式 + 背景说明 |
|
||||
| `docs/product-manual.md` | 版本号 V3.04 + 版本历史 |
|
||||
| `docs/technical-spec.md` | 版本号 V3.04 + 版本历史 |
|
||||
|
||||
### 对照 110S 差异结论(不需要改的部分)
|
||||
|
||||
- **断开次数双变量**:154Pro 不需要——LED 快闪不依赖 cut_amount 次数(走 `g_disconnect_active`),`g_loop_cut_amount` 本身就是上电持续累计,无 3 次上限
|
||||
- **0x24 偏移 7 direction_mode**:154Pro 已经是完整字节(dbn_ble_srv.c:637),与 110S V4.31 语义一致
|
||||
- **重连 g_loop_cut_last = 0**:154Pro 已有(peripheral_main.c:815)
|
||||
- ⚠ 位含义差异:两产品 direction_mode 低 4 位语义不同(110S=方向/触发;154Pro=输出融合模式 7 种),小程序按产品区分
|
||||
|
||||
### 涉及文件
|
||||
|
||||
| 文件 | 内容 |
|
||||
|------|------|
|
||||
| `BLE/DLD154Pro_Peripheral_28K/APP/include/cmcng.h` | V3.04 + LOOP_MEASURE_BASE |
|
||||
| `BLE/DLD154Pro_Peripheral_28K/APP/dbn_ble_srv.c` | 0x24 追加 3B |
|
||||
| `docs/ble-protocol.md` / `product-manual.md` / `technical-spec.md` | 同步 V3.04 |
|
||||
|
||||
---
|
||||
|
||||
## 2026-08-25 — 蓝牙小程序接口协议文档
|
||||
|
||||
### 背景
|
||||
|
||||
根据 `dbn_ble_srv.c`(+ peripheral.c/gattprofile.c/storage.h/cmcng.h)整理蓝牙小程序与芯片交互的完整接口协议,供小程序开发对接。
|
||||
|
||||
### 文档要点
|
||||
|
||||
| 章节 | 内容 |
|
||||
|------|------|
|
||||
| §1 BLE 服务 | 服务 0xFFE0;Char1(0xFFE1 RW 命令下发)、Char4(0xFFE4 Notify 响应/上报);MTU 协商 + notify ≤ MTU−3 |
|
||||
| §2 帧格式 | Magic(8F/7F)+Header+Len+CMD+Data+XOR+SUM;校验从 Header 起 |
|
||||
| §3 分包 | 发送按 14B 写死分包(MTU=23 旧假设);Header=(amount<<4)\|seq |
|
||||
| §4-5 命令 | 0x10/0x1F/0x23/0x24/0x31/0x8A/0x92/0xC5 逐字段 |
|
||||
| §6 主动上报 | 0xC0 线圈动态(type=5,含频率+360 补偿、variation 3B 有符号) |
|
||||
| §7 坑清单 | sensitvity 1~4(≠vd960Loop 0~3)、0xC5 超时疑 bug、0x8A 写表依赖 para_store_init、notify 超限静默丢弃 |
|
||||
|
||||
### 关键发现(源码事实)
|
||||
|
||||
1. **sensitvity 协议层 1~4**,内部 `g_freq_sens = sensitvity − 1`(0~3 索引灵敏度表 {108,54,28,14}),0x24 回读 +1——**与 vd960Loop 的 0~3 不同**
|
||||
2. **0xC5 超时疑似 bug**:`timeout_counter = timeout_min × 60 × 100`,若意图 ms 应为 ×1000(现场验证)
|
||||
3. 0x8A 写灵敏度表不直接更新 RAM,依赖 `para_store_init()` 重读
|
||||
4. 0x1F/0x92 复位/出厂类命令无响应帧
|
||||
|
||||
### 涉及文件
|
||||
|
||||
| 文件 | 内容 |
|
||||
|------|------|
|
||||
| `docs/ble-protocol.md` | 新增(依据 dbn_ble_srv.c 整理,固件 V3.03) |
|
||||
|
||||
---
|
||||
|
||||
## 2026-07-31 — 发布 V3.03
|
||||
|
||||
### 变更摘要
|
||||
|
||||
| 变更 | 说明 |
|
||||
|------|------|
|
||||
| 硬件看门狗 (WWDG) | 使能窗口看门狗,TMR1 ISR 5ms tick 驱动 `g_wdg_counter`,主循环 `poll_wdg()` 每 500ms 喂狗,超时 ~558ms 自动复位 |
|
||||
| OTA 安全 | 跳转 OTA 前 `WWDG_ResetCfg(DISABLE)` 关闭看门狗,防止 OTA 期间超时复位 |
|
||||
| 固件版本 | V3.02 → V3.03 |
|
||||
|
||||
### 涉及文件
|
||||
|
||||
| 文件 | 变更 |
|
||||
|------|------|
|
||||
| `peripheral_main.c` | +`poll_wdg()` + `g_wdg_counter`;移除 `u32CountWdt`;`main()` 中 `WWDG_ResetCfg(ENABLE)` |
|
||||
| `peripheral.c` | OTA 跳转前 `WWDG_ResetCfg(DISABLE)` |
|
||||
| `cmcng.h` | `FIRMWARE_VER` 3.02→3.03 |
|
||||
|
||||
---
|
||||
|
||||
## 2026-07-31 — 发布 V3.02
|
||||
|
||||
### 变更摘要
|
||||
|
||||
| 变更 | 说明 |
|
||||
|------|------|
|
||||
| `g_loop_cut_amount` 累加修复 | 重连路径补充 `g_loop_cut_last = 0` 边沿记忆清零,修复二次断开后 counter 卡在 1 的问题;放开硬编码 3 次上限 |
|
||||
| Modbus 主动上报线圈事件 | 线圈断开/重连时立即触发主动上报(对齐 700BS 行为) |
|
||||
| 0x2C 复位指令重构 | 700BS: `handle_reset_init()` 改为直接 `SYS_ResetExecute()` MCU 全复位;Modbus: 新增 HR 0x0012 System Cmd,写 0x2C2C 触发全复位 |
|
||||
| HR 0x0012 寄存器 | 协议文档 V1.7:新增 `MB_HR_SYSTEM_CMD` (0x0012),旧 0x00FF 标注废弃 |
|
||||
| DLD154Tool 同步 | `protocol_modbus.py` +`build_reset_mcu()`;`main.py` Modbus Tab 红色复位按钮 |
|
||||
| RS485 初始化时序 | `rs485_init()`/`modbus_init()` 从 `gpio_uart_init()` 移至 `main()` 中 `para_store_init()` 之后,确保波特率参数加载后初始化 |
|
||||
| `g_loop_cut_amount` 累加修复 | 重连路径补充 `g_loop_cut_last = 0` 边沿记忆清零,放开 3 次上限 |
|
||||
| Modbus 主动上报线圈事件 | 线圈断开/重连立即触发主动上报(对齐 700BS) |
|
||||
| 0x2C 复位指令重构 | 700BS: `SYS_ResetExecute()` MCU 全复位;Modbus: HR 0x0012=0x2C2C |
|
||||
| DLD154Tool v1.0.0 | 版本显示 + PyInstaller 打包;Modbus 复位按钮 |
|
||||
| RS485 初始化时序 | 移至 `para_store_init()` 之后 |
|
||||
| 光耦呼吸加速 | 红灯在非复位模式下光耦有信号时加速 (~0.5s),便于现场判断光耦状态 |
|
||||
|
||||
### 涉及文件
|
||||
|
||||
| 文件 | 变更 |
|
||||
|------|------|
|
||||
| `peripheral_main.c` | cut_amount 修复 + RS485 初始化时序调整 |
|
||||
| `peripheral_main.c` | cut_amount 修复 + RS485 时序 + 光耦呼吸加速 (BREATH_OPTO_DUTY_STEP=32) |
|
||||
| `rs485_700bs.c` | `handle_reset_init()` → `SYS_ResetExecute()` |
|
||||
| `rs485_modbus.c` | +HR 0x0012 read/write (FC 0x03/0x06/0x10) |
|
||||
| `rs485_modbus.h` | +`MB_HR_SYSTEM_CMD` / `MB_CMD_RESET_MCU` |
|
||||
| `protocol_modbus.py` | +`build_reset_mcu()` |
|
||||
| `main.py` | TabModbus +复位按钮 + `_send_reset()` |
|
||||
| `rs485-modbus-protocol.md` | V1.6→V1.7 全量更新 |
|
||||
| `devlog.md` | 本条目 |
|
||||
|
||||
### 影响
|
||||
|
||||
- 线圈断开计数器从现在起如实累加,Modbus 全数据块 `Cut Cnt` 不再卡在 1
|
||||
- 0x2C/HR 0x0012 执行真正的 MCU 全复位(含外设重新初始化),而非仅"复位线圈基线"
|
||||
- 上位机 DLD154Tool 同步支持新复位指令
|
||||
- RS485 初始化不再受参数加载顺序影响
|
||||
|
||||
---
|
||||
| `rs485_modbus.c/h` | +HR 0x0012 (System Cmd) |
|
||||
| `protocol_modbus.py` / `main.py` | +`build_reset_mcu()` + 复位按钮 |
|
||||
| `DLD154Tool.spec` / `.gitignore` | PyInstaller 打包配置 |
|
||||
| `rs485-modbus-protocol.md` | V1.6→V1.7 |
|
||||
| `devlog.md` / `product-manual.md` / `technical-spec.md` | V3.02 文档同步 |
|
||||
|
||||
## 2026-07-30 — Modbus RTU V1.6 私有协议编码实现
|
||||
|
||||
|
||||
+10
-7
@@ -1,6 +1,6 @@
|
||||
# DLD154Pro 产品说明书
|
||||
|
||||
> 单路线圈蓝牙车辆检测器 | 型号: DLD154Pro | 版本: V3.02
|
||||
> 单路线圈蓝牙车辆检测器 | 型号: DLD154Pro | 版本: V3.05
|
||||
> 适用于停车场、收费站、交通卡口等场景的车辆到达/离开检测
|
||||
|
||||
---
|
||||
@@ -86,16 +86,16 @@ DLD154Pro 是一款基于 RISC-V 微控制器的**单通道环形线圈蓝牙车
|
||||
|
||||
### 3.2 指示灯
|
||||
|
||||
| 指示灯 | 颜色 | 功能 |
|
||||
| 灯 | 颜色 | 功能 |
|
||||
|--------|------|------|
|
||||
| 绿灯 (LEDA) | 绿色 | 车辆检测指示 / 自检。初始化/稳定期慢闪,有车亮,无车灭 |
|
||||
| 红灯 (LEDB) | 红色 | 系统运行指示(呼吸灯,表示正常工作) |
|
||||
| 红灯 (LEDB) | 红色 | 系统运行指示(呼吸灯)。光耦有信号时加速至 ~0.5s 周期 |
|
||||
|
||||
### 3.3 内部跳线/配置
|
||||
|
||||
| 项目 | 说明 |
|
||||
|------|------|
|
||||
| 频率档位 | 通过 BLE 小程序设置,IO 控制 PA12 切换 33nF 调频电容:0=接 33nF(低频),1=不接(高频) |
|
||||
| 频率档位 | 通过 BLE 小程序设置,IO 控制 PA12 切换调频电容:0=接 66nF(低频),1=接 33nF(高频) |
|
||||
|
||||
---
|
||||
|
||||
@@ -127,7 +127,7 @@ DLD154Pro **无物理拨码开关**,所有参数通过手机 BLE 小程序配
|
||||
| 输出模式 | 0 (存在) / 1 (进入脉冲) / 2 (离开脉冲) | 0 | 继电器输出类型 |
|
||||
| 离开延时 | 0 ~ 255 (×100ms) | 5 (500ms) | 车辆离开后延时释放 |
|
||||
| 有限存在 | 0 (永久) 或 1~255 (×5s) | 0 | 超时后释放并复位 |
|
||||
| 频率档位 | 0 (高频) / 1 (低频) | 0 | 调频电容切换 |
|
||||
| 频率档位 | 0 (高频=33nF) / 1 (低频=66nF) | 0 | 调频电容切换 (PA12) |
|
||||
| 融合模式 | 0 ~ 6 | 4 (仅地感) | 见 §4.6 |
|
||||
| 功能码 (function_mode) | bit0: RS485 协议, bit1: 光耦功能 | 0 | 700BS/Modbus 切换 |
|
||||
| RS485 协议 | 700BS / Modbus RTU | 700BS | bit0=0→700BS, bit0=1→Modbus |
|
||||
@@ -194,8 +194,9 @@ DLD154Pro 支持通过光耦输入接入外部雷达/车检器的干接点信号
|
||||
|------|------|------|
|
||||
| 上电初始化 / 基线学习中 | **慢闪** (200ms 亮/灭) | 呼吸 (~1.9s 周期) |
|
||||
| 线圈断开 | **灭** | 呼吸 |
|
||||
| 正常运行,无车 | **灭** | 呼吸 |
|
||||
| 正常运行,无车 | **灭** | 呼吸 (~1.9s) |
|
||||
| 正常运行,有车 | **亮** | 呼吸 |
|
||||
| 光耦有信号 (非复位模式) | — | **快闪 (~0.5s)** |
|
||||
|
||||
> **提示**:上电后绿灯慢闪约 1.2s 后熄灭,表示线圈稳定就绪。如果绿灯一直慢闪不灭(超过 5s),说明线圈可能未连接或电感异常。
|
||||
|
||||
@@ -283,7 +284,9 @@ DLD154Pro 支持两种 RS485 协议,通过 BLE 小程序切换:
|
||||
|
||||
| 版本 | 日期 | 说明 |
|
||||
|------|------|------|
|
||||
| V3.02 | 2026-07-31 | Modbus RTU 协议实现 + 主动上报;0x2C 复位改为 MCU 全复位;`g_loop_cut_amount` 累加修复;上位机 DLD154Tool |
|
||||
| V3.05 | 2026-08-27 | **RS485 省 Flash 减配**:Modbus FC 0x03/0x10/0x11 与部分寄存器未实现(协议文档 V1.8 如实标注);700BS 0x3D 不响应;呼吸灯光耦加速步长 32→64;OTA 跳转前延时移除。⚠ 配置类参数写入走 BLE 小程序 |
|
||||
| V3.04 | 2026-08-26 | 0x24 追加 LOOP_MEASURE_BASE 归一化基数(3B LE=524288);断开次数语义明确为上电持续累计 |
|
||||
| V3.03 | 2026-07-31 | 硬件看门狗 (WWDG ~558ms 超时);OTA 安全关闭看门狗 |
|
||||
| V3.01 | 2026-07-28 | 光耦输出融合模式(6 种);LEDA 同步继电器状态 |
|
||||
| V3.00 | 2026-07-21 | 项目初始化:从 DLD110SV4 移植 + 硬件适配 CH591R |
|
||||
|
||||
|
||||
@@ -134,6 +134,8 @@
|
||||
|
||||
### 4.4 查询拨码开关 DIP1–5 设置
|
||||
|
||||
> ⚠ **DLD154Pro 实现状态(V3.05 起)**:此命令固件**未实现**(省 Flash 减配,`CMD_QUERY_DIP` 分支已注释),从机不响应。DLD154Pro 无物理拨码,拨码语义由 BLE 配置映射,如需查询请走 BLE 或 Modbus 全数据块。
|
||||
|
||||
**主机发送:**
|
||||
|
||||
```
|
||||
@@ -194,7 +196,7 @@
|
||||
| 0xFA | 主→从 | 查询有车 + 线圈状态 | F5 DATA XOR |
|
||||
| 0x1B | 主→从 | 查询线圈频率 | 14 Fre1-3 ADDR XOR |
|
||||
| 0x2C | 主→从 | 复位初始化线圈 | 无回复 |
|
||||
| 0x3D | 主→从 | 查询 DIP1-5 | 32 DATA ADDR XOR |
|
||||
| 0x3D | 主→从 | 查询 DIP1-5 | 32 DATA ADDR XOR | ⚠ DLD154Pro 未实现(V3.05 起减配,不响应) |
|
||||
| 0xAA | 从→主 | 主动心跳上报 | 不回复 |
|
||||
|
||||
---
|
||||
@@ -206,5 +208,5 @@
|
||||
| 0xFA 查询状态 | Modbus → DI 0x0000–01 | 等价覆盖 |
|
||||
| 0x1B 查询频率 | Modbus → IR 0x0000–01 | 等价覆盖(32-bit) |
|
||||
| 0x2C 复位 | Modbus → HR 0x00FF | 新增命令寄存器 |
|
||||
| 0x3D 查拨码 | Modbus → IR 0x000C (DIP Virtual) | DLD154Pro 无物理拨码,虚拟映射 |
|
||||
| 0x3D 查拨码 | Modbus → IR 0x000C (DIP Virtual) | ⚠ 未实现(V3.05 起减配,IR 0x000C 与 700BS 0x3D 均不响应) |
|
||||
| 0xAA 心跳 | Modbus 无等价 | 主从架构限制,靠轮询 DI+IR 补偿 |
|
||||
|
||||
@@ -64,9 +64,10 @@
|
||||
| 0x0005 | Relay Output | 继电器当前输出状态 | 0=释放, 1=吸合 |
|
||||
| 0x0006 | Freq Low Fault | 频率下限异常 (Fre_Err bit0) | 0=正常, 1=频率过低 |
|
||||
| 0x0007 | Freq High Fault | 频率上限异常 (Fre_Err bit4) | 0=正常, 1=频率过高 |
|
||||
| 0x0008 | Init Flag | 复位后首次指示 (Init_B) | 0=正常, 1=复位后首次—上位机读后清零* |
|
||||
| 0x0008 | Init Flag | 复位后首次指示 (Init_B) | 0=正常, 1=复位后首次—上位机读后清零* | ⚠ **未实现**(固件恒为 0) |
|
||||
|
||||
> **Init Flag 清除机制**:上位机读到 1 后,应发送 **写 HR 0x00FE=0x0001** 清零。参见 §4.7。
|
||||
> ⚠ **实现状态(V1.8 起标注)**:`DI 0x0008` 与 `HR 0x00FE` 固件均**未实现**(DI 恒为 0,HR 无处理分支),此机制仅文档保留。
|
||||
|
||||
### 3.2 输入寄存器 (Input Registers) — 功能码 0x04
|
||||
|
||||
@@ -78,13 +79,15 @@
|
||||
| 0x0003 | CAPVD Lo | uint16 | | 归一化周期值,低 16 位 |
|
||||
| 0x0004 | Origin Hi | uint16 | **2 寄存器** | 基线值 (32-bit),高 16 位 |
|
||||
| 0x0005 | Origin Lo | uint16 | | 基线值,低 16 位 |
|
||||
| 0x0006 | Variation Hi | int16 | **2 寄存器** | 变化量 = CAPVD − Origin (32-bit 有符号),高 16 位 |
|
||||
| 0x0007 | Variation Lo | int16 | | 变化量,低 16 位 |
|
||||
| 0x0008 | FW Version | uint16 | 1 寄存器 | 固件版本,高字节=主版本,低字节=子版本。例 `0x0300` = v3.00 |
|
||||
| 0x0009 | HW Version | uint16 | 1 寄存器 | 硬件版本。例 `0x0301` = v3.01 |
|
||||
| 0x000A | Freq Sens | uint16 | 1 寄存器 | 当前灵敏度等级 (0=低, 1=中低, 2=中高, 3=高) |
|
||||
| 0x000B | Condition | uint16 | 1 寄存器 | 环境活跃度 (0=安静, 1–100=嘈杂) |
|
||||
| 0x000C | DIP Virtual | uint16 | 1 寄存器 | 虚拟拨码(700BS 兼容): bit[7:4]=function_mode, bit[3:0]=fusion_mode |
|
||||
| 0x0006 | Variation Hi | int16 | **2 寄存器** | 变化量 = CAPVD − Origin (32-bit 有符号),高 16 位 | ⚠ **未实现**(省 Flash 减配,V1.8) |
|
||||
| 0x0007 | Variation Lo | int16 | | 变化量,低 16 位 | ⚠ **未实现** |
|
||||
| 0x0008 | FW Version | uint16 | 1 寄存器 | 固件版本,高字节=主版本,低字节=子版本。例 `0x0300` = v3.00 | |
|
||||
| 0x0009 | HW Version | uint16 | 1 寄存器 | 硬件版本。例 `0x0301` = v3.01 | |
|
||||
| 0x000A | Freq Sens | uint16 | 1 寄存器 | 当前灵敏度等级 (0=低, 1=中低, 2=中高, 3=高) | ⚠ **未实现**(省 Flash 减配,V1.8) |
|
||||
| 0x000B | Condition | uint16 | 1 寄存器 | 环境活跃度 (0=安静, 1–100=嘈杂) | ⚠ **未实现**(省 Flash 减配,V1.8) |
|
||||
| 0x000C | DIP Virtual | uint16 | 1 寄存器 | 虚拟拨码(700BS 兼容): bit[7:4]=function_mode, bit[3:0]=fusion_mode | ⚠ **未实现**(省 Flash 减配,V1.8) |
|
||||
|
||||
> ⚠ **输入寄存器实现状态(V1.8 起标注)**:`0x0006/0x0007`(Variation)、`0x000A`(Freq Sens)、`0x000B`(Condition)、`0x000C`(DIP Virtual)固件**未实现**(读返回异常 0x02 Illegal Data Address)。读取变化量请用全数据块 `0x010A/0x010B`(见 §3.2.1,仍可用)。
|
||||
|
||||
### 3.2.1 全数据块 (Input Registers 0x0100+) — 功能码 0x04
|
||||
|
||||
@@ -127,25 +130,27 @@
|
||||
|
||||
### 3.3 保持寄存器 (Holding Registers) — 功能码 0x03 / 0x06 / 0x10
|
||||
|
||||
> ⚠ **实现状态(V1.8 起标注)**:功能码 **0x03(读保持寄存器)与 0x10(批量写)固件未实现**(返回异常 0x01 Illegal Function)。保持寄存器**只支持 FC 0x06 写单寄存器**,且仅 `0x0010/0x0011/0x0012` 可写;其余 R/W 寄存器(0x0000–0x0004, 0x0009, 0x000A)因省 Flash 减配**读写均未实现**,只读寄存器(0x0005–0x0008, 0x000B)因 FC 0x03 未实现**读不到**。
|
||||
|
||||
| 地址 | 名称 | 范围 | 默认 | R/W | 说明 |
|
||||
|------|------|------|------|-----|------|
|
||||
| 0x0000 | Sensitivity | 0–3 | 1 | R/W | 灵敏度等级 (0=低, 1=中低, 2=中高, 3=高) |
|
||||
| 0x0001 | Fusion Mode | 0–6 | 0 | R/W | 输出组合模式(见 §6.5) |
|
||||
| 0x0002 | Hold Time | 0–255 | 0 | R/W | 有限存在时间 (×5s), 0=永久存在 |
|
||||
| 0x0003 | Output Delay | 0–255 | 10 | R/W | 离开延时 (×50ms), 例 10=500ms |
|
||||
| 0x0004 | Freq Level | 0–1 | 0 | R/W | 线圈频率档: 0=高频, 1=低频 |
|
||||
| 0x0005 | RS485 Baud Hi | — | — | **R** | RS485 波特率高 16 位(只读) |
|
||||
| 0x0006 | RS485 Baud Lo | — | — | **R** | RS485 波特率低 16 位(只读) |
|
||||
| 0x0007 | RS485 Addr | 1–247 | 1 | **R** | RS485 从机地址(只读) |
|
||||
| 0x0008 | Protocol | 0–1 | 0 | **R** | 当前 RS485 协议: 0=700BS, 1=Modbus |
|
||||
| 0x0009 | BT Timeout | 0–255 | 0 | R/W | 蓝牙空闲关闭超时 (分钟), 0=不关闭 |
|
||||
| 0x000A | Safe Timeout | 0–255 | 0 | R/W | 安全模式超时 (×10s), 0=关闭 |
|
||||
| 0x000B | Opto Func | 0–1 | 0 | **R** | 光耦功能: 0=雷达输入, 1=复位 |
|
||||
| 0x0010 | Auto Rpt Enable | 0–1 | 0 | R/W | 全数据主动上报: 0=关闭, 1=使能(见 §4.9) |
|
||||
| 0x0011 | Active Thr | 0–65535 | 10 | R/W | 活动状态阈值: |Variation| ≥ 该值时进入活动上报速率 (150ms) |
|
||||
| 0x0012 | System Cmd | — | — | **W** | 系统指令: 写 `0x2C2C` 触发 MCU 全复位 (等效 700BS 0x2C, 见 §4.7) |
|
||||
| 0x00FE | Init Flag Clear | 0–1 | — | **W** | 写 1 清零 Init Flag (DI 0x0008) |
|
||||
| 0x00FF | Device Reset (已废弃) | — | — | **W** | ⚠ V1.7 废弃, 请使用 HR 0x0012=0x2C2C |
|
||||
| 0x0000 | Sensitivity | 0–3 | 1 | R/W | 灵敏度等级 (0=低, 1=中低, 2=中高, 3=高) | ⚠ **未实现**(省 Flash 减配,V1.8) |
|
||||
| 0x0001 | Fusion Mode | 0–6 | 0 | R/W | 输出组合模式(见 §6.5) | ⚠ **未实现**(省 Flash 减配,V1.8) |
|
||||
| 0x0002 | Hold Time | 0–255 | 0 | R/W | 有限存在时间 (×5s), 0=永久存在 | ⚠ **未实现**(省 Flash 减配,V1.8) |
|
||||
| 0x0003 | Output Delay | 0–255 | 10 | R/W | 离开延时 (×50ms), 例 10=500ms | ⚠ **未实现**(省 Flash 减配,V1.8) |
|
||||
| 0x0004 | Freq Level | 0–1 | 0 | R/W | 线圈频率档: 0=高频, 1=低频 | ⚠ **未实现**(省 Flash 减配,V1.8) |
|
||||
| 0x0005 | RS485 Baud Hi | — | — | **R** | RS485 波特率高 16 位(只读) | ⚠ FC 0x03 未实现,读不到 |
|
||||
| 0x0006 | RS485 Baud Lo | — | — | **R** | RS485 波特率低 16 位(只读) | ⚠ FC 0x03 未实现,读不到 |
|
||||
| 0x0007 | RS485 Addr | 1–247 | 1 | **R** | RS485 从机地址(只读) | ⚠ FC 0x03 未实现,读不到 |
|
||||
| 0x0008 | Protocol | 0–1 | 0 | **R** | 当前 RS485 协议: 0=700BS, 1=Modbus | ⚠ FC 0x03 未实现,读不到 |
|
||||
| 0x0009 | BT Timeout | 0–255 | 0 | R/W | 蓝牙空闲关闭超时 (分钟), 0=不关闭 | ⚠ **未实现**(省 Flash 减配,V1.8) |
|
||||
| 0x000A | Safe Timeout | 0–255 | 0 | R/W | 安全模式超时 (×10s), 0=关闭 | ⚠ **未实现**(省 Flash 减配,V1.8) |
|
||||
| 0x000B | Opto Func | 0–1 | 0 | **R** | 光耦功能: 0=雷达输入, 1=复位 | ⚠ FC 0x03 未实现,读不到 |
|
||||
| 0x0010 | Auto Rpt Enable | 0–1 | 0 | R/W | 全数据主动上报: 0=关闭, 1=使能(见 §4.9) | ✅ FC 0x06 可写 |
|
||||
| 0x0011 | Active Thr | 0–65535 | 10 | R/W | 活动状态阈值: \|Variation\| ≥ 该值时进入活动上报速率 (150ms) | ✅ FC 0x06 可写 |
|
||||
| 0x0012 | System Cmd | — | — | **W** | 系统指令: 写 `0x2C2C` 触发 MCU 全复位 (等效 700BS 0x2C, 见 §4.7);读恒 0 | ✅ FC 0x06 可写 |
|
||||
| 0x00FE | Init Flag Clear | 0–1 | — | **W** | 写 1 清零 Init Flag (DI 0x0008) | ⚠ **未实现**(固件无此分支) |
|
||||
| 0x00FF | Device Reset (已废弃) | — | — | **W** | ⚠ V1.7 废弃, 请使用 HR 0x0012=0x2C2C | ⚠ 废弃(未实现) |
|
||||
|
||||
> **只读寄存器 (0x0005–0x0008, 0x000B)**:写操作返回异常 0x02(Illegal Data Address)。
|
||||
> **写入寄存器 (0x00FE, 0x00FF)**:只写不读。读返回 0x0000。写入非魔数值返回异常 0x03。
|
||||
@@ -179,6 +184,8 @@
|
||||
|
||||
### 4.3 读保持寄存器 — 功能码 0x03
|
||||
|
||||
> ⚠ **V1.8 未实现**:固件已禁用 FC 0x03(省 Flash 减配),请求返回异常 `0x83 0x01`(Illegal Function)。保持寄存器只支持 FC 0x06 写(仅 0x0010/0x0011/0x0012),请勿依赖此功能码读取参数。
|
||||
|
||||
读取全部可读写参数:
|
||||
|
||||
```
|
||||
@@ -205,6 +212,8 @@
|
||||
|
||||
### 4.5 批量写寄存器 — 功能码 0x10
|
||||
|
||||
> ⚠ **V1.8 未实现**:固件已禁用 FC 0x10(省 Flash 减配),请求返回异常 `0x90 0x01`(Illegal Function)。批量写请改用 FC 0x06 逐条写,或走 BLE 小程序配置。
|
||||
|
||||
一次写入灵敏度和存在时间(60s):
|
||||
|
||||
```
|
||||
@@ -234,6 +243,8 @@
|
||||
|
||||
### 4.8 清除 Init Flag — 写 HR 0x00FE
|
||||
|
||||
> ⚠ **V1.8 未实现**:固件无 HR 0x00FE 处理分支(且 DI 0x0008 Init Flag 恒为 0),此命令无实际效果,仅文档保留。
|
||||
|
||||
```
|
||||
>>> 01 06 00 FE 00 01 xx xx (写 0x00FE=1)
|
||||
<<< 01 06 00 FE 00 01 xx xx (Init Flag → 0)
|
||||
@@ -302,13 +313,13 @@
|
||||
|--------|------|------|------|
|
||||
| 0x01 | Read Coils | ✗ | 不使用 |
|
||||
| 0x02 | Read Discrete Inputs | ✓ | 车辆状态、故障、继电器、光耦 |
|
||||
| 0x03 | Read Holding Registers | ✓ | 读所有配置参数 |
|
||||
| 0x04 | Read Input Registers | ✓ | 读传感器数据 (32-bit 跨双寄存器) |
|
||||
| 0x03 | Read Holding Registers | ✗ | ⚠ **V1.8 未实现**(省 Flash 减配,返回异常 0x01) |
|
||||
| 0x04 | Read Input Registers | ✓ | 读传感器数据 (32-bit 跨双寄存器);⚠ 0x0006/0x0007/0x000A/0x000B/0x000C 未实现,用 0x0100+ 全数据块 |
|
||||
| 0x05 | Write Single Coil | ✗ | 不使用 |
|
||||
| 0x06 | Write Single Register | ✓ | 写单个参数 |
|
||||
| 0x06 | Write Single Register | ✓ | 写单个参数;⚠ 仅 0x0010/0x0011/0x0012 有效(V1.8 减配) |
|
||||
| 0x0F | Write Multiple Coils | ✗ | 不使用 |
|
||||
| 0x10 | Write Multiple Registers | ✓ | 批量写参数 |
|
||||
| 0x11 | Report Slave ID | ✓ | 返回设备型号 + 运行状态 |
|
||||
| 0x10 | Write Multiple Registers | ✗ | ⚠ **V1.8 未实现**(省 Flash 减配,返回异常 0x01) |
|
||||
| 0x11 | Report Slave ID | ✗ | ⚠ **V1.8 未实现**(省 Flash 减配,返回异常 0x01) |
|
||||
| N/A | **Active Push** | ✓ | 主动上报全数据块(格式同 FC 0x04 响应),需 HR 0x0010=1 使能 |
|
||||
|
||||
> **主动上报**:非标准 Modbus 功能。设备在 `Auto Rpt Enable=1` 时根据变化量阈值自动调速发送数据帧,帧格式与 FC 0x04 读 0x0100 起 19 个寄存器的响应一致。总线上的其他从机在上报期间保持静默,主机需在接收逻辑中处理非请求响应。
|
||||
@@ -329,9 +340,10 @@ DLD154Pro 算法移植后,`MEASUREMENT_BASE = 524288 (2^19)`(CH591R@60MHz
|
||||
|
||||
### 6.3 参数持久化
|
||||
|
||||
- `0x06` 或 `0x10` 写入 Holding Register → 立即更新 RAM → 写入 DataFlash → 返回响应
|
||||
- `0x06`(或 `0x10`,⚠ V1.8 起 0x10 未实现)写入 Holding Register → 立即更新 RAM → 写入 DataFlash → 返回响应
|
||||
- Flash 写入失败 → 返回异常码 `0x04` (Slave Device Failure)
|
||||
- 值超出范围(如灵敏度写 5)→ 返回异常码 `0x03` (Illegal Data Value)
|
||||
- ⚠ **V1.8 减配**:写寄存器仅剩 `0x0010`(主动上报使能)/`0x0011`(活动阈值)/`0x0012`(复位)三条有效;灵敏度/融合模式等配置请走 BLE 小程序
|
||||
|
||||
### 6.4 灵敏度与 ΔL/L 对应关系
|
||||
|
||||
@@ -456,8 +468,8 @@ DLD154Pro RS485 同时支持 700BS 协议(`g_fm_700bs_disable=0`)和 Modbus
|
||||
| | bit5=线圈故障 | DI 0x0001 Loop Fault | ✅ |
|
||||
| 0x1B 查询频率 | 3 字节 Freq | IR 0x0000–01 Freq (32bit) | ✅ |
|
||||
| 0x2C 复位 | — | **HR 0x0012** 写 0x2C2C | ✅ V1.7: MCU 全复位 (SYS_ResetExecute)
|
||||
| 0x3D 查拨码 | DIP1-5 | **IR 0x000C DIP Virtual** | ✅ V1.2 新增 (DLD154Pro 无物理拨码,虚拟映射) |
|
||||
| 0xAA 心跳 Init_B | A1=首次 | **DI 0x0008 Init Flag** | ✅ V1.2 新增 |
|
||||
| 0x3D 查拨码 | DIP1-5 | **IR 0x000C DIP Virtual** | ⚠ V1.8 起未实现(IR 0x000C 减配,读返回异常 0x02) |
|
||||
| 0xAA 心跳 Init_B | A1=首次 | **DI 0x0008 Init Flag** | ⚠ V1.8 标注:固件恒为 0(未实现) |
|
||||
| 0xAA 心跳 Fre_Err | bit0=下限异常 | **DI 0x0006 Freq Low Fault** | ✅ V1.2 新增 |
|
||||
| | bit4=上限异常 | **DI 0x0007 Freq High Fault** | ✅ V1.2 新增 |
|
||||
| 0xAA 心跳 主动上报 | 5s/1s/事件 | — | ✅ V1.6: Modbus 新增主动上报 (FC 0x04 响应格式, 800ms/150ms/事件立即) |
|
||||
@@ -472,6 +484,7 @@ DLD154Pro RS485 同时支持 700BS 协议(`g_fm_700bs_disable=0`)和 Modbus
|
||||
|
||||
| 版本 | 日期 | 作者 | 变更 |
|
||||
|------|------|------|------|
|
||||
| V1.8 | 2026-08-27 | wangfq | **省 Flash 减配(实现状态如实标注)**:FC 0x03(读保持寄存器)/0x10(批量写)/0x11(Report Slave ID)未实现;IR 0x0006/0x0007(Variation)/0x000A(Freq Sens)/0x000B(Condition)/0x000C(DIP Virtual)未实现(改读全数据块 0x010A/0x010B);HR 0x0000–0x0004/0x0009/0x000A 读写未实现(灵敏度等配置走 BLE);FC 0x06 仅剩 0x0010/0x0011/0x0012 可写;DI 0x0008 Init Flag 与 HR 0x00FE 标注未实现(固件恒 0/无分支) |
|
||||
| V1.7 | 2026-07-31 | wangfq | 复位指令重构: HR 0x00FF 废弃, 新增 HR 0x0012 (System Cmd); 写 0x2C2C 触发 `SYS_ResetExecute()` MCU 全复位 (对齐 700BS 0x2C 行为); 0x2C2C 对应 700BS CMD_RESET_INIT 的 0x2C; +§4.7 示例更新 |
|
||||
| V1.6 | 2026-07-30 | wangfq | 新增主动上报 & 全数据块: +IR 0x0100–0x0112 全数据块(19 reg, 含灵敏度/频率/融合模式/car_state/线圈/光耦/频率/CAPVD/Variation/断开计数/继电器计数/通过时间); +HR 0x0010 上报使能, +HR 0x0011 活动阈值; +§4.9–4.12 命令示例; +§6.7 主动上报机制(3 级速率: 空闲800ms/活动150ms/事件立即); 车间距/通过时间(10ms单位); 700BS 对照表更新 |
|
||||
| V1.5 | 2026-07-30 | wangfq | 枚举再次重排: 且后移 (0=或,1=混行,2=ETC,3=且,4=仅地感,5=仅光耦,6=复位); 模式号引用同步更新 |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# DLD154Pro 技术规格书
|
||||
|
||||
> 单路线圈蓝牙车辆检测器 | 固件版本: V3.02 | 硬件版本: V3.01
|
||||
> 单路线圈蓝牙车辆检测器 | 固件版本: V3.05 | 硬件版本: V3.01
|
||||
> 本文档面向工程开发、系统集成及故障深度分析
|
||||
|
||||
---
|
||||
@@ -18,7 +18,7 @@
|
||||
RS485 ──────────────┤ PA14 TX / PA15 RX / PA13 RE (UART0) │
|
||||
│ ├── PA8 (GPIO) ──── 继电器 RLY1
|
||||
BLE ────────────────┤ 2.4GHz 无线 │
|
||||
│ ├── PA12 (GPIO) ──── 调频电容 (33nF)
|
||||
│ ├── PA12 (GPIO) ──── 调频电容 (66nF/33nF)
|
||||
└──────────────────────────────────────┘
|
||||
```
|
||||
|
||||
@@ -52,7 +52,7 @@ Main_Circulation (无 RTOS, 裸机轮询)
|
||||
| 工作温度 | -40 | — | +85 | °C | 工业级 |
|
||||
| 存储温度 | -55 | — | +125 | °C | — |
|
||||
| 线圈电感范围 | 50 | 200 | 1000 | μH | 超出范围可工作但精度下降 |
|
||||
| 线圈频率范围 | 20 | 80 | 200 | kHz | 含 33nF 调频电容 |
|
||||
| 线圈频率范围 | 20 | 80 | 200 | kHz | 含调频电容 (33/66nF) |
|
||||
| 线圈 Q 值 | 5 | — | — | — | 过低导致振荡不稳定 |
|
||||
| 继电器触点电压 | — | — | 250 | VAC | 单刀双掷 (SPDT) |
|
||||
| 继电器触点电流 | — | — | 3 | A | — |
|
||||
@@ -72,7 +72,7 @@ Main_Circulation (无 RTOS, 裸机轮询)
|
||||
|------|------|------|------|------|---------|------|
|
||||
| **PA9** | **LP** | **线圈频率捕获** | IN | **TMR0** | — | **核心输入,下降沿→下降沿** |
|
||||
| PA8 | RLY1 | 继电器输出 | OUT | GPIO PP | 0 (释放) | 单刀双掷,低电平有效 |
|
||||
| PA12 | FLEVEL | 线圈调频 | OUT | GPIO PP | L (33nF) | 0=接33nF(低频), 1=0nF(高频) |
|
||||
| PA12 | FLEVEL | 线圈调频 | OUT | GPIO PP | L (66nF) | 0=接66nF(低频), 1=接33nF(高频) |
|
||||
| PA14 | UART0_TX | RS485 发送 | OUT | UART0 | — | 700BS / Modbus |
|
||||
| PA15 | UART0_RX | RS485 接收 | IN | UART0 | — | 700BS / Modbus |
|
||||
| PA13 | UART0_RE | RS485 方向控制 | OUT | GPIO PP | RX (接收) | 高=发送, 低=接收 |
|
||||
@@ -429,7 +429,7 @@ TMR1 ISR (每 5ms)
|
||||
|
||||
### 7.3 红灯行为
|
||||
|
||||
呼吸灯 (PWM11, ~1.9s 周期),始终运行,指示系统正常工作。不参与车辆/故障指示。
|
||||
呼吸灯 (PWM11),始终运行,指示系统正常工作。**非复位模式下光耦有信号时加速至 ~0.5s 周期**(DUTY_STEP=32),便于现场判断光耦输入是否正常。无光耦信号时 ~1.9s 周期(DUTY_STEP=8)。
|
||||
|
||||
---
|
||||
|
||||
@@ -555,7 +555,10 @@ Magic | Addr/Sub | Len | CMD | Data | XOR | SUM
|
||||
|
||||
| 版本 | 日期 | 说明 |
|
||||
|------|------|------|
|
||||
| V3.02 | 2026-07-31 | Modbus RTU 协议实现 + 主动上报;0x2C/HR 0x0012 复位改为 `SYS_ResetExecute()` MCU 全复位;`g_loop_cut_amount` 累加修复;RS485 初始化时序调整 |
|
||||
| V3.05 | 2026-08-27 | **RS485 省 Flash 减配**:Modbus FC 0x03(读保持寄存器)/0x10(批量写)/0x11(Report Slave ID)未实现;IR 0x0006/0x0007/0x000A/0x000B/0x000C 未实现(Variation 走全数据块 0x010A/0x010B);HR 0x0000–0x0004/0x0009/0x000A 读写未实现;FC 0x06 仅 0x0010/0x0011/0x0012 有效;700BS 0x3D 不响应。协议文档 rs485-modbus V1.8 / 700BS 同步标注。呼吸灯光耦加速步长 32→64;OTA 跳转前延时移除 |
|
||||
| V3.04 | 2026-08-26 | 0x24 响应追加 LOOP_MEASURE_BASE 归一化基数(3B LE=524288,variation 换算 ΔL/L 用);断开次数语义明确为上电持续累计 |
|
||||
| V3.03 | 2026-07-31 | 硬件看门狗 WWDG (~558ms 超时, 5ms tick + 500ms 喂狗);OTA 安全关闭看门狗 |
|
||||
| V3.02 | 2026-07-31 | Modbus RTU 协议 + 主动上报;0x2C/HR 0x0012 复位改为 `SYS_ResetExecute()`;`g_loop_cut_amount` 累加修复;RS485 初始化时序调整 |
|
||||
| V3.01 | 2026-07-28 | 光耦输出模式完整实现 (6 种融合逻辑 + 状态机);LEDA 同步继电器状态 |
|
||||
| V3.00 | 2026-07-21 | 项目初始化:从 DLD110SV4 复制基线 + 硬件适配 (CH591R) |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user