2024年3月23日发(作者:)

STM32单片机的ADC配置详解

一、ADC定义

将模拟量转换为数字量的过程称为模式(A/D)转换,完成这一转换的工具就是模数转

换器(简称ADC),用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。例

如:把芯片的引脚上的电压读出来,把芯片集成的上的温度传感器的温度读出来!

二、ADC要点

1-独立模式-单通道-中断读取

①、初始化ADC用到的GPIO;

②、设置ADC的工作参数并初始化;

③、配置ADC时钟;

④、设置ADC转换通道顺序及采样时间;

⑤、配置使能ADC转换完成中断,在中断内读取转换完的数据;

⑥、使能ADC;

⑦使能软件触发ADC转换。

三、ADC内容

1)ADC数量: STM32有3个ADC,每个ADC最多有16个外部通道,ADC1和ADC2都有

16个外部通道,而ADC3随CPU引脚的不同通道数也不同,一般都有8个外部通道。

2)ADC精度: ADC为12位,即模拟电压经过ADC转换后是一个12位的数字量;一般情

况下ADC的输入电压范围是:0~3.3V,因此最小精度为:3.3/2^12,当数字量为X时,则有

模拟量 Y = (3.3 / 2^12)*X。

3)电压输入范围: ADC 输入范围为:VREF- ≤ VIN ≤ VREF+。由 VREF- 、VREF+ 、VDDA 、

VSSA 、这四个外部引脚决定。一般把VSSA 和VREF- 接地,把VREF+ 和VDDA 接3V3,得

到ADC的输入电压范围为:0~3.3V。

4)输入通道: ADC的信号输入就是通过通道来实现的,信号通过通道输入到单片机中,单

片机经过转换后,将模拟信号输出为数字信号;STM32F103的ADC多达18个通道,在

F103ZET6中ADC1的通道16连接到了芯片内部的温度传感器,Vrefint (内部参照电压)连

接到了通道 17,ADC2 的模拟通道 16 和 17 连接到了内部的 VSS(地)。

外部的 16 个通道在转换的时候又分为规则通道和注入通道,其中规则通道最多有 16路,

注入通道最多有 4 路。

*规则通道:*规则通道就是很规矩的意思,我们平时一般使用的就是这个通道。

注入通道:注入,可以理解为插入,插队的意思,是一种不安分的通道。它是一种在规则通

道转换的时候强行插入要转换的一种。这点跟中断程序很像,都是不安分的主。所以,注入

通道只有在规则通道存在时才会出现。即注入通道的优先级比规则通道高。

5)转换顺序:规则序列寄存器有 3 个,分别为 SQR3、SQR2、SQR1。SQR3 控制着规则序

列中的第一个到第六个转换,对应的位为:SQ1[4:0]~SQ6[4:0],第一次转换的是位 4:0 SQ1[4:0],

如果通道 16 想第一次转换,那么在 SQ1[4:0]写 16 即可。注入序列注入序列寄存器 JSQR

只有一个,最多支持 4个通道,具体多少个由 JSQR的 JL[2:0]决定。如果 JL的 值小于 4

的话,则 JSQR跟 SQR决定转换顺序的设置不一样,第一次转换的不是 JSQR1[4:0],而是

JCQRx[4:0] ,x = (4-JL),跟 SQR 刚好相反。(关于转换顺序只记录个大概,详细请看芯片

手册)

6)触发源: ADC转换有两种方式,①是ADCADC 控制寄存器 2: ADC_CR2 的 ADON 这个

位来控制,写 1 的时候开始转换,写 0 的时候停止转换,这个是最简单也是最好理解的开

启 ADC 转换的控制方式。②是触发转换,这个触发包括内部定时器触发和外部IO触发。而

触发源有很多,具体选择哪一种触发源,由ADC 控制寄存器 2:ADC_CR2 的EXTSEL[2:0]和

JEXTSEL[2:0]位来控制。EXTSEL[2:0]用于选择规则通道的触发源,JEXTSEL[2:0]用于选择注入通

道的触发源。选定好触发源之后,触发源是否要激活,则由ADC控制寄存器 2:ADC_CR2的

EXTTRIG和 JEXTTRIG 这两位来激活。其中 ADC3的规则转换和注入转换的触发源与ADC1/2

的有所不同,在框图上已经表示出来。

7)转换时间: ADC 需要若干个 ADC_CLK 周期完成对输入的模拟量进行采样,最短的转换

