ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ADC模数转换器原理、工作模式与关键参数详解:从采样到工程实践

ADC模数转换器原理、工作模式与关键参数详解:从采样到工程实践 上周调一块电机控制板ADC采母线电流的数值跳得像心电图DMA搬进内存的数据从0到4095来回窜。查了半天不是传感器问题不是电源纹波最后发现是参考电压引脚上多接了一截杜邦线。这件事让我觉得ADC这事儿看着简单想用明白还是得把原理、模式和参数完整捋一遍。这篇文章就是给做硬件、写嵌入式固件的朋友准备的。不管你是刚接触STM32、ESP32这类MCU的初学者还是已经在做电源、电机、传感器采集的老手只要手里有需要“把模拟电压变成数字”的活儿都可以参考。文中会从定义入手逐步讲清楚ADC的工作原理、常见工作模式和关键参数最后再分享一些实测中踩过的坑。1. ADC到底是个什么东西1.1 从两个世界说起模拟信号与数字信号我们生活的物理世界本质上是连续的。电流、电压、温度、压力、光照、声音这些物理量在时间上和幅值上都是连续变化的属于模拟信号。而单片机、DSP、FPGA这些数字器件只认0和1处理不了连续的电压变化。ADC全称Analog-to-Digital Converter也就是模数转换器干的事就是把连续变化的模拟电压按一定规则“切”成有限数量的离散数字值。它夹在模拟世界和数字世界中间是整个信号链的必经之路。可以把它理解成一个翻译官传感器输出一个模拟电压告诉你“当前温度对应1.25V”MCU不认识1.25V只认识数字ADC把1.25V翻译成一个数比如2680MCU拿到这个数字再进行换算就知道了真实温度是多少。没有ADCMCU面对模拟信号基本就是个瞎子。1.2 为什么非要有个ADC有朋友可能会问模拟信号直接接比较器、运放做门槛判断不行吗行很多场景确实不用ADC。比如过流保护用比较器设置一个阈值超过就翻转信号去关断这比ADC快得多也便宜得多。但问题在于比较器只能告诉你“大还是小”不能告诉你“到底多大”。实际工程里我们需要知道具体数值的情况太多了。电池电压要监测剩余电量NTC热敏电阻要精确换算温度音频信号要采集波形电机相电流要闭环控制光伏板要追踪最大功率点……这些都需要ADC把模拟量数字化让算法去处理。ADC的精度和速度直接决定了整个系统的测量水平。1.3 ADC在信号链里的位置一个典型的模拟采集链路是传感器 → 信号调理电路放大、滤波、电平偏移→ ADC → MCU/处理器 → 执行机构或显示。ADC处在信号链的核心枢纽位置。传感器拾取的物理量经调理后变成适合ADC输入范围的电压ADC负责量化和编码把模拟电压变成二进制数据。后面不管是做PID控制、FFT分析还是数据存储都建立在这一串数字之上。所以ADC选型是否合理、参数配置是否正确直接影响整个系统的上限。这也是为什么我把这篇文章的重点放在原理和参数上而不是单纯告诉你“点这个按钮就能采集”。2. ADC是怎么工作的核心原理拆解2.1 采样与保持一闪而过的信号怎么“留住”ADC工作第一步是采样Sampling。模拟信号在时间上是连续的但ADC没法每时每刻都盯着信号看它只能“抓拍”。这就像用相机拍快速飞行的鸟快门打开瞬间感光元件记录当前画面。采样之后还要保持Hold。ADC把信号“抓”进来后不能马上完成转换需要一点时间做后续的量化、编码这时候必须把抓到的电压值稳稳“冻住”否则信号一变后面的比较就乱了。这就是采样保持电路的作用采样开关闭合让保持电容快速充电到当前输入电压开关断开后电容电压保持不变ADC再对着这个稳定的电压去做转换。采样保持过程对精度影响很大。采样时间太短电容没充满就开始转换读数会偏低采样时间太长又会拖慢整体转换速度。所以MCU的ADC外设里基本都有可配置的采样周期这个参数后面会细说。2.2 量化与编码连续值变成阶梯值采样把时间上的连续问题解决后还有幅值上的连续问题。模拟电压可以是任意值比如1.2537V、1.2538V但数字世界里没有“无限细分”只能用有限个级别去逼近真实值。这个过程叫量化Quantization。以一个12位ADC、参考电压3.3V为例它能把0到3.3V的区间分成2的12次方也就是4096个台阶。每个台阶的高度是3.3V除以4096约等于0.000806V也就是0.806mV。ADC输出的12位数字本质上就是告诉你“输入电压落在第几个台阶上”。量化必然带来误差因为真实电压很少恰好落在台阶中心。最坏情况下误差是半个LSB最低有效位。这个误差被称为量化噪声是ADC精度下限的根本原因之一再理想的ADC也无法消除它。量化完成后ADC把台阶序号转成二进制数字。比如输入1.65V接近第2048个台阶12位数字输出就是二进制100000000000也就是十六进制的0x800。这就是编码Encoding。2.3 常见ADC架构分类同样是做ADC内部实现方式差异很大。常见的架构有逐次逼近型SAR、积分型、闪速型Flash、流水线型和Sigma-Delta型。每种架构在速度、精度、功耗、成本上各有取舍没有绝对好坏只有适不适合。逐次逼近型SAR是MCU里最常用的架构。它内部有一个比较器、一个数模转换器DAC和一个逐次逼近寄存器。工作方式像猜数字游戏先假设最高位是1把对应电压和输入比较如果输入更大说明猜小了保留这一位如果输入更小说明猜大了撤销这一位。接着猜下一位直到把每个二进制位都确定下来。12位ADC需要12次比较就能出结果速度不慢功耗低芯片面积小所以STM32、NXP等主流MCU的片内ADC基本都是SAR型。积分型ADC用运放对输入电压积分再用参考电压反向积分通过两次积分的时间比值算出输入电压。这种架构对工频干扰有天然抑制作用精度可以做到很高但转换速度很慢常见于数字万用表。你去测市电环境的低频信号用双斜率积分ADC效果反而好。Flash型并联比较型是用2的N次方减1个比较器把输入电压和所有参考阶梯同时比较一次并行出结果。速度极快几个纳秒就能完成一次转换但每增加一位比较器数量翻倍12位需要4095个比较器芯片面积和功耗都大得离谱所以一般只做低位数高速度场景。流水线型把多个低分辨率Flash级联起来一级转换完残差传给下一级兼顾了速度和精度常用于高速数据采集、通信基站、视频处理这类场景但单片MCU里很少集成。Sigma-Delta型走的是另一条路它用很低的位数甚至1位配合极高的采样率通过噪声整形和数字滤波换取高分辨率。就好比拿一把粗尺子量长度但反复量几千次再平均也能量出很精细的结果。这种架构特别适合音频采集、称重传感器、温度测量等低速高精度应用。很多MCU内部也集成了Sigma-Delta型ADC专门用来做高分辨率测量。2.4 各架构怎么选一张表说清楚架构速度精度功耗典型应用SAR逐次逼近型中高中高低MCU片内ADC、工业控制、电池监测积分型低高中万用表、低频精密测量Flash闪速型极高低高高速示波器前端、射频通信流水线型高中高中高视频采集、雷达、高速数据采集Sigma-Delta型低极高中音频编解码、称重、精密传感器选型口诀是低速高精度找Sigma-Delta中等速度兼顾功耗找SAR追求极端速度只能上Flash或流水线。大多数嵌入式项目用MCU自带的SAR型ADC就够了不必外挂ADC除非你确实需要更高的精度或更快的采样率。3. ADC的工作模式详解3.1 单次转换模式单次转换是最基础的模式。你给ADC一个触发信号它转换一次结果放进数据寄存器转换结束标志位置位然后停下来等你取数。这个模式适合低频采样场景。比如一块电池供电的产品每10秒检测一次电池电压中间大部分时间系统可以进入低功耗模式需要测电压时唤醒ADC转换完再睡回去。典型做法是配置一个定时器中断每隔固定时间在中断里启动一次ADC转换或者在主循环里定期读取。单次模式坑比较少的主要注意一点转换结果读取时机要正确。有的芯片在转换完成后没有及时读走数据下一次转换会覆盖寄存器旧数据就丢了。确保每次都等EOC转换结束标志置位后再读不要盲读。3.2 连续转换模式连续转换模式下ADC转换完一个通道后立即开始下一次转换不需要重新触发。数据寄存器会不断刷新。这个模式适合需要实时连续跟踪信号的场合。比如电机控制里的相电流采集控制环每个周期都要拿到最新的电流值再比如音频波形采集、电源电压纹波监测都需要ADC持续工作。但连续模式有个问题如果CPU来不及读取新数据会覆盖旧数据你拿到的是最新值但中间可能丢了好几次。所以连续模式一般配合DMA使用转换结果由DMA自动搬到内存缓冲区CPU最后批量处理。这个组合是实际项目里最常用的采集方案。3.3 扫描模式与多通道采集如果系统里有多路模拟量要采集比如同时测三相电压、多处温度传感器可以开启扫描模式。扫描模式下ADC会自动按照配置的通道顺序从通道0到通道N逐个转换一轮转换完成后触发中断或DMA请求。配合DMA扫描模式可以做成非常简单的“全自动采集流水线”ADC自己排队转换DMA把每路结果按顺序搬进缓冲区CPU完全不用干预一轮结束取走数组就行。缓冲区里每个索引对应一路信号数据处理起来特别舒服。需要注意的是扫描模式下各通道之间最好用同一个采样时间否则转换时间会受影响。另一个采坑点是多通道切换时如果信号源内阻较大前几个通道的值可能受到上一路信号的残留影响。解决办法是在每个通道转换完成后稍作延时或者对传感器输出加一级运放缓冲。3.4 注入模式与外部触发注入模式是STM32系列ADC的一个特色功能。它允许在常规转换规则组正在进行时强行插入一个高优先级转换组。注入组的转换可以打断规则组转完再恢复规则组继续。这个功能在实际工程中非常实用。比如电机控制器里规则组在循环采集三相电流突然某一路母线电压出现异常需要立刻采样这时候就可以把母线电压放到注入组配合外部引脚触发或定时器触发无论规则组转到哪里注入组都能快速响应转换完毕自动回到规则组。如果不用注入模式就只能在主循环里轮询母线电压响应速度很难保证而且会和电流采样过程相互干扰。注入组就是专为这种“高优先级随机事件”准备的。外部触发模式则解决“什么时候开始转换”的问题。可以用PWM定时器的更新事件或比较输出来触发ADC这样采样时刻可以精确锁定在PWM周期的特定相位尤其适合电机控制应用中在PWM开关噪声最小时刻采样电流。3.5 DMA模式不占CPU的搬运工DMA直接内存访问模式在现代MCU的ADC应用中几乎必不可少。它的原理很简单ADC转换完成后数据不再走CPU中转而是由DMA控制器直接把数据从外设寄存器搬运到指定的内存地址。为什么要用DMA因为连续模式扫描模式下ADC每秒可能产生几十万甚至几百万个数据点如果每次都让CPU去读寄存器再存内存中断开销会占满整个CPU资源核心算法根本跑不动。DMA把数据搬走了CPU只需要在缓冲区满的时候处理一次。比如用ADCDMA采集一段音频DMA存满4096个点后触发一次中断CPU取走做FFT分析然后DMA继续存下一批。DMA模式有个细节需要说下DMA传输大小要和你定义的数据缓冲区匹配而且传输模式要设置成循环模式否则缓冲区满一次就停了。另外DMA搬运的是连续排列的数据扫描模式下通道顺序要和DMA缓冲区的索引顺序对得上否则最终数据分不清哪路是哪路。3.6 模式选择经验总结低频间隔测量单次转换模式 定时器唤醒省电优先。实时不断采集连续转换模式 DMA吞吐优先。多路传感器巡检扫描模式 DMA按固定周期刷新一遍所有通道。高优先级紧急采样注入模式 外部触发保证某一关键信号能随时插入。精确定时采样定时器触发ADC DMA采样点严格对齐PWM周期。实际项目里几种模式经常会组合使用。比如一个完整的电机控制工程规则组用扫描模式采集三相电流和母线电压DMA循环搬运注入组挂一个紧急过流信号一触发就立即采样并置标志去关断驱动同时主循环还在愉快地跑算法互不干扰。4. 基本参数逐个吃透4.1 分辨率位数不是越高越好分辨率指ADC输出数字量的位数常见有8位、10位、12位、16位、24位等。它决定了ADC能把参考电压范围分成多少个台阶。12位ADC能分出4096个台阶16位能分出65536个台阶24位更是能分出1677万个台阶。分辨率越高能够分辨的最小电压变化越小。但“够用”和“越高越好”是两码事。高分辨率ADC本身价格高而且对噪声更敏感如果系统底噪都超过了最低位那高位纯粹是在放大噪声没有实际意义。举个例子12位ADC、3.3V参考理论上能分辨0.806mV的电压变化。如果信号链上有10mV的噪声那LSB级别以下的信息全部被噪声淹没了。这时候提升分辨率不如去降噪、稳定参考电压。选分辨率要和系统噪声水平、成本、处理速度一起权衡。4.2 采样率与采样周期采样率是指ADC每秒完成转换的次数单位是Sa/s每秒采样次数。根据奈奎斯特采样定理要无失真还原一个最高频率为f的信号采样频率必须不低于2f。否则信号会混叠产生假频率成分。实际工程中一般取3到10倍甚至更高。对于MCU的SAR型ADC实际采样率由ADC时钟频率和采样时间共同决定。以STM32为例ADC时钟最高可以工作到几十MHz每次转换总时间等于采样周期加转换周期。采样周期可配置成1.5到239.5个ADC时钟周期转换周期对于12位分辨率固定是12.5个周期。总时间算出来倒过来就是最大采样率。实际选采样周期时要考虑外部信号源内阻给采样电容充电的速度。信号源阻抗大采样时间就要给长一些。我习惯的做法是先在低速下试采样观察读数是否随采样时间变化如果读数在增加说明采样时间不足电容没充满。4.3 参考电压Vref的选择参考电压Vref决定了ADC的满量程输入范围是ADC能测量的“尺子”。STM32内部通常有VREF引脚也可以用内部参考电压VREFINT。Vref有多重要ADC输出数字量输入电压除以参考电压再乘以满量程数值。如果参考电压飘了1%那所有测量结果都会飘1%。更麻烦的是如果Vref噪声大转换结果会伴随明显的随机跳动。我遇到过一次ADC读数跳的问题排查到最后发现是主板上的3.3V开关电源纹波高达几十毫伏而VREF直接接在了这路3.3V上。解决办法是单独用一颗低噪声LDO给VREF供电或者用高精度基准芯片输出一个稳定的2.5V或3.0V。精密测量场合推荐用外部基准源比如REF3030、ADR360这类电压基准IC温度系数低、噪声低。普通消费电子用一颗单独的LDO供电就够了关键是干净、稳定。Vref选择还有一个容易忽略的细节不要让输入信号电压太接近Vref上限最好留出5%到10%的余量否则信号接近满量程时线性度通常会变差。4.4 信噪比与有效位数信噪比SNR指信号功率与噪声功率之比单位dB。对理想ADC理论SNR可以由一个固定公式估算出来SNR 6.02 × N 1.76 dB其中N是ADC位数。12位理想ADC的SNR大约是74dB16位约98dB。这个公式经常被拿来做参数记忆也用来反推实际精度。有效位数ENOB比标称位数更能反映真实精度。它把实际SNR代入公式反解ENOB (实际SNR - 1.76) / 6.02举个例子某ADC标称12位实测SNR只有68dB那么ENOB (68 - 1.76) / 6.02 ≈ 11位。说明这个12位ADC实际有效精度只有11位多出来的1位没有意义。所以看ADC性能不能只盯位数要关注ENOB。数据手册里一般同时给出SNR、ENOB和总谐波失真做高精度采集时要重点看这些指标而不是被“24位”这种宣传词迷惑。4.5 线性误差INL和DNL线性误差描述ADC实际转换曲线偏离理想直线的程度分为积分非线性和微分非线性两类。INL表示实际传输曲线整体偏离理想直线的最大偏差单位是LSB。理想情况下输入电压和输出数字量应该呈一条直线。但实际会因为电阻失配、电容失配等原因在中间某些区段偏离直线。INL大意味着你按线性公式换算电压时某些区间会有固定偏差校准起来比较麻烦。DNL描述相邻两个数字码对应的模拟台阶宽度和理想台阶宽度的偏差。如果某一级的DNL小于负数的一个LSB也就是低于-1LSB就会出现丢码现象也就是某些数字码永远不会出现。这在很多测量场景下是致命的比如做数据采集丢码会导致波形出现毛刺或断点。普通MCU内置ADC的INL和DNL通常在正负1到正负3LSB之间做常规控制够用。如果追求更高线性度就要考虑外置ADC或自己加校准算法。4.6 偏移误差和增益误差偏移误差Offset Error指输入电压为零时ADC输出的数字量对应的电压偏离零点的程度。比如理想情况下输入0V输出0实际可能输出3、4个LSB这就是偏移误差。它会让整个测量曲线整体上下平移表现为“零底数”不为零。增益误差Gain Error指实际传输曲线的斜率与理想斜率的偏差。表现为输入满量程时输出数字量对应的电压偏离满量程的程度。比如输入3.3V应该输出4095实际可能是4080少了15个LSB。这两种误差在工程上通常可以在固件里做两点校准来消除选零点采样一次记录偏移量选满量程附近采样一次记录增益系数再对每次测量结果做线性校正。我做过的一个温控设备采样电路出厂前就做一次两点校准把偏移和增益误差全部校正到0.1%以内效果很明显。5. 实测中的常见问题与排查5.1 读数跳动该从哪里查起ADC读数跳动是最常见的问题可能原因太多了按优先级排查顺序先查参考电压是否干净再看信号源波形是否有毛刺接着检查采样时间是否充足最后考虑软件数据处理方式。在硬件上先用示波器看Vref引脚的纹波如果纹波超过几个毫伏优先处理电源。再看被测信号输入端如果信号本来就有噪声在ADC输入和地之间加一个100nF左右的陶瓷电容做滤波。采样时间不够的问题会被误认为“读数偏低”比如接一个稳定的1.5V电压读数在1.2V附近多半是采样电容没充满。软件上可以加滑动平均或中值滤波。我实际项目中常用的组合是先做一个5点中值滤波剔除尖峰毛刺再做16点滑动平均平滑数据效果比单纯增加滤波器阶数好很多。还有一个小技巧如果ADC有多个通道可以在配置里把未使用的通道也加上输出固定电平然后软件丢弃这些“假通道”数据等于在时间上给真实通道留出缓冲减少模拟开关切换带来的串扰。5.2 参考电压噪声是隐藏杀手很多初学者一直纠结算法、滤波却忽略了一个基础事实ADC的每一步转换都是拿输入电压和参考电压做比较。参考电压抖动测量结果就会跟着抖。我做个一个实验同一块板子Vref用主板3.3V直连时ADC低8位一直在跳动改成独立LDO供电后低4位就非常稳定了。如果项目对精度要求高建议从原理图阶段就把Vref独立供电或者用基准源芯片这点投入很值得。另外如果你用的是STM32它内部有一个VREFINT通道专门用来在Vref不稳时做参考校准。原理是先采集内部固定电压VREFINT的实际数字值用理想值反推当前实际的Vref再对通道测量结果做补偿。这个方法要求VREFINT本身稳定但至少能在一定程度上修正Vref漂移。5.3 ADC接口的防护问题ADC引脚通常直接连到传感器、接插件外部干扰或静电可能顺着线打进来所以接口防护不能省。最简单也最有效的防护是在ADC引脚前串一个小电阻再并一个接地的电容组成RC低通网络既滤除高频噪声又提供一定ESD缓冲。电阻通常选100Ω到1kΩ电容选1nF到100nF。注意RC的截止频率要高于你关心的信号频率否则把有效信号也滤掉了。对更恶劣的环境比如引线比较长、靠近电机或开关电源应该在输入端加TVS管。TVS管要选截止电压高于ADC满量程、嵌位电压低于ADC绝对最大额定值的型号这样才能既保护引脚又不影响正常工作。顺便说一句如果被保护信号频率太低RC网络会影响采样时间这时候要在采样时间计算里加上外接电容的充电影响否则采样率上不去。5.4 常见问题速查表现象可能原因排查思路读数持续跳动参考电压纹波大、信号线受干扰示波器看Vref和信号波形加滤波电容读数明显偏低采样时间不足增大采样周期确认信号源内阻某个通道值偏大/偏小扫描通道顺序错乱、通道间串扰检查DMA缓冲区排布加通道间隔偶尔冒出极大或极小值电源瞬态干扰、ESD脉冲、连接器虚接软件中值滤波硬件加TVS和RC测量结果随温度漂移参考电压温度系数大、PCB焊接应力换精密基准软件校温漂高分辨率模式无效果噪声底太大、有效位数受限降噪为主别迷信位数排查ADC问题我强烈建议先把采样时间调到最大把信号源接到一个非常稳定的电压上看转换结果是否稳定。如果最大采样时间下读数都不稳问题基本在参考电压或信号源本身而不是采样配置。5.5 我的一个实用排查案例去年调试一个电力仪表项目ADC采集电压电流值发现50Hz的采样结果一直有轻微波动但不是50Hz工频而是一个奇怪的频率。后来用示波器追踪发现DMA中断处理程序里有一个稍耗时的浮点运算导致每次读DMA缓冲区的时刻偏移等效于采样间隔抖动。解决办法很简单把浮点运算移到缓冲区数据处理之前或者用双缓冲机制DMA在写一块缓冲区时CPU处理另一块互不干扰。这类问题在高速采集里很容易被忽略采样时钟本身是准的但软件读取时序不稳同样会引入额外噪声。所以做ADC采集软件时序和硬件设计一样重要。任何在采样中断里做耗时操作的行为都要尽量避免。我个人在实际操作中最大的体会是ADC做出来容易做准很难。很多人觉得配置一下寄存器、读回来一个数就完事了但真正到一个产品里参考电压、信号调理、采样时间、DMA调度、滤波算法每一环都可能成为精度瓶颈。最后分享一个小技巧批产的产品里如果每块板的ADC精度参差不齐可以在量产测试阶段给每块板做一次简单的零点校准和满量程校准把偏移误差和增益误差存到Flash里上电时读出来对测量结果做线性校正。这个方法成本极低但能把产品一致性提升一个档次。ADC这个东西你对它认真它才会对你认真。
返回列表