当前位置: 首页 > news >正文

寒假学习(15)(HAL库6)

#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; dis=Get_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
http://www.jsqmd.com/news/356164/

相关文章:

  • 浅谈路由器Openwrt防火墙的-端口转发-与-NAT穿透-区别与优缺点
  • AI写专著的高效法门:工具推荐与使用技巧,助你快速完成大作
  • 基于SpringBoot和Vue的汽车租赁买卖管理系统
  • 基于SpringBoot和Vue的民宿预定信息管理系统
  • 【轴承故障检测】滚动轴承中进行基于振动的故障诊断研究附Matlab代码
  • 基于SpringBoot和Vue的美食信息推荐网站系统
  • 基于SpringBoot和Vue的旅游出行指南系统
  • AI写专著必备!几款顶尖工具对比,为你的专著写作保驾护航!
  • Python先进技术全面发展无人有人医疗机器人芯片治疗方案手术机器人组合体各种各样问题结合体研发开发重要性智能化系统化武器多样化太阳能利用回收利用可再生能源
  • 详细介绍:多线程编程核心:可重入与线程安全解析及条件变量应用
  • 你觉得,AI能让你“一人成军”吗?我的工具流与真实体验
  • 揭秘AI专著生成秘诀:实用工具助力,快速产出高质量学术专著!
  • python先进技术全面发展无人有人远程战略攻击性轰炸机研发开发重要性系统化武器多样化太阳能利用回收利用可再生能源
  • Python先进技术全面发展多功能一体坦克组合体研究开发重要性智能化系统化武器多样化太阳能利用回收利用可再生能源
  • STM32项目分享:车辆防盗报警系统
  • 解锁AI写专著的神技!专业工具助力,让学术创作更轻松
  • 卧式与立式空调压缩机的技术区别
  • 【2 月小记】Part 2: ABC444 比赛总结 - L
  • Python先进技术全面发展有人无人作战先进隐形战斗机时速超音速研究开发重要性智能化系统化武器多样化太阳能利用回收利用可再生能源
  • 【轴承故障诊断】一种用于轴承故障诊断的稀疏贝叶斯学习(SBL),两种群稀疏学习算法来提取故障脉冲,第一种仅利用故障脉冲的群稀疏性,第二种则利用故障脉冲的额外周期性行为附Matlab代码
  • 每位漏洞赏金猎人必备的十大顶级工具解析
  • Python先进技术全面发展有人无人全能隐身远程战略轰炸机激光雷达运输机研究开发重要性智能化系统化武器多样化太阳能利用回收利用可再生能源
  • 【轴承故障诊断】用于轴承故障诊断的集中时频分析研究附Matlab代码
  • E - Sparse Range 题解
  • Python先进技术全面发展核电站发电多样化研究开发重要性智能化系统化武器多样化太阳能利用回收利用可再生
  • Python BytesIO:用内存字节流替代临时文件
  • 基于Spring Boot的企业数据资产登记系统
  • 【主动噪声控制】基于直观的循环卷积惩罚因子的频域输出约束型主动噪声控制算法附Matlab代码
  • ..
  • 设计支持手势识别的实时引擎