GD32F470_(4线制)火光/火焰传感器模块火源探测 红外接收传感器 智能车配件

本文主要是介绍GD32F470_(4线制)火光/火焰传感器模块火源探测 红外接收传感器 智能车配件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2.16 火焰传感器

红外火焰传感器可以用来探测火源或其它一些波长在700纳米~1000纳米范围内的热源,在机器人比赛中,远红外火焰探头起到非常重要的作用,它可以用作机器人的眼睛来寻找火源或足球。利用它可以制作灭火机器人等。
红外火焰传感器能够探测700纳米~1000纳米范围内的红外光,探测角度为60,其中红外光波长在880纳米附近时,其灵敏度达到最大。红外火焰探头将外界红外光的强弱变化转化为电流的变化,通过A/D转换器反映为0 ~4095范围内的数值的变化。外界红外光越强,数值越小;红外光越弱,数值越大。

2.16.1 模块来源

采购链接:
(4线制)火光/火焰传感器模块火源探测 红外接收传感器 智能车配件
资料下载链接:
https://pan.baidu.com/s/14rzP9Gx7AjbmRSqD_A5Pyw
资料提取码:risv

2.16.2 规格参数

工作电压:3.3V-5V
探测距离:1米
输出方式: DO接口为数字量输出
AO接口为模拟量输出
读取方式:ADC与数字量(0和1)
管脚数量:4 Pin(2.54mm间距排针)
探测距离:1米
输出方式: DO接口为数字量输出
AO接口为模拟量输出
读取方式:ADC与数字量(0和1)
管脚数量:4 Pin(2.54mm间距排针)

2.16.3 移植过程

我们的目标是在梁山派GD32F470上能够判断当前检测范围是否有火光的功能。首先要获取资料,查看数据手册应如何实现,再移植至我们的工程。

2.16.3.1 查看资料

 火焰传感器模块的工作原理很简单。其背后的理论是热的物体会发出红外辐射。对于火焰或火灾,这种辐射会很高。我们将使用红外光电二极管检测这种红外辐射。光电二极管的电导率将根据其检测到的红外辐射而变化。我们使用 LM393 来比较这种辐射,当达到阈值时,数字输出会发生变化。

我们还可以使用模拟输出来测量红外辐射强度。模拟输出直接取自光电二极管的端子。板载 D0 LED 将在检测到时显示存在火灾。灵敏度可以通过调整板上的可变电阻来改变。这可用于消除误触发。
其对应的原理图见图2.16.3.1-2,AO输出为火焰传感器直接输出的电压,所以为模拟量;DO为经过LM393进行电压比较后,输出高低电平,所以为数字量。具体原理见光敏电阻光照传感器章节的2.3.3.1 查看资料。

在这里插入图片描述
2.16.3.2 引脚选择
想要使用ADC,需要确定使用的引脚是否有ADC外设功能。可以通过数据手册

在这里插入图片描述
在数据手册的第28页结尾,是关于GD32F450Zx系列芯片引脚的功能定义示意图。在这里插入图片描述
当前只有AO引脚需要使用到ADC接口,所以DO引脚可以使用开发板上其他的GPIO。这里选择使用PC1的附加ADC功能。使用ADC0的第11道输入通道。
在这里插入图片描述

火焰传感器立创·梁山派
VCC3V3
GNDGND
DOPF8
AOPC1

在这里插入图片描述

2.16.3.3 移植至工程

移植步骤中的导入.c和.h文件与上一节相同,只是将.c和.h文件更改为bsp_flame.c与bsp_flame.h。见2.2.3.3 移植至工程。这里不再过多讲述。移植完成后面修改相关代码。
在文件bsp_flame.c中,编写如下代码。

