From f829fa6bb7f2c0a1b1e698dba9336b4632d71dbc Mon Sep 17 00:00:00 2001 From: nitiantuhao <2062405236@qq.com> Date: Sun, 5 Apr 2026 11:23:18 +0800 Subject: [PATCH] 1.0 --- Core/Inc/f4_can_app.h | 9 ++++----- Core/Src/f4_can_app.c | 36 ++++++++++++------------------------ Core/Src/ladrc.c | 4 ++-- 3 files changed, 18 insertions(+), 31 deletions(-) diff --git a/Core/Inc/f4_can_app.h b/Core/Inc/f4_can_app.h index 7f54e17..0032522 100644 --- a/Core/Inc/f4_can_app.h +++ b/Core/Inc/f4_can_app.h @@ -164,11 +164,10 @@ void Chassis_Diagnostics_10ms_Tick(void); /* * 20ms 周期调用: - * - 发送 0x181 状态帧 - * - 发送 0x182 实际轮速帧 - * - 发送 0x183 目标轮速帧 - * - 发送 0x200 里程计帧 - * - 内部每 5 次额外发送 1 次 0x184 通信诊断帧 + * - 发送 0x181 状态帧(每次,20ms) + * - 发送 0x200 里程计帧(每次,20ms) + * - 轮流发送 0x182 实际轮速帧 / 0x183 目标轮速帧(各 40ms) + * - 内部每 5 次额外发送 1 次 0x184 通信诊断帧(100ms) */ void CAN_Send_Telemetry_20ms(void); diff --git a/Core/Src/f4_can_app.c b/Core/Src/f4_can_app.c index 600b144..b527cba 100644 --- a/Core/Src/f4_can_app.c +++ b/Core/Src/f4_can_app.c @@ -18,7 +18,7 @@ volatile uint32_t g_dbg_valid_accept = 0U; /* ================= 机器人底盘物理参数 ================= */ #define WHEEL_RADIUS_M 0.04f -#define WHEEL_TRACK_M 0.30f +#define WHEEL_TRACK_M 0.25f #define PI_F 3.14159265358979323846f /* ================= CAN 协议参数 ================= */ @@ -929,32 +929,20 @@ void CAN_Send_Telemetry_20ms(void) /* 状态帧最重要,固定每 20ms 发一次 */ CAN_Send_StatusFrame(); - /* 第二帧轮换发送,避免同一拍挤爆 3 个 TX mailbox */ - switch (s_telem_slot) + /* 里程计帧实时性关键,固定每 20ms 发一次 */ + CAN_Send_OdomFrame(); + + /* 轮速帧轮换发送,降低瞬时总线负载 */ + if (s_telem_slot == 0U) { - case 0: - CAN_Send_ActualRpmFrame(); /* 0x182 */ - break; - - case 1: - CAN_Send_TargetRpmFrame(); /* 0x183 */ - break; - - case 2: - CAN_Send_OdomFrame(); /* 0x200 */ - break; - - default: - s_telem_slot = 0U; - CAN_Send_ActualRpmFrame(); - break; + CAN_Send_ActualRpmFrame(); /* 0x182 - 40ms 周期 */ + } + else + { + CAN_Send_TargetRpmFrame(); /* 0x183 - 40ms 周期 */ } - s_telem_slot++; - if (s_telem_slot >= 3U) - { - s_telem_slot = 0U; - } + s_telem_slot = 1U - s_telem_slot; /* 在 0 和 1 之间切换 */ /* 通信诊断帧保持 100ms 一次 */ s_comm_diag_divider++; diff --git a/Core/Src/ladrc.c b/Core/Src/ladrc.c index 78ccbfb..de9ec78 100644 --- a/Core/Src/ladrc.c +++ b/Core/Src/ladrc.c @@ -7,11 +7,11 @@ /* 这组只是保守起始值,b0 仍建议后续辨识 */ #define LADRC_DEFAULT_WC 12.0f #define LADRC_DEFAULT_WO 25.0f -#define LADRC_DEFAULT_B0 0.80f +#define LADRC_DEFAULT_B0 0.60f #define LADRC_DEFAULT_OUT_MAX 1000.0f /* 把目标爬坡放到控制循环内部,避免依赖外部调用频率 */ -#define LADRC_TARGET_SLEW_RPM_PER_S 100.0f +#define LADRC_TARGET_SLEW_RPM_PER_S 400.0f static float LADRC_Abs(float x); static float LADRC_Clamp(float x, float min_value, float max_value);