ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Σ-Δ ADC高精度采集:过采样、噪声整形与工程实战

Σ-Δ ADC高精度采集:过采样、噪声整形与工程实战 1. 认识Σ-Δ ADC为什么高精度测量的活儿总落到它头上做模拟前端的人大概都有过这样的经历板子焊完代码跑通屏幕上的数值却像心电图一样上下乱蹦末位三四个数字根本没法定住。你换基准、加电容、改走线折腾一圈之后发现问题往往不在你的电路水平而在于选错了转换架构。Σ-Δ ADC 就是在这种场景下被反复拿出来讨论的东西——它能把 24 位甚至 32 位的分辨率做实让微伏级的信号变化在数字域里被清楚地看见。它常出现在电子秤、压力变送器、热电偶采集、电桥测量、音频前端、电能计量这些地方本文适合已经会写基础 ADC 采样代码、但被噪声和跳动折磨过的嵌入式工程师也适合刚接触精密测量的硬件新手。严格说数模转化这个说法其实是口语里的混用。ADC 干的是模数转换把连续的模拟电压变成离散的数字码DAC 才是数模转换把数字码还原成模拟电压。两者方向相反但内部的量化、基准、采样这些底层概念高度重合所以很多人图省事就统称数模转化。本文聊的是 Σ-Δ 架构在模数方向上的实现也就是 ADC 这一侧。Σ-Δ 这个名字来自它内部的两个核心动作求和Σ与差分Δ。它不像逐次逼近那样一次比较出结果而是用一种以快换准的思路——先做极高速但极粗糙的 1 位量化再靠过采样和噪声整形把精度一点点从噪声里抠出来。理解了这个思路你才能明白为什么它采样率不高却能做到 24 位也才能明白为什么它的输出总有延迟、为什么它对基准和时钟那么敏感。1.1 先把ADC和DAC分清楚数模转化这个说法怎么来的要讲清楚 Σ-Δ ADC得先把两个方向捋顺。模数转换Analog to Digital是输入模拟电压、输出数字码关注的是分辨率、信噪比、积分非线性、失调与增益误差。数模转换Digital to Analog是输入数字码、输出模拟电压或电流关注的是建立时间、毛刺能量、输出摆幅。两者共用基准电压这个概念也都受量化误差约束所以在很多教程里被放在一起讲久而久之就出现了数模转化这种笼统的叫法。我自己习惯这样区分看信号流向。传感器出来的电压进 MCU那是 ADCMCU 输出一个控制电压去驱动执行器那是 DAC。这个区分在排查问题时特别有用因为两者的噪声来源完全不一样。ADC 侧最怕的是输入端的干扰和基准抖动DAC 侧最怕的是输出级的负载变化和码字跳变引起的瞬态。还有一类芯片把两者做在一起标注成 ADC/DAC比如音频编解码器、某些精密测量 SoC。这类芯片里 ADC 和 DAC 通常共用基准和部分模拟前端布局上要格外注意数字回流路径不要穿过模拟区否则 DAC 输出的跳变会直接耦合进 ADC 的输入表现出来就是一播放声音采集数据就抖这个坑我踩过不止一次。所以当你看到高精度数模转化这个词先确认它说的是哪个方向。本文后面所有的内容都围绕模拟输入到数字输出这条链路展开。1.2 三种主流ADC架构的横向对照选 ADC 之前先看一张对照表比看十页数据手册都管用。下面这张表是我自己总结的版本参数是典型量级具体型号会有出入但趋势不会错。架构典型分辨率典型速率优势短板典型场景逐次逼近 SAR8~18 位几十 kSPS ~ 几 MSPS无延迟、功耗低、单次转换高分辨率下难做、对驱动要求高电机控制、快速采样、通用采集Σ-Δ16~32 位几 SPS ~ 几百 kSPS分辨率极高、抗混叠好有群延迟、速率低称重、温度、电桥、音频流水线 Pipeline10~16 位几十 MSPS ~ 几 GSPS高速高分辨率兼顾功耗大、有延迟、成本高通信接收、雷达、示波器这张表里最关键的一列是短板。很多人选型只看分辨率忽略了群延迟。Σ-Δ 的输出不是这一瞬间的电压而是过去一段时间电压的平均抽取滤波器的阶数越高延迟越大。做闭环控制的时候如果你用 Σ-Δ 去采电流环反馈又要求环路带宽很高那延迟会直接把相位裕度吃掉系统就开始振荡。这种问题在实验室里很难复现因为它在特定负载下才出现。反过来说如果你做的是静态或缓变量的测量比如称重、压力、温度信号带宽只有几赫兹到几十赫兹那 Σ-Δ 几乎是唯一合理的选择。它自带的数字滤波器把高频噪声切得很干净你甚至不需要在模拟端放很陡的抗混叠滤波器省了运放、省了调试时间。1.3 Σ-Δ在什么场景下不可替代有几类活是 Σ-Δ 的专属地盘。第一类是桥式传感器比如应变片、称重传感器输出满量程只有几毫伏到几十毫伏信噪比要求极高而且经常要分辨十万分之一的变化。第二类是热电偶和 RTD 测温信号本身很小还要做冷端补偿。第三类是电能计量需要同时保证线性度和动态范围。第四类是音频采集人耳对噪声极其敏感Σ-Δ 在音频领域几乎是默认方案。这些场景有个共同点信号带宽低但对分辨率的要求接近物理极限。用 SAR 硬做你需要一个噪声极低的驱动运放、一个极其干净的基准、一层严格的屏蔽成本往往比直接用 Σ-Δ 芯片还高而且良率不稳定。Σ-Δ 把这些难题转移到了数字域用滤波和平均来换精度工程上更好把控。不过也别把它神化。Σ-Δ 在高速场景下确实没优势几百 kSPS 以上的高分辨率采集还是要回头看 SAR 或者流水线。选型的本质是权衡不是找最好的。2. 核心机制拆解过采样与噪声整形怎么把精度做出来这部分是理解 Σ-Δ 的关键也是很多人看数据手册时直接跳过的地方。跳过之后的后果是你知道它分辨率高但不知道为什么高你知道要配滤波器但不知道该配多慢。一旦现场出问题就没有下手的地方。我尽量用生活化的方式把它讲透再补上可以手算的公式。先记住一个总纲Σ-Δ 提升精度靠的是两次交换。第一次是过采样用时间换精度采样率越高落在信号带宽内的噪声越少。第二次是噪声整形用结构换精度把量化噪声从低频搬到高频再用数字滤波器把高频部分扔掉。两次交换叠加分辨率就上去了。2.1 量化噪声到底长什么样任何 ADC 都绕不开量化。一个 N 位转换器的最小刻度是 LSB VREF / 2^N。把连续电压映射到离散码字时产生的误差在 ±0.5 LSB 之间随机分布。如果输入信号足够乱这个误差可以近似看成在 [-LSB/2, LSB/2] 上均匀分布的白噪声它的功率是量化噪声功率 σ² LSB² / 12 (VREF / 2^N)² / 12这个噪声总功率是固定的但它分布在多宽的频率范围里决定了信号带宽内能分到多少。如果采样率是 fs那么从直流到 fs/2 这整个奈奎斯特区间里噪声是均匀铺开的。你的信号只占其中很小一段叫做信号带宽 BW。于是信号带宽内的噪声功率就是总功率乘以一个比例BW / (fs/2)。这个比例越小你分到的噪声越少信噪比就越高。这就是过采样的全部秘密没有更玄的东西。理想 N 位 ADC 的信噪比有个经典公式SNR 6.02N 1.76 (dB)这个 1.76 来自量化噪声的均匀分布假设是个常数。它说明每增加 1 位分辨率信噪比提升约 6 dB。理解这个数字很重要因为它就是后面所有计算的基准尺子。2.2 过采样用速度换分辨率的第一次交换如果我把采样率提高到信号带宽的 OSR 倍也就是 fs OSR × 2 × BW那么落在信号带宽内的噪声功率就变成原来的 1/OSR。信噪比因此提升ΔSNR 10 × log10(OSR)换算一下OSR 每翻一倍信噪比提升约 3 dB也就是半位分辨率。想靠纯过采样提升 1 位分辨率6 dB需要 OSR 翻四倍。这个效率太低了24 位靠纯过采样根本不可能——你需要 OSR 达到 4^23这是个天文数字。所以纯过采样救不了场必须上噪声整形。这里有个容易忽略的点过采样要求输入信号在采样前不能被混叠污染。虽然 Σ-Δ 内部的数字滤波器对带外信号有抑制但那是针对已经进入调制器的信号。如果高频干扰在采样瞬间被折叠进带内滤波器是救不回来的。这就是为什么模拟端仍然需要一个简单的 RC 抗混叠网络哪怕它只要一阶。2.3 噪声整形把噪声赶到高频去Σ-Δ 调制器的结构是一个差分放大器加积分器再进一个 1 位比较器比较器的输出通过 1 位 DAC 反馈回输入端。这个反馈回路构成了一个负反馈系统对信号是低通对量化噪声是高通。用 z 域写出来更清楚。一阶调制器的噪声传递函数是NTF(z) 1 - z⁻¹它的幅频响应是 |NTF| 2 × sin(πf / fs)。在低频处f 很小sin 很小噪声被强烈压制在高频处接近 fs/2 时|NTF| 接近 2噪声被放大。也就是说量化噪声没有消失只是被搬到了高频。而信号传递函数 STF(z) z⁻¹对信号是纯延迟幅频响应是平的信号毫发无伤。一阶整形的效果是信号带宽内噪声随频率的分布变成了二阶上升整体信噪比提升为ΔSNR 30 × log10(OSR) - 5.17 (dB)每翻倍 OSR 提升约 9 dB也就是 1.5 位。比纯过采样的 3 dB 好多了但还是不够。于是有了二阶调制器NTF(z) (1 - z⁻¹)²信噪比提升变成ΔSNR 50 × log10(OSR) - 12.9 (dB)每翻倍 OSR 提升约 15 dB等于 2.5 位。三阶、四阶依次往上推但阶数越高稳定性越难保证因为反馈环路的相位裕度在减少。工程上常见的是二阶和三阶四阶以上往往需要更复杂的补偿结构属于芯片设计层面的活用的人不用深究。注意噪声整形并没有降低总的量化噪声功率它只是改变了分布。如果你把采样数据直接做宽带分析会发现高频段的噪声比普通 ADC 还大。这是正常现象别以为芯片坏了。2.4 抽取滤波1bit码流怎么变成24bit结果调制器输出的是 1 位高速码流速率等于采样率 fs比如几百 kHz 到几 MHz。这个码流里包含了信号和大量被搬到高频的噪声所谓的抽取滤波器要干两件事把高频噪声滤掉把速率降下来。这两个动作合并在一起叫抽取英文 Decimation。注意它和抽取在统计学里的含义不同这里是滤波加降采样。最常见的滤波器结构是 sinc³也叫三级积分梳状滤波器。它的频响在直流处增益为 1在 fs/OSR 的整数倍处有零点正好把降采样会混叠进来的频率点压死。sinc³ 的冲激响应长度是 3 × OSR 个采样点所以它的建立时间是 3 个输出周期。这句话翻译成工程语言就是当你切换输入通道或者改变增益之后至少要等 3 个转换周期输出才可信。很多人多通道采集时发现第一帧数据总是偏大或者偏小原因就在这里。滤波器的输出就是最终的数字码位宽通常做到 24 位。注意这 24 位里并不是每一位都有效实际有效位数取决于信噪比。所以数据手册上会写24 位无失码和有效分辨率 21.5 位这种表述前者说的是码字都是单调的后者说的是真实精度。选型时要看后者。2.5 一组完整的参数计算示例光说公式没有体感我拿一组数字走一遍。假设我用一个二阶 Σ-Δ 调制器内部 1 位比较器输出速率 fs 256 kHz目标信号带宽 BW 1 kHz。那么过采样率 OSR fs / (2 × BW) 256000 / 2000 128。先算二阶整形的信噪比增量ΔSNR 50 × log10(128) - 12.9 50 × 2.107 - 12.9 105.35 - 12.9 92.45 dB再加上基础项1 位量化器的信噪比是 6.02 × 1 1.76 7.78 dB。所以总信噪比约为 100.2 dB。换算成有效位数 ENOBENOB (SNR - 1.76) / 6.02 (100.2 - 1.76) / 6.02 ≈ 16.4 位看到了吧1 位比较器加二阶整形加 128 倍过采样理论有效位数 16 位多。实际芯片里会做到二阶以上或者把采样率提得更高才能到 20 位以上。这组计算的价值在于你可以反推如果我要 20 位有效分辨率在二阶结构下需要多大的 OSR20 位对应 SNR 20 × 6.02 1.76 122.2 dB 需要 50 × log10(OSR) - 12.9 7.78 122.2解得 log10(OSR) 2.546OSR ≈ 352也就是说采样率要做到 704 kHz 以上。这个数字直接决定了你的芯片选型和时钟设计比盲目试参数靠谱得多。实际设计还要留 6~10 dB 余量给基准噪声和热噪声所以 OSR 建议再往上放一档。3. 硬件设计从参考电压到PCB布局的落地细节原理懂了接下来是把纸面性能变成实测性能。这一步的差距往往比想象的大——同一个芯片不同人画出来的板子有效位数能差 4 到 5 位。差距不在原理图而在细节。下面这几节是我在多个项目里反复验证过的做法。3.1 参考电压VREF的选择与噪声预算Σ-Δ 的转换结果本质上是输入电压与基准电压的比值所以基准的任何抖动都会直接乘到结果上。一个 0.1% 的基准波动会带来 0.1% 的读数误差。对 20 位系统来说0.1% 相当于 1000 个 LSB这是灾难性的。先做噪声预算。假设目标是 20 位有效分辨率、满量程 2.5 V那么 1 个 LSB 是 2.5 / 2^20 ≈ 2.38 μV。基准噪声折算到输入端要求大约控制在 1 μV 以内才能不成为瓶颈。这个量级下普通的 LDO 输出直接当基准是绝对不行的它的噪声通常在几十 μV 到几百 μV。我的常规做法有三条。第一用专用的基准芯片比如初始精度 0.05%、温漂 5 ppm/°C 以内的型号输出噪声密度在 1 μVpp 级别。第二基准输出端加两级 RC第一级 10 Ω 加 10 μF第二级 10 Ω 加 0.1 μF把高频噪声滤掉。注意串联电阻要小否则基准的负载调整率会变差。第三如果基准芯片有噪声抑制引脚一定要接电容而且要走最短路径回到芯片地。还有一个容易被忽略的点基准的负载电流会随转换过程变化。Σ-Δ 内部的采样电容在充电瞬间会从基准抽取电流尖峰如果基准的瞬态响应跟不上就会出现与转换速率相关的周期性误差表现为频谱上出现 fs 及其倍频的杂散。解决办法是在基准引脚紧靠芯片的位置放一个 0.1 μF 到 1 μF 的陶瓷电容路径长度控制在 5 mm 以内。另外如果设计里同时有 ADC 和 DAC基准的分配要慎重。DAC 输出的码字跳变会通过共用基准耦合到 ADC这种耦合很难在后期消除。条件允许的话给 ADC 单独一路基准是最省心的方案。3.2 模拟前端与采样电路设计传感器到 ADC 之间那段电路决定了你能不能用满芯片的分辨率。标准的 ADC 采样电路其实很简单传感器、可能一级缓冲、一个差分 RC 滤波器、进 ADC 输入。复杂的地方在于取值。先说 RC。Σ-Δ 的内部采样电容会周期性充电形成电流尖峰。如果信号源阻抗太高这个尖峰来不及被吸收就会产生误差。经验值是源阻抗乘以采样电容得到的时间常数要小于采样窗口的 1/5。以常见的 8 pF 采样电容为例如果采样窗口是 1 μs那么源阻抗要控制在 25 kΩ 以内。这就是为什么高阻传感器比如某些 pH 电极、光电二极管前面一定要加缓冲运放。差分 RC 的取值也有讲究。电阻取 1 kΩ 到 10 kΩ电容取 0.1 μF 到 1 μF构成的截止频率要在信号带宽的 5 到 10 倍以上目的是不让它影响有用信号同时把高频干扰压下去。两个电阻要相等误差控制在 0.1% 以内否则会破坏共模抑制。再说共模电压。很多 Σ-Δ 的差分输入有严格的共模范围通常在 (AVDD/2) ± 0.1 V 左右。如果信号源的共模偏离太多输入级会进入非线性区表现为增益误差和失真。处理办法是给一个共模偏置网络用两个等值电阻从基准或者 AVDD/2 分压出来接到差分输入的两个端子。这个网络会引入噪声所以分压电阻不宜太大建议 10 kΩ 以内并配一个 0.1 μF 的旁路电容。还有一个实操细节如果传感器是电桥激励源的选择比什么都重要。用电压激励时激励源的噪声会按比例传到输出用电流激励时情况类似。所以高端方案会用比例式测量——把电桥激励和 ADC 基准接在同一路电压上。这样激励的漂移在比值运算中被消掉只剩下噪声项。这一招在称重行业是标配能省掉一个高精度基准。3.3 端口保护与限幅工业现场的 ADC 输入口是最容易被打坏的地方。传感器线缆动辄几米感应雷、静电、电源串扰都会顺着线进来。芯片手册上标的绝对最大输入电压通常只比 AVDD 高 0.3 V超过就击穿内部保护二极管。我的标准防护结构是三级。第一级是串联限流电阻取值 1 kΩ 到 10 kΩ功率要够至少要承受可能的浪涌能量。第二级是 TVS 或者肖特基钳位二极管把电压钳到 AVDD 0.3 V 以内注意选低电容型号否则会影响信号带宽。第三级是芯片自带的 ESD 结构靠前两级把能量消耗掉让它只处理残余。这里有个常见错误只在差分线的一根上加保护另一根忘了。差分输入的共模电压会被单边钳位拉偏超过共模范围芯片直接就不工作了。正确的做法是两根线都要加而且参数要尽量对称。对于电流采集还有个细节是采样电阻的位置。高边采样共模电压高需要共模抑制能力强的运放或专用电流检测放大器低边采样简单但会破坏系统地的完整性在多路采集时容易串扰。这个取舍要看具体系统没有万能答案。3.4 电源、地平面与时钟这一节的内容在老工程师眼里是常识在新手眼里常常被忽略。Σ-Δ 的电源抑制比虽然标称很高但那是在直流和低频段高频段其实很一般。地平面要做的事情是把模拟区和数字区分开单点连接。所谓单点就是模拟地和数字地只在 ADC 芯片下方连接一次。如果板子上有多个 ADC 或者 ADC/DAC 混合那个连接点要选在共用的参考地上。这样数字部分的回流电流不会流经模拟地避免在模拟地上产生毫伏级的压降——对 20 位系统来说1 mV 的干扰相当于 400 多个 LSB。电源去耦的布局规律是容值大的离芯片远容值小的离芯片近。0.1 μF 的陶瓷电容要紧贴电源引脚走线长度控制在 2 mm 以内回流路径要短。10 μF 的钽电容或者陶瓷电容放在 1 cm 以内。很多设计失败的原因就是 0.1 μF 放得太远等效串联电感把高频滤波效果全毁了。时钟方面Σ-Δ 的输出速率由主时钟分频得到时钟抖动会直接转换成采样时刻的误差对高分辨率系统影响明显。如果用的是内部 RC 振荡器注意它的温漂和抖动指标如果外部给时钟走线要做阻抗控制远离数字跳变信号。在有 PWM 或者开关电源的板子上让时钟线远离这些噪声源是最便宜的改善手段。提示如果实测有效位始终比手册低 3 位以上先别怀疑芯片把示波器探头的地线弹簧装上去测基准引脚和 AVDD 引脚的纹波。我遇到过三次这类问题两次是基准去耦位置不对一次是开关电源的地回路设计有误。4. 固件与软件配置、搬运与滤波的完整链路硬件把信号送到芯片引脚之后剩下的活就是配置和数据搬运。这部分看起来简单但配置顺序错了、时序没等够、搬运做成了阻塞式都会让前面所有努力白费。下面按实际项目里的流程走一遍。4.1 外设配置思路与触发链不管是哪种 MCUΣ-Δ 的配置逻辑都差不多复位、配置时钟、设置采样率和增益、选择通道、启动连续转换、等待数据就绪。看起来是线性流程但有几个点必须注意。第一个是复位后的等待时间。很多芯片上电后需要几十毫秒的建立时间基准电容充电、内部振荡器稳定都要时间。手册上写 50 ms 就老老实实等 50 ms早启动反而会读到垃圾数据而且有些芯片会因此锁死得掉电重启。我见过有人为了优化启动速度把这段延时砍掉结果产线良率掉了几个百分点。第二个是配置寄存器的顺序。一定要先配置、后启动写在启动之后再改采样率很多芯片会要求先停止转换。跨时钟域的寄存器尤其危险主时钟和你写寄存器的时钟可能不是同一个写完要回读校验。回读这一步很多人省掉出了偶发问题再查就非常痛苦。第三个是触发方式。如果只是低速静态采集用软件触发就够。如果是同步采集比如配合电机的电流环就用硬件触发。常见做法是用定时器的 PWM 或者 EPWM 模块在特定时刻产生触发信号让 ADC 在开关管动作之后的固定相位采样避开开关噪声最猛的时刻。这个特性在有电机控制的板子上非常关键用软件触发是做不到精确对齐的。如果用的是带硬件滤波通道的型号配置时要确认滤波器的类型和阶数以及是否与主通道共享采样资源。有些型号的快速通道和滤波通道不能同时使用配置时会有冲突数据手册上一般在通道分配那一章。4.2 DMA搬运与双缓冲结构数据就绪之后怎么读直接决定了系统能跑多快、CPU 有多少余量。轮询等待是最差的方案CPU 会被完全占住中断逐字节读会引入延迟抖动DMA 是正解。DMA 的配置要点是外设到内存、循环模式、数据宽度和外设数据宽度一致、内存地址递增。如果 ADC 是 24 位而 DMA 传输宽度设成 16 位数据会被截断表现出来就是高位数据丢失或者符号错误。这类问题在调试时最容易被误判成芯片问题。更实用的做法是双缓冲。申请两块大小相等的内存区域DMA 填满第一块时自动切到第二块并产生中断CPU 在中断里处理第一块的数据。这样采集和处理可以并行不会丢数据。缓冲区大小按采样率和你的处理周期算一般取 1 到 10 个控制周期。太小会频繁中断太大则处理延迟增加。这里有个坑要注意处理缓冲区数据时CPU 的访问会占用总线如果和 DMA 抢同一个内存区域可能造成总线冲突甚至数据错乱。把 DMA 缓冲区和主程序栈放在不同的内存段或者使用独立的 RAM 区能规避大部分问题。某些 MCU 的 DMA 无法访问某些 RAM 段配置前一定要查手册里的总线矩阵图。4.3 软件滤波的C语言实现就算 Σ-Δ 本身已经把噪声压得很低到了软件层还是需要一到两级滤波用来压制随机抖动和工频干扰。常用的有三种滑动平均、中值和 IIR各有适用场景。滑动平均适合抑制随机白噪声实现简单代价是有一个窗口长度的延迟。窗口越长越平滑但响应越慢。实现上我用环形缓冲避免每次搬移整个数组#define MA_WIN 32 typedef struct { int32_t buf[MA_WIN]; int32_t sum; uint8_t idx; uint8_t cnt; } ma_t; void ma_init(ma_t *m) { memset(m, 0, sizeof(*m)); } int32_t ma_push(ma_t *m, int32_t v) { if (m-cnt MA_WIN) { m-sum - m-buf[m-idx]; } else { m-cnt; } m-buf[m-idx] v; m-sum v; m-idx (m-idx 1) % MA_WIN; return m-sum / m-cnt; }中值滤波对脉冲干扰特别有效比如偶发的尖峰。它需要排序窗口一般取 3 到 5 个点太长会明显增加延迟并且抹掉真实的快速变化。对于 3 点中值直接比较两次就能出结果不需要完整排序int32_t median3(int32_t a, int32_t b, int32_t c) { if (a b) { int32_t t a; a b; b t; } if (b c) { int32_t t b; b c; c t; } if (a b) { int32_t t a; a b; b t; } return b; }IIR 低通滤波适合需要陡峭频率特性的场合一阶实现只要两行。系数用浮点算是这样的y[n] α × x[n] (1 - α) × y[n-1]其中 α 1 - exp(-2π × fc / fs)在单片机上如果没有 FPU可以把 α 放大成定点数计算用一个移位代替除法。注意 IIR 的初值问题第一次调用时如果 y[n-1] 是 0而输入是满量程输出会有一个明显的爬升过程。解决办法是初始化时把 y[0] 直接设为第一次的采样值而不是 0。三种滤波器的组合顺序也有讲究。一般是先中值去尖峰再滑动平均或者 IIR 平滑。反过来做的话IIR 会把尖峰展宽中值再去就来不及了。另外滤波窗口的长度要和你关心的信号变化速率匹配。如果被测的是每秒变化 0.1% 的静态量窗口取几十甚至几百都行如果要跟踪快变信号窗口就得压到几个点。4.4 数据落盘与波形回看调参阶段必须把原始数据导出来看波形光看串口打印的数字是找不出问题的。我的常规做法是让设备以固定的周期把原始码值通过串口发出来格式用 CSV一行一个采样点方便导入到波形工具里逐段分析。格式上我一般这样组织第一列是时间戳单位毫秒第二列是原始码值第三列是滤波后的值如果有多通道就继续往后排。这样一份数据既能看时域波形也能做频谱分析。导入的时候注意工具对表头、分隔符、小数点格式的要求中文标点和英文标点混用是最常见的导入失败原因。看波形时重点关注三件事。第一是短时跳动看峰峰值有多少个 LSB判断噪声水平。第二是长时漂移看几个小时的曲线是否有单调的爬升或下降这通常是温漂或者充电效应。第三是周期性成分如果曲线有规律地起伏先量一下周期反过来算频率对不上工频就是对上了采样率相关的杂散。如果条件允许做一次 FFT 看频谱比看时域波形有效得多。看工频有没有尖峰看采样率的一半附近有没有噪声堆积看有没有谐波家族。这些特征能直接把问题指向具体的电路位置。5. 常见问题排查实录与速查表前面讲的是设计和实现这一节讲出问题怎么办。下面这几类问题我在项目里都遇到过处理思路是通用的。5.1 数据跳动大、有效位上不去这是最常见的抱怨。排查顺序应该从大到小不要一上来就怀疑芯片精度。先看电源和基准的纹波。用示波器加弹簧地线测 AVDD 和 VREF 引脚的交流耦合波形带宽限制打开。如果是开关电源供电重点看开关频率处的纹波通常几十到几百 kHz。这个频率如果落在采样率附近会被混叠进来表现出来就是无规律的跳动。解决方法是加 LC 滤波或者改用低噪声 LDO同时把开关电源的布局远离模拟区。再看输入端的干扰。断开传感器把输入短接到一个干净的共模电压上看输出跳动。如果短接后跳动明显变小说明干扰是从外部进来的检查线缆屏蔽、接地方式和传感器供电。如果短接后还跳问题在板子本身。接着看采样时序。转换周期设置得太短滤波器还没建立完就读数据有效位数必然下降。把采样率降一半再测如果有效位数提升明显就是时序问题。这种情况下要么降速要么换更高阶的滤波器。最后才怀疑增益和失调标定。增益误差不引起跳动只引起系统性偏差所以它在跳动问题里基本不是元凶但排查完了还是应该标定一次。5.2 工频干扰与频谱上的那根尖峰50 Hz 或者 60 Hz 的干扰几乎是标配。表现是读数以 20 ms 或者 16.7 ms 为周期缓慢起伏幅度可能在几个到几十个 LSB。最有效的办法是让采样率和工频形成整数关系。具体做法是选择输出速率等于 50 Hz 的整数倍或者整数分之一比如 10 SPS、50 SPS、100 SPS。这样工频干扰在抽取滤波器的零点上被完全抑制。很多 Σ-Δ 芯片内置了这个选项配置寄存器里会写50 Hz 或 60 Hz 抑制选上就行。如果芯片没有这个选项或者干扰不是纯工频就要在软件里加陷波。二阶陷波器在定点 MCU 上实现稍麻烦但一阶的滑动平均也可以凑合——把窗口长度设成工频周期的整数倍比如采样率 1 kSPS 时窗口取 20 个点就能把 50 Hz 完全抵消。这个方法简单粗暴缺点是窗口长了延迟大。还有一种情况是干扰通过地线耦合进来的。测量时把传感器的地和设备的地断开看跳动是否变小。如果变化明显说明存在地环路需要做隔离或者改单点接地。5.3 多通道切换后的第一帧不可信这个问题前面提过原因是抽取滤波器需要建立时间。但实操中还有几个变种。一种是通道间串扰。切换之后如果前一通道的信号还残留在采样电容上第一帧会带有上一通道的分量。这通常是因为切换和启动转换之间的间隔太短。解决办法是在切换后加一段延时长度等于滤波器的建立时间然后再读数据并且把第一帧丢弃。另一种是切换后的共模跳变。不同传感器的共模电压不同切换瞬间共模电平会跳变输入级需要时间恢复。这个恢复时间取决于输入端的 RC 时间常数。如果 RC 太大恢复就慢第一帧偏差更大。所以前面说 RC 的截止频率要远高于信号带宽就是这个原因。我的通用做法是切换通道后连续读 3 到 5 帧全部丢弃从第 4 帧开始用。如果通道数很多、切换频繁就要重新评估采样率和滤波器阶数的搭配或者干脆用多个 ADC 并行每个通道独占一个省掉切换问题。多花几块钱省掉大量调试时间这笔账通常划算。5.4 问题速查表下面这张表是我自己贴在工位旁边的版本出问题时先按表走一遍能解决八成的情况。现象可能原因快速验证方法处理办法末位跳动 10 LSB 以上基准或电源纹波示波器测 VREF 交流纹波加 RC、换低噪声基准读数随温度缓慢漂移基准温漂、传感器温漂恒温箱分段测试选低漂基准、做温度补偿周期性起伏 20 ms工频耦合改变采样率看周期是否变选工频抑制速率、加陷波切换通道后首帧偏差大滤波器未建立丢弃首帧后是否正常加延时、丢弃前几帧高频段噪声异常大噪声整形正常现象做 FFT 看分布形状无需处理属正常满量程附近非线性输入超共模范围改变共模电压观察加共模偏置、降增益偶发数据突变后不恢复芯片锁死复位后是否恢复加看门狗、电源复位数据整体偏移固定值增益失调未标定两点标定后是否消除做零点与满度标定6. 标定、温漂与长期稳定性设备出厂前跑得再好现场跑三个月之后精度下降是更让人头疼的问题。这一节聊的是怎么让精度保持住。6.1 两点标定与零点漂移任何高精度系统都需要标定因为芯片的初始失调和外部电路的误差叠加起来通常有几个到几十个 LSB 的固定偏差。标定方法很多最实用的是两点法。零点标定输入端接零信号对电桥来说是空载对电压输入是短接到共模连续采样一段时间取平均值作为零偏。满度标定输入端加接近满量程的标准信号同样取平均用两个点算出一条直线的斜率和截距之后所有读数都按这条直线换算。标定时的采样点数要够。一般取 100 到 1000 个点做平均点数太少平均值自己就不稳。标定期间的采样率要和实际工作时一致因为不同采样率下噪声分布不同标出来的系数会偏。标定用的标准源精度至少要比目标精度高一个数量级否则标出来的结果没有意义。零点漂移主要来自两个地方芯片自身的失调漂移和外部电路的失调漂移。前者一般在几 μV/°C 量级后者取决于运放和电阻的匹配。如果零点漂移在整机误差预算里占比偏高就要考虑斩波稳零运放或者选用带内部斩波的 ADC。6.2 温漂补偿的实操做法温漂补偿的基本前提是有温度数据。板上至少要放一个温度传感器位置靠近 ADC 和基准因为这两处是主要的热源敏感点。温度传感器的精度不用太高0.5°C 就够因为我们补偿的是趋势不是绝对值。补偿的做法是分两步。第一步是建立温度模型把整机放进温箱从低温到高温走一遍每个温度点稳定后记录读数偏差做成一张表或者拟合一条曲线。拟合用二次多项式通常就够了更高阶容易过拟合。第二步是在运行时代入温度读数计算补偿量从原始读数里扣掉。这里有个容易忽略的细节温箱里的稳定时间和实际工况不一样。温箱里温度是均匀的实际设备可能只有局部发热ADC 感受到的温度和传感器测到的温度有差。所以补偿系数要在真实工况下再修正一次不能完全依赖温箱数据。还有一个更彻底的做法是硬件补偿用两个匹配的通道做差分测量让温度和共模的影响在差分中被抵消。比如电桥的两个输出都进 ADC 的两路差分输入结果做比值而不是差值。这种做法在传感器成本允许的前提下比软件补偿更稳定因为不依赖模型精度。6.3 长期稳定性与自校准设备跑久了除了温漂还有老化。电阻的老化、基准的老化、焊点的应力释放都会带来缓慢变化。这个变化在几个月的尺度上通常比温漂小但在要求长期免维护的场合必须考虑。一个实用的技巧是在系统里留一条自校准通路用一个高精度、低温漂的参考电阻或者参考电压源定期比如每次开机、或者每 24 小时自动跑一次标定。这样做的前提是参考源本身足够稳否则会把参考源的漂移引入系统。参考源的温漂可以做到 1 ppm/°C 以内比整机的其他环节都小作为校准基准是合适的。另一个技巧是数据完整性校验。在数据里加上时间戳和状态标志一旦出现超范围或者标定失效的情况能追溯到是哪一批数据。这在做数据分析时非常有用能区分是系统漂移还是个别异常。我个人的体会是把精度做到目标值可能只花一周把精度稳定住通常要花一个月。中间省不掉的就是反复的、在真实工况下的测试。实验室数据再漂亮也只是起点。最后再分享一个我经常用的小技巧在固件里加一个调试模式按固定间隔把原始码值、滤波值、温度、状态标志一起打包成一行文本输出。不用多复杂就是普通的 CSV。调参那阵子把日志存下来过了几个月回头看往往能从里面找到当时没注意到的规律。这个习惯帮我定位过好几次偶发问题而偶发问题恰恰是最耗时间的。
返回列表