#include bsp.h void bsp_init(void) { Delay_Init(); // 延迟初始化 Delayed initialization Bsp_TIM7_Init(); // tim7初始化 tim7 initializatio HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_1); HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_2); HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_3); HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_4); HAL_TIM_PWM_Start(htim8, TIM_CHANNEL_1); HAL_TIM_PWM_Start(htim8, TIM_CHANNEL_2); HAL_TIM_PWM_Start(htim8, TIM_CHANNEL_3); HAL_TIM_PWM_Start(htim8, TIM_CHANNEL_4); // 启动定时器主输出高级定时器需要启动MOE __HAL_TIM_MOE_ENABLE(htim1); __HAL_TIM_MOE_ENABLE(htim8); // 设置默认模式避障优先 Set_Avoidance_Mode(AVOIDANCE_PRIORITY); // 延时启动让所有初始化完成 HAL_Delay(100); } void bsp_loop(void) { // 模式1避障优先模式默认 // 当检测到障碍物时优先执行避障避障完成后再返回循迹 AvoidanceMode_t mode Get_Avoidance_Mode(); if(mode AVOIDANCE_PRIORITY) { // 智能避障函数会返回是否正在避障 if(Smart_Avoidance(20)) { // 正在避障中跳过循迹 return; } // 避障完成执行循迹 car_irtrack_avoidance(); } else if(mode AVOIDANCE_TRACKING) { // 模式2循迹优先模式 // 先执行循迹如果检测到障碍物则叠加避障动作 // 这个模式可以根据需要添加更复杂的逻辑 car_irtrack_avoidance(); // 如果检测到障碍物执行简单的避障动作 float dis Get_distance(); if(dis 20 dis 2.0) { Motion_Set_Pwm(0, 0, 0, 0); HAL_Delay(200); Motion_Set_Pwm(-200, -200, -200, -200); HAL_Delay(300); } } else if(mode AVOIDANCE_OFF) { // 模式3关闭避障只执行循迹 car_irtrack(); } }#include HC_SR04.h #include PWM.h uint32_t ultrasonic_num 0; uint8_t ultrasonic_flag 0; // 0:没开始测距 1:开始测距 0: Ranging not started 1: Ranging started // 避障相关变量 static AvoidanceMode_t avoidance_mode AVOIDANCE_PRIORITY; // 默认避障优先模式 static AvoidanceState_t avoidance_state AVOIDANCE_IDLE; /* * 得到测5次平均值 * * Get the average of 5 measurements * */ float Get_distance(void) { float distance 0, aveg 0; uint16_t tim, count; uint8_t i 0; while (i ! 5) { HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_SET); Delay_US(20); HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_RESET); while (HAL_GPIO_ReadPin(ECHO_GPIO_Port, ECHO_Pin) GPIO_PIN_RESET) ; ultrasonic_flag 1; i 1; while (HAL_GPIO_ReadPin(ECHO_GPIO_Port, ECHO_Pin) GPIO_PIN_SET) { count ultrasonic_num; if (count 10000) { ultrasonic_flag 0; ultrasonic_num 0; return 0; } } ultrasonic_flag 0; tim TIM7-CNT; distance (tim ultrasonic_num * 10) / 58.5; aveg distance aveg; ultrasonic_num 0; HAL_Delay(10); } distance aveg / 5; return distance; } void Bsp_TIM7_Init(void) { HAL_TIM_Base_Start_IT(htim7); } /* * 此回调函数可放多个定时器处理 * * This callback function can be used to process multiple timers * */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim-Instance TIM7) { if (ultrasonic_flag) // 开始测距--超声波 { ultrasonic_num; } } } void Ultrasonic_avoidance(uint16_t distance) { uint16_t dis; disGet_distance(); if(distance 2.0 dis distance ) { //小车停止 Car stops Motion_Set_Pwm(0,0,0,0); HAL_Delay(500); //小车后退 Car backs up Motion_Set_Pwm(-200,-200,-200,-200); HAL_Delay(1000); //小车左转 Car turns left Motion_Set_Pwm(-100,-100,400,400); HAL_Delay(500); Motion_Set_Pwm(250,250,250,250); HAL_Delay(1500); //小车右转 Car turns right Motion_Set_Pwm(100,100,400,400); HAL_Delay(500); Motion_Set_Pwm(250,250,250,250); HAL_Delay(1500);//直走 Motion_Set_Pwm(100,100,400,400); HAL_Delay(500);//右转 Motion_Set_Pwm(250,250,250,250); HAL_Delay(1500); Motion_Set_Pwm(-100,-100,400,400); HAL_Delay(500); } } // 设置避障模式 void Set_Avoidance_Mode(AvoidanceMode_t mode) { avoidance_mode mode; if(mode AVOIDANCE_OFF) { Reset_Avoidance_State(); } } // 获取避障模式 AvoidanceMode_t Get_Avoidance_Mode(void) { return avoidance_mode; } // 获取避障状态 AvoidanceState_t Get_Avoidance_State(void) { return avoidance_state; } // 重置避障状态 void Reset_Avoidance_State(void) { avoidance_state AVOIDANCE_IDLE; } // 检查是否在避障中 uint8_t Is_In_Avoidance(void) { return (avoidance_state ! AVOIDANCE_IDLE); } // 智能避障兼容循迹 // 返回值: 1-正在避障应跳过循迹0-未避障可以执行循迹 uint8_t Smart_Avoidance(uint16_t distance) { static uint32_t state_timer 0; static uint8_t turn_direction 0; // 0-左转1-右转 float dis; // 如果避障功能关闭直接返回 if(avoidance_mode AVOIDANCE_OFF) { return 0; } // 获取距离为了不影响循环性能每次只测一次 dis Get_distance(); // 超出有效范围或距离太远返回0 if(distance 2.0 || dis distance) { if(avoidance_state AVOIDANCE_IDLE) { return 0; } } // 状态机处理 switch(avoidance_state) { case AVOIDANCE_IDLE: // 检测到障碍物进入避障模式 if(dis distance distance 2.0) { avoidance_state AVOIDANCE_DETECTED; state_timer HAL_GetTick(); Motion_Set_Pwm(0, 0, 0, 0); // 立即停止 } return 0; case AVOIDANCE_DETECTED: // 停止500ms if(HAL_GetTick() - state_timer 500) { Motion_Set_Pwm(0, 0, 0, 0); return 1; } avoidance_state AVOIDANCE_BACKWARD; state_timer HAL_GetTick(); return 1; case AVOIDANCE_BACKWARD: // 后退600ms if(HAL_GetTick() - state_timer 600) { Motion_Set_Pwm(-300, -300, -300, -300); return 1; } // 随机选择转向方向避免每次都往同一方向转 turn_direction (HAL_GetTick() % 2); avoidance_state (turn_direction 0) ? AVOIDANCE_TURN_LEFT : AVOIDANCE_TURN_RIGHT; state_timer HAL_GetTick(); return 1; case AVOIDANCE_TURN_LEFT: // 左转500ms if(HAL_GetTick() - state_timer 500) { Motion_Set_Pwm(-200, -200, 300, 300); return 1; } // 直走一段距离检查前方 if(HAL_GetTick() - state_timer 800) { Motion_Set_Pwm(250, 250, 250, 250); return 1; } // 再次检查前方距离 dis Get_distance(); if(dis distance distance 2.0) { // 还是检测到障碍物继续转 avoidance_state AVOIDANCE_TURN_RIGHT; state_timer HAL_GetTick(); } else { // 避障完成返回循迹 avoidance_state AVOIDANCE_IDLE; } return 1; case AVOIDANCE_TURN_RIGHT: // 右转500ms if(HAL_GetTick() - state_timer 500) { Motion_Set_Pwm(300, 300, -200, -200); return 1; } // 直走一段距离检查前方 if(HAL_GetTick() - state_timer 800) { Motion_Set_Pwm(250, 250, 250, 250); return 1; } // 再次检查前方距离 dis Get_distance(); if(dis distance distance 2.0) { // 还是检测到障碍物继续转 avoidance_state AVOIDANCE_TURN_LEFT; state_timer HAL_GetTick(); } else { // 避障完成返回循迹 avoidance_state AVOIDANCE_IDLE; } return 1; default: avoidance_state AVOIDANCE_IDLE; return 0; } }#ifndef __HC_SR04_H #define __HC_SR04_H #include main.h #include delay.h #include tim.h #include usart.h #include gpio.h float Get_distance(void); extern uint32_t ultrasonic_num; extern uint8_t ultrasonic_flag; void BSP_Init(void); void BSP_Loop(void); void Bsp_TIM7_Init(void); void Ultrasonic_avoidance(uint16_t distance); // 避障模式枚举 typedef enum { AVOIDANCE_OFF 0, // 关闭避障 AVOIDANCE_PRIORITY, // 避障优先检测到障碍物后立即避障 AVOIDANCE_TRACKING // 循迹优先在循迹的基础上叠加避障 } AvoidanceMode_t; // 避障状态 typedef enum { AVOIDANCE_IDLE 0, // 空闲状态 AVOIDANCE_DETECTED, // 检测到障碍物 AVOIDANCE_BACKWARD, // 后退 AVOIDANCE_TURN_LEFT, // 左转 AVOIDANCE_TURN_RIGHT // 右转 } AvoidanceState_t; // 获取避障状态 AvoidanceState_t Get_Avoidance_State(void); // 设置避障模式 void Set_Avoidance_Mode(AvoidanceMode_t mode); // 获取避障模式 AvoidanceMode_t Get_Avoidance_Mode(void); // 重置避障状态 void Reset_Avoidance_State(void); // 智能避障兼容循迹 uint8_t Smart_Avoidance(uint16_t distance); // 检查是否在避障中 uint8_t Is_In_Avoidance(void); #endif