ADC 简介
ADC 即模拟数字转换器,英文详称 Analog-to-digital converter,可以将外部的模拟信号转换 为数字信号。
STM32F103 系列芯片拥有 3 个 ADC(C8T6 只有 2 个),这些 ADC 可以独立使用,其中 ADC1 和 ADC2 还可以组成双重模式(提高采样率)。STM32 的 ADC 是 12 位逐次逼近型的模 拟数字转换器。它有 18 个通道,可测量 16 个外部和 2 个内部信号源,其中 ADC3 根据 CPU 引 脚的不同其通道数也不同,一般有 8 个外部通道。ADC 中的各个通道的 A/D 转换可以单次、连 续、扫描或间断模式执行。ADC 的结果可以以左对齐或者右对齐存储在 16 位数据寄存器中。
STM32F103 的 ADC 主要特性我们可以总结为以下几条:
1、12 位分辨率;
2、转换结束、注入转换结束和发生模拟看门狗事件时产生中断
3、单次和连续转换模式
4、自校准
5、带内嵌数据一致性的数据对齐
6、采样间隔可以按通道分别编程
7、规则转换和注入转换均有外部触发选项
8、间断模式
9、双重模式(带 2 个或以上 ADC 的器件)
10、ADC 转换时间:时钟为 72MHz 为 1.17us
11、ADC 供电要求:2.4V 到 3.6V
12、ADC 输入范围:VREF–≤VIN≤VREF+
13、规则通道转换期间有 DMA 请求产生
ADC框图简介
图中,我们按照 ADC 的配置流程标记了七处位置,分别如下:
① 输入电压
在前面 ADC 的主要特性也对输入电压有所提及,ADC 输入范围 VREF–≤VIN≤VREF+,最终 还是由 VREF–、VREF+、VDDA 和 VSSA 决定的。下面看一下这几个参数的关系,如图 30.1.2 所示:
从上图可以知道,VDDA 和 VREF+接 VCC3.3,而 VSSA 和 VREF-是接地,所以 ADC 的输入范 围即 0~3.3V。
② 输入通道
在确定好了 ADC 输入电压后,如何把外部输入的电压输送到 ADC 转换器中呢,在这里引 入了 ADC 的输入通道,在前面也提及到了 ADC1 和 ADC2 都有 16 个外部通道和 2 个内部通 道;而 ADC3 就有 8 个外部通道。外部通道对应的是上图中的 ADCx_IN0、ADCx_IN1… ADCx_IN15。ADC1 的通道 16 就是内部通道,连接到芯片内部的温度传感器,通道 17 连接到 Vrefint。而 ADC2 的通道 16 和 17 连接到内部的 VSS。ADC3 的通道 9、14、15、16 和 17 连接 到的是内部的 VSS。具体的 ADC 通道表见表 30.1.1 所示:
③转换顺序
当 ADC 的多个通道以任意顺序进行转换就诞生了成组转换,这里有两种成组转换类型: 规则组和注入组。规则组就是图中的规则通道,注入组就是图中的注入通道。为了避免大家对 输入通道,以及规则通道和注入通道的理解混淆,后面规则通道以规则组来代称,注入通道以 注入组来代称。
规则组允许最多 16 个输入通道进行转换,而注入组允许最多 4 个输入通道进行转换。这里 讲解一下规则组和注入组。
规则组(规则通道)
规则组,按字面理解,“规则”就是按照一定的顺序,相当于正常运行的程序,平常用到最 多也是规则组。
注入组(注入通道)
注入组,按字面理解,“注入”就是打破原来的状态,相当于中断。当程序执行的时候,中断是可以打断程序的执行。同这个类似,注入组转换可以打断规则组的转换。假如在规则组转 换过程中,注入组启动,那么注入组被转换完成之后,规则组才得以继续转换。
为了便于理解,下面看一下规则组和注入组的执行优先级对比图,如图 30.1.3 所示:
了解了规则组和注入组的概念后,下面来看看它们的转换顺序,即转换序列。转换序列可 以分为规则序列和注入序列。下面分别来介绍它们。
规则序列
规则组最多允许 16 个输入通道进行转换,那么就需要设置通道转换的顺序,即规则序列。 规则序列寄存器有 3 个,分别为 SQR1、SQR2 和 SQR3。SQR3 控制规则序列中的第 1 个到第 6 个转换;SQR2 控制规则序列中第 7 个到第 12 个转换;SQR1 控制规则序列中第 13 个到第 16 个转换。规则序列寄存器控制关系汇总如表 30.1.2 所示:
从上表可以知道,当我们想设置 ADC 的某个输入通道在规则序列的第 1 个转换,只需要 把相应的输入通道号的值写入 SQR3 寄存器中的 SQ1[4:0]位即可。例如想让输入通道 5 先进行 转换,那么就可以把 5 这个数值写入 SQ1[4:0]位。如果还想让输入通道 8 在第 2 个转换,那么就可以把 8 这个数值写入 SQ2[4:0]位。最后还要设置你的这个规则序列的输入通道个数,只需 把输入通道个数写入 SQR1 的 SQL[3:0]位。注意:写入 0 到 SQL[3:0]位,表示这个规则序列有 1 个输入通道的意思,而不是 0 个输入通道。
注入序列
注入序列,跟规则序列差不多,决定的是注入组的顺序。注入组最大允许 4 个通道输入, 它的注入序列由 JSQR 寄存器配置。注入序列寄存器 JSQR 控制关系如表 30.1.3 所示:
注入序列有多少个输入通道,只需要把输入通道个数写入到 JL [ 1 : 0 ]位,范围是 0~3。注 意:写入 0 表示这个注入序列有一个输入通道,而不是 0 个输入通道。这个内容很简单。编程 时容易犯错的是注入序列的转换顺序问题,下面给大家讲解一下。
如果 JL[ 1 : 0 ]位的值小于 3,即设置注入序列要转换的通道个数小于 4,则注入序列的转 换顺序是从 JSQx[ 4 : 0 ](x=4-JL[1:0])开始。例如:JL [ 1 : 0 ]=10、JSQ4 [ 4 : 0 ]= 00100、JSQ3 [ 4 : 0 ]= 00011、JSQ2 [ 4 : 0 ]= 00111、JSQ1 [ 4 : 0 ]= 00010,意味着这个注入序列的转换顺序 是:7、3、4,而不是 2、7、3。如果 JL[ 1 : 0 ]=00,那么转换顺序是从 JSQ4 [ 4 : 0 ]开始。
④ 触发源
在配置好输入通道以及转换顺序后,就可以进行触发转换了。ADC 的触发转换有两种方法: 分别是通过 ADON 位或外部事件触发转换。
(1)ADON 位触发转换
当 ADC_CR2 寄存器的 ADON 位为 1 时,再独立给 ADON 位写 1(其它位不能一起改变, 这是为了防止误触发),这时会启动转换。这种控制 ADC 启动转换的方式非常简单。
(2)外部触发转换
另一种方法是通过外部事件触发转换,例如定时器捕获、EXTI 线和软件触发,可以分为规 则组外部触发和注入组外部触发。
规则组外部触发使用方法是将 EXTTRIG 位置 1,并且通过 EXTSET[2:0]位选择规则组启动 转换的触发源。如果 EXTSET[2:0]位设置为 111,那么可以通过 SWSTART 为启动 ADC 转换, 相当于软件触发。
注入组外部触发使用方法是将 JEXTTRIG 位置 1,并且通过 JEXTSET[2:0]位选择注入组启 动转换的触发源。如果 JEXTSET[2:0]位设置为 111,那么可以通过 JSWSTART 为启动 ADC 转 换,相当于软件触发。
ADC1 和 ADC2 的触发源是一样的,ADC3 的触发源和 ADC1/2 有所不同,这个需要注意。
⑤ 转换时间
(1)ADC 时钟
在学习转换时间之前,我们先来了解 ADC 时钟。从标号⑤框出来部分可以看到 ADC 时钟是 要经过 ADC 预分频器的,那么 ADC 的时钟源是什么?ADC 预分频器的分频系数可以设置的 范围又是多少?以及 ADC 时钟频率的最大值又是多少?下面将为大家解答。
ADC 的输入时钟是由 PCLK2 经过分频产生的,分频系数是由 RCC_CFGR 寄存器的 ADCPRE[1:0]位设置的,可选择 2/4/8/16 分频。需要注意的是,ADC 的输入时钟频率最大值是 14MHz,如果超过这个值将会导致 ADC 的转换结果准确度下降。
一般我们设置 PCLK2 为 72MHz。为了不超过 ADC 的最大输入时钟频率 14MHz,我们设 置 ADC 的预分频器分频系数为 6,就可以得到 ADC 的输入时钟频率为 72MHz/6,即 12MHz。 例程中,我们也是如此设置的。
(2)转换时间
STM32F103 的 ADC 总转换时间的计算公式如下:TCONV = 采样时间 + 12.5 个周期
采样时间可通过 ADC_SMPR1 和 ADC_SMPR2 寄存器中的 SMPx[2:0]位设置,x=0~17。 ADC_SMPR1 控制的是通道 0~9,ADC_SMPR2 控制的是通道 10~17。每个输入通道都支持通 过编程来选择不同的采样时间,采样时间可选的范围如下:
⚫ SMP = 000:1.5 个 ADC 时钟周期
⚫ SMP = 001:7.5 个 ADC 时钟周期
⚫ SMP = 010:13.5 个 ADC 时钟周期
⚫ SMP = 011:28.5 个 ADC 时钟周期
⚫ SMP = 100:41.5 个 ADC 时钟周期
⚫ SMP = 101:55.5 个 ADC 时钟周期
⚫ SMP = 110:71.5 个 ADC 时钟周期
⚫ SMP = 111:239.5 个 ADC 时钟周期
可以看出,采样时间最小是 1.5 个时钟周期,设置为这个值,那么我们可以得到最短的转 换时间。下面以我们例程的 ADC 时钟配置为例,来给大家计算一下 ADC 的最短转换时间,计 算过程如下:TCONV = 1.5 个 ADC 时钟周期 + 12.5 个 ADC 时钟周期 = 14 个 ADC 时钟周期
例程中,PCLK2 的时钟是 72MHz,经过 ADC 时钟预分频器的 6 分频后,ADC 时钟频率 为 12MHz。代入上式可得到:TCONV = 14 个 ADC 时钟周期 = ( 1 12000000) ∗ 14 s = 1.17u
⑥数据寄存器
ADC 转换完成后的数据输出寄存器。根据转换组的不同,规则组的完成转换的数据输出到 ADC_DR 寄存器,注入组的完成转换的数据输出到 ADC_JDRx 寄存器。假如是使用双重模式, 规则组的数据也是存放在 ADC_DR 寄存器。下面给大家简单介绍一下这两个寄存器。
(1)ADC 规则数据寄存器(ADC_DR)
ADC 规则组数据寄存器 ADC_DR 是一个 32 位的寄存器,独立模式时只使用到该寄存器低 16 位保存 ADC1/2/3 的规则转换数据。在双 ADC 模式下,高 16 位用于保存 ADC2 转换的数据, 低 16 位用于保存 ADC1 转换的数据。
因为 ADC 的精度是 12 位的,ADC_DR 寄存器无论高 16 位还是低 16,存放数据的位宽都 是 16 位的,所以允许选择数据对齐方式。由 ADC_CR2 寄存器的 ALIGN 位设置数据对齐方式, 可选择:右对齐或者左对齐。
细心的朋友可能发现,规则组最多有 16 个输入通道,而 ADC 规则数据寄存器只有一个, 如果一个规则组用到好几个通道,数据怎么读取?如果使用多通道转换,那么这些通道的数据 也会存放在 DR 里面,按照规则组的顺序,上一个通道转换的数据,会被下一个通道转换的数 据覆盖掉,所以当通道转换完成后要及时把数据取走。比较常用的方法是使用 DMA 模式。当 规则组的通道转换结束时,就会产生 DMA 请求,这样就可以及时把转换的数据搬运到用户指 定的目的地址存放。注意:只有 ADC1 和 ADC3 可以产生 DAM 请求,而由 ADC2 转换的数据 可以通过双 ADC 模式,利用 ADC1 的 DMA 功能传输。
(2)ADC 注入数据寄存器 x(ADC_JDRx)(x=1~4)
ADC 注入数据寄存器有 4 个,注入组最多有 4 个输入通道,刚好每个通道都有自己对应的 数据寄存器。ADC_JDRx 寄存器是 32 位的,低 16 位有效,高 16 位保留,数据也同样需要选 择对齐方式。也是由 ADC_CR2 寄存器的 ALIGN 位设置数据对齐方式,可选择:右对齐或者左 对齐。
⑦中断
ADC 中断可分为三种:规则组转换结束中断、注入组转换结束中断、设置了模拟看门狗状 态位中断。它们都有独立的中断使能位,分别由 ADC_CR 寄存器的 EOCIE、JEOCIE、AWDIE 位设置,对应的标志位分别是 EOC、JEOC、AWD。
模拟看门狗中断
模拟看门狗中断发生条件:首先通过ADC_LTR和ADC_HTR寄存器设置低阈值和高阈值, 然后开启了模拟看门狗中断后,当被 ADC 转换的模拟电压低于低阈值或者高于高阈值时,就 会产生中断。例如我们设置高阈值是 3.0V,那么模拟电压超过 3.0V 的时候,就会产生模拟看 门狗中断,低阈值的情况类似。
DMA 请求
规则组和注入组的转换结束后,除了可以产生中断外,还可以产生 DMA 请求,我们利用 DMA 及时把转换好的数据传输到指定的内存里,防止数据被覆盖。
注意:只有 ADC1 和 ADC3 可以产生 DAM 请求,DMA 相关的知识请回顾 DMA 实验。
⑧单次转换模式和连续转换模式
单次转换模式和连续转换模式在框图中是没有标号,为了更好地学习后续的内容,这里简 单给大家讲讲。
(1)单次转换模式
通过将 ADC_CR2 寄存器的 CONT 位置 0 选择单次转换模式。该模式下,ADC 只执行一 次转换,由 ADC_CR2 寄存器的 ADON 位启动(只适用于规则组),也可以通过外部触发启动 (适用于规则组或注入组)。
如果规则组的一个输入通道被转换,那么转换的数据被储存在 16 位 ADC_DR 寄存器中、 EOC(转换结束)标志位被置 1、如果设置了 EOCIE 位,则产生中断,然后 ADC 停止。
如果注入组的一个输入通道被转换,那么转换的数据被储存在16位ADC_DRJx寄存器中、 JEOC(转换结束)标志位被置 1、如果设置了 JEOCIE 位,则产生中断,然后 ADC 停止。
(2)连续转换模式
通过将 ADC_CR2 寄存器的 CONT 位置 1 选择连续转换模式。该模式下,ADC 完成上一 个通道的转换后会马上自动地启动下一个通道的转换,由 ADC_CR2 寄存器的 ADON 位启动, 也可以通过外部触发启动。
如果规则组的一个输入通道被转换,那么转换的数据被储存在 16 位 ADC_DR 寄存器中、 EOC(转换结束)标志位被置 1、如果设置了 EOCIE 位,则产生中断。
如果注入组的一个输入通道被转换,那么转换的数据被储存在16位ADC_DRJx寄存器中、 JEOC(转换结束)标志位被置 1、如果设置了 JEOCIE 位,则产生中断。
⑨扫描模式
扫描模式在框图中是没有标号,为了更好地学习后续的内容,这里简单给大家讲讲。
可以通过 ADC_CR1 寄存器的 SCAN 位配置是否使用扫描模式。如果选择扫描模式,ADC 会扫描所有被 ADC_SQRx 寄存器或 ADC_JSQR 选中的所有通道,并对规则组或者注入组的每 个通道执行单次转换,然后停止转换。但如果还设置了 CONT 位,即选择连续转换模式,那么 转换不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换。
如果设置了DMA 位,在每次 EOC 后,DMA控制器把规则组通道的转换数据传输到 SRAM 中。而注入通道转换的数据总是存储在 ADC_JDRx 寄存器中。
不同模式组合的作用