在stm32上对于火焰模块的应用分析
一.火焰模块
接线说明:+ 供电(3.3v) G 接地(GND)
AO模拟输入 DO数字输出
以stm32f407举例说明:
AO接入:PF7
DO接入:PA4(实际上也可以不接,因为本实例没用到)
二.火焰模块的数据分析;
火焰模块实际是和光敏模块是类似的。都是将模拟量通过adc获取后再通过dac
转化为数字信号量,输出到串口上如图。
通过对这些数字信号量处理,便可以设置适当的警报。
三.代码示例
头文件
#ifndef _hy_H
#define _hy_H
#include "system.h"
#include "stdio.h"
void Lsens_Init(void);
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc);
u16 Get_Adc3(u32 ch);
u8 Lsens_Get_Val(void);
#endif
程序
#include "hy.h"
ADC_HandleTypeDef ADC3_Handler;//ADC句柄
//初始化光敏(火焰)传感器
void Lsens_Init(void)
{
ADC3_Handler.Instance=ADC3;
ADC3_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4; //4分频,ADCCLK=PCLK2/4=84/4=21MHZ
ADC3_Handler.Init.Resolution=ADC_RESOLUTION_12B; //12位模式
ADC3_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT; //右对齐
ADC3_Handler.Init.ScanConvMode=DISABLE; //非扫描模式
ADC3_Handler.Init.EOCSelection=DISABLE; //关闭EOC中断
ADC3_Handler.Init.ContinuousConvMode=DISABLE; //关闭连续转换
ADC3_Handler.Init.NbrOfConversion=1; //1个转换在规则序列中 也就是只转换规则序列1
ADC3_Handler.Init.DiscontinuousConvMode=DISABLE; //禁止不连续采样模式
ADC3_Handler.Init.NbrOfDiscConversion=0; //不连续采样通道数为0
ADC3_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START; //软件触发
ADC3_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE;//使用软件触发
ADC3_Handler.Init.DMAContinuousRequests=DISABLE; //关闭DMA请求
HAL_ADC_Init(&ADC3_Handler); //初始化
}
//ADC底层驱动,引脚配置,时钟使能
//此函数会被HAL_ADC_Init()调用
//hadc:ADC句柄
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_ADC3_CLK_ENABLE(); //使能ADC3时钟
__HAL_RCC_GPIOF_CLK_ENABLE(); //开启GPIOF时钟
GPIO_Initure.Pin=GPIO_PIN_7; //PF7
GPIO_Initure.Mode=GPIO_MODE_ANALOG; //模拟
GPIO_Initure.Pull=GPIO_NOPULL; //不带上下拉
HAL_GPIO_Init(GPIOF,&GPIO_Initure);
}
//获得ADC值
//ch: 通道值 0~16,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
//返回值:转换结果
u16 Get_Adc3(u32 ch)
{
ADC_ChannelConfTypeDef ADC1_ChanConf;
ADC1_ChanConf.Channel=ch; //通道
ADC1_ChanConf.Rank=1; //第1个序列,序列1
ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES; //采样时间
ADC1_ChanConf.Offset=0;
HAL_ADC_ConfigChannel(&ADC3_Handler,&ADC1_ChanConf); //通道配置
HAL_ADC_Start(&ADC3_Handler); //开启ADC
HAL_ADC_PollForConversion(&ADC3_Handler,10); //轮询转换
return (u16)HAL_ADC_GetValue(&ADC3_Handler); //返回最近一次ADC1规则组的转换结果
}
#define LSENS_READ_TIMES 10 //定义光敏传感器读取次数,读这么多次,然后取平均值
//读取Light Sens的值
//0~100:0,最暗;100,最亮
u8 Lsens_Get_Val(void)
{
u32 temp_val=0;
u8 t;
for(t=0;t<LSENS_READ_TIMES;t++)
{
temp_val+=Get_Adc3(ADC_CHANNEL_5); //读取ADC值
delay_ms(5);
}
temp_val/=LSENS_READ_TIMES;//得到平均值
if(temp_val>4000)temp_val=4000;
return (u8)(100-(temp_val/40));
}
源程序:https://download.csdn.net/download/weixin_44386927/13155236
效果显示:
当没有火焰时只有上面一个灯亮。
当出现强光或者火焰时两个灯都亮。
当中存在的问题说明,当火焰呈现蓝色或者不明显时灯只会闪烁或者不亮。