打印
[RISC-V MCU 应用开发]

国产risc-v微控制器读取火焰传感器

[复制链接]
83|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 dirtwillfly 于 2025-6-29 10:50 编辑

1. 使用的软硬件
1.1 开发环境
1)RT-Thread Studio

1.2 硬件
1)四线火焰传感器模块  1块
2)HPM5361EVK        1块
3)杜邦线                 若干

2. 火焰传感器模块

2.1 火焰传感器模块特性
1)可以检测火焰或者波长760纳米~1100纳米范围内的光源
2)探测角度60度左右,对火焰光谱特别灵敏
3)灵敏度可调(使用蓝色电位器调节)
4)对火焰的探测距离:跟灵敏度和火焰强度有关,一般1m以内适用
5)工作电压:3.3V-5V
6)  输出形式:a 模拟量电压输出,b 数字开关量输出(0 和 1)

2.2 火焰传感器模块原理图


使用特权

评论回复

相关帖子

沙发
dirtwillfly|  楼主 | 2025-6-29 10:49 | 只看该作者
本帖最后由 dirtwillfly 于 2025-6-29 11:01 编辑

3. hpm5361 硬件电路
3.1 ADC采集引脚选择
通过HPM Pinmux Tool工具,可以知道ADC0的各通道基本都在PB端口,其中通道3为 PB11。我们就是用它作为火焰传感器模块AO引脚的采集引脚。


3.2 在开发板上,PB11为GPIO29。把该引脚连接到火焰传感器模块的AO引脚,同时把火焰传感器模块的VIN和GND连接到开发板的3.3V和GND。


使用特权

评论回复
板凳
dirtwillfly|  楼主 | 2025-6-29 10:49 | 只看该作者
本帖最后由 dirtwillfly 于 2025-6-29 11:16 编辑

4. 软件开发
4.1 配置资源
在RT-Thread Setting 界面的硬件标签页,使能ADC,使能ADC16,以及使能ADC0。


在组件标签页,使能ADC设备驱动程序。


然后点击”保存“,等待开发环境自动配置完毕。


4.2 代码开发


新建app_flame.c和头文件app_flame.h文件。
app_flame.c添加包含的头文件:
#include <rtthread.h>
#include <rtdevice.h>
#include "app_flame.h"
添加宏定义,adc0为使用的adc外设,采集通道为3:
#define FLAME_DEVICE_NAME  "adc0"
#define FLAME_DEVICE_CHANNEL   3//ADC通道
添加全局变量:
static rt_adc_device_t flame = RT_NULL;
static struct rt_thread flame_thread;//定义线程控制块
static char flame_thread_stack[512];//定义线程栈
rt_uint16_t adc_value = 0;
编写火焰传感器的线程逻辑,整体线程循环为:读取adc,然后通过串口打印输出,然后延时1000ms。
static void flame_thread_entry(void *parameter)
{
     while(1)
     {
        adc_value = rt_adc_read(flame, FLAME_DEVICE_CHANNEL);
        rt_kprintf("flame:%d\n", adc_value);
        rt_thread_mdelay(1000);
     }
}
编写初始化函数,主要功能为查找adc设备,使能采集通道,初始化对应的线程,最后启动线程。

int flame_init(void)
{
        rt_err_t ret = 0;

        flame = (rt_adc_device_t)rt_device_find(FLAME_DEVICE_NAME);
        if(flame == RT_NULL)
        {
                rt_kprintf("rt_device_find flame failed\n\r");
                return RT_ERROR;
        }

        ret = rt_adc_enable(flame, FLAME_DEVICE_CHANNEL);
        if(ret < 0)
        {
                rt_kprintf("rt_adc_enable flame failed\n\r");
                return ret;
        }

        //创建线程
        rt_kprintf("flame_thread init\n\r");
        ret = rt_thread_init(&flame_thread, "flame_thread", flame_thread_entry, NULL, flame_thread_stack, sizeof(flame_thread_stack), 8, 10);

        if(ret != RT_EOK)
                rt_kprintf("flame_thread init failed\n\r");
        else
                ret = rt_thread_startup(&flame_thread);


        return ret;
}
然后,再把初始化函数添加到app_flame.h文件。
最后的app_flame.h文件内容为:
#ifndef APPLICATIONS_APP_FLAME_H_
#define APPLICATIONS_APP_FLAME_H_

int flame_init(void);

#endif /* APPLICATIONS_APP_FLAME_H_ */


使用特权

评论回复
地板
dirtwillfly|  楼主 | 2025-6-29 10:49 | 只看该作者
本帖最后由 dirtwillfly 于 2025-6-29 11:15 编辑

5. 验证效果在main.c文件,添加包含文件:
#include "app_flame.h"
在main()函数添加火焰传感器的初始化函数:
flame_init();
编译下载,使用串口调试工具观察,会有如下信息:

当传感器靠近打火机火焰,或者人体皮肤时,采集到的数据会有变化。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1193

主题

35062

帖子

1122

粉丝