ADC采样原理入门:单片机如何读取模拟信号

1、什么是ADC?

ADC,全称 Analog-to-Digital Converter,中文叫模数转换器。顾名思义,它的工作就是把模拟信号(Analog Signal)转换成数字信号(Digital Signal)。

听起来很抽象?我们用个比喻来理解:

模拟信号就像一条连续平滑的曲线——温度从25℃慢慢升到26℃,中间经历了25.1、25.2、25.3……每一个瞬间都有值。

数字信号就像一串离散的台阶——你只能看到25、26、27这样跳跃的整数。

ADC的角色,就是用一把“刻度尺”去测量这条连续曲线上的某个点,然后报告一个最接近的刻度值。

在单片机内部,ADC是一个外设模块(就像定时器、串口一样),它接收引脚上的模拟电压(通常是0V ~ 3.3V或0V ~ 5V),经过一系列内部处理,最终输出一个整型数字(比如0、1024、2048、4095),供CPU读取和使用。

2、为什么需要ADC?

这是最核心的问题:单片机本身就只认识0和1,为什么非要去读模拟信号?

答案是:因为真实世界是模拟的,而我们要让单片机感知世界。

没有ADC,单片机就无法读取任何模拟传感器的数据,只能处理按键、开关这类“要么0要么1”的数字信号。那它就只能做个简单的逻辑控制器,永远做不了温度计、电压表、音频播放器、光控灯……

所以ADC是单片机感知模拟世界的“眼睛”和“耳朵”。

3、ADC的几个关键参数

选型和使用ADC时,这几个参数你必须搞懂,它们直接决定了ADC的性能和适用场景。

(1)分辨率(Resolution)—— 刻度有多细?

分辨率决定了ADC能把输入电压范围切分成多少份,单位是 bit(位)。

8位ADC → 2^8=256 个刻度

10位ADC → 2^10=1024 个刻度

12位ADC → 2^12=4096 个刻度(STM32主流配置)

16位ADC → 2^16=65536 个刻度(高端型号)

分辨率越高,测量越精细,另外分辨率越高,转换时间通常越长,成本和功耗也越高。要根据实际需求选择——测温度用10~12位就够,测音频至少需要16位。

(2)采样频率(Sampling Rate)—— 多久测一次?

采样频率表示ADC每秒进行多少次转换,单位是 SPS(Samples Per Second,每秒采样次数) 或 Hz。

比如“1MHz采样率”表示每秒能采样100万次。

这里有个铁律必须记住——奈奎斯特采样定理:

采样频率必须 ≥ 2 × 信号最高频率,才能从采样后的数字信号中完整恢复原始模拟信号

实际工程中,通常会取 3~5倍 甚至更高,以留出余量。

(3)参考电压(VREF)—— 测量的“天花板”

ADC测量的是输入电压相对于参考电压的比例,转换公式是:

其中:VIN是输入电压,VREF是参考电压,N是ADC的位数

参考电压就是测量的“满量程”。如果VREF=3.3V,那么输入电压只能在0~3.3V范围内测量;如果输入超过3.3V,ADC会直接“爆表”(输出满量程值4095)。

参考电压的稳定性直接影响测量精度。如果VREF有纹波或漂移,转换结果会跟着抖动。高端应用中会用专门的高精度基准源(比如TL431)来提供稳定的VREF。

(4)量化误差(Quantization Error)—— 天生的“测量误差”

因为ADC的输出是离散的有限个数值,而输入是连续信号,所以绝大多数情况下,输入电压并不能精准对应到一个刻度值上,只能取最接近的那个刻度。

这个“取近似”带来的误差就是量化误差,其理论最大值是 ±0.5 LSB(Least Significant Bit,最低有效位)。

LSB就是ADC能分辨的最小电压,即 VREF/2^N。

还用上面的12位ADC、3.3V参考电压来算:

LSB = 3.3V / 4096 ≈ 0.805mV,那么量化误差最大就是 ±0.4mV左右。

这是ADC物理原理决定的固有误差,无法消除,只能通过提高分辨率来降低它的影响。

4、ADC的几种工作模式

单片机ADC的工作模式可以从三个维度来理解:按转换节奏分(单次还是连续)、按通道数量分(单通道还是多通道扫描)、按启动方式分(软件触发还是硬件触发)。实际使用中,这些维度往往组合在一起,灵活适配不同的应用场景。

按转换节奏:单次转换模式

这是最简单、最基础的模式。每次转换都需要软件去“触发”一下,触发之后ADC开始工作,等它转换完,结果存到寄存器里,然后就停下来睡觉,直到你下一次再触发它。

整个过程就像你按一下相机快门,它拍一张照片,然后等着你再按。

这个模式最适合那些变化非常缓慢的信号。比如测量室内温度,温度一分钟也变不了0.1度,你完全没必要连续不停地测,每隔几秒甚至几秒钟触发一次单次转换,读一次结果就足够了。这样做的好处是省电,对于电池供电的设备尤其友好。

按转换节奏:连续转换模式