/********************************************************************************* 文 件 名: bsp_flame.c* 版 本 号: 初版* 修改作者: LC* 修改日期: 2023年04月06日* 功能介绍:          ******************************************************************************* 注意事项:
*********************************************************************************/#include "bsp_flame.h"
#include "systick.h"//DMA缓冲区
uint16_t gt_adc_val[ SAMPLES ][ CHANNEL_NUM ]; /******************************************************************* 函 数 名 称:ADC_DMA_Init* 函 数 说 明:初始化ADC+DMA功能* 函 数 形 参:无* 函 数 返 回:无* 作       者:LC* 备       注:无
******************************************************************/
void ADC_DMA_Init(void)
{/* DMA初始化功能结构体定义 */dma_single_data_parameter_struct dma_single_data_parameter;/* 使能引脚时钟 */rcu_periph_clock_enable(RCU_FLAME_GPIO_AO);                    rcu_periph_clock_enable(RCU_FLAME_GPIO_DO); /* 使能ADC时钟 */rcu_periph_clock_enable(RCU_FLAME_ADC);                /* 使能DMA时钟 */rcu_periph_clock_enable(RCU_FLAME_DMA);/*        配置ADC时钟        */ adc_clock_config(ADC_ADCCK_PCLK2_DIV4);        /*        配置DO为输入模式        */gpio_mode_set(PORT_FLAME_DO, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_FLAME_DO); /*        配置AO为浮空模拟输入模式        */gpio_mode_set(PORT_FLAME_AO, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_FLAME_AO); // PC1 : ADC012_IN11 /*        配置ADC为独立模式        */adc_sync_mode_config(ADC_SYNC_MODE_INDEPENDENT);/*        使能连续转换模式        */adc_special_function_config(PORT_ADC, ADC_CONTINUOUS_MODE, ENABLE);/*        使能扫描模式        */adc_special_function_config(PORT_ADC, ADC_SCAN_MODE, ENABLE);/*        数据右对齐        */        adc_data_alignment_config(PORT_ADC, ADC_DATAALIGN_RIGHT);/*        ADC0设置为规则组  一共使用 CHANNEL_NUM 个通道                */  adc_channel_length_config(PORT_ADC, ADC_REGULAR_CHANNEL, CHANNEL_NUM);/*        ADC规则通道配置:ADC0的通道11的扫描顺序为0;采样时间:15个周期                */  /*        DMA开启之后 gt_adc_val[x][0] = PC1的数据   */adc_regular_channel_config(PORT_ADC, 0, CHANNEL_ADC, ADC_SAMPLETIME_15);//PC1/*        ADC0设置为12位分辨率                */  adc_resolution_config(PORT_ADC, ADC_RESOLUTION_12B); /*        ADC外部触发禁用, 即只能使用软件触发                */  adc_external_trigger_config(PORT_ADC, ADC_REGULAR_CHANNEL, EXTERNAL_TRIGGER_DISABLE);/*        使能规则组通道每转换完成一个就发送一次DMA请求                */  adc_dma_request_after_last_enable(PORT_ADC);  /*        使能DMA请求                */  adc_dma_mode_enable(PORT_ADC);/*        使能DMA                */          adc_enable(PORT_ADC);/*        等待ADC稳定                */  delay_1ms(1);/*        开启ADC自校准                */adc_calibration_enable(PORT_ADC); /*        清除 DMA通道0 之前配置         */dma_deinit(PORT_DMA, CHANNEL_DMA);/*        DMA初始化配置         */dma_single_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(PORT_ADC));         //设置DMA传输的外设地址为ADC0基地址dma_single_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;                         //关闭外设地址自增dma_single_data_parameter.memory0_addr = (uint32_t)(gt_adc_val);                         //设置DMA传输的内存地址为 gt_adc_val数组dma_single_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;                         //开启内存地址自增(因为不止一个通道)dma_single_data_parameter.periph_memory_width = DMA_PERIPH_WIDTH_16BIT;             //传输的数据位 为 16位dma_single_data_parameter.direction = DMA_PERIPH_TO_MEMORY;                                         //DMA传输方向为 外设往内存dma_single_data_parameter.number = SAMPLES * CHANNEL_NUM;                                     //传输的数据长度为:每个通道采集30次 * 1个通道dma_single_data_parameter.priority = DMA_PRIORITY_HIGH;                                                 //设置高优先级dma_single_data_mode_init(PORT_DMA, CHANNEL_DMA, &dma_single_data_parameter);//将配置保存至DMA1的通道0/*        DMA通道外设选择                *//*        数据手册的195页根据PERIEN[2:0]值确定第三个参数,例是100 则为DMA_SUBPERI4          例是010 则为DMA_SUBPERI2         *//*        我们是ADC0功能,PERIEN[2:0]值为000,故为DMA_SUBPERI0                */dma_channel_subperipheral_select(PORT_DMA, CHANNEL_DMA, DMA_SUBPERI0);/*        使能DMA1通道0循环模式                */dma_circulation_enable(PORT_DMA, CHANNEL_DMA);/*        启动DMA1的通道0功能                */dma_channel_enable(PORT_DMA, CHANNEL_DMA); /*        开启软件触发ADC转换                */adc_software_trigger_enable(PORT_ADC, ADC_REGULAR_CHANNEL); 
}/******************************************************************* 函 数 名 称:Get_Adc_Dma_Value* 函 数 说 明:对DMA保存的数据进行平均值计算后输出* 函 数 形 参:CHx 第几个扫描的数据* 函 数 返 回:对应扫描的ADC值* 作       者:LC* 备       注:无
******************************************************************/
unsigned int Get_Adc_Dma_Value(char CHx)
{unsigned char i = 0;unsigned int AdcValue = 0;/* 因为采集 SAMPLES 次,故循环 SAMPLES 次 */for(i=0; i< SAMPLES; i++){/*    累加    */AdcValue+=gt_adc_val[i][CHx];}/* 求平均值 */AdcValue=AdcValue / SAMPLES;return AdcValue;
}/******************************************************************* 函 数 名 称:Get_FLAME_Percentage_value* 函 数 说 明:读取火焰AO值,并且返回百分比* 函 数 形 参:无* 函 数 返 回:返回百分比* 作       者:LC* 备       注:无
******************************************************************/
unsigned int Get_FLAME_Percentage_value(void)
{int adc_max = 4095;int adc_new = 0;int Percentage_value = 0;adc_new = Get_Adc_Dma_Value(0);Percentage_value = (1-((float)adc_new/adc_max)) * 100;return Percentage_value;
}
/******************************************************************* 函 数 名 称:Get_FLAME_Do_value* 函 数 说 明:读取火焰DO值,返回0或者1* 函 数 形 参:无* 函 数 返 回:* 作       者:LC* 备       注:无
******************************************************************/
unsigned char Get_FLAME_Do_value(void)
{return gpio_input_bit_get(PORT_FLAME_DO,GPIO_FLAME_DO);
}

