2019年9月18日星期三(STM32 adc转换)

烟雾传感器

    

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
{
  uint32_t ADC_Mode;                      /*!< 模式 ADC_Mode_Independent @ref ADC_Common_mode */                                             
  uint32_t ADC_Prescaler;                 /*!< 分频系数 ADC_Prescaler_Div4 @ref ADC_Prescaler */
  uint32_t ADC_DMAAccessMode;             /*!<  是否使用DMA ADC_DMAAccessMode_Disabled @ref ADC_Direct_memory_access_mode_for_multi_mode */
  uint32_t ADC_TwoSamplingDelay;          /*!< 采样周期 ADC_TwoSamplingDelay_5Cycles
                                               @ref ADC_delay_between_2_sampling_phases */
 
}ADC_CommonInitTypeDef;

(5)初始化ADC1(分辨率,规则序列,工作模式)

    void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct)

 typedef struct
{
  uint32_t ADC_Resolution;                /*!< 分辨率 ADC_Resolution_12b @ref ADC_resolution */                                  
  FunctionalState ADC_ScanConvMode;       /*!< 选择单通道还是多通道 set to ENABLE or DISABLE */
  FunctionalState ADC_ContinuousConvMode; /*!< 选择是否连续转换 set to ENABLE or DISABLE. */
  uint32_t ADC_ExternalTrigConvEdge;      /*!< 选择外部触发方式 ADC_ExternalTrigConvEdge_None 
                                               @ref ADC_external_trigger_edge_for_regular_channels_conversion */
  uint32_t ADC_ExternalTrigConv;          /*!< 选择触发事件 ADC_ExternalTrigConv_T1_CC1 
                                               @ref ADC_extrenal_trigger_sources_for_regular_channels_conversion */
  uint32_t ADC_DataAlign;                 /*!< 数据对齐方式 ADC_DataAlign_Right @ref ADC_data_align */
  uint8_t  ADC_NbrOfConversion;           /*!< 规则组中转换数目 1
                                               This parameter must range from 1 to 16. */
}ADC_InitTypeDef;

(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);

posted @ 2019-09-18 18:33  柚子皮max  阅读(407)  评论(0编辑  收藏  举报