ADC内部是如何读取引脚电平的
采样与逐次逼近
STM32的ADC并非“瞬间”读取电压,而是通过采样-保持电路和逐次逼近逻辑来完成。
- 采样阶段(电容充电):当ADC开始转换时,内部的一个采样电容会通过开关连接到你的目标引脚。在一段被称为“采样时间”的窗口内,电容被充电,直到其两端电压与引脚电压一致。
- 保持阶段(断开输入):采样结束后,开关断开,电容与引脚隔离。此时电容上“记住”了采样瞬间的电压值,并在整个转换期间保持稳定,这是精确转换的前提。
- 逐次逼近(二分法比较):这是核心的量化过程。ADC内部的逐次逼近寄存器(SAR) 会从最高有效位(MSB)开始,逐位确定数字输出。它像一个“天平”,将电容上的电压与一系列基准电压(如VREF/2, VREF/4, 3VREF/8...)进行比较。每一位的比较结果决定该位是1还是0,直到最低有效位(LSB)被确定,一个完整的数字量就诞生了。
多长时间读取一次:转换时间的计算
ADC的读取速度由总转换时间(Tconv) 决定,即一次完整转换(采样+逐次逼近)所需的时间。其计算公式为:
Tconv = 采样时间 + 12.5个ADC时钟周期
其中,12.5个周期是SAR架构进行逐次逼近所需的固定时间(对于12位分辨率)。而采样时间是可配置的,通过寄存器(如 ADC_SMPR1/2)可以设置不同的采样周期数(如1.5、7.5、239.5个周期等),以适应不同内阻的信号源。
转换频率 = 1 / Tconv。以常见的STM32F4系列为例,假设ADC时钟(ADCCLK)配置为21MHz,采样时间设为3个周期,那么: Tconv = (3 + 12) / 21MHz ≈ 0.714 µs,即最快约1.4 MSPS(每秒百万次采样)。
不同系列性能差异较大,例如STM32F1系列的最高转换速率约为1 MSPS,而STM32H7等高性能系列可达3.6 MSPS甚至更高。
转换后的值存放何处:数据寄存器与DMA
转换完成的数字结果会存入特定的数据寄存器中,而非直接进入CPU。
- 规则通道数据寄存器(ADC_DR):对于常规的“规则组”转换,结果存放在
ADC_DR中。它是一个32位寄存器,但只有低16位有效。你可以通过配置对齐方式(左对齐或右对齐)来方便地提取数据。 - 注入通道数据寄存器(ADC_JDRx):对于优先级更高的“注入组”转换,结果存放在独立的
ADC_JDR1~JDR4寄存器中,与规则组数据完全隔离。
关键点:ADC_DR 只有一个,如果进行多通道扫描转换,后一个通道的结果会覆盖前一个通道的数据。因此,在连续扫描多个通道时,几乎必须使用DMA。DMA可以在每次转换完成后,自动将 ADC_DR 中的值搬运到内存数组里,避免数据丢失。