寒假学习(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; 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

相关新闻

超实用!低查重AI教材编写工具助力,快速完成高质量教材创作

超实用!低查重AI教材编写工具助力,快速完成高质量教材创作

随着教材编写的需求多样化,如何准确响应不同的需求成为一个重要课题。不同年段学生的学习能力差异明显,呈现的内容如果过于简单或复杂,都会影响学习效果;而在课堂教学、自主学习等不同场景中,教材的呈现方式也需要灵活…

2026/7/6 7:27:13 阅读更多 →
基于SpringBoot和Vue的旅游出行指南系统

基于SpringBoot和Vue的旅游出行指南系统

文章目录 详细视频演示项目介绍技术介绍功能介绍核心代码系统效果图源码获取 详细视频演示 文章底部名片,获取项目的完整演示视频,免费解答技术疑问 项目介绍 基于 SpringBoot 的旅游出行指南系统是一款聚焦游客出行全流程需求的综合性信息服务平台&am…

2026/7/4 22:51:33 阅读更多 →
STM32项目分享:车辆防盗报警系统

STM32项目分享:车辆防盗报警系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 PCB图 五、程序设计 六、实验效果 七、包含内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: https://www.bilibili.com/video/BV1zJk7BQEpX/?…

2026/7/4 3:03:21 阅读更多 →

最新新闻

13DOF传感器与TM4C123的嵌入式定位导航系统设计

13DOF传感器与TM4C123的嵌入式定位导航系统设计

1. 项目背景与核心需求在智能硬件和机器人领域,精准的定位导航能力一直是技术突破的关键瓶颈。传统方案往往面临两个主要痛点:一是单一传感器(如GPS或IMU)在复杂环境中可靠性不足;二是低功耗微控制器难以承载多传感器数…

2026/7/6 7:27:09 阅读更多 →
如何用深蓝词库转换工具实现跨平台词库自由:完整新手指南

如何用深蓝词库转换工具实现跨平台词库自由:完整新手指南

如何用深蓝词库转换工具实现跨平台词库自由:完整新手指南 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 你是否曾经因为更换输入法而不得不放弃多年积累…

2026/7/6 7:27:09 阅读更多 →
BERT 与 3 种传统方法对比:情感多分类任务下的精度、速度与数据需求分析

BERT 与 3 种传统方法对比:情感多分类任务下的精度、速度与数据需求分析

BERT与传统方法在情感多分类任务中的全面对比:精度、效率与数据需求的深度解析情感分析作为自然语言处理(NLP)领域的核心任务之一,其技术演进直接反映了NLP方法论的发展轨迹。本文将聚焦情感多分类这一典型场景,系统对…

2026/7/6 7:25:09 阅读更多 →
OpenCV实战:从零搭建实时人脸识别系统,附完整代码与避坑指南

OpenCV实战:从零搭建实时人脸识别系统,附完整代码与避坑指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 最近在做一个智能门禁的小项目,需要用到实时人脸识别。本以为用现成的API就能搞定,结果发现对本地化部署、成本…

2026/7/6 7:21:08 阅读更多 →
明日方舟智能助手实战指南:5个核心技巧告别手动肝日常

明日方舟智能助手实战指南:5个核心技巧告别手动肝日常

明日方舟智能助手实战指南:5个核心技巧告别手动肝日常 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://git…

2026/7/6 7:21:08 阅读更多 →
XTR116与STM32的4-20mA电流环工业应用设计

XTR116与STM32的4-20mA电流环工业应用设计

1. 4-20mA电流环技术背景与XTR116特性解析工业现场最头疼的问题莫过于长距离信号传输时的干扰和衰减。我在化工厂做自动化改造时,曾遇到过传感器信号传输300米后完全失真的情况。这时候4-20mA电流环的优势就凸显出来了——电流信号对线路电阻不敏感,抗干…

2026/7/6 7:21:08 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