• 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 ));//等待转换结束

     

     

     

     

     

  • 相关阅读:
    彻底掌握Python中 * 号
    ARFoundation系列讲解 - 79 AR室内导航四
    linux
    Netty(8)netty组件:ByteBuf
    Java开发备战 - JavaSe(基础篇)
    [汇编语言]包含多个段的程序
    查看Oracle_表名、字段名、注释、进程及杀进程等常用语句
    【Maven】使用maven profile 动态激活不同环境、依赖打包部署
    【C++】特殊类设计
    解决centos离线安装cmake找不到OpenSSL问题
  • 原文地址:https://blog.csdn.net/wbyyd1314/article/details/132610238