在stm32上对于火焰模块的应用分析

在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..net/download/weixin_44386927/13155236

效果显示: 当没有火焰时只有上面一个灯亮。

当出现强光或者火焰时两个灯都亮。 当中存在的问题说明,当火焰呈现蓝色或者不明显时灯只会闪烁或者不亮。

经验分享 程序员 微信小程序 职场和发展