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