STM32串口DMA传输与ADC采集工程实战 - 第3节

一、逐次逼近型ADC的工作原理

ADC,也就是模数转换器,它的任务很简单——把连续的模拟电压,变成离散的数字量。STM32内部用的是逐次逼近型(SAR)架构。这种架构在速度和精度之间取得了很好的平衡,也是工业控制里最常见的一种。

逐次逼近型ADC的核心思想,说白了就是二分法比较。它内部有一个比较器、一个DAC(数模转换器)和一个逐次逼近寄存器(SAR)。工作流程大致是这样的:

  1. 采样保持电路先把输入电压“拍个快照”,固定住。
  2. SAR从最高位开始,先假设一个值,比如12位ADC,先假设是1000 0000 0000。
  3. DAC把这个假设值转成模拟电压,和输入电压比较。
  4. 如果输入电压更大,这一位保留为1;否则置0。
  5. 然后移到下一位,重复比较,直到所有位都确定。

举个例子,假设参考电压是3.3V,输入是2.5V,12位分辨率。SAR会先试2048(0x800),DAC输出1.65V,比较发现2.5V > 1.65V,最高位保留1。接着试3072(0xC00),DAC输出2.475V,还是小于2.5V,次高位也保留1……这样逐位逼近下去,最终得到接近的数字量。

关键点:逐次逼近型ADC的转换时间取决于位数和时钟频率。12位ADC需要12个比较周期,加上采样时间,总转换时间是可以精确计算的。这一点在实时性要求高的项目中特别重要。

我记得刚做第一个数据采集项目时,对ADC的转换时间没太在意,结果采样率一直上不去。后来才发现是采样时间设得太长了。嗯,这里要提醒大家——采样时间和转换时间是两个概念,别搞混了。

二、STM32 ADC模块特性

2.1 分辨率

STM32的ADC支持多种分辨率,常见的有:

分辨率 位数 量化步长(3.3V参考) 适用场景
12位 12 0.805 mV 通用高精度测量
10位 10 3.22 mV 快速采样,精度要求不高
8位 8 12.9 mV 极速采样,如音频
6位 6 51.6 mV 特殊高速场景

我个人习惯在大多数传感器采集场景下使用12位分辨率。虽然STM32也支持可编程分辨率,但12位是硬件原生精度,转换结果最稳定。我曾经在一个温度采集项目里试过用10位分辨率来换取更快的速度,结果发现噪声反而更明显了——因为量化步长变大,小信号的变化被吞掉了。

2.2 采样时间

采样时间决定了ADC内部采样电容充电到输入电压所需的时间。STM32的采样时间可以通过寄存器配置,常见选项有:1.5、7.5、13.5、28.5、41.5、55.5、71.5、239.5个ADC时钟周期。

选采样时间有个基本原则:信号源阻抗越高,需要的采样时间越长。如果采样时间太短,采样电容没充满,转换结果就会偏小。

经验值:对于大多数传感器输出(阻抗在10kΩ以内),7.5个周期的采样时间就够用了。如果信号源阻抗超过50kΩ,建议用55.5或71.5个周期。我曾经遇到过用1.5周期采样一个高阻信号,结果ADC读数一直偏低,折腾了半天才发现是采样时间不够。

2.3 转换模式

STM32的ADC支持多种转换模式,我挑几个最常用的说说:

  • 单次转换模式:触发一次,转换一次。适合单点测量。
  • 连续转换模式:转换完自动开始下一次。适合持续监测。
  • 扫描模式:按顺序转换多个通道。适合多路采集。
  • 间断模式:每次触发只转换一组通道中的一部分。适合分时采集。

在实际项目中,我经常把连续转换 + 扫描模式搭配使用,配合DMA传输,实现多通道的连续数据采集。这个组合在后面的章节会详细展开。

三、ADC引脚与通道映射

STM32的ADC输入引脚是固定的,每个ADC模块对应一组GPIO引脚。以STM32F103为例,ADC1的通道映射如下:

通道号 引脚 备注
ADC1_IN0 PA0 常用
ADC1_IN1 PA1 常用
ADC1_IN2 PA2 常用
ADC1_IN3 PA3 常用
ADC1_IN4 PA4 常用
ADC1_IN5 PA5 常用
ADC1_IN6 PA6 常用
ADC1_IN7 PA7 常用
ADC1_IN8 PB0 备用
ADC1_IN9 PB1 备用

这里有个容易踩的坑——不是所有引脚都能同时用作ADC输入。比如PA0和PA1如果被复用为定时器PWM输出,就不能同时做ADC输入。我在一个电机控制项目里就吃过这个亏,PWM和ADC共用了PA0,结果ADC读数全是乱的。

避坑指南:配置ADC引脚前,一定要检查该引脚是否被其他外设占用。建议在项目初期就做好引脚功能分配表,避免后期返工。我曾经因为没注意PB0被I2C占用,导致ADC通道8一直读不到正确值,排查了整整一天。

四、知识体系结构图

下面这张图把本章的核心知识点串起来了,你可以对照着梳理思路:

ADC基础原理知识体系 逐次逼近型ADC 工作原理 二分法比较 采样保持 → 逐位比较 DAC反馈 → 逼近结果 模块特性 分辨率 / 采样时间 / 模式 12位/10位/8位/6位 单次/连续/扫描/间断 引脚与通道映射 ADC_IN0 ~ ADC_IN9 PA0~PA7 / PB0~PB1 注意引脚复用冲突 实际应用:多通道连续采集 + DMA 理解ADC原理是配置好采样参数的前提 采样时间、分辨率、引脚映射缺一不可

这张图把ADC的三个核心维度——工作原理、模块特性、引脚映射——串在了一起。你想想看,如果采样时间没设对,再高的分辨率也白搭;如果引脚被其他外设占了,再好的转换模式也用不了。所以这三块内容要一起理解,不能割裂。

本章小结:逐次逼近型ADC通过二分法比较实现模数转换,STM32的ADC支持多种分辨率和转换模式,采样时间要根据信号源阻抗合理选择,引脚映射要注意复用冲突。这些基础知识是后续配置ADC和DMA传输的基石,务必掌握扎实。