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