STM32 ADC介绍
STM32 内部的 ADC 采用逐次逼近型 (SAR) 结构。其工作原理是利用内部数模转换器 (DAC) 和比较器,通过逐次逼近的方法将模拟电压转换为数字信号。核心思想是通过比较器不断调整数字近似值,使其逐步逼近真实的模拟电压。
基本转换步骤:
-
初始化:
转换开始时,逐次逼近寄存器 (SAR) 先将最高有效位 (MSB) 置为 1,其余位设为 0。此时,SAR 中的数字值对应 ADC 测量范围的一半 -
逐位比较:
- SAR 中当前的数字值通过内部 DAC 转换为模拟电压
- 比较器将此模拟电压与待测的模拟输入电压进行比较
- 根据比较结果,判断当前位是否应保持为 1,或调整为 0,从而确定下一位的状态
-
逼近真实值:
依次对每一位进行上述比较和调整操作,逐步逼近真实的模拟电压值,直到获得最接近输入电压的数字表示
这种方式相当于在二进制的每一位上判断应为0还是1,从而逐步逼近真实的模拟电压值
量程
在使用ADC时,量程决定了设备能够正常测量的电压范围,同时也保护了设备免受过高电压的损害。STM32 ADC的量程由参考电压引脚决定:
ADC输入范围由VREF-、 VREF+ 、VDDA 、VSSA、这四个外部引脚决定。在设计原理图的时候一般把VSSA和VREF-接地, 把VREF+和VDDA 接3V3,得到ADC的输入电压范围为:0~3.3V。 在64脚以下的CPU中,没有VREF-和VREF+这两个引脚,ADC电压输入范围直接由VDDA和VSSA决定。
如果我们想让输入的电压范围变宽,去到可以测试负电压或者更高的正电压,我们可以在外部加一个电压调整电路, 把需要转换的电压抬升或者降压到0~3.3V,这样ADC就可以测量
分辨率
STM32内置ADC通常具有12位分辨率,这意味着数字输出范围为 0 到 4095(2¹² = 4096个离散值)
分辨率计算公式为:3.3V/4095≈0.008V 或 0.8mV
这表明 ADC 大约能检测到 0.8 毫伏 的最小电压变化。如果实际电压变化小于此分辨率,ADC 将无法识别这种细微变化。
采样频率
采样频率(Sample Rate):指指的是 ADC 在单位时间内对模拟信号进行采样的次数,通常以赫兹 (Hz) 为单位。它决定了数字信号能够多快地反映输入模拟信号的变化
**采样定理(Nyquist定理):**为了避免混叠(aliasing)现象,采样频率必须至少是信号中最高频率成分的两倍。例如,若信号中最高频率为
f
m
a
x
f_{max}
fmax,则采样频率
f
s
f_{s}
fs应满足:
f
s
≥
2
×
f
m
a
x
f_{s} ≥ 2×f_{max}
fs≥2×fmax这被称为Nyquist率
。如果采样频率低于该值,可能会导致高频信号成分被错误地映射到低频部分,从而失去原始信号的真实信息
转换时间
转换时间(Conversion Time):指的是从ADC开始对一个模拟信号进行采样,到完成整个模数转换过程、获得稳定数字输出所需的时间。对于逐次逼近型ADC,转换时间主要包括以下几个阶段:
- 采样阶段(Sample Phase):
ADC首先利用采样保持电路将输入信号电压捕获并稳定保持,这个过程需要一定的时间来让内部电容充电到输入电压 - 逐次逼近阶段(Conversion Phase):
在这个阶段,SAR逻辑开始依次判断各个位,从最高位开始设定,经过DAC与比较器反复比较,逐步逼近真实电压值。每一位的决策都需要一定的时间,整个过程往往以ADC时钟周期为单位来计算
转换时间与采样频率的关系:
- 转换速度限制:
ADC内部完成一次转换所需的时间决定了最大转换速率。如果单片机尝试以高于ADC转换速度的速率读取数据,会出现未完成转换的新采样数据被重复读取的情况,导致数据失真 - 平衡CPU资源:
除了ADC自身的转换时间外,单片机还需要考虑如何合理调度资源。如果采样频率远超ADC的转换速度,不仅无法得到更高精度的数据,还会浪费CPU的计算资源
注意一些细节问题
参考电压的选择
在使用ADC时,通常的用法是 V r e f + V_{ref+} Vref+接电源 $V_{DD}$3.3V,然后计算时直接用3.3V做参考电压。然而,这种方法忽略了一些实际情况,例如供电电压可能因外部大电流用电器的运行而出现波动,或者给 MCU 供电的低压差线性稳压器 (LDO) 的精度可能存在个体差异。在这种情况下,仍然使用 3.3V 的固定值作为参考电压进行计算,显然会导致测量结果与实际电压之间存在较大的偏差
解决方案:
通常,引脚数在 100 以上的 STM32 MCU 会引出专门的 VREF 引脚。对于引脚数少于 100 的芯片,STM32 通常不会引出 VREF 引脚,而是将其在内部直接连接到 VDDA 引脚。这导致 ADC 的供电电源和参考电源实际上是同一个。在典型的项目中,VDDA 也连接到 VDD。如果存在 VREF 引脚,可以在 VREF 上连接一个稳定且精度高的外部电压源作为参考电压
另一种方法是启用内部参考电压:除了通过外部引脚提供稳定的参考电压外,STM32 还提供了启用内部参考电压的选项。这在实际应用中能有效改善由供电波动或 LDO 精度不足带来的误差问题。
内部参考电压的原理与特点
-
原理简介:
内部参考电压(通常称为VREFINT)是芯片内部产生的一个稳定电压参考值。其电压值通常经过精密设计和校准,与外部电源无关,能够提供一个较为恒定的参考基准,这个电压基本不随外部供电电压的变化而变化不同的芯片这个参考电压的范围不一样
如果以这个为参考电压,我们仍需测量其值,该值对于不同的芯片是一个范围,并不是确定值。 STM32 可以通过配置将 VREFINT 接入到 ADC 内部的通道17,然后就可以测量 VREFINT。注意MCU 不同,具体连接的 ADC 通道也是不同的
- 使用方式:
在 STM32 的 ADC 模块中,可以通过配置相应的寄存器来启用内部参考电压通道。启用后,ADC 在进行转换时可以同时采集内部参考电压的数值。通过比较采集到的内部参考电压的数字值和其已知的精确值(通常在数据手册中给出典型值和范围),可以对其他 ADC 通道的采集结果进行校正,或者反过来推算出当前的供电电压波动情况
ADC测量电压
在实际应用中,待测电压往往可能超出ADC的直接测量范围,或者信号源内部阻抗较高,导致直接接入ADC存在误差和安全隐患。为了确保测量准确性与系统稳定性,通常采用信号调理技术,其中电阻分压是一种常用的方案
电阻分压器由两个串联电阻组成,其主要作用是将输入电压按一定比例降至ADC的量程内。基本公式如下:
V
OUT
=
V
IN
×
R
2
R
1
+
R
2
V_{\text{OUT}} = V_{\text{IN}} \times \frac{R_2}{R_1 + R_2}
VOUT=VIN×R1+R2R2
最简单的电阻测量电路如下图:
这时候测量点的电压计算公式为:V=R2 / (R1 + R2) * Uref,如果事先知道R1,R2阻值,就能算出来电压。
如果是负电压,参考这个原理:https://www.firebbs.cn/forum.php?mod=viewthread&tid=12680
ADC测量电流
于ADC只能直接测量电压,实际工程中电流采样通常依赖于把电流转换为电压信号的方法。常用的方案是在被测电路中串联一个高精度采样电阻,通过测量该电阻两端的电压降,再利用欧姆定律换算成电流值
ADC直接测量的是电压,而要测量电流,首先需要将电流信号转换为电压信号。常见方法是串联采样电阻法
在被测电路中串联一个精密采样电阻 ( R_s ) ,流过的电流 ( I ) 在该电阻上产生电压降 ( U )。根据欧姆定律:
U
=
I
×
R
s
U = I \times R_s
U=I×Rs
然后利用ADC采集 ( U ) 值,通过电压转换电流公式得到实际电流:
I
=
U
R
s
I = \frac{U}{R_s}
I=RsU
采样电阻的选型:
-
精度与温漂: 为确保测量精度,采样电阻必须选用高精度、低温漂的元件。温漂小可以保证在温度变化时阻值保持稳定,避免因阻值变化引入测量误差。
-
功耗与电压降: 采样电阻的阻值选择需要兼顾两方面:
- 阻值过大: 电压降较大,易于采集但会增加功耗并可能影响被测电路的正常工作
- 阻值过小: 电压降微小,ADC采集时可能精度不足,因此一般需要后续放大处理
信号放大:
在实际应用中,电流信号转换后形成的电压变化范围往往很小(例如几十毫安电流通过1mΩ或几毫欧的电阻得到的电压可能仅为几十毫微伏至几百毫伏),这时需要将信号放大
ADC转换与电流换算
ADC将放大后的电压信号 (Uadc) 进行数字化转换,转换关系通常为:
D = ( U adc V ref ) × ( 2 n − 1 ) D = \left(\frac{U_{\text{adc}}}{V_{\text{ref}}}\right) \times (2^{n} - 1) D=(VrefUadc)×(2n−1)
- ( D ):ADC采集的数字值
- ( Vref):参考电压(通常为3.3V或其他精密参考电压)
- ( n ):ADC位数(如10位满量程为1023,12位满量程为4095)
假设放大后的电压 (Uadc) 与采样电阻 ( R_s ) 之间仍满足欧姆定律关系,那么实际电流 ( I ) 为:
I
=
U
adc
R
s
×
A
I = \frac{U_{\text{adc}}}{R_s \times A}
I=Rs×AUadc
其中 ( A ) 是放大器的增益。结合ADC转换公式,可以将ADC数值 ( D ) 反推为实际电流:
I
=
D
×
V
ref
(
2
n
−
1
)
×
R
s
×
A
I = \frac{D \times V_{\text{ref}}}{(2^{n} - 1) \times R_s \times A}
I=(2n−1)×Rs×AD×Vref
例如:
- ADC分辨率: 12位(4095满量程)
- 参考电压: 3.3V
- 采样电阻: 10mΩ
- 放大器增益: 50
则电流计算公式为:
I
=
D
×
3.3
4095
×
0.01
×
50
I = \frac{D \times 3.3}{4095 \times 0.01 \times 50}
I=4095×0.01×50D×3.3
实际工程中,可以通过实验测量确定一个校正系数,再进行软件补偿以获得更准确的电流值
工程实践中的注意事项
单片机I/O电流限制:单片机引脚的输入通常具有较高阻抗,不会直接影响电流测量。但输出引脚的电流能力有限(一般为20mA,整体不超过120mA),在设计输出驱动或信号放大时需注意保护单片机I/O不被过大电流损坏
校正与温度补偿:已知电流条件下采集ADC值,确定系统换算系数,利用内部参考电压及温度传感器数据进行补偿,确保长期测量精度。由于采样电阻和放大电路的参数可能随温度漂移,添加温度补偿电路或在软件中进行校正是提高准确度的重要手段
噪声与滤波:在采样电阻两端或放大电路输入端加入RC低通滤波器,能有效降低高频噪声的影响,提高ADC采样的稳定性