STM32__红外避障模块的使用

embedded/2025/3/31 21:56:10/

目录

一、红外避障模块>避障模块 概述

二、直接读取OUT引脚电平

三、使用中断方式触发


一、红外避障模块>避障模块 概述

引脚解释:

VCC接3.3V 或 5.0V
GND接开发板的GND
OUT数字量输出(0或1); 低电平时表示前方有障碍 ; 通过可调电阻调整检测距离 

产品特点:

工作电压推荐3.3V, 也可以5V
模块功耗23mA~40mA
检测距离<=30cm ; 通过可调电阻调整检测距离 
指示灯电压灯 + 障碍指示灯

模块描述:

1、可以广泛应用于机器人避障避障小车、流水线计数、黑白线循迹 等众多场合。

2、采用3.3V 或 5V 直流电源对模块进行供电。当电源接通时,电源指示灯点亮;

3、该传感器模块对环境光线适应能力强,其具有一对红外线发射与接收管,发射管发射出一定频率的红外线,当检测方向遇到障碍物(反射面)时,红外线反射回来被接收管接收,经过比较器电路处理之后,绿色指示灯会亮起,同时OUT端口持续输出低电平信号(0);

4、检测距离2~30cm,检测角度35°; 检测距离可以通过电位器进行调节,顺时针调电位器,检测距离增加;逆时针调电位器,检测距离减少。

5、传感器是主动红外线反射探测, 因此目标的反射率和形状是探测距离的关键。其中黑色探测距离最小, 白色最大; 小面积物体距离小,大面积距离大。

6、输出端口OUT可直接与单片机IO口连接,使用代码读取OUT电平,或使用中断触发的方式;  另外, OUT引脚也可以直接驱动一个5V继电器;

7、使用前,建议先用螺丝刀调节好需要的触发距离 (绿灯亮),再接入单片机进行开发调试。

8、具有3mm的螺丝孔,便于固定、安装;


二、程序直接读取OUT引脚电平

OUT接口在闲时(没有发现障碍物),是持续的高电平状态;高电平的电压值是供电电压值;

当发现障碍物时,OUT接口将持续地输出低电平,直到障碍物消失时再输出高电平;

因此,我们可以在STM32工程中,直接用代码读取OUT接口的电平,即可知道是否遇到障碍物。

  • 这里以OUT接口,连接PC12引脚为示例;(哪个引脚都可以,只要是空闲的引脚即可)
  • PC12引脚工作模式,无需初始化、设置。因为读电平,不管哪种模式状态下都可以直接读。

在main的while中,编写以下代码即可:

HAL_Delay(500);                                            // 延时间隔uint8_t state = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_12);      // 读取OUT引脚电平; 只是读引脚电平,用哪个引脚都可以,无需提前初始化
if (state == 0)                                            // 判断 OUT 引脚是否是低电平(闲时高电平,遇到障碍物时持续输出低电平)
{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);  // 点亮蓝色LED; 引脚PB2, 低电平通路点亮;printf("发现障碍物!\r\n");                            // 打印提示信息; printf需要预先使能UART1,并重定向到UART1输出
}
else
{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);    // 熄灭蓝色LED; 引脚PB2, 高电平断路熄灭;
}

完成后,位置如下图:

上面的代码,当PC12为低电平时(遇到障碍物):亮灯、printf输出提示信息;


三、使用中断方式触发

上面的读取方式,操作简单、容易理解。

但这种方式有一个潜在隐患:处理可能不及时。

如,当小车高速开跑中,遇到了障碍物,但程序却正在运行其它功能的代码, ......。

小车翻车没啥事,但如果用在工业现场,如电机、导轨等, 那就严重了!

我们可以使用中断触发的方式,发现障碍物,立即进入执行处理!

下面,还是以OUT接口连接PC12作示例,示范CubeMX的中断触发配置、编写回调函数代码。

1、配置引脚的工作模式

  • 点击需要使用的引脚,选择:GPIO_EXTI,即 外部中断模式

2、配置触发方式

  • 根据OUT接口的工作特点,配置为: Interrupt  Falling ,即下降沿触发中断;
  • 设置为上拉,即 闲时引脚电平保持在高电平状态;

3、使能中断线

  • 在 NVIC 中断控制器页面中,打勾对应的中断线,令中断控制器能够响应该中断线,从而使芯片能够接收并处理引脚的电平跳变事件。

引脚编号与中断线对应的关系是:

GPIO_PIN_0EXTI_Line0
GPIO_PIN_1EXTI_Line
GPIO_PIN_2EXTI_Line
GPIO_PIN_3EXTI_Line
GPIO_PIN_4EXTI_Line
GPIO_PIN_5    至  GPIO_PIN_9    共用一个中断线EXTI_Line[9:5]
GPIO_PIN_10  至  GPIO_PIN_15  共用一个中断线EXTI_LineEXTI_Line[15:10]

至此,引脚的中断触发,配置完成,重新生成。

4、编写中断回调函数

CubeMX配置上述中断后,将自动生成底层的初始化、中断服务函数等代码。

当引脚发生了配置中的电平跳变时,将触发硬件自动调用程序里的中断服务函数,继而调用程序里的EXTI中断回调函数:HAL_GPIO_EXTI_Callback ( );

