基于STM32F103RCT6的五路火焰传感器ADC监测火焰代码
时间: 2023-10-02 12:08:47 浏览: 148
以下是基于STM32F103RCT6的五路火焰传感器ADC监测火焰的代码,供您参考:
```c
#include "stm32f10x.h"
void Init_GPIO(void);
void Init_ADC1(void);
void Init_TIM3(void);
void Delay_ms(uint32_t ms);
int main(void)
{
uint16_t adc_value[5] = {0};
uint32_t sum = 0;
uint8_t i, j;
Init_GPIO();
Init_ADC1();
Init_TIM3();
while(1)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //开始一次AD转换
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); //等待转换完成
for(i=0; i<5; i++)
{
adc_value[i] = ADC_GetConversionValue(ADC1); //获取AD转换结果
sum += adc_value[i]; //将五路结果求和
}
sum /= 5; //求平均值
if(sum < 1000) //判断火焰是否存在
{
for(j=0; j<10; j++) //火焰存在时LED闪烁
{
GPIO_SetBits(GPIOC, GPIO_Pin_13);
Delay_ms(50);
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
Delay_ms(50);
}
}
sum = 0;
}
}
void Init_GPIO(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void Init_ADC1(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //开启扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //右对齐
ADC_InitStructure.ADC_NbrOfChannel = 5; //转换通道数
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE); //开启AD转换器
}
void Init_TIM3(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 999; //计数上限
TIM_TimeBaseStructure.TIM_Prescaler = 7199; //分频系数
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_Cmd(TIM3, ENABLE); //开启TIM3
}
void Delay_ms(uint32_t ms)
{
uint32_t i, j;
for(i=0; i<ms; i++)
for(j=0; j<7200; j++);
}
```
该代码使用了ADC和定时器,通过对五路火焰传感器进行AD转换,计算平均值,判断火焰是否存在,存在时LED闪烁。
阅读全文