From 91151c250a8efe56ba91941270285dce9be070d9 Mon Sep 17 00:00:00 2001 From: wangbeihong Date: Tue, 14 Apr 2026 19:46:16 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E7=BA=A2=E5=A4=96?= =?UTF-8?q?=E4=BC=A0=E6=84=9F=E5=99=A8=E9=80=BB=E8=BE=91=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E7=8A=B6=E6=80=81=E5=88=A4=E6=96=AD=E5=8F=8A=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Bsp/bsp_track_ir.c | 21 ++++++++++++++------- Core/Bsp/bsp_track_ir.h | 5 +++-- Core/Src/freertos.c | 11 +++++------ 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/Core/Bsp/bsp_track_ir.c b/Core/Bsp/bsp_track_ir.c index 1536ea3..71a5092 100644 --- a/Core/Bsp/bsp_track_ir.c +++ b/Core/Bsp/bsp_track_ir.c @@ -53,17 +53,23 @@ uint8_t track_ir_get_line_mask(void) track_ir_state_t track_ir_basic_judge(void) { uint8_t line_mask = track_ir_get_line_mask(); - uint8_t left_mask = line_mask & (TRACK_IR_H4_BIT | TRACK_IR_H3_BIT); - uint8_t right_mask = line_mask & (TRACK_IR_H2_BIT | TRACK_IR_H1_BIT); - - if (line_mask == 0U) { + + /* + * 根据用户描述:超出范围输出低电平(等同于黑线信号)。 + * 如果四路全为低电平(line_mask == 0x0F),则判定为“超出范围”或“丢线”。 + */ + if (line_mask == (TRACK_IR_H1_BIT | TRACK_IR_H2_BIT | TRACK_IR_H3_BIT | TRACK_IR_H4_BIT)) { return TRACK_IR_STATE_LOST; } - if (line_mask == (TRACK_IR_H1_BIT | TRACK_IR_H2_BIT | TRACK_IR_H3_BIT | TRACK_IR_H4_BIT)) { - return TRACK_IR_STATE_CROSS; + /* 全高电平(未检测到黑线) */ + if (line_mask == 0U) { + return TRACK_IR_STATE_CENTER; // 或者根据业务逻辑定义为其他状态 } + uint8_t left_mask = line_mask & (TRACK_IR_H4_BIT | TRACK_IR_H3_BIT); + uint8_t right_mask = line_mask & (TRACK_IR_H2_BIT | TRACK_IR_H1_BIT); + if ((left_mask != 0U) && (right_mask == 0U)) { return TRACK_IR_STATE_LEFT; } @@ -72,7 +78,8 @@ track_ir_state_t track_ir_basic_judge(void) return TRACK_IR_STATE_RIGHT; } - return TRACK_IR_STATE_CENTER; + /* 左右都有信号,视为十字或居中压线 */ + return TRACK_IR_STATE_CROSS; } const char *track_ir_state_to_string(track_ir_state_t state) diff --git a/Core/Bsp/bsp_track_ir.h b/Core/Bsp/bsp_track_ir.h index 93018fe..8e5ce86 100644 --- a/Core/Bsp/bsp_track_ir.h +++ b/Core/Bsp/bsp_track_ir.h @@ -13,8 +13,9 @@ #define TRACK_IR_H4_BIT (1U << 3) /* - * 红外模块有效电平:常见 TCRT5000 模块为低电平有效。 - * 若你的模块是高电平有效,可在编译选项或此处改为 GPIO_PIN_SET。 + * 红外模块有效电平: + * 根据用户描述:探测黑线输出低电平(GPIO_PIN_RESET),白线输出高电平。 + * 超出范围(丢线/悬空)也输出低电平。 */ #ifndef TRACK_IR_ACTIVE_LEVEL #define TRACK_IR_ACTIVE_LEVEL GPIO_PIN_RESET diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c index 80c8d4c..b821941 100644 --- a/Core/Src/freertos.c +++ b/Core/Src/freertos.c @@ -32,7 +32,7 @@ #include "protocol.h" #include "usart.h" #include "bsp_hall.h" // 添加对 bsp_hall.h 的包含 - +#include "bsp_track_ir.h" // 添加对 bsp_track_ir.h 的包含 /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -115,7 +115,7 @@ void MX_FREERTOS_Init(void) { motor_init(); // 初始化电机相关外设 hall_init(); // 初始化霍尔传感器 - + track_ir_init(); // 初始化轨迹红外传感器 /* USER CODE END Init */ @@ -172,10 +172,9 @@ void StartDefaultTask(void *argument) /* Infinite loop */ for (;;) { - HAL_GPIO_TogglePin(RUN_LED_GPIO_Port, RUN_LED_Pin); - - - osDelay(1000); + track_ir_state_t state = track_ir_basic_judge(); + printf("循迹状态: %s\r\n", track_ir_state_to_string(state)); + HAL_Delay(100); } /* USER CODE END StartDefaultTask */ }