这个回调函数在CubeMX生成时,在stm32xx_hal_gpio.c中已生成了弱定义;

我们在适合的、喜欢的位置,自行重新编写HAL_GPIO_EXTI_Callback函数,即能被中断函数调用到。

我们在main.c的下方,/* USER CODE BEGIN 4 */之下,编写此回调函数:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if (GPIO_Pin == GPIO_PIN_12)                               // 由PC12触发{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);  // 点亮蓝色LED; 引脚PB2, 低电平通路点亮;printf("发现障碍物!\r\n");                            // 打印提示信息; printf需要预先使能UART1,并重定向到UART1输出}}

完成后,位置如下图:

如上,即可实现遇到障碍物时,实时地执行处理。

这里的亮灯、printf,只是示范,你可以替换成需要的执行,如刹车、关闭设备电源等。

5、多次触发的解决思路

当使用中断触发,可能会有一个使用上明显的bug:连续多次触发!

这个bug的产生,是OUT接口输出低电平信号过程中的振铃现象所导致的。

测试了三个不同店家的红外避障模块>避障模块,有两家模块存在多次触发现象。

物理解决方案:

        在 OUT接口与GND间,并联一个1uF左右的小电容(1uF只是建议,具体得根据现场而定);

代码解决方案:

        在中断回调函数里,增加5ms延时,即HAL_Delay(10ms),让程序刻意“错过”振铃导致的多次触发。这种方式有点像按键的消抖处理。但是,不建议使用这种方式,因为在中断里延时死等,有可能导致其它通信的中断无法及时执行,数据丢包! 如果确定要使用这种方式(在中断里使用HAL_Delay),  注意会产生中断嵌套冲突。需要在CubeMX里修改NVIC的Time base响应优先级,默认是15 (最低),把它修改为0 (最高),然后,把引脚中断线的优先级,默认是0 (最高),修改为大于0的值,如1、6等。这样处理后,在EXTI的中断回调函数里才能使用HAL_Delay函数。

操作如下图:


如有错漏,望指正,将及时更新修改~~~


http://www.ppmy.cn/embedded/177515.html

相关文章

Kubernetes 中导致 pod 重启的原因

原因 在 Kubernetes&#xff08;K8s&#xff09;中&#xff0c;导致 Pod 重启的原因主要有以下几种&#xff1a; 1. 应用程序异常 应用进程崩溃&#xff1a;Pod 内部的应用程序由于未处理的异常、内存溢出&#xff08;OOM&#xff09;、访问非法地址等原因崩溃&#xff0c;导…

2025最新-智慧小区物业管理系统

目录 1. 项目概述 2. 技术栈 3. 功能模块 3.1 管理员端 3.1.1 核心业务处理模块 3.1.2 基础信息模块 3.1.3 数据统计分析模块 3.2 业主端 5. 系统架构 5.1 前端架构 5.2 后端架构 5.3 数据交互流程 6. 部署说明 6.1 环境要求 6.2 部署步骤 7. 使用说明 7.1 管…

STM32八股【1】-----启动流程和startup文件理解

启动流程 知识点 MCU 上电复位。MSP从向量表第0个地址读取一个32位&#xff08;2字节&#xff09;的值并保存&#xff0c;该值为栈顶地址。PC计数器从第1个地址读取一个两字节的值并保存&#xff0c;该值为程序入口&#xff0c;一般是Reset_Handler。想了解FLASH地址映射可以…

QOpenGLWidget视频画面上绘制矩形框

一、QPainter绘制 在QOpenGLWidget中可以绘制&#xff0c;并且和OpenGL的内容叠在一起。paintGL里面绘制完视频后&#xff0c;解锁资源&#xff0c;再用QPainter绘制矩形框。这种方式灵活性最好。 void VideoGLWidget::paintGL() {glClear(GL_COLOR_BUFFER_BIT);m_program.bi…

基于springboot人脸识别的社区流调系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;社区流调系统当然不能排除在外。社区流调系统是在实际应用和软件工程的开发原理之上&#xff0c;运用Java语言、Spring Boot框架、人脸校对…

xlsx+xlsx-style实现导出自定义样式的Excel文件

1、安装依赖 npm install --save file-saver //导出文件的库,也可以不安装这个 npm install --save xlsx-style //导出excel后表格的样式需要用到这个库 npm install --save xlsx //声明工作簿,创建文件,塞入数据要用到这个库 2、解决 Cant resolve ./cptable in ... 的问…

5G核心网(5GC)中TDD(时分双工)和FDD(频分双工)

在5G核心网&#xff08;5GC&#xff09;中&#xff0c;TDD&#xff08;时分双工&#xff09;和FDD&#xff08;频分双工&#xff09;是两种主要的双工方式&#xff0c;它们在5G网络的部署和性能中起着关键作用。以下是TDD和FDD的详细介绍及其在5G中的应用和区别&#xff1a; T…

初识scala

1 scala简介 scala是Scalable Language 的简写&#xff0c;是一门多范式的编程语言。它是由Martin Odersky 等人在 2003 年开发的&#xff0c;并于 2004 年首次发布&#xff0c;它运行于Java平台,并兼容现有的Java程序&#xff0c;也与java和c#一样可以调用Java类库 2 scala特…