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 通过“SPI+DMA高速采集 + 256点累加滑动滤波 + 32位不除扩展”这一套组合拳,用16位ADC的成本,实现了等效19~20位(24位数据格式)的精度输出。这不仅是对芯片性能的压榨,更是“软件定义硬件”的生动实践。
我们ZLinear开源这些底层代码,就是希望让大家看到:工业级的高精度测量,不是只能靠砸钱买昂贵芯片。掌握底层数字信号处理算法,你一样能用百元级的板卡,干出千元级设备的活儿。
希望今天关于过采样的硬核拆解,能给你带来启发。如果你在项目中也用过类似的“黑科技”算法,或者在调试ADC时遇到过“玄学”噪声问题,欢迎在评论区留言,我们一起在技术的道路上摸爬滚打!