现在我们大致知道,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)文章来源:https://www.toymoban.com/news/detail-743957.html
STM32—ADC详解入门(ADC读取烟雾传感器的值)_stm32 adc_wlkq~的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-743957.html
到了这里,关于【STM32学习】ADC(一)—— STM32 内置 AD 模块框图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!