一、ADC 的基本作用
单片机的核心是数字电路,只能处理“0”和“1”。但现实中的物理量——比如温度、压力、电池电压、声音、光照强度——大多是连续变化的模拟量。传感器通常把这些物理量转换成电压信号,然后 ADC 再把电压转换成数字。
举例:
一个温度传感器在 0°C 时输出 0.5V,在 100°C 时输出 2.5V。单片机要“知道”温度,就必须先测量这个电压。ADC 把电压测出来,给出一个数字,比如 1.5V 对应 1861(假设 12 位 ADC,参考电压 3.3V)。然后程序再根据电压与温度的关系反推出温度值。
所以 ADC 是连接模拟世界和数字世界的桥梁。
二、关键参数深入理解
1. 分辨率(位数)
分辨率表示 ADC 能把输入电压范围分成多少份。常见的有 8 位、10 位、12 位、16 位、24 位等。
8 位:把量程分成 256 份,每份约 0.39%(量程的 1/256)。
10 位:分成 1024 份,每份约 0.098%。
12 位:分成 4096 份,每份约 0.024%。
16 位:分成 65536 份,每份约 0.0015%。
“份”越小,ADC 能分辨的电压变化就越细微。比如参考电压为 3.3V,12 位 ADC 能分辨的最小电压变化大约是 0.8 毫伏;而 10 位 ADC 只能分辨约 3.2 毫伏。
注意:分辨率高只是说刻度细,不代表测得准。一把尺子刻度再细,如果尺子本身弯曲变形,读数照样不准。
2. 参考电压
参考电压决定 ADC 的测量范围(满量程)。输入电压不能超过参考电压,否则输出会饱和(通常是最大值)。
参考电压来源有三种:
芯片内部基准:使用方便,但精度一般,受温度影响较大。例如常见的 1.2V、2.5V 内部基准。
外部专用基准芯片:精度高、温漂小,适合要求高的场合。例如 TL431、REF3030 等。
直接用单片机电源电压:最省事,但电源的噪声和波动会直接影响测量结果。
参考电压的稳定性至关重要。如果参考电压漂移 1%,测量结果也会跟着漂移约 1%。
3. 采样率(转换速率)
采样率表示 ADC 每秒钟能完成多少次转换,单位是 SPS(每秒采样次数)或 Hz。
测量温度、电池电压等慢变信号,几百到几千 SPS 就够用。
普通单片机 SAR ADC 通常能达到几十 kSPS 到几 MSPS。
音频信号需要 44.1 kSPS 以上。
高速示波器用的 ADC 可以达到几百 MSPS 甚至 GSPS。
根据采样定理,要完整还原一个信号,采样率至少要大于信号最高频率的两倍。实际工程中往往取 5~10 倍甚至更高,才能保证信号质量。
4. 精度指标
分辨率只是理论上的刻度数量,实际精度还受多种因素影响:
DNL(微分非线性):相邻两个数字码对应的电压间隔与理想间隔的偏差。如果偏差超过 1 LSB,可能出现某个码永远不会出现(丢码)。
INL(积分非线性):整个转换曲线与理想直线的最大偏离,反映整体线性好坏。
失调误差:输入为 0V 时,输出不为 0 的偏差。可以校准消除。
增益误差:实际满量程与理想满量程之间的斜率偏差。也可以校准。
有效位数(ENOB):由于噪声和非线性,实际有效位数往往低于标称位数。例如标称 12 位,实际可能只有 10.5 位有效。
因此在要求高精度的场合,不能只看位数,还要看这些指标。
三、SAR ADC 的工作原理(用生活比喻)
单片机内部最常用的是逐次逼近型 ADC,简称 SAR ADC。它像用天平称重。
假设要称一个未知重量的物体,手头有一组砝码,重量分别是最大量程的一半、四分之一、八分之一……以此类推,直到最小砝码。
步骤:
先放最大的砝码(对应最高位),看看天平是否超重。
如果物体比砝码重,就保留这个砝码;如果比砝码轻,就拿掉这个砝码。
接着放第二大的砝码(对应下一位),再比较。
从大到小逐个尝试,直到所有砝码都试完。
保留下来的砝码总重量就是物体的重量。
SAR ADC 的原理完全一样:它内部有一个 DAC(数模转换器),可以把数字码转成对应的电压,像“砝码”一样。比较器比较输入电压和这个 DAC 输出电压,决定保留或丢弃每一位。从最高位到最低位,一位一位逼近,最终得到一个最接近输入电压的数字码。
这种方法的优点是:
速度适中,N 位 ADC 大约需要 N 个时钟周期完成一次转换。
功耗低,电路简单,适合集成在单片机里。
分辨率通常可以做到 8~16 位。
缺点是:对输入信号源的阻抗比较敏感,如果信号源太“弱”,采样时可能来不及给内部电容充电,导致结果偏低。
四、单片机内部 ADC 外设结构
以常见的 STM32、AVR、MSP430、ESP32 等单片机为例,内部 ADC 通常包含以下部分:
1. 模拟多路开关
单片机往往只有一个 ADC 核心,但有很多引脚可以测量。通过模拟多路选择器,可以分时切换不同的输入通道。例如 STM32F103 的 ADC1 可以连接 16 个外部引脚。
2. 采样保持电路
在开始转换之前,ADC 需要先“冻结”输入电压。内部有一个小电容,采样阶段开关闭合,电容充电到输入电压;然后开关断开,电容保持住这个电压,转换过程中电压就不会变了。
如果采样时间太短,电容还没充到输入电压,结果就会偏小。所以采样时间要根据信号源阻抗来设置。
3. 逐次逼近转换器
这是 ADC 的核心,完成“称重”的过程。
4. 转换结果寄存器
转换完成后,数字结果存放在一个寄存器里。通常寄存器是 16 位,但有效数据取决于 ADC 位数。结果可以左对齐或右对齐,方便程序读取。
5. 触发控制
ADC 转换可以由多种方式启动:
软件触发:程序直接写一个启动位,ADC 开始转换。
定时器触发:由定时器事件(比如 PWM 输出)触发,可以实现固定间隔采样。这在电机控制、数字电源等场合非常重要,因为需要精确的采样时刻。
外部引脚触发:用外部信号边沿触发,比如在某个外部事件发生时立即采样。
6. 中断和 DMA
转换完成后可以产生中断,通知 CPU 读取结果。如果采样率很高,CPU 频繁中断会吃不消,这时可以用 DMA(直接存储器访问)自动把结果搬到内存缓冲区,CPU 只需要定期处理数据即可。
7. 模拟看门狗
这是一个非常实用的功能。可以设置一个上限和一个下限,当 ADC 转换结果超出这个范围时,自动产生中断。常用于电源电压监测、过流保护、温度报警等。
8. 内部专用通道
除了外部引脚,很多单片机还把一些内部信号接到 ADC 上:
内部温度传感器:可以测芯片温度。
内部参考电压:可以反推出电源电压(因为参考电压已知)。
电池电压监测通道:有些芯片有专门的电池检测引脚。
DAC 输出回读:可以监测 DAC 输出是否正确。
五、常见工作模式
1. 单次转换模式
触发一次,ADC 完成一次转换后就停下来,等待下一次触发。适合不需要连续采样的场合,比如按键检测、温度巡检、电池电压偶尔测量。
2. 连续转换模式
一次转换结束后自动开始下一次,不停地测。适合需要实时监测的场合,但 CPU 负担较重,通常配合 DMA 使用。
3. 扫描模式
多个通道按顺序依次转换。比如同时监测温度、电压、电流三个通道。可以配合单次或连续模式使用,结果可以按顺序存放。
4. 注入模式
部分单片机(如 STM32)支持注入通道。注入通道的优先级高于常规通道,可以由外部事件触发,打断正在进行的常规转换。常用于电机控制中的电流采样,需要在特定时刻立即获取结果。
5. 间断模式
每次触发只转换一个或几个通道,然后停止等待下一次触发。适合低功耗应用,因为不需要连续工作。
6. 过采样与硬件平均
部分单片机(如 STM32L4)支持硬件过采样,自动对多次采样求和或平均,可以有效提高分辨率、降低噪声。比如过采样 256 次,理论上有效位数可以增加 4 位。
六、硬件设计要点
1. 参考电压设计
优先使用外部专用基准芯片,保证精度和温漂。
在参考引脚附近加去耦电容(比如 100nF 陶瓷电容 + 10μF 钽电容)。
参考电压走线要远离大电流和高速数字信号,避免干扰。
如果使用内部基准,注意查看数据手册中的精度和温漂指标,确认是否满足要求。
2. 输入信号调理
分压:当被测电压超过 ADC 量程时,使用精密电阻分压。分压电阻的精度直接影响测量精度。
滤波:在 ADC 输入引脚加 RC 低通滤波器,滤除高频噪声,同时起到抗混叠作用。电阻一般选 100Ω~1kΩ,电容选 10nF~100nF。
缓冲:如果传感器输出阻抗较高(比如几十 kΩ 以上),直接接 ADC 会导致采样电容充电不足,测量偏低。此时需要加运放缓冲,运放输出阻抗低,驱动能力强。
保护:在输入引脚加钳位二极管或串联电阻,防止过压损坏单片机。比如输入可能超过 VDD 时,用二极管钳位到电源轨。
3. 阻抗匹配
SAR ADC 在采样瞬间会从信号源抽取电荷,如果信号源阻抗太大,采样电容在采样时间内充不满,结果就会偏低。一般要求信号源阻抗小于几 kΩ,具体看芯片手册。
如果信号源阻抗较高,可以:
增大采样时间(如果芯片支持配置)。
在信号源和 ADC 之间加运放缓冲。
在 ADC 输入引脚并联一个较大的电容(比如 100nF),提供瞬时电荷。
4. PCB 布局
模拟地和数字地分开走,最后单点连接,避免数字噪声耦合到模拟部分。
ADC 输入走线尽量短,远离时钟线、PWM 线等高速数字信号。
参考电压走线加粗,并在附近放置去耦电容。
如果有条件,给 ADC 输入加一个小的滤波电容到地,尽量靠近芯片引脚。
七、软件处理技巧
1. 软件滤波
平均滤波:连续采样 N 次,求平均值。可以降低随机噪声,但响应稍慢。
中值滤波:采样 N 次,排序后取中间值。对脉冲干扰(比如电机火花)特别有效。
一阶低通滤波:用本次采样值和上次滤波结果加权平均,越新的数据权重越大。可以平滑数据,同时保留一定响应速度。
滑动平均滤波:维护一个固定长度的队列,新数据进来,最老的数据出去,计算队列平均值。效果类似平均滤波,但实现更灵活。
2. 过采样与抽取
如果 ADC 本身不支持硬件过采样,可以通过软件多次采样求和来实现。每增加 4 倍采样次数,有效分辨率理论上增加 1 位。前提是信号中存在足够的噪声,否则需要人为加入抖动。
例如:对同一信号采样 256 次并累加,累加结果右移 4 位(相当于除以 16),就相当于把 12 位 ADC 提升到 16 位分辨率(但实际精度受噪声限制,不会真正达到 16 位)。
3. 校准
零点校准:把输入短接到地,记录 ADC 输出值,这个值就是失调。后续测量结果减去这个值。
满量程校准:输入一个已知的精确电压(比如用基准芯片输出),计算增益修正系数。后续测量结果乘以这个系数。
两点校准:同时做零点和满量程校准,修正斜率和偏移。
很多单片机支持硬件校准,可以自动修正内部失调和增益。
4. 结果换算
ADC 输出的是码值,需要换算成实际电压,再根据传感器特性换算成物理量。换算时注意使用正确的参考电压和分辨率。如果参考电压不是精确值,换算结果也会有误差。
八、选型考虑因素
选择单片机或独立 ADC 时,需要综合考虑:
分辨率:根据精度要求选择。一般 10 位能满足普通需求,12 位是主流,16 位以上用于高精度测量。
采样率:根据信号频率确定,留足余量。比如测 50Hz 工频信号,采样率至少 1kHz 以上。
通道数:需要同时采集几路信号?如果通道多,要考虑扫描模式和切换时间。
参考电压:内部基准精度是否够?是否需要外部基准?
功耗:电池供电的低功耗设备,要关注 ADC 的工作电流和待机电流。
DMA 支持:大量数据连续采集时,DMA 能大大减轻 CPU 负担。
模拟看门狗:需要电压监测和报警功能时很有用。
差分输入:某些传感器输出差分信号(如桥式传感器),差分输入可以抑制共模干扰。
封装和价格:根据产品定位选择。
常见单片机 ADC 对比:
| 单片机 | ADC 分辨率 | 最大采样率 | 特点 |
|---|---|---|---|
| STM32F103 | 12 位 | 1 MSPS | 多通道、注入模式、DMA、模拟看门狗 |
| STM32L4 | 12 位 | 5 MSPS | 硬件过采样、低功耗、高性能 |
| ESP32 | 12 位 | 2 MSPS | 多通道,但线性度一般,精度受电源影响大 |
| ATmega328P | 10 位 | 15 kSPS | 简单易用,适合 Arduino 入门 |
| MSP430 | 12 位 | 200 kSPS | 超低功耗,适合电池供电 |
| 独立 ADS1115 | 16 位 | 860 SPS | I2C 接口,高精度,内置 PGA |
九、实际应用案例
1. 电池电压监测
用两个电阻分压,把电池电压降到 ADC 量程内。
选择内部高精度参考电压(如 1.2V),不受电池电压变化影响。
启用模拟看门狗,当电压低于设定阈值时产生中断,提醒用户充电。
软件做平均滤波,消除纹波和噪声。
2. 温度采集
使用 NTC 热敏电阻或模拟温度传感器(如 LM35)。
通过分压电路将温度变化转换为电压变化。
ADC 采样后,根据传感器特性曲线(查表或公式)计算温度。
采用过采样提高分辨率,降低噪声。
3. 电机电流采样
在电机驱动回路串联一个小的采样电阻(比如 0.05Ω)。
用运放放大采样电阻两端的电压(因为压降很小)。
ADC 由定时器触发,在 PWM 特定时刻采样(比如在 PWM 高电平中间采样,避开开关噪声)。
使用注入模式或 DMA 实时采集。
软件做滑动平均或一阶滤波,提取电流值。
4. 音频采集
麦克风信号经运放放大和滤波后送入 ADC。
使用定时器触发,采样率设置为 44.1 kHz 或更高。
DMA 将数据搬运到缓冲区,CPU 进行编码或传输。
注意抗混叠滤波,避免高频噪声折叠到音频频段。
十、常见调试问题与解决方法
1. 转换结果跳动大
可能原因:噪声大、参考电压不稳、采样时间不足。
解决方法:
增加硬件 RC 滤波。
软件平均滤波。
检查参考电压去耦电容。
增大采样时间。
2. 转换结果始终为 0 或满量程
可能原因:输入引脚未正确连接、参考电压异常、通道配置错误、ADC 时钟未使能。
解决方法:
检查 GPIO 复用配置和引脚连接。
用万用表测量输入电压和参考电压。
确认 ADC 时钟和使能位已打开。
3. 多通道采样相互干扰
可能原因:通道切换后采样时间太短,内部采样电容未充分充放电。
解决方法:
增大采样时间。
在通道切换后插入小延时。
使用外部缓冲器降低源阻抗。
4. 精度不够
可能原因:参考电压精度低、未校准、布线干扰、电源噪声。
解决方法:
使用外部高精度基准芯片。
进行两点校准。
优化 PCB 布局,分离模拟和数字地。
加电源滤波,使用 LDO 给模拟部分供电。
十一、总结
单片机 ADC 是嵌入式系统中最常用的模拟外设,它将连续的模拟电压转换为离散的数字编码。绝大多数单片机集成的是 SAR 型 ADC,原理类似天平称重,逐位逼近。
关键参数包括分辨率、参考电压、采样率和精度指标。外设结构包含多路开关、采样保持、逐次逼近转换器、结果寄存器、触发控制、DMA 和模拟看门狗等。工作模式支持单次、连续、扫描、注入、间断和过采样。
硬件设计上要保证参考电压稳定、输入阻抗匹配、加滤波和保护。软件上可以用滤波、过采样和校准来提高精度。选型时要综合考虑分辨率、采样率、通道数、功耗等因素。
只有软硬件协同设计,才能充分发挥 ADC 的性能,实现可靠、精确的模拟信号采集。