zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    ES6 Syntax and Feature Overview
    Javescript——数据类型
    Javescript——变量声明的区别
    React之概述(待续)
    React之简介
    Vue.js学习之简介(待续)
    Build Telemetry for Distributed Services之OpenCensus:Tracing2(待续)
    docker之redis使用
    Build Telemetry for Distributed Services之OpenCensus:C#
    Build Telemetry for Distributed Services之Open Telemetry简介
  • 原文地址:https://www.cnblogs.com/zjlbk/p/11544385.html
Copyright © 2011-2022 走看看