From c8d1bfa4e8be594881b839f0e8f9eb460772ef78 Mon Sep 17 00:00:00 2001 From: wangfq Date: Fri, 24 Jul 2026 09:46:02 +0800 Subject: [PATCH] =?UTF-8?q?fix(rs485):=20=E9=A2=91=E7=8E=87=E4=BB=8E?= =?UTF-8?q?=E5=8E=9F=E5=A7=8B=20capvd=20=E7=9B=B4=E6=8E=A5=E8=AE=A1?= =?UTF-8?q?=E7=AE=97=EF=BC=8C=E4=B8=8D=E5=86=8D=E4=BE=9D=E8=B5=96=20BLE=20?= =?UTF-8?q?=E6=8A=A5=E5=91=8A=E9=80=9A=E9=81=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rs485_get_freq(): 用 g_loop_acs_info.loop_capvd + loop1_LPCNT 直接算 freq = FREQ_SYS * LPCNT / capvd + 360 之前 g_loop_acs_info.frequent 只在 usart_packet_processing_acs_loop 里赋值,该路径被 g_dbn_ble_state_acs_enable.enable 门控, BLE 断开时 freq 永远为 0 --- BLE/DLD154Pro_Peripheral_28K/APP/rs485_700bs.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/BLE/DLD154Pro_Peripheral_28K/APP/rs485_700bs.c b/BLE/DLD154Pro_Peripheral_28K/APP/rs485_700bs.c index 4368dd6..e6638c6 100644 --- a/BLE/DLD154Pro_Peripheral_28K/APP/rs485_700bs.c +++ b/BLE/DLD154Pro_Peripheral_28K/APP/rs485_700bs.c @@ -13,6 +13,7 @@ #include "cmcng.h" #include "rs485_700bs.h" #include "storage.h" +#include "dbn_ble_srv.h" #include /*=========================================================================== @@ -86,6 +87,15 @@ static void rs485_send(const uint8_t *data, uint8_t len) * 命令处理 *===========================================================================*/ +/* 直接从原始测量值计算线圈频率 (Hz),不依赖 BLE 报告通道 */ +static uint32_t rs485_get_freq(void) +{ + uint32_t capvd = g_loop_acs_info.loop_capvd; // TMR0 捕获累加值 + if (capvd == 0 || loop1_LPCNT == 0) return 0; + /* freq = FREQ_SYS / (capvd / LPCNT) + 360 (补偿值) */ + return (uint32_t)((uint64_t)FREQ_SYS * loop1_LPCNT / capvd) + 360; +} + /* 0xFA — 查询有车状态 + 线圈好坏 */ static void handle_query_status(uint8_t addr) { @@ -100,7 +110,7 @@ static void handle_query_status(uint8_t addr) /* 0x1B — 查询线圈频率 */ static void handle_query_freq(uint8_t addr) { - uint32_t freq = g_loop_acs_info.frequent; // Hz + uint32_t freq = rs485_get_freq(); // Hz uint8_t buf[6]; buf[0] = RSP_FREQ; buf[1] = (uint8_t)((freq >> 16) & 0xFF); // Fre_1 (MSB) @@ -166,7 +176,7 @@ static uint8_t calc_freq_err(uint32_t freq) static void rs485_send_heartbeat(void) { extern uint8_t loop1_LOOP_OK; - uint32_t freq = g_loop_acs_info.frequent; + uint32_t freq = rs485_get_freq(); uint8_t st = g_rs485_id & 0x1F; if (g_loop_acs_info.car_state) st |= 0x80; // bit7=有车