时间: Tconv = 采样时间 + 12.5 个周期;PCLK2 = 72M, ADC_CLK = 72/6 = 12M

Tconv = 1.5+12.4 = 14周期 = 14/12us=1.17us即算出最短的转换时间为 1.17us。

8)数据寄存器:**一切准备就绪后,ADC 转换后的数据根据转换组的不同,规则组的数据

放在 ADC_DR寄存器,注入组的数据放在 JDRx。

9)规则数据寄存器:ADC 规则组数据寄存器 ADC_DR 只有一个,是一个 32 位的寄存器,

低 16 位在单 ADC时使用,高 16 位是在 ADC1 中双模式下保存 ADC2 转换的规则数据,

双模式就是 ADC1 和ADC2 同时使用。在单模式下,ADC1/2/3 都不使用高 16 位。因为 ADC

的精度是 12 位,无论 ADC_DR 的高 16 或者低 16 位都放不满,只能左对齐或者右对齐,

具体是以哪一种方式存放,由ADC_CR2 的 11 位 ALIGN 设置。规则通道可以有 16 个这么

多,可规则数据寄存器只有一个,如果使用多通道转换,那转换的数据就全部都挤在了 DR

里面,前一个时间点转换的通道数据,就会被下一个时间点的另外一个通道转换的数据覆盖

掉,所以当通道转换完成后就应该把数据取走,或者开启 DMA 模式,把数据传输到内存里

面,不然就会造成数据的覆盖。最常用的做法就是开启 DMA 传输。

10)注入数据寄存器:ADC 注入组最多有 4 个通道,刚好注入数据寄存器也有 4 个,每个

通道对应着自己的寄存器,不会跟规则寄存器那样产生数据覆盖的问题。ADC_JDRx 是 32

位的,低 16 位有效,高 16 位保留,数据同样分为左对齐和右对齐,具体是以哪一种方式

存放,由ADC_CR2 的 11 位 ALIGN 设置。

11)中断:中断数据转换结束后,可以产生中断,中断分为三种:规则通道转换结束中断,

注入转换通道转换结束中断,模拟看门狗中断。

其中转换结束中断很好理解,跟我们平时接触的中断一样,有相应的中断标志位和中断使能

位,还可以根据中断类型写相应配套的中断服务程序。

模拟看门狗中断

当被 ADC转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断,前提是我们开启

了模拟看门狗中断,其中低阈值和高阈值由 ADC_LTR 和 ADC_HTR 设置。例如我们设置高

阈值是 2.5V,那么模拟电压超过 2.5V的时候,就会产生模拟看门狗中断,反之低阈值也一

样。

DMA 请求

规则和注入通道转换结束后,除了产生中断外,还可以产生 DMA 请求,把转换好的数据直

接存储在内存里面。要注意的是只有 ADC1 和 ADC3 可以产生 DMA 请求。有关DMA请求

需要配合《STM32F10X-中文参考手册》DMA控制器这一章节来学习。一般我们在使用 ADC

的时候都会开启 DMA 传输。

12)ADC初始化结构体详解: ADC_InitTypeDef 结构体

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;

ADC_Mode: 配置 ADC的模式,当使用一个 ADC时是独立模式,使用两个 ADC时是双模

式,在双模式下还有很多细分模式可选,具体配置 ADC_CR1:DUALMOD位。

ScanConvMode: 可选参数为 ENABLE 和 DISABLE,配置是否使用扫描。如果是单通道 AD

转换使用 DISABLE ,如果是多通道 AD 转换使用 ENABLE,具体配置ADC_CR1:SCAN 位。

ADC_ContinuousConvMode: 可选参数为 ENABLE和 DISABLE,配置是启动自动连续转换还

是单次转换。使用 ENABLE 配置为使能自动连续转换;使用 DISABLE 配置为单次转换,转

换一次后停止需要手动控制才重新启动转换,具体配置 ADC_CR2:CON 位。

ADC_ExternalTrigConv: 外部触发选择,图中列举了很多外部触发条件,可根据项目需求配

置触发来源。实际上,我们一般使用软件自动触发。

ADC_DataAlign: 转换结果数据对齐模式,可选右对ADC_DataAlign_Right或者左对齐

ADC_DataAlign_Left。一般我们选择右对齐模式。

ADC_NbrOfChannel: AD 转换通道数目,根据实际设置即可。具体的通道数和通道的转换顺

序是配置规则序列或注入序列寄存器。