• stm32----ADC模数转换


    一、ADC介绍

           ADC,即模数转换器它可以将模拟信号转化为数字信号。在stm32种一般有3个ADC,每个ADC有18个通道。 12位ADC是一种逐次逼近型模拟数字转换器,它有多达18个通道,可测量16个外部和两个内部信号源。各个通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或者右对齐方式存储在16位数据寄存器中。

            模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。 ADC的输入时钟不得超过14MHz,它是由PCLK2(72M的APB2总线)经分频产生。

    二、ADC主要特征

    ●12位分辨率

    ● 转换结束、注入转换结束和发生模拟看门狗事件时产生中断

    ● 单次和连续转换模式

    ● 从通道0到通道n的自动扫描模式

    ● 自校准

    ● 带内嵌数据一致性的数据对齐

    ● 采样间隔可以按通道分别编程

    ● 规则转换和注入转换均有外部触发选项

    ● 间断模式

    ● 双重模式(带2个或以上ADC的器件)

    ● ADC转换时间: ─ STM32F103xx增强型产品:时钟为56MHz时为1μs(时钟为72MHz为1.17μs) ─ STM32F101xx基本型产品:时钟为28MHz时为1μs(时钟为36MHz为1.55μs) ─ STM32F102xxUSB型产品:时钟为48MHz时为1.2μs ─ STM32F105xx和STM32F107xx产品:时钟为56MHz时为1μs(时钟为72MHz为1.17μs)

    ● ADC供电要求:2.4V到3.6V

    ● ADC输入范围:VREF- ≤ VIN ≤ VREF+

    ● 规则通道转换期间有DMA请求产生

    三、STM32F1 ADC结构框图

    这里参照的是stm32中文手册中的图:

     在上图中,可以看出,在这3个ADC中,每个都有16个外部通道(0~15),经GPIO端口到达注入通道或者规则通道,规则通道和注入通道的不同就是:在规则通道中,ADC会按顺序依次扫描每个通道,而注入通道有点像中断,如果ADC正在扫描规则通道,但是有个注入通道,此时会优先扫描注入通道中的数据, 注入通道是不按顺序来的。外部的 16 个通道在转换的时候可分为2组通道:规则通道组和注入 通道组,其中规则通道组最多有16路,注入通道组最多有 4 路。

    stm32中GPIO端口对应的ADC通道如下图:

     四、stm32ADC配置步骤

    具体配置步骤如下:

    (1)使能端口时钟和ADC时钟,设置引脚模式为模拟输入
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN; //模拟输入模式
    (2)设置ADC的分频因子
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    (3)初始化ADC参数,包括ADC工作模式、规则序列等

     void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef*

    ADC_InitStruct);
    typedef struct
    {
    uint32_t ADC_Mode; // ADC 工作模式选择
    FunctionalState ADC_ScanConvMode; /* ADC 扫描(多通道)或者单
    次(单通道)模式选择 */
    FunctionalState ADC_ContinuousConvMode; // ADC 单次转换或者连
    续转换选择
    uint32_t ADC_ExternalTrigConv; // ADC 转换触发信号选择
    uint32_t ADC_DataAlign; // ADC 数据寄存器对齐格式
    uint8_t ADC_NbrOfChannel; // ADC 采集通道数
    } ADC_InitTypeDef;

     (4)使能ADC并校准

    void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
    ADC_Cmd(ADC1, ENABLE);//开启AD转换器
    执行复位校准的方法是:
    ADC_ResetCalibration(ADC1);
    执行 ADC 校准的方法是:
    ADC_StartCalibration(ADC1); //开始指定 ADC1 的校准状态
    while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
    while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
    (5)读取ADC转换值
    设置规则序列通道以及采样周期的库函数是:
    void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t);
    ADC_Channel,uint8_t Rank, uint8_t ADC_SampleTime);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1,
    ADC_SampleTime_239Cycles5 );
    设置好规则序列通道及采样周期,接下来就要开启转换,由于我们采
    用的是软件触发,库函数
    void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx,
    FunctionalState NewState);

     开启转换之后,就可以获取ADC 转换结果数据,调用的库函数是:

    uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
    获取 AD 转换的状态信息的库函数是:
    FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t
    ADC_FLAG);
    例如我们要判断 ADC1 的转换是否结束,方法是:
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

     

     

     

     

     

  • 相关阅读:
    从源码看webpack3打包流程
    跑步耳机排行榜,目前最好的六款跑步耳机
    Spring MVC视图解析器
    美团财务科技Java后端一面:面向对象、类加载过程、全限定类名相同的类是否可以同时被加载
    每日刷题记录 (十)
    捷报|数说故事入选「广州市人工智能应用场景典型案例TOP100」
    基于Python开发的开心麻花影视作品分析系统(源码+可执行程序+程序配置说明书+程序使用说明书)
    JAVA设计模式--桥接模式【结构型模式】
    【RP2物联网实战(一)】C/C++&FreeRTOS版
    【Linux线程】一、什么是线程
  • 原文地址:https://blog.csdn.net/wbyyd1314/article/details/132610238