【STM32学习】深入解析STM32内置AD模块框图(一)

现在我们大致知道,ADC 的大致转换流程就是输入模拟信号,经由采样、保持、量化、编码等过程,最终转换成数字信号。下面将通过ADC模块框图了解ADC模块正常运作需要做哪些事。

准备阶段:

  • 配置分频数(控制ADC周期)
  • ADC 的输入范围控制(需要让输入信号在ADC转换范围内)
  • ADC 采样时间
  • ADC 输入方式(规则组 / 注入组)
  • ADC 工作模式(单次/连续、是否扫描)
  • ADC 转换:开始转换的时间点

    ADC 转换完毕:是否使能转换完成的中断(不同输入方式对应的中断不同)

    一、什么是 ADC?

    1、ADC 的基本概念

    ADC(Analogto-Digital Converter)模拟数字转换器,是将模拟信号转换成数字信号的一种外设。我们所熟悉的温度值、电压值其实都是模拟信号,但是单片机只认识高低电平,如果我们希望单片机去处理这些模拟信号,那就需要通过 ADC 将模拟信号转换成数字信号。

    2、ADC 分辨率

    我们平时总说“12位AD采样”,这里代表的意思是,当前AD值的取值范围为 0 ~ 2^12-1,即0~4095。如果输入电压是0~3.3V,相当于可以把 3.3 V等分成 4096份;如果是 16 位AD采样,那就相当于可以把3.3V等分成 65536 份。

    分辨率强调的是精度,分的份数越多,粒度越细,转换结果也就更精确。

    二、ADC 实现框图

    下面是 ADC 模块的结构图,为了方便理解,这里大体是分为了七个部分。请从左边按照逆时针的顺序了解。

    ① 电压输入范围

    为了提高转换的精确度,ADC使用一个独立的电源供电,过滤和屏蔽来自印刷电路板上的毛刺干扰,ADC的电源引脚为VDDA,独立的电源地VSSA。

    Vref+ 和 Vref- 代表了 ADC 能够转换的电压范围,即ADC所能测量的电压范围就是Vref- ≤ Vin ≤ Vref+。(内部Vref+ 连到了VDDA,Vref-连到了 VSSA)

    ② 模拟信号采样(采样时间)

    ADCx_IN0 ~ 17 是 ADCx 的输入通道,每个通道都可以接一个模拟信号的输入源。在向通道输入模拟信号之前,需要先对模拟信号做 “ 采样保持 ” 操作,这一步所花费的时间便是 “ 采样时间 ”,这也是我们后续程序的一个必要配置项。(采样保持的原因参考文章最后一个模块)

    ADCx的某个通道要连接到哪个IO引脚,都是事先决定好的,下面是 stm32f4 系列的通道-引脚对应关系。比如 ADC1 的通道0连接到的IO引脚是 PA0。第 16 ~ 18 通道比较特殊,第 16 通道接到了芯片内部的温度传感器,第 17 通道接到了内部参考电压 Vrefint,第 18 通道备份电源引脚 Vbat。

    ③ 触发AD转换的方式(软件 / 硬件)

    触发AD转换的方式包含软件触发、硬件触发。软件触发则是通过向 ADC-CR2 寄存器的 AD ON 位写1来开启转换;硬件触发可以是定时器(TIM)触发、外部引脚(EXIT)触发。

    图中有左右两组触发,这和 AD 的输入方式有关,左边是注入组专用,右边是规则组专用。

    ④ ADC分频(ADC周期)

    时钟分频决定的是ADC周期,这个需要参考时钟树。ADC 的时钟来自于 APB2 总线,将 APB2 总线的时钟再次分频就可以得到 ADC 的时钟频率,分频数可以是 2 / 4 / 6 / 8。 

    从时钟树可以看到,我们可以对 180MHz 进行 1 / 2 / 4 / 8 / 16 分频,分频后的时钟频率就是APB2总线的时钟频率。APB2总线上的不同外设对时钟需求不同,不可能每个外设都使用相同的时钟频率,因此在提供给 ADC 之前还需要再做一次分频。

    ⑤ 输入方式

    ADC 有两种输入方式,分别是注入组(injected channels)、规则组(regular channels)。相当于给 AD 转换器发送一个转换列表,告诉他要转换哪些通道。

    注入组:

            一次最多可以转换4个通道,转换结果保存到注入组数据寄存器(注入组有4个数据寄存器,每个寄存器长度为16bit)

    规则组:

            一次最多可以转换 16 个通道,转换结果保存到规则组数据寄存器(规则组只有1个数据寄存器,每个寄存器长度为16bit)。规则组最好搭配 DMA 使用,规则组只有一个寄存器,一旦上层没有及时取走寄存器内的转换结果,寄存器内的结果便会被下一次的结果覆盖。

    ​⑥ 工作方式

    ADC 的工作方式主要体现在量化编码阶段,我们可能就得考虑两个问题:

  • 开始转换以后,虽然会输入多个通道,但每次是转换一个还是一组?(非扫描 / 扫描)
  • 转换完毕以后,是就此停下,还是继续转换?(单次 / 连续)
  • 假设输入方式是注入组。

    非扫描 / 扫描模式

    非扫描:无论输入多少,只转换第一个。比如下面输入了三个通道,但最终只会转换第 0 个位置,即通道0

    扫描:输入多少,转换多少。

    单次 / 连续转换

    单次转换:转换一次后就停下来,下一次要重新启动才会开始转换

    连续转换:转换一次后,继续开始下一次转换

    ⑦ 标志位、中断使能

    当转换完成时,对应的标志位会自动置1,我们可以启动中断使能来通知。

  • OVR:使用DMA搬移转换结果完毕
  • EOC:注入组 / 规则组转换完毕
  • JEOC:注入组转换完毕
  • AWD:触发看门狗事件(需要设置水位线,当高于或者低于某个水位线时,就会触发事件)
  • 三、为什么需要 “ 采样保持 ” ?

     模拟信号是在源源不断输入的,也就是在变化的,我们希望在转换模拟信号的时候,模拟信号是固定不变的。因此就需要用到采样保持(实现这一目的就是采样保持电路)

            采样阶段,开关 S 闭合,电容 CH 充电,输出电压 Vo 随模拟信号变化

             保持阶段,开关 S 断开,电容 CH 放电,输出电压 Vo 保持在模拟开关断开瞬间的输入信号值。

             从开关 S 闭合到开关 S 断开的时间便是所谓的 “ 采样时间 ”。采样时间过长,会影响到整体AD转换时间;采样时间过短,容易导致电容充电时间不够,采集到的电压值低于实际电压值。

    四、ADC 转换时间计算

    采样完毕后,相当于做好了准备数据的工作,接下来要经过 “ 量化编码 ” 阶段来将模拟信号转换成数字信号(二进制编码)。

    由此可知,转换时间 = 采样时间 + 量化编码时间。其中量化编码一般是12.5 个ADC周期。因此,

    转换时间 = 采样时间 + 12.5个ADC周期

    ADC时钟频率最大为14MHz,假设采样时间为 1.5 个周期,那么

    转换时间 = 1.5 + 12.5 = 14 个ADC周期 = 1us

    参考文章:

    STM32学习笔记—ADC采集数据常见问题 – 知乎 (zhihu.com)

    详解STM32中的ADC-电子发烧友网 (elecfans.com)

    STM32—ADC详解入门(ADC读取烟雾传感器的值)_stm32 adc_wlkq~的博客-CSDN博客

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【STM32学习】深入解析STM32内置AD模块框图(一)

    发表评论