STM32F1与STM32CubeIDE快速入门ADC概述
STM32F1与STM32CubeIDE快速入门-ADC概述
ADC概述
在文中,我们将讨论 STM32 ADC(模数转换器)模块。 首先介绍作为数字电路的 ADC,然后将注意力转移到 STM32 ADC 硬件及其特性。 我们将深入介绍 STM32 微控制器中 ADC 的功能描述、它的工作原理以及如何对其进行配置并充分利用它。

1、什么是模数转换器 (ADC)
ADC(模拟到数字)转换器是一种电子电路,它将模拟电压作为输入并将其转换为数字数据,该数据以二进制代码表示电压电平。 每当您触发模拟输入以开始转换时,ADC 都会对模拟输入进行采样。 它执行一个称为量化的过程,以确定电压电平及其被推入输出寄存器的二进制代码。
ADC 执行与 DAC 相同的计数器操作,而 ADC (A/D) 将模拟电压转换为数字数据,而 DAC (D/A) 将数字数字转换为输出引脚上的模拟电压。

ADC 是最昂贵的电子元件之一,尤其是当它具有高采样率和高分辨率时。 因此,它是微控制器中的宝贵资源,不同的制造商为我们(固件工程师)提供了各种功能,以便充分利用它。 并且还可以灵活地做出很多决定,例如牺牲分辨率以换取更高的分辨率,或者让 ADC 触发内部定时器信号以定期对模拟通道进行采样,以及我们将在本文中看到的更多内容。
2、STM32中的ADC
STM32中的12 位 ADC 是逐次逼近型模数转换器。 它有多达18个多路复用通道,允许它测量来自16个外部和两个内部源的信号。 各个通道的A/D转换可以在单一、连续、扫描或不连续模式下进行。ADC 的结果存储在左对齐或右对齐的 16 位数据寄存器中。
模拟看门狗功能允许应用检测输入电压是否超出用户定义的高阈值或低阈值。 ADC 输入时钟由 PCLK2 时钟经预分频器分频生成,且不得超过 14 MHz。
1)ADC的主要特性
- 12 位分辨率
- 转换结束、注入转换结束和模拟看门狗事件时产生中断
- 单次和连续转换模式
- 通道 0 到通道‘n’自动转换的扫描模式
- 自校准
- 数据对齐与内置数据一致性
- 逐通道可编程采样时间
- 常规和注入转换的外部触发选项
- 不连续模式
- 双模(在具有 2 个或更多 ADC 的设备上)
- ADC 转换时间:56 MHz 时为 1 µs(72 MHz 时为 1.17 µs)
- ADC 电源要求:2.4 V 至 3.6 V
- ADC 输入范围:VREF– ≤ VIN ≤ VREF+
- 常规通道转换期间的 DMA 请求生成
ADC的功能框图如下:

2)ADC时钟
时钟控制器提供的 ADCCLK 时钟与 PCLK2(APB2 时钟)同步。 RCC 控制器有一个专用的 ADC 时钟可编程预分频器,它不得超过 14 MHz。
3)通道选择
有 16 个多路复用通道。 可以将转换分为两组:**常规(Regular)和注入(Injected)**。 一个组由一系列转换组成,这些转换可以在任何通道上以任何顺序完成。 例如,可以按以下顺序进行转换:Ch3、Ch8、Ch2、Ch2、Ch0、Ch2、Ch2、Ch15。
**常规组(Regular Group)**最多由 16 个转换组成。 转换序列中的常规通道及其顺序必须在 ADC_SQRx 寄存器中选择。 常规组中的总转换次数必须写入 ADC_SQR1 寄存器的 L[3:0] 位。
**注入组(Injected Group)**由最多 4 个转换组成。 必须在 ADC_JSQR 寄存器中选择注入通道及其在转换序列中的顺序。 注入组中的总转换次数必须写入 ADC_JSQR 寄存器的 L[1:0] 位。
4)ADC 转换时间和时序图
ADC 在开始准确转换之前需要
t
S
T
A
B
t_{STAB}
tSTAB的稳定时间。 ADC 转换开始后 14 个时钟周期后,EOC 标志置位,16 位 ADC 数据寄存器包含转换结果。

5)ADC 模拟看门狗 (AWD)
如果 ADC 转换的模拟电压低于低阈值或高于高阈值,则 AWD 模拟看门狗状态位被设置。 这些阈值在 ADC_HTR 和 ADC_LTR 16 位寄存器的 12 个最低有效位中编程。 可以通过使用 ADC_CR1 寄存器中的 AWDIE 位来启用中断。 阈值与所选的对齐方式无关。 并且可以在一个或多个通道上启用模拟看门狗。

