源码分析--红外避障&红外寻迹(HAL库)

本文详细介绍了基于STM32F103C8T6单片机的红外避障和寻迹功能实现。通过元器件选择、GPIO分配及主函数讲解,阐述了避障和寻迹的逻辑控制,包括根据红外传感器检测结果进行的转向和行驶策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、功能实现

1、红外避障:单片机通过安装在小车前端两侧的红外避障模块检测障碍物与小车间的距离,加以判断实现避障功能。
2、红外寻迹:单片机通过安装在小车底盘两侧的红外寻迹模块检测黑线与小车的相对位置,加以判断实现寻迹功能。

二、元器件选择

2.1单片机型号选择
单片机选择STM32F103C8T6,此款单片机有48个引脚,72M主频,64K Flash、20K RAM,3个普通定时器,1个高级定时器,2个SPI,2个I²C,3个串口,1个USB,1个CAN,37个可使用IO口,2个12位10通道ADC。
如此丰富的内设硬件资源足以应付大多数场合使用,相对于STM32F103同系列其他单片具有机性价比高,网络资源多、例程丰富,适合STM32入门初探与产品设计应用。

GPIO分配

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

main函数(按照main函数内顺序讲解)

int main(void)
{
   
  /* 复位所有外设,初始化Flash接口和系统滴答定时器 */
  HAL_Init();
  /* 配置系统时钟 */
  SystemClock_Config();
	
/**************GPIO******************************************************************/
	GPIOA_Init();//初始化L298N接口
	GPIOB_Init();//初始化寻迹和红外避障模块接口

/***************PWM******************************************************************/	
	 /* 通用定时器初始化并配置PWM输出功能 */
  GENERAL_TIMx_Init();
  
  /* 启动通道PWM输出 */
  HAL_TIM_PWM_Start(&htimx,TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htimx,TIM_CHANNEL_2);
	TIM3->CCR1=TIM3->CCR2=250;//调车速,范围0~1000,数值越大速度越快
	
/* 无限循环 */
  while (1)
  {
   	
//		Avoid();//避障
		Track();//寻迹
	}

}

1.首先复位所有外设,初始化Flash接口和系统滴答定时器
2.其次配置系统时钟(对如何配置系统时钟感兴趣的可以见文章最下方链接)
3.配置GPIOA和B

void GPIOA_Init(void)
{
   
   /* 定义IO硬件初始化结构体变量 */
  GPIO_InitTypeD
### 单片机黑白循迹传感器与HAL使用教程 #### 了解黑白循迹传感器的工作原理 黑白循迹传感器通过检测地面颜色的变化来判断路径。通常情况下,白色表面反射光较强而黑色表面反射较弱。基于这一特性,可以实现自动跟踪功能。 对于STM32系列单片机而言,在利用其内置的ADC模块读取来自红外线发射接收管组成的循迹探头所反馈回来的数据时,推荐采用官方提供的硬件抽象层(Hardware Abstraction Layer, HAL来进行编程操作[^1]。 #### 初始化配置过程 为了简化开发流程并提高代码可移植性,建议先借助ST公司推出的STM32CubeMX工具完成外设初始化设置工作。具体来说就是打开该软件后新建工程文件,并按照实际需求勾选相应的选项以生成必要的驱动函数框架结构。 接着针对模拟输入通道部分做如下调整: - 将要使用的GPIO端口模式更改为Analog; - 启用对应定时器资源用于触发AD转换事件; - 设置DMA控制器使能标志位以便于后续批量传输数据至内存缓冲区; 以上步骤完成后导出项目源码即可进入下一步骤编写应用程序逻辑环节。 #### 编写主程序循环体内的处理算法 当一切准备就绪之后就可以着手构建核心业务流程了。这里给出一段简单的C语言示范片段用来说明如何获取当前环境下的灰度值进而决定电机转向策略: ```c #include "main.h" // 定义全局变量存储采样结果 uint16_t adcValue; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_ADC1_Init(void); int main(void){ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_ADC1_Init(); while (1) { // 开始一次新的测量周期 if(HAL_OK != HAL_ADC_Start(&hadc1)){ Error_Handler(__FILE__, __LINE__); } // 阻塞等待直到本次采集结束 if(HAL_OK != HAL_ADC_PollForConversion(&hadc1, 1000)){ Error_Handler(__FILE__, __LINE__); } // 获取最近一次有效数值 adcValue = HAL_ADC_GetValue(&hadc1); // 判断是否偏离预定路线并作出相应反应... if(adcValue < THRESHOLD){ // 假定阈值为THRESHOLD TurnLeft(); // 调整车轮朝向左侧移动 }else{ TurnRight(); // 或者反之亦然 } // 插入适当延时防止CPU过载运行 HAL_Delay(DELAY_TIME); } } ``` 上述例子展示了怎样调用`HAL_ADC_*()`接口函数序列完成一轮完整的模数变换动作以及依据所得结论指导执行机构做出恰当行为的方式方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值