本帖最后由 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_ */
|