连续转换模式则完全相反。一旦你触发启动,ADC就像上了发条一样,以最高速度不停地进行转换,上一个刚转换完,下一个马上开始,根本停不下来。

这就好比用高速摄像机持续录像,而不是拍照片。

这种模式适用于变化很快、需要连续跟踪的信号。比如采集音频信号做频谱分析,或者实时监控电机电流是否出现过冲,都需要ADC一刻不停地采样。当然,代价就是功耗高,而且CPU需要频繁去读取数据,通常要配合DMA来搬运,否则CPU会被活活累死。

按通道数量:单通道模式

这个最好理解——ADC只盯着一个引脚采样,别的引脚一概不理。你配置好通道号之后,每次转换都来自同一个输入引脚。

单通道模式可以搭配单次转换使用(测温度),也可以搭配连续转换使用(录单声道音频),非常灵活。

按通道数量:多通道扫描模式

当你需要同时测量多个传感器时(比如同时测电池电压和温度),就要用到扫描模式。

在扫描模式下,ADC会按照你事先设定好的通道顺序,依次对每个通道进行转换——先测通道0,再测通道1,再测通道2……像一个轮询服务员,挨个招待每一位客人。

转换完成后,每个通道的结果会分别存放在不同的寄存器中。由于多通道扫描会产生大量数据,工程上几乎总是配合DMA使用——ADC每转换完一个通道,DMA就自动把结果搬运到内存数组里,等全部通道都转换完毕,CPU直接去数组里取数就行了,全程几乎不需要CPU插手。

一个典型的应用是三相电机电流检测:需要同时采集U、V、W三相的电流,ADC对三个通道依次采样,DMA把数据搬运到数组,FOC算法再拿这些数据进行矢量控制计算。

按启动方式:软件触发

软件触发就是你直接在代码里调用启动函数,比如 HAL_ADC_Start(),ADC收到指令后立刻开始转换。

这种方式简单、直接、容易理解,适合那些对采样时机没有严格要求的场景。比如你每隔100ms去测一次温度,用软件触发完全够用,因为定时精度要求不高,早几个微秒晚几个微秒对温度读数没有任何影响。

按启动方式:硬件触发

硬件触发则是让别的硬件模块来替你启动ADC。常见的触发源包括:

定时器触发:定时器溢出时自动触发一次ADC转换

外部中断触发:某个引脚出现上升沿或下降沿时触发

PWM事件触发:PWM输出的某个特定时刻触发

硬件触发最典型的应用场景是电机控制中的电流采样。在FOC算法中,你必须在PWM周期的特定相位点(比如下桥臂导通时的中间时刻)去采样电流,这个时刻是固定的、精确到微秒级的。如果用软件触发,中断响应有延迟,你无法保证每次都在同一时刻采样,算出来的电流值就会抖动。而用定时器硬件触发ADC,定时器一到点就自动启动ADC转换,分毫不差,精度和一致性远超软件触发。

另一个场景是连续等间隔采样,比如要求每隔50μs采样一次。这时用定时器硬件触发ADC,比用软件定时器中断触发要精准得多,因为硬件触发不受中断优先级和CPU负载的影响。

如果觉得不好理解,华清远见自主研发的虚拟仿真平台,可以非常直观的操作并看到ADC内部的工作过程,如下:

组合起来看

实际工程中,这些模式从来不是孤立使用的,而是组合搭配,形成适合具体场景的方案:

室内温度监测:单次转换模式 + 单通道 + 软件触发。温度变化极慢,每次主动触发测一下就够了,CPU几乎无负担。

音频信号采集(示波器):连续转换模式 + 单通道 + 软件触发。让ADC以最高速度不停采,DMA持续搬运数据到缓冲区,CPU只管从缓冲区取数据显示波形。

三相电机电流检测:连续转换模式 + 多通道扫描模式 + 定时器硬件触发 + DMA搬运。每个PWM周期固定时刻触发ADC,依次扫描三个电流采样通道,DMA自动搬运数据,CPU拿数据做FOC计算。这是要求最高的组合,但也是最强大的。

电池电量+温度综合检测:单次转换模式 + 多通道扫描模式 + 软件触发。每次主动触发一次扫描,ADC自动把电池电压通道和温度传感器通道各测一遍,DMA搬走数据,CPU一次拿到两个结果。

最后总结一下:

什么是ADC?就是把模拟电压转换为数字量的硬件模块。

为什么需要ADC?让单片机读取真实世界的模拟信号(温度、光强、电压等)。

关键参数有哪些?分辨率(精细度)、采样率(速度)、参考电压(量程)、量化误差(固有误差)。

有哪些工作模式?单次/连续、单通道/扫描模式、软件/硬件触发,可根据场景灵活组合。

掌握了这些,你对ADC的理解就不再停留在“调用一个库函数”的层面了。下次配置ADC时,你会知道为什么选12位而不是8位、为什么用定时器触发而不是软件触发、为什么多通道要用DMA——因为你真正理解了ADC的工作原理。


请使用浏览器的分享功能分享到微信等