在文件bsp_flame.h中,编写如下代码。

#ifndef _BSP_FLAME_H_
#define _BSP_FLAME_H_#include "gd32f4xx.h"#define RCU_FLAME_GPIO_AO    RCU_GPIOC
#define RCU_FLAME_GPIO_DO    RCU_GPIOF#define RCU_FLAME_DMA     RCU_DMA1
#define PORT_DMA        DMA1
#define CHANNEL_DMA     DMA_CH0#define RCU_FLAME_ADC     RCU_ADC0
#define PORT_ADC        ADC0
#define CHANNEL_ADC     ADC_CHANNEL_11#define PORT_FLAME_AO     GPIOC
#define GPIO_FLAME_AO     GPIO_PIN_1#define PORT_FLAME_DO     GPIOF
#define GPIO_FLAME_DO     GPIO_PIN_8//采样次数
#define SAMPLES         30
//采样通道数 
#define CHANNEL_NUM     1extern uint16_t gt_adc_val[ SAMPLES ][ CHANNEL_NUM ];  //DMA缓冲区void ADC_DMA_Init(void);
unsigned int Get_Adc_Dma_Value(char CHx);
unsigned int Get_FLAME_Percentage_value(void);
unsigned char Get_FLAME_Do_value(void);#endif

2.16.4 移植验证

在自己工程中的main主函数中,编写如下。

/********************************************************************************* 文 件 名: main.c* 版 本 号: 初版* 修改作者: LC* 修改日期: 2023年04月06日* 功能介绍:          ******************************************************************************* 注意事项:
*********************************************************************************/#include "gd32f4xx.h"
#include "systick.h"
#include "bsp_usart.h"
#include "bsp_flame.h"
#include "stdio.h"int main(void)
{nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);  // 优先级分组systick_config();                //滴答定时器初始化 1msADC_DMA_Init();usart_gpio_config(115200U);while(1){printf("flame = %d%%\r\n",Get_FLAME_Percentage_value());delay_1ms(500);}
}

移植现象:输出检测火光的百分比。在这里插入图片描述
移植成功示例,见文件2.16.4-1 。

这篇关于GD32F470_(4线制)火光/火焰传感器模块火源探测 红外接收传感器 智能车配件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/888561

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

智能交通(二)——Spinger特刊推荐

特刊征稿 01  期刊名称: Autonomous Intelligent Systems  特刊名称: Understanding the Policy Shift  with the Digital Twins in Smart  Transportation and Mobility 截止时间: 开放提交:2024年1月20日 提交截止日

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

Jenkins构建Maven聚合工程,指定构建子模块

一、设置单独编译构建子模块 配置: 1、Root POM指向父pom.xml 2、Goals and options指定构建模块的参数: mvn -pl project1/project1-son -am clean package 单独构建project1-son项目以及它所依赖的其它项目。 说明: mvn clean package -pl 父级模块名/子模块名 -am参数

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订