打破硬件极限:数据采集卡如何用“过采样”魔法将16位ADC提升至24位?

打破硬件极限:数据采集卡如何用“过采样”魔法将16位ADC提升至24位? zlinear开源电子前言大家好我是ZLinear的硬件工程师。在数据采集领域有一个永恒的博弈精度与成本。想要24位的高精度ADC没问题ADI或者TI的旗舰芯片安排上但代价是BOM成本直线飙升。对于工业级通用测量动辄几十上百美金的ADC芯片显然不够“亲民”。那么有没有办法在不增加昂贵硬件成本的前提下白嫖更高的分辨率答案是有的。这就是今天我们要聊的“黑科技”——过采样与数字滤波。在我们ZLinear的DABL7606数据采集卡上硬件采用的是16位的SAR ADC但在实际输出和记录仪功能中用户却能拿到24位的数据。很多朋友私信问我“这是怎么做到的难道是软件造假凑出来的位数吗”今天我们就结合《7606代码分析》中的底层逻辑深度剖析一下过采样的原理、代码实现以及它在工程实战中不得不付出的“代价”。一、 为什么需要过采样——噪声与分辨率的博弈要理解过采样首先要理解ADC的量化噪声。对于一个N位的ADC它的理想信噪比SNR公式为SNR 6.02N 1.76 dB。16位ADC的理论SNR约为98.04 dB。24位ADC的理论SNR约为146.24 dB。两者相差了近48dB这48dB的差距意味着24位ADC能分辨出的最小信号幅度是16位ADC的 1/256。当ADC对信号进行采样时量化误差可以被看作是均匀分布在 ±0.5 LSB 之间的白噪声。如果我们在奈奎斯特频率下采样这些量化噪声会全部折叠进我们的信号带宽内。过采样的核心思想是以远高于信号带宽的频率进行采样将量化噪声分散到更宽的频带中然后通过数字滤波器把信号带宽外的噪声滤除从而提升信号带内的有效分辨率ENOB。通俗地说原本噪声挤在一个小房间里现在我们把房间扩大了256倍噪声密度自然就降低了我们就能看清更微小的细节了。二、 代码级剖析DABL7606的过采样实战理论很美好但工程实现靠的是扎实的代码。在DABL7606的固件中我们是如何把16位“拔高”到24位的呢根据《7606代码分析》核心采集函数ad7606_startConvert触发后通过SPI1 DMA以极快的速度读取8通道的16位原始数据。关键在于后续的数字处理1. 256点滑动平均信噪比提升 ~24dB要在16位基础上增加8位分辨率达到等效24位根据公式需要 $4^8 65536$ 倍的过采样率。但在实际嵌入式系统中受限于MCU算力和内存不可能无限累加。我们采用了256点滑动平均的折中方案。数学原理每4倍过采样可以增加1位有效分辨率约6dB。256点是 $4^4$理论上可以增加4位有效分辨率提升约 24dB 的信噪比。实现效果通过滑动平均滤波我们有效平抑了宽带噪声。这24dB的提升虽然不能让我们直接达到理想24位的理论极限但足以让有效位数ENOB从普通的15位左右跃升至19~20位的水平。2. 24位精度扩展256点累加不除这是代码中非常巧妙的一笔。传统的平均算法是累加N次然后除以N。这样最终结果还是16位的。但我们的做法是256点累加不除。16位原始数据int16_t乘以256相当于在二进制中左移8位。256个16位数相加结果存入32位整型int32_t中不会溢出。我们不进行除法运算直接将这个32位数作为24位等效数据上传。为什么要“不除”因为除法会丢失低位数据即我们辛辛苦苦提取出来的微小信号细节。保留累加和实际上就是保留了低8位的“小数部分”信息。这样上位机收到的就是实打实的24位数据格式精度得到了最大程度的保留。三、 不可忽视的代价带宽与响应时间的权衡“既然过采样这么好为什么不一直开着最高倍数的过采样”因为天下没有免费的午餐过采样的代价是牺牲带宽和响应速度。1. 硬件算力的天花板在DABL7606用户手册中明确提到“受限于单片机算力软件上做了一些数值限制。”过采样和滤波需要大量的CPU周期。为了兼顾其他功能DABL7606的SRAM采样率被分成了4个动态档位开启1-2个ADC通道最大采样率 35K开启3-4个通道最大采样率 30K开启大于4个通道最大采样率 25K开启DAC或PWM定时器功能后ADC速率最大限制为 10K为什么开启DAC/PWM后采样率暴跌因为MCU的资源是有限的。出让部分算力给外设接口就必须降低ADC的吞吐量。这正是实时系统多线程调度的工程妥协。2. 低通滤波效应与信号失真过采样的数字滤波器本质上是一个低通滤波器。手册中有一段非常生动的描述“在100Hz采集速率下测工频干扰信号35K采样率下可以看到较多细节10K采样率下信号特征明显减少1K采样率下细节明显丢失但是轮廓基本不变。”当你把采样率设得很低即过采样倍数设得很高时数字滤波器的截止频率也会随之降低。此时高频的信号细节会被当作“噪声”滤除掉。利如果你测的是缓变信号如温度、压力高过采样能给你极其平滑、高分辨率的曲线。弊如果你测的是瞬态冲击或高频振动过采样会抹平信号的尖峰导致波形失真。工程建议在DABL7606的上位机中采样率设置是可调的。如果要提高数据响应速率与信号带宽可以适当调高ADC的采样率设置如果要追求极致的微小信号分辨能力则降低采样率享受过采样带来的红利。四、 总结软件定义硬件的艺术在硬件同质化越来越严重的今天纯粹的硬件堆料已经很难拉开差距。真正的核心竞争力在于软硬件的协同优化。DABL7606 通过“SPIDMA高速采集 256点累加滑动滤波 32位不除扩展”这一套组合拳用16位ADC的成本实现了等效19~20位24位数据格式的精度输出。这不仅是对芯片性能的压榨更是“软件定义硬件”的生动实践。我们ZLinear开源这些底层代码就是希望让大家看到工业级的高精度测量不是只能靠砸钱买昂贵芯片。掌握底层数字信号处理算法你一样能用百元级的板卡干出千元级设备的活儿。希望今天关于过采样的硬核拆解能给你带来启发。如果你在项目中也用过类似的“黑科技”算法或者在调试ADC时遇到过“玄学”噪声问题欢迎在评论区留言我们一起在技术的道路上摸爬滚打