6)ADC 结果数据对齐
ADC_CR2 寄存器中的 ALIGN 位选择转换后存储的数据的对齐方式。 数据可以左对齐或右对齐,如下图所示。
注入的组通道转换数据值减去写入 ADC_JOFRx 寄存器的用户定义偏移量,因此结果可能为负值。 SEXT 位是扩展符号值。 对于常规组通道,没有减去偏移量,因此只有 12 位是有效的。

7)ADC 操作模式
单次转换模式
在单次转换模式下,ADC 进行一次转换。 该模式通过设置 ADC_CR2 寄存器中的 ADON 位(仅适用于常规通道)或通过外部触发器(适用于常规或注入通道)启动,而 CONT 位为 0。一旦选定通道的转换为 完全的:
如果转换了常规频道:
- – 转换后的数据存储在 16 位 ADC_DR 寄存器中
- – 设置了 EOC(转换结束)标志
- – 如果设置了 EOCIE,则会产生中断。
如果注入的通道被转换:
- – 转换后的数据存储在 16 位 ADC_DRJ1 寄存器中
- – 设置了 JEOC(注入的转换结束)标志
- – 如果设置了 JEOCIE 位,则会产生中断。然后停止 ADC。
连续转换模式
在连续转换模式下,ADC 在完成一次转换后立即开始另一次转换。 此模式由外部触发或通过设置 ADC_CR2 寄存器中的 ADON 位启动,而 CONT 位为 1。 每次转换后:
+ 如果转换了常规通道:
- – 转换后的数据存储在 16 位 ADC\_DR 寄存器中
- – 设置了 EOC(转换结束)标志
- – 如果设置了 EOCIE,则会产生中断。
+ 如果注入的通道被转换:
- – 转换后的数据存储在 16 位 ADC\_DRJ1 寄存器中
- – 设置了 JEOC(注入的转换结束)标志
- – 如果设置了 JEOCIE 位,则会产生中断。**扫描模式**
该模式用于扫描一组模拟通道。 对组中的每个通道执行一次转换。 每次转换结束后,组的下一个通道将自动转换。 如果设置了 CONT 位,转换不会在最后选择的组通道处停止,而是从第一个选择的组通道再次继续。
当使用扫描模式时,必须设置 DMA 位,并且在每次更新 ADC_DR 寄存器后,使用直接内存访问控制器将常规组通道的转换数据传输到 SRAM。 注入的通道转换数据始终存储在 ADC_JDRx 寄存器中。
不连续模式
该模式通过设置 ADC_CR1 寄存器中的 DISCEN 位来启用。 它可用于转换由 n 次转换 (n <=8) 组成的短序列,这是在 ADC_SQRx 寄存器中选择的转换序列的一部分。 n 的值通过写入 ADC_CR1 寄存器中的 DISCNUM[2:0] 位来指定。
当外部触发发生时,它开始在 ADC_SQRx 寄存器中选择的下 n 个转换,直到完成序列中的所有转换。 总序列长度由 ADC_SQR1 寄存器中的 L[3:0] 位定义。
8)外部触发器上的 ADC 转换
转换可由外部事件触发(例如定时器捕获、EXTI 线)。 如果设置了 EXTTRIG 控制位,则外部事件能够触发转换。 EXTSEL[2:0] 和 JEXTSEL[2:0] 控制位允许应用程序选择决定 8 个可能事件中的哪一个可以触发常规组和注入组的转换。
当外部触发器选择常规或注入通道转换时,只有信号的上升沿才能启动转换。下表列出了 ADC1 和 2 外部触发输入在常规组通道上启动转换的可能选项。

9)ADC 校准
ADC 具有内置的自校准模式。 由于内部电容器组变化,校准可显着降低精度误差。 在校准期间,会为每个电容器计算一个纠错码(数字字),并且在所有后续转换期间,使用此代码消除每个电容器的误差贡献。
通过设置 ADC_CR2 寄存器中的 CAL 位开始校准。 校准结束后,CAL 位由硬件复位,即可进行正常转换。 建议在上电时校准一次 ADC。 校准阶段一结束,校准代码就会存储在 ADC_DR 中。 建议在每次上电后执行校准。

STM32 HAL 确实在 ADC API 中提供了一个功能,专门用于启动校准过程。
10)ADC 采样时间
ADC 在多个 ADC_CLK 周期内对输入电压进行采样,这些周期可以使用 ADC_SMPR1 和 ADC_SMPR2 寄存器中的 SMP[2:0] 位进行修改。 每个通道可以用不同的采样时间进行采样。
总 ADC 转换时间计算如下:
Tconv = Sampling time + 12.5 cycles
比如,ADCCLK = 14 MHz,采样时间为 1.5 个周期:Tconv = 1.5 + 12.5 = 14 个周期 = 1 µs时,ADC 采样率(频率)使用以下公式计算:
SamplingRate = 1 / Tconv
因此,计算的结果为: Tconv = 1µs,采样率 = 1000000 = 1Ms/sec
11)ADC 分辨率、参考、公式
ADC 分辨率
STM32 ADC 的分辨率为 12 位,这导致总转换时间为 SamplingTime+12.5 个时钟周期。 但是,可以通过牺牲高分辨率来实现更高的采样率。 因此,分辨率可以下降到 10-Bit、8-Bit 或 6-Bit,从而大大缩短转换时间并提高采样率。 这可以由程序员在软件中配置和实现,STM32 HAL 确实提供 API 来设置所有 ADC 参数,包括其分辨率。
ADC 参考电压
ADC 参考电压引脚在数据表中定义,并假设连接到特定范围内的电压电平。 这显示在下表中。 您可以选择将参考电压设置为其最大允许电平,以实现更宽的转换范围但降低电压测量分辨率。 或者,您可以将参考电压设置为最小允许值,以获得更好的电压读数分辨率。

如果您使用的是开发板,则可能需要查看其原理图,因为它可能根本没有连接 ADC Vref 或将其连接到 2.5v,例如,ADC 将饱和并在之前给您 4096 输入模拟电压达到 3.3v,你想知道为什么! 可能是因为参考电压设置为小于3.3v的值,所以需要考虑。
ADC 公式
ADC 转换时间
Tconv = Sampling time + 12.5 cycles
ADC 采样率
SamplingRate = 1 / Tconv
ADC 结果电压(模拟输入值)
Vin = ADC_Res x (Reference Voltage / 4096),其中,Reference Voltage = (VREF+) – (VREF-)
12)ADC & DMA
由于转换后的常规通道值存储在唯一的数据寄存器中,因此需要使用 DMA 进行多个常规通道的转换。 这避免了已经存储在 ADC_DR 寄存器中的数据丢失。
只有常规通道的转换结束才会生成 DMA 请求,这允许将其转换后的数据从 ADC_DR 寄存器传输到用户选择的目标位置。
13)ADC 中断
常规组和注入组的转换结束时以及模拟看门狗状态位被设置时,可以产生中断。 单独的中断使能位提供了灵活性。

14)读取STM32 ADC的不同方法
轮询方法
这是在模拟输入通道上使用 ADC 执行模数转换的最简单的代码方法。 然而,这并不是所有情况下的有效方式,因为它被认为是使用 ADC 的一种阻塞方式。 通过这种方式,我们开始 A/D 转换并等待 ADC 完成转换,以便 CPU 可以继续处理主代码。
中断方法
中断方法是一种以非阻塞方式进行 ADC 转换的有效方法,因此 CPU 可以继续执行主代码例程,直到 ADC 完成转换并触发中断信号,以便 CPU 可以切换到 ISR 上下文并保存 用于进一步处理的转换结果。
然而,当您以循环模式处理多个通道时,您将收到来自 ADC 的周期性中断,这些中断对于 CPU 来说是无法处理的。 这会给系统带来抖动注入和中断延迟以及各种时序问题。 这可以通过使用 DMA 来避免。
DMA 方法
最后,DMA 方法是以非常高的速率转换多个 ADC 通道的最有效方法,并且仍然将结果传输到内存而无需 CPU 干预,这是一种非常酷且省时的技术。
15)STM32 ADC 转换错误
本节列出了影响 A/D 转换精度的主要错误类型。 这些类型的错误发生在所有 A/D 转换器中,转换质量取决于消除它们每个错误的来源。
ADC 本身引起的 ADC 误差
a.ADC 失调误差
偏移误差是第一个实际转换和第一个理想转换之间的偏差。 第一次转换发生在数字 ADC 输出从 0 变为 1 时。理想情况下,当模拟输入范围在 0.5 LSB 和 1.5 LSB 之间时,数字输出应为 1。不过,理想情况下,第一次转换发生在 0.5 LSB。 偏移误差由 EO 表示。 偏移误差可以通过应用程序固件轻松校准。

b.ADC 增益误差
增益误差是最后一次实际转换与最后一次理想转换之间的偏差。 用
E
G
E_G
EG表示。 最后一个实际转换是从 0xFFE 到 0xFFF 的转换。 理想情况下,当模拟输入等于
V
R
E
F
V_{REF}
VREF+ – 0.5 LSB 时,应该有一个从 0xFFE 到 0xFFF 的转换。 因此,对于
V
R
E
F
V_{REF}
VREF+= 3.3 V,最后一个理想转换应发生在 3.299597 V。如果 ADC 提供
V
A
I
N
V_{AIN}
VAIN <
V
R
E
F
V_{REF}
VREF+ – 0.5 LSB 的 0xFFF 读数,则获得负增益误差。 增益误差由以下公式获得:
EG = Last actual transition – ideal transition

c. 积分线性误差
积分线性误差是任何实际转换与端点相关线之间的最大偏差。 ILE 用
E
L
E_L
EL 表示。 端点相关线可以定义为 A/D 转换曲线上连接第一个实际转换和最后一个实际转换的线。
E
L
E_L
EL 是每次转换与这条线的偏差。 因此,端点相关线对应于实际传递曲线,与理想传递曲线无关。 ILE 也称为积分非线性误差 (INL)。 ILE 是 DLE 在整个范围内的积分。

环境引起的 ADC 误差
a.ADC 参考电压噪声
由于 ADC 输出是模拟信号电压与参考电压之间的比率,因此模拟参考上的任何噪声都会导致转换后的数字值发生变化。 VDDA 模拟电源在某些封装上用作参考电压(
V
R
E
F
+
_{VREF}+
VREF+),因此
V
D
D
A
V_{DDA}
VDDA 电源的质量对 ADC 误差有影响。
b.模拟输入信号噪声
小但高频的信号变化会导致采样期间的大转换误差。 这种噪音是由电机、发动机点火装置、电源线等电气设备产生的。 它通过添加不需要的信号来影响源信号(例如传感器)。 因此,ADC 转换结果不准确。
ADC 动态范围匹配不良
要获得最大的 ADC 转换精度,ADC 动态范围与待转换信号的最大幅度匹配非常重要。 让我们假设要转换的信号在 0 V 和 2.5 V 之间变化,并且 VREF+ 等于 3.3 V。ADC 转换的最大信号值为 3102 (2.5 V),如下图所示。 在这种情况下,有 993 个未使用的转换 (4095 – 3102 = 993)。 这意味着转换信号精度的损失。

模拟信号源阻抗(电阻)
由于电流流入引脚,模拟信号源的阻抗或信号源和引脚之间的串联电阻 (
R
A
I
N
R_{AIN}
RAIN) 会导致其两端出现电压降。 内部采样电容器 (
C
A
D
C
C_{ADC}
CADC) 的充电由带有电阻
R
A
D
C
R_{ADC}
RADC 的开关控制。 随着源电阻的增加(使用
R
A
D
C
R_{ADC}
RADC),保持电容完全充电所需的时间会增加。
如果采样时间小于通过
R
A
D
C
R_{ADC}
RADC +
R
A
I
N
R_{AIN}
RAIN为
C
A
D
C
C_{ADC}
CADC充满电所需的时间(ts < tc),则 ADC 转换的数字值小于实际值。

通过设置模拟通道的采样时间,确保在 ADC 开始转换之前输入引脚上存在适当的电压电平,可以减少或完全消除该误差。
模拟信号源电容和寄生效应
转换模拟信号时,必须考虑源端的电容和模拟输入引脚上的寄生电容。 源电阻和电容形成一个 RC 网络。 此外,ADC 转换结果可能不准确,除非外部电容 (
C
A
I
N
+
C
p
C_{AIN} + C_p
CAIN+Cp) 完全充电至输入电压电平。
(
C
A
I
N
+
C
p
C_{AIN} + C_p
CAIN+Cp) 的值越大,源频率越受限制。 源极的外部电容和寄生电容分别用
C
A
I
N
C_{AIN}
CAIN 和
C
p
C_p
Cp表示。

注入电流效应
任何模拟引脚(或靠近位置的数字输入引脚)上的负注入电流都可能将泄漏电流引入 ADC 输入。 最坏的情况是相邻的模拟通道。 当
V
A
I
N
<
V
S
S
V_{AIN} < V_{SS}
VAIN<VSS 时引入负注入电流,导致电流从 I/O 引脚流出。 这可能会改变引脚上的电压电平并使测量结果失真。

IO 引脚串扰( IO Pin Cross-Talking)
由于 I/O 之间的电容耦合,切换 I/O 可能会在 ADC 的模拟输入中引起一些噪声。 相互靠近或相互交叉的 PCB 走线可能会引入串扰。
内部切换数字信号和 IO 会引入高频噪声。 切换高接收器 I/O 可能会引起电源中由电流浪涌引起的一些电压骤降。 与 PCB 上的模拟输入轨道交叉的数字轨道可能会影响模拟信号。

EMI 感应噪声
来自相邻电路的电磁辐射可能会在模拟信号中引入高频噪声,因为 PCB 轨道可能充当天线。 它被称为电磁干扰 (EMI) 噪声。

文章来源: https://iotsmart.blog.csdn.net/article/details/123444129