STM32-一文搞懂ADC
2022-03-09 来源:eefocus
1 STM32ADC简介
STM32 拥有 1~3 个 ADC(STM32F101/102 系列只有 1 个 ADC,F103系列至少有两个ADC),这些 ADC 可以独立使用,也可以使用双重模式(提高采样率)。STM32 的12位ADC是一种逐次逼近型模拟数字转换器,它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。ADC的输入时钟不得超过14MHz,它是PCLK2经分频产生。
1.1 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请求产生。
1.2 STM32的ADC模块结构
单个ADC模块的框图如下所示
其中绿色部分为输入部分,蓝色为ADC模块核心部分,红色部分为输出部分。下面分别介绍。
2 ADC模块详解
这里分为输入单元、核心单元、输出单元进行分析。
2.1 ADC核心单元
2.1.1 规则通道和注入通道
STM32有18个多路通道,为了保证这些通道上的转换有序地、有优先级地进行,把 ADC 的转换分为 2 个通道组:规则通道组和注入通道组。任意多个通道上以任意顺序进行的一系列转换构成组转换。例如,可以如下顺序完成转换:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。
规则组由多达16个转换组成。规则通道和它们的转换顺序在ADC_SQRx寄存器中选择。规则组中转换的总数应写入ADC_SQR1寄存器的L[3:0]位中。
注入组由多达4个转换组成。注入通道和它们的转换顺序在ADC_JSQR寄存器中选择。注入组里的转换总数目应写入ADC_JSQR寄存器的L[1:0]位中。
如何理解规则通道组合注入通道组?
所谓过则通道就是一般的转换规则组,所有该组内的通道按顺序进行转换,而注入通道组的转换则是有较高优先级的,可以打断规则通道组的转换。规则通道相当于你正常运行的程序,而注入通道呢,就相当于中断。在你程序正常执行的时候,中断是可以打断你的执行的。同这个类似,注入通道的转换可以打断规则通道的转换, 在注入通道被转换完成之后,规则通道才得以继续转换。
2.1.2 规则/注入通道数据寄存器
通道数据寄存器用来保存AD转换的结果,数据以左对齐或右对齐的方式存储。可以看到有四个注入通道数据寄存器,而所有的规则通道组只有一个数据寄存器!而每个注入通道都有一个单独的数据寄存器。因为规则通道转换的值储存在一个仅有的数据寄存器中,所以当转换多个规则通道时需要使用DMA,这可以避免丢失已经存储在ADC_DR寄存器中的数据。
ADC 注入数据寄存器x (ADC_JDRx) (x= 1..4)
JDATA[15:0]:注入转换的数据 (Injected data)
这些位为只读,包含了注入通道的转换结果,数据是左对齐或右对齐。
ADC规则数据寄存器(ADC_DR)
ADC2DATA[15:0]:ADC2转换的数据 (ADC2 data)
在ADC1中:双模式下,这些位包含了ADC2转换的规则通道数据。见11.9:双ADC模式
在ADC2和ADC3中:不使用这些位。
DATA[15:0]:规则转换的数据 (Regular data)
这些位为只读,包含了注入通道的转换结果,数据是左对齐或右对齐。
2.2 ADC输入单元
输入单元主要包括电源和参考电压、时钟、模拟输入通道、触发通道。
2.2.1 电源和参考电压
工作电源VDDA、VSSA
ADC使用一个独立于VDD的电源供电,过滤和屏蔽来自印刷电路板上的毛刺干扰,ADC的电源引脚为VDDA,以及独立的电源地VSSA。
参考电压VREF+、VREF-
为了确保输入为低压时获得更好精度,用户可以连接一个独立的外部参考电压ADC到VREF+和 VREF-脚上。VREF+的电压范围为2.4V~VDDA(一般直接接VDD)。64脚或以下的封装上没有VREF+和VREF-引脚,他们在芯片内部与ADC的电源(VDDA)和地(VSSA)相联。
ADC所能测量的电压范围就是VREF- ≤ VIN ≤ VREF+。因为一般接VDD(3.3V),故一般使用下,测量范围为0~3.3V。
注(1).VDDA和VSSA应该分别连接到VDD和VSS。
2.2.2 时钟
时钟来源
RCC控制器为ADC时钟提供一个专用的可编程ADC预分频器,如下图(时钟树部分截取)。ADC的时钟是由高速APB2时钟PCLK2经该分频器2、4、6或8分频后获得。注意ADC的输入时钟不得超过14MHz。
时钟配置
ADC预分频器的分频系数可以通过时钟配置寄存器(RCC_CFGR)的位15:14 ADCPRE[1:0]配置
由软件置’1’或清’0’来确定ADC时钟频率
00:PCLK2 2分频后作为ADC时钟
01:PCLK2 4分频后作为ADC时钟
10:PCLK2 6分频后作为ADC时钟
11:PCLK2 8分频后作为ADC时钟
2.2.3 模拟输入通道
STM32的ADC有多达18个通道,可测量16个外部(与GPIO复用)和2个内部(片内温度传感器和)信号源,其中两个内部信号源通道只存在于ADC1中。温度传感器和通道ADC1_IN16相连接,内部参照电压VREFINT和ADC1_IN17相连接。
与GPIO复用映射关系如下,在使用AD功能时,要进行复用使能相关引脚
2.2.4 触发转换
ADC转换可以由软件的方式触发转换,也可以由外部触发的方式进行转换,比如定时器捕获、EXTI线。如果设置了EXTTRIG控制位,则外部事件就能够触发转换。当外部触发信号被选为ADC规则或注入转换时,(仅)它的上升沿可以启动转换。
其中ADC1和ADC2的触发源基本相同,ADC3的触发源见上图右下角。
2.3 ADC输出单元
2.3.1 ADC-中断
规则和注入组转换结束时能产生中断,它们都有独立的中断使能位。ADC1和ADC2的中断映射在同一个中断向量上,而ADC3的中断有自己的中断向量。
2.3.2 ADC-DMA
因为规则通道转换的值储存在一个仅有的数据寄存器中,所以当转换多个规则通道时需要使用DMA,这可以避免丢失已经存储在ADC_DR寄存器中的数据。只有在规则通道的转换结束时才产生DMA请求,并将转换的数据从ADC_DR寄存器传输到用户指定的目的地址。
需要注意的是,只有ADC1和ADC3拥有DMA功能。
3 功能详解
3.1 ADC开关控制
通过设置ADC_CR2寄存器的ADON位可给ADC上电,清除ADON位可以停止转换,并将ADC置于断电模式。
3.2 转换时间
Tcovn=采样时间+12.5 个周期
其中:Tcovn 为总转换时间,采样时间是根据每个通道的 SMP 位的设置来决定的。例如,当 ADCCLK=14Mhz 的时候,并设置 1.5 个周期的采样时间,则得到:Tcovn=1.5+12.5=14 个周期=1us。
3.3 单次转换模式
所谓单次转换是指对所选通道组只转换一次。单次转换模式下,ADC只对所选的通道组内的一个通道执行一次转换,即不管所选通道组内有多少个通道,只对一个通道转换一次。单次也是我们学习或者做简单的应用时常用的模式。该模式既可通过设置ADC_CR2寄存器的ADON位(只适用于规则通道)启动也可通过外部触发启动(适用于规则通道或注入通道)。
如果一个规则通道被转换完成:
转换数据被储存在16位ADC_DR寄存器中
EOC(转换结束)标志被设置
如果设置了EOCIE(转换结束中断允许位),则产生中断。
如果一个注入通道被转换完成:
转换数据被储存在16位的ADC_DRJ1寄存器中
JEOC(注入转换结束)标志被设置
如果设置了JEOCIE(注入转换中断允许位),则产生中断。
然后ADC停止,直到下次启动ADC转换命令。
3.4 连续转换模式
在连续转换模式中,当前面ADC通道转换一结束马上就启动下一次转换,同样之转换通道组里的第一个通道。此模式可通过外部触发启动或通过设置ADC_CR2寄存器上的ADON位启动。
如果一个规则通道被转换完成:
转换数据被储存在16位的ADC_DR寄存器中
EOC(转换结束)标志被设置
如果设置了EOCIE,则产生中断。
如果一个注入通道被转换完成:
转换数据被储存在16位的ADC_DRJ1寄存器中
JEOC(注入转换结束)标志被设置
如果设置了JEOCIE位,则产生中断。
3.5 扫描模式
此模式用来扫描一组模拟通道,与单词转化和连续转换模式不一样的是,扫描模式是以此转换所选通道组里的所有的通道。扫描模式可通过设置ADC_CR1寄存器的SCAN位来选择。一旦这个位被设置,ADC扫描所有被ADC_SQRX寄存器(对规则通道)或ADC_JSQR(对注入通道)选中的所有通道。在每个组的每个通道上执行单次转换。在每个转换结束时,同一组的下一个通道被自动转换。
如果设置了连续转换模式,转换不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换。
扫描模式一般要通过DMA读!在每次EOC后,DMA控制器把规则组通道的转换数据传输到SRAM中。而注入通道转换的数据总是存储在ADC_JDRx寄存器中。
这些模式之间什么区别呢?
首先搞明白什么是通道、通道组、ADC模块,他们之间的包含关系。
每个ADC模块有18个通道,要使用到的通道任意组合构成通道组。
单次转换、连续转换是针对“通道组”而言的,通道组是最小单元,与组内通道无关。通道组内的通道转换规则由扫描模式、间断模式设置。ADC模块之间的转换规则由双ADC模式设置。
关于单次转换模式、连续转换模式、扫描模式的区别的形象介绍,可以戳这里参考一下。
3.6 间断模式
所谓间断模式是指提前设定好每次触发转换所选通道组里的多少个通道。间断模式只能作用于一组转换,应该避免同时为规则组和注入组设置间断模式。
此模式通过设置ADC_CR1寄存器上的DISCEN位激活。它可以用来执行一个短序列的n次转换(n<=8),此转换是ADC_SQRx寄存器所选择的转换序列的一部分。数值n由ADC_CR1寄存器的DISCNUM[2:0]位给出。一个外部触发信号可以启动ADC_SQRx寄存器中描述的下一轮n次转换,直到此序列所有的转换完成为止。总的序列长度由ADC_SQR1寄存器的L[3:0]定义。
举例:
n=3,被转换的通道 = 0、1、2、3、6、7、9、10
第一次触发:转换的序列为 0、1、2
第二次触发:转换的序列为 3、6、7
第三次触发:转换的序列为 9、10,并产生EOC事件
第四次触发:转换的序列 0、1、2
注意,最后一次触发转换时,如果剩下的通道数不够n,剩多少转换多少。注意上述例子的第三次触发,只转换了剩下的两个通道。
3.7 双ADC模式
所谓双ADC模式,是指两个ADC都工作,可以提高工作效率,具体的工作方式由双ADC模式具体设置。在有2个或以上ADC模块的产品中,可以使用双ADC模式。双ADC模式下的触发源均来自ADC1的通道组。
共有6种可能的模式:
独立模式
同步注入模式
同步规则模式
快速交叉模式
慢速交叉模式
交替触发模式
还有可以用下列方式组合使用上面的模式:
同步注入模式 + 同步规则模式
同步规则模式 + 交替触发模式
同步注入模式 + 交叉模式
如果不使用双ADC模式就设置为独立模式,每个ADC接口独立工作,这也是常用的基本模式。
在双ADC模式里,当转换配置成由外部事件触发时,用户必须将其设置成仅触发主ADC,从ADC设置成软件触发,这样可以防止意外的触发从转换。但是,主和从ADC的外部触发必须同时被激活。
在双ADC模式里,为了在主数据寄存器上读取从转换数据,必须使能DMA位,即使不使用DMA传输规则通道数据。
3.7.1 同步模式
所谓同步模式是指,对于一个通道组内的所有通道的转换工作由ADC1和ADC2同时工作来完成,以一个通道组内的16个通道的同步模式转换为例,如下图所示。同步模式的组可以是规则组也可以是注入组,因此又分别称为同步规则模式、同步注入模式。
在同步模式中,必须转换具有相同时间长度的序列,或保证触发的间隔比2个序列中较长的序列长,否则当较长序列的转换还未完成时,具有较短序列的ADC转换可能会被重启。不要在2个ADC上转换相同的通道(两个ADC在同一个通道上的采样时间不能重叠)。
3.7.2 交叉模式
所谓交叉模式是指ADC1和ADC1对规则通道组内的一个通道的转换工作交叉进行,该模式只适用于规则通道组中的一个通道,且在交叉模式下不能有注入通道的外部触发产生。根据交叉进行的快慢又分为快速交叉模式和慢速交叉模式。快速交叉模式下,读一个同道进行转换的第二个ADC与第一个ADC的时间间隔是7个ADC时钟周期,慢速交叉模式的时间间隔是14个时钟周期。
对于快速交叉模式:
外部触发产生后:
ADC2立即启动并且
ADC1在延迟7个/14个ADC时钟周期后启动
如果同时设置了ADC1和ADC2的CONT位(连续转换),所选的两个ADC规则通道将被连续地转换。
对于慢速交叉模式:
触发产生后:
ADC2立即启动并且
ADC1在延迟14个ADC时钟周期后启动
在延迟第二次14个ADC周期后ADC2再次启动,如此循环。
ADC1产生一个EOC中断后(由EOCIE使能),产生一个32位的DMA传输请求(如果设置了DMA位),ADC1_DR寄存器的32位数据被传输到SRAM,ADC1_DR的上半个字包含ADC2的转换数据,低半个字包含ADC1的转换数据。在28个ADC时钟周期后自动启动新的ADC2转换。在这个模式下不能设置CONT位,因为它将连续转换所选择的规则通道。
在通道0上的快速/慢速交叉模式分别如下图所示
对于慢速交叉模式下,采样时间小于14个ADC时钟周期;快速模式下,采样时间小于7个ADC时钟周期。
3.7.3 交替触发模式
所谓交替触发模式是指触发信号交替触发ADC1和ADC2上的注入通道组的转换,该模式只使用与注入通道组。
当第一个触发产生时,ADC1上的所有注入组通道被转换。
当第二个触发到达时,ADC2上的所有注入组通道被转换。
如此循环……
如果允许产生JEOC中断,在所有ADC1/ADC2注入组通道转换后产生一个JEOC中断。
交叉模式和交替触发模式什么区别?
交叉模式是一个触发信号后,ADC1和ADC2对规则通道组里的一个通道交替转换。ADC1采样完了开始转化,这是ADC2利用ADC1转换的空闲开始采样,然后进行转换,这样可以大大提高对这个通道的采样率。
交替触发模式是ADC1注入通道组和ADC2注入通道组对触发信号交替响应。
多种模式的配置可以参见这篇文章
3.8 校准
ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。在校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差。通过设置ADC_CR2寄存器的CAL位启动校准。一旦校准结束,CAL位被硬件复位,可以开始正常转换。建议在上电时执行一次ADC校准。校准阶段结束后,校准码储存在ADC_DR中。
4 基本功能相关寄存器
ADC的寄存器很多,这里只列举和规则通道的单次转换相关的寄存器。
4.1 ADC控制寄存器 1(ADC_CR1)
位[19:16]: DUALMOD[3:0]:双模式选择 (Dual mode selection)
软件使用这些位选择操作模式。最基本的使用就是独立模式。
0000:独立模式
0001:混合的同步规则+注入同步模式
0010:混合的同步规则+交替触发模式
0011:混合同步注入+快速交叉模式
0100:混合同步注入+慢速交叉模式
0101:注入同步模式
0110:规则同步模式
0111:快速交叉模式
1000:慢速交叉模式
1001:交替触发模式
位[8]: SCAN:扫描模式 (Scan mode)
0:关闭扫描模式;
1:使用扫描模式。
该位由软件设置和清除,用于开启或关闭扫描模式。在扫描模式中,转换由ADC_SQRx或ADC_JSQRx寄存器选中的通道。
如果分别设置了EOCIE或JEOCIE位,只在最后一个通道转换完毕后才会产生EOC或JEOC中断。
位[7]: JEOCIE:允许产生注入通道转换结束中断 (Interrupt enable for injected channels)
该位由软件设置和清除,用于禁止或允许所有注入通道转换结束后产生中断。
0:禁止JEOC中断;
1:允许JEOC中断。当硬件设置JEOC位时产生中断。
位[5]: EOCIE:允许产生EOC中断 (Interrupt enable for EOC)
该位由软件设置和清除,用于禁止或允许转换结束后产生中断。
0:禁止EOC中断;
1:允许EOC中断。当硬件设置EOC位时产生中断。
4.2 ADC控制寄存器 2(ADC_CR2)
位[0]: ADON:开/关A/D转换器 (A/D converter ON / OFF)
该位用于开关AD转换器,当该位为’0’时,写入’1’将把ADC从断电模式下唤醒。当该位为’1’时,写入’1’将启动转换。
0:关闭ADC转换/校准,并进入断电模式;
1:开启ADC并启动转换。
为防止触发错误,如果该位和其他位一起改变,将不会触发转换。
位[1]: CONT:连续转换 (Continuous conversion)
如果设置了该位,则转换将连续进行直到该位被清除。
0:单次转换模式;
1:连续转换模式。
位[2]: CAL:A/D校准 (A/D Calibration)
该位由软件设置以开始校准,并在校准结束时由硬件清除。
0:校准完成;
1:开始校准。
位[3]: RSTCAL:复位校准 (Reset calibration)
该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。
0:校准寄存器已初始化;
1:初始化校准寄存器。
位[11]: ALIGN:数据对齐 (Data alignment)
该位由软件设置和清除。参考图29和图30。
0:右对齐;
1:左对齐。
位[19:17]: EXTSEL[2:0]:选择启动规则通道组转换的外部事件 (External event select for regular group)
这些位选择用于启动规则通道组转换的外部事件
一般最简单的使用为软件触发。
位[22]: SWSTART: 开始转换规则通道 (Start conversion of regular channels)
由软件设置该位以启动转换,转换开始后硬件马上清除此位。如果在EXTSEL[2:0]位中选择了
SWSTART为触发事件,该位用于启动一组规则通道的转换,
0:复位状态;
1:开始转换规则通道。
4.3 ADC采样时间寄存器 1~3(ADC_SMPR1~3)
位[23:0]: SMPx[2:0]:选择通道x的采样时间 (Channel x Sample time selection)
这些位用于独立地选择每个通道的采样时间。在采样周期中通道选择位必须保持不变。
000:1.5周期 100:41.5周期
001:7.5周期 101:55.5周期
010:13.5周期 110:71.5周期
011:28.5周期 111:239.5周期
关于转换时间的计算在前文已经提到了
ADC转换时间Tcovn=采样时间+12.5 个周期
4.4 ADC规则序列寄存器 1~3(ADC_SQR1~3)
这三个寄存器都大同小异,这里以1为例。
位[23:20]: L[3:0]:规则通道序列长度 (Regular channel sequence length)
这些位由软件定义在规则通道转换序列中的通道数目。
0000:1个转换
0001:2个转换
……
1111:16个转换
SQ13~16 则存储了规则序列中第 13~16 个通道的编号(0~17)
4.5 ADC状态寄存器(ADC_SR)
位[1]: EOC:转换结束位 (End of conversion)
该位由硬件在(规则或注入)通道组转换结束时设置,由软件清除或由读取ADC_DR时清除
0:转换未完成;
1:转换完成。
此外还有
STRT:规则通道开始位 (Regular channel Start flag)
JSTRT:注入通道开始位 (Injected channel Start flag)
JEOC:注入通道转换结束位 (Injected channel end of conversion)
AWD:模拟看门狗标志位 (Analog watchdog flag)
参考资料:
《STM32中文/英参考手册》
《正点原子开发指南》