feat: 更新红外传感器逻辑,优化状态判断及初始化
This commit is contained in:
@@ -53,17 +53,23 @@ uint8_t track_ir_get_line_mask(void)
|
|||||||
track_ir_state_t track_ir_basic_judge(void)
|
track_ir_state_t track_ir_basic_judge(void)
|
||||||
{
|
{
|
||||||
uint8_t line_mask = track_ir_get_line_mask();
|
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;
|
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)) {
|
if ((left_mask != 0U) && (right_mask == 0U)) {
|
||||||
return TRACK_IR_STATE_LEFT;
|
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_RIGHT;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRACK_IR_STATE_CENTER;
|
/* 左右都有信号,视为十字或居中压线 */
|
||||||
|
return TRACK_IR_STATE_CROSS;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *track_ir_state_to_string(track_ir_state_t state)
|
const char *track_ir_state_to_string(track_ir_state_t state)
|
||||||
|
|||||||
@@ -13,8 +13,9 @@
|
|||||||
#define TRACK_IR_H4_BIT (1U << 3)
|
#define TRACK_IR_H4_BIT (1U << 3)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 红外模块有效电平:常见 TCRT5000 模块为低电平有效。
|
* 红外模块有效电平:
|
||||||
* 若你的模块是高电平有效,可在编译选项或此处改为 GPIO_PIN_SET。
|
* 根据用户描述:探测黑线输出低电平(GPIO_PIN_RESET),白线输出高电平。
|
||||||
|
* 超出范围(丢线/悬空)也输出低电平。
|
||||||
*/
|
*/
|
||||||
#ifndef TRACK_IR_ACTIVE_LEVEL
|
#ifndef TRACK_IR_ACTIVE_LEVEL
|
||||||
#define TRACK_IR_ACTIVE_LEVEL GPIO_PIN_RESET
|
#define TRACK_IR_ACTIVE_LEVEL GPIO_PIN_RESET
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
#include "usart.h"
|
#include "usart.h"
|
||||||
#include "bsp_hall.h" // 添加对 bsp_hall.h 的包含
|
#include "bsp_hall.h" // 添加对 bsp_hall.h 的包含
|
||||||
|
#include "bsp_track_ir.h" // 添加对 bsp_track_ir.h 的包含
|
||||||
/* USER CODE END Includes */
|
/* USER CODE END Includes */
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
@@ -115,7 +115,7 @@ void MX_FREERTOS_Init(void) {
|
|||||||
|
|
||||||
motor_init(); // 初始化电机相关外设
|
motor_init(); // 初始化电机相关外设
|
||||||
hall_init(); // 初始化霍尔传感器
|
hall_init(); // 初始化霍尔传感器
|
||||||
|
track_ir_init(); // 初始化轨迹红外传感器
|
||||||
|
|
||||||
/* USER CODE END Init */
|
/* USER CODE END Init */
|
||||||
|
|
||||||
@@ -172,10 +172,9 @@ void StartDefaultTask(void *argument)
|
|||||||
/* Infinite loop */
|
/* Infinite loop */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
|
||||||
HAL_GPIO_TogglePin(RUN_LED_GPIO_Port, RUN_LED_Pin);
|
track_ir_state_t state = track_ir_basic_judge();
|
||||||
|
printf("循迹状态: %s\r\n", track_ir_state_to_string(state));
|
||||||
|
HAL_Delay(100);
|
||||||
osDelay(1000);
|
|
||||||
}
|
}
|
||||||
/* USER CODE END StartDefaultTask */
|
/* USER CODE END StartDefaultTask */
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user