STM32F1与STM32CubeIDE编程实例-火焰传感器驱动 火焰传感器驱动 1、火焰传感器介绍 火焰探测器是一种传感器,设计用于探测火焰]或火灾的存在并对其做出响应,从而实现火焰探测。火焰传感器主要有如下几种类型:
光学火焰探测器
紫外线探测器:紫外线(UV) 检测器通过检测点火瞬间发出的紫外线辐射来工作。
近红外阵列:近红外(IR) 阵列火焰探测器(0.7 至 1.1 μm),也称为视觉火焰探测器,采用火焰识别技术通过使用电荷耦合器件(CCD) 分析近红外辐射来确认火灾。
红外线:红外 (IR) 或宽带红外(1.1 μm 和更高)火焰探测器可监控红外光谱带,以了解热气体发出的特定模式。这些是使用专门的消防热像仪(TIC)(一种热像仪)来感应的。
红外热像仪:MWIR 红外 (IR) 摄像机可用于检测热量,并通过特定算法检测场景内的热点以及火焰,以检测和预防火灾以及火灾风险。
紫外/红外:探测器对 UV 和 IR 波长都很敏感,并通过比较两个范围的阈值信号来检测火焰。这有助于最大限度地减少误报
IR/IR 火焰检测:双红外 (IR/IR) 火焰探测器比较两个红外范围内的阈值信号。通常一个传感器查看 4.4 微米的二氧化碳 (CO 2 ),而另一个传感器查看参考频率。感测 CO 2排放适合碳氢燃料;对于非碳基燃料,例如氢,宽带水带被感测。
IR3 火焰检测:多红外探测器利用算法来抑制背景辐射(黑体辐射)的影响,这种辐射再次降低了灵敏度。
3IR+UV火焰检测:多红外 (Multi-IR/3IR) 探测器使用算法来确定火灾的存在,并将它们与被称为“黑体辐射”的背景噪声区分开来,这通常会降低探测器的范围和精度。
可见传感器:可见光传感器(例如相机:0.4 到 0.7 μm)能够呈现人类可以理解的图像。此外,复杂的图像处理分析可以由计算机执行,它可以识别火焰甚至烟雾。
视频:闭路电视或网络摄像机可用于视觉检测(波长在 0.4 和 0.7 μm 之间)。烟雾或雾会限制它们的有效范围,因为它们仅在可见光谱中运行。
电离电流火焰检测 :火焰体内的强电离可以通过火焰整流现象来测量,当施加电压时,交流电流更容易沿一个方向流动。该电流可用于验证火焰的存在和质量。这种探测器可用于大型工业过程气体加热器并连接到火焰控制系统。它们通常用作火焰质量监测器和火焰故障检测。它们在各种家用燃气炉和锅炉中也很常见。
热电偶火焰检测 :热电偶广泛用于监测燃烧加热系统和燃气灶中的火焰存在。这些装置的一个常见用途是在火焰失效时切断燃料供应,以防止未燃烧的燃料积聚。这些传感器测量热量,因此通常用于确定没有火焰。这可用于验证引燃火焰的存在。
本次使用的火焰传感器可以检测火焰波长在760纳米~1100纳米范围内的火源,探测角度为60度左右。对火焰光谱敏感并可以调节。A0端口输出火焰大小的模拟值,D0端连接一个LM393(比较器),可以通过电位器调节火焰大小报警临界值。当火焰大小超过临界值时,D0输出低电平;否则输出高电平。
2、火焰传感配置
开发环境搭建、系统时钟配置、调试配置及串口配置,请参考:
火焰传感器的配置如下:
STM32F103VE的PA2引脚连接火焰传感器的D0引脚。
3、火焰传感器驱动实现 1)基本定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 /\* \* flame\_sensor.h \* \* Created on: Apr 22, 2022 \* Author: jenson \*/ #ifndef \_\_FLAME\_SENSOR\_H\_\_ #define \_\_FLAME\_SENSOR\_H\_\_ #include <stdio.h> #include "stm32f1xx\_hal.h" #include "main.h" typedef struct { uint16\_t id; GPIO_TypeDef \*GPIOx; // 总线端口 uint16\_t GPIO_Pin; // 总线引脚 } flame\_sensor\_t; /\*\*\* \* @brief 检查火焰传感器输出 \* @return 当传感器有报警时,返回1;否则返回0 \*/ uint8\_t flame\_sensor\_check(flame\_sensor\_t\* sensor); #endif /\* \_\_FLAME\_SENSOR\_H\_\_ \*/
2)驱动实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 /\* \* flame\_sensor.c \* \* Created on: Apr 22, 2022 \* Author: jenson \*/ #include "flame\_sensor.h" uint8\_t flame\_sensor\_check(flame\_sensor\_t \*sensor) { // 读取传感器输出电平 if (HAL\_GPIO\_ReadPin(sensor->GPIOx, sensor->GPIO_Pin) == GPIO_PIN_RESET) { return 1; } return 0; }
3)主程序
在main.c文件中添加如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 /\* Private includes ----------------------------------------------------------\*/ /\* USER CODE BEGIN Includes \*/ #include <stdio.h> #include "flame\_sensor/flame\_sensor.h" /\* USER CODE END Includes \*/ /\* Private variables ---------------------------------------------------------\*/ /\* USER CODE BEGIN PV \*/ flame\_sensor\_t sensor; /\* USER CODE END PV \*/ int main(void) { /\* USER CODE BEGIN 1 \*/ /\* USER CODE END 1 \*/ /\* MCU Configuration--------------------------------------------------------\*/ /\* Reset of all peripherals, Initializes the Flash interface and the Systick. \*/ HAL\_Init(); /\* USER CODE BEGIN Init \*/ /\* USER CODE END Init \*/ /\* Configure the system clock \*/ SystemClock\_Config(); /\* USER CODE BEGIN SysInit \*/ /\* USER CODE END SysInit \*/ /\* Initialize all configured peripherals \*/ MX\_GPIO\_Init(); MX\_USART1\_UART\_Init(); /\* USER CODE BEGIN 2 \*/ sensor.id = 1; sensor.GPIO_Pin = FLAME_SENSOR_Pin; sensor.GPIOx = FLAME_SENSOR_GPIO_Port; printf("\*\*\*\*STM32CubeIDE:Flame Sensor\*\*\*\*\r\n"); /\* USER CODE END 2 \*/ /\* Infinite loop \*/ /\* USER CODE BEGIN WHILE \*/ while (1) { /\* USER CODE END WHILE \*/ /\* USER CODE BEGIN 3 \*/ if(flame\_sensor\_check(&sensor)){ printf("flame sensor %d altered\r\n",sensor.id); } HAL\_Delay(100); } /\* USER CODE END 3 \*/ }
程序运行结果如下:
4、火焰传感器配置(中断方式) 前面的驱动代码是基于循环轮询实现,比较耗CPU。可以通过外部中断方式来对传感器输出信号进行检测。关于外部中断使用,请参考:
传感器的中断方式驱动配置如下:
5、火焰传感器驱动实现(中断方式) 1)基本定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 /\* \* flame\_sensor.h \* \* Created on: Apr 22, 2022 \* Author: jenson \*/ #ifndef \_\_FLAME\_SENSOR\_H\_\_ #define \_\_FLAME\_SENSOR\_H\_\_ #include <stdio.h> #include "stm32f1xx\_hal.h" #include "main.h" /\*\* \* @brief 中断回调函数 \* @param sensor\_id 传感器编号 \* \*/ typedef void (\*flame_sensor_callback)(uint16\_t sensor_id); typedef struct { uint16\_t id; GPIO_TypeDef \*GPIOx; // 总线端口 uint16\_t GPIO_Pin; // 总线引脚 flame_sensor_callback callback; } flame\_sensor\_t; #endif /\* \_\_FLAME\_SENSOR\_H\_\_ \*/
2)中断回调实现
在stm32f1xx_it.c文件中,添加如代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 /\* USER CODE BEGIN Includes \*/ #include "flame\_sensor/flame\_sensor.h" /\* USER CODE END Includes \*/ /\* Private variables ---------------------------------------------------------\*/ /\* USER CODE BEGIN PV \*/ extern flame\_sensor\_t sensor; /\* USER CODE END PV \*/ /\* USER CODE BEGIN 1 \*/ void HAL\_GPIO\_EXTI\_Callback(uint16\_t GPIO_Pin) { if(GPIO_Pin == sensor.GPIO_Pin){ if(sensor.callback){ sensor.callback(sensor.id); } } } /\* USER CODE END 1 \*/
3)主程序
在main.c文件中添加如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 /\* Private includes ----------------------------------------------------------\*/ /\* USER CODE BEGIN Includes \*/ #include <stdio.h> #include "flame\_sensor/flame\_sensor.h" /\* USER CODE END Includes \*/ /\* USER CODE BEGIN PV \*/ flame\_sensor\_t sensor; /\* USER CODE END PV \*/ /\* USER CODE BEGIN PFP \*/ void on\_flame\_sensor\_alert(uint16\_t sensor_id); /\* USER CODE END PFP \*/ /\* Private user code ---------------------------------------------------------\*/ /\* USER CODE BEGIN 0 \*/ void on\_flame\_sensor\_alert(uint16\_t sensor_id){ printf("flame sensor %d alerted\r\n",sensor_id); } /\* USER CODE END 0 \*/ int main(void) { /\* USER CODE BEGIN 1 \*/ /\* USER CODE END 1 \*/ /\* MCU Configuration--------------------------------------------------------\*/ /\* Reset of all peripherals, Initializes the Flash interface and the Systick. \*/ HAL\_Init(); /\* USER CODE BEGIN Init \*/ /\* USER CODE END Init \*/ /\* Configure the system clock \*/ SystemClock\_Config(); /\* USER CODE BEGIN SysInit \*/ /\* USER CODE END SysInit \*/ /\* Initialize all configured peripherals \*/ MX\_GPIO\_Init(); MX\_USART1\_UART\_Init(); /\* USER CODE BEGIN 2 \*/ sensor.id = 1; sensor.GPIO_Pin = FLAME_SENSOR_Pin; sensor.GPIOx = FLAME_SENSOR_GPIO_Port; sensor.callback = on_flame_sensor_alert; printf("\*\*\*\*STM32CubeIDE:Flame Sensor\*\*\*\*\r\n"); /\* USER CODE END 2 \*/ /\* Infinite loop \*/ /\* USER CODE BEGIN WHILE \*/ while (1) { /\* USER CODE END WHILE \*/ /\* USER CODE BEGIN 3 \*/ } /\* USER CODE END 3 \*/ }
程序运行结果:
文章来源: https://iotsmart.blog.csdn.net/article/details/125335245
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!