STM32串口DMA传输与ADC采集工程实战 - 第3节
一、逐次逼近型ADC的工作原理
ADC,也就是模数转换器,它的任务很简单——把连续的模拟电压,变成离散的数字量。STM32内部用的是逐次逼近型(SAR)架构。这种架构在速度和精度之间取得了很好的平衡,也是工业控制里最常见的一种。
逐次逼近型ADC的核心思想,说白了就是二分法比较。它内部有一个比较器、一个DAC(数模转换器)和一个逐次逼近寄存器(SAR)。工作流程大致是这样的:
- 采样保持电路先把输入电压“拍个快照”,固定住。
- SAR从最高位开始,先假设一个值,比如12位ADC,先假设是1000 0000 0000。
- DAC把这个假设值转成模拟电压,和输入电压比较。
- 如果输入电压更大,这一位保留为1;否则置0。
- 然后移到下一位,重复比较,直到所有位都确定。
举个例子,假设参考电压是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通过二分法比较实现模数转换,STM32的ADC支持多种分辨率和转换模式,采样时间要根据信号源阻抗合理选择,引脚映射要注意复用冲突。这些基础知识是后续配置ADC和DMA传输的基石,务必掌握扎实。