烟雾传感器
1.外部中断消抖
轮询时使用延时消抖,但是中断中不允许延时,即使延时也不能组织中断的产生,可能导致中断重入
外部中断我们应该采用定时器来去除抖动,方法是在外部中断发生时,并不去处理具体的事务,而是去启动重置定时器
处理具体事务的代码放入到定时器中断中去处理,这样即使有多次抖动产生中断,通过重置定时器将这些抖动消除,这样一次操作就对应一次事务处理
一.ADC
1.概念
ADC,是Analog-to-Digtal Converter的缩写,指的是模/数转换器,将连续变化的模拟量转换成离散的数字信号
真实世界的模拟信号(声音 图像 压力 电压 温度),需要转换成更容易存储,处理,传输的数字形式。ADC实现就是这个功能
DAC就是数/模转换器,是ADC的逆向过程,用于计算机对外提供模拟量
2.ADC转换步骤
采样----->量化------>编码
3.ADC的分类
(1)积分型
使用积分器获取模拟电压的数字值,电路简单,成本低,转换时间长
(2)逐次逼近型
内部使用多个信号和测量信号多次比较,得到数字值,电路相对复杂,成本相对高,转换时间相对短
(3)并行逼近比较型
使用多个比较器同时测量信号,速度更快,电路更复杂,成本高
4.stm32f407的ADC
跳线连接P10,让Vref+ = 3.3V
5.stm32f407的ADC编程(以滑动变阻器输入为例)
(1)开启GPIOA时钟和ADC1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
....
(2)将GPIO配置为模拟输入功能
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init();
(3)复位ADC1
ADC_DeInit();
(4)设置ADC1的分频系数
void ADC_CommonInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct)
typedef struct |
(5)初始化ADC1(分辨率,规则序列,工作模式)
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct)
typedef struct |
(6)使能ADC1
ADC_Cmd(ADC1,ENABLE);
(7)配置规则通道
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)
参数:
ADCx - 哪个ADC
ADC1
ADC_Channel - 哪个通道
ADC_Channel_5
Rank - 转换通道在规则组中的编号
1
ADC_SampleTime - ADC采样时间
ADC_SampleTime_3Cycles
(8)开启软件转换
ADC_SoftwareStartConv(ADC1);
(9)等待转换结束
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)!=SET);
(10)读取转换结果
ADC_GetConversionValue(ADC1);