中厘微纳开源电子
前言
大家好,我是ZLinear的硬件工程师。
在前面几期的博文中,我们把DABL7606的DDS波形合成、PWM脉冲控制、W5100S以太网架构和电源防护树翻了个底朝天。但后台有做传感器研发和高精度测控的读者提了一个非常"触及灵魂"的问题:
"张工,在工业现场,传感器输出的往往只是毫伏级的微弱信号,混杂着电机启停带来的尖峰干扰和长距离传输引入的工频噪声。很多便宜的采集卡采回来的数据全是毛刺,根本没法用。我看你们手册标称16bit分辨率,又说能通过算法扩展到24bit,精度做到±0.02%。到底是怎么在充满干扰的车间里,把'脏信号'洗净,还能凭空'算'出24位分辨率的?"
这个问题问到了数据采集的"最源头"!源头数据如果是"脏"的,后端再强的DSP和大数据分析都是无源之水。而分辨率不仅仅是ADC芯片的硬件参数,更是算法与系统设计的综合体现。
今天,我们继续"无公式、纯工程"的风格,翻开《ADC基础及在工业数据采集卡中的硬核应用》、《7606代码分析》和《用户手册》,硬核拆解DABL7606底层的多级硬件抗混叠滤波架构 、256点滑动平均的过采样数学魔术 ,以及上位机两点线性插值的标定哲学。
一、工业噪声的"物理隔离墙":3级抗混叠滤波架构
根据《ADC基础》资料所述,工业现场的数据采集卡不仅是把模拟量变成数字量,更是一个在复杂电磁环境中"去伪存真"的硬核关卡。高频噪声如果不滤除,会在ADC采样时发生频率混叠(高频噪声折叠回低频段,形成无法去除的虚假信号)。
DABL7606在信号链最前端构建了3级等效约4阶的低通滤波防线:
1. 第1级:输入RC硬件低通滤波
信号进入ADC引脚前,首先经过物理的阻容网络。这一级主要目的是限制输入信号的带宽,滤除极高频率的射频干扰(RFI)和电机启停带来的尖峰毛刺,保护后级ADC输入端口。
2. 第2级:AD7606自带2阶抗混叠滤波
核心ADC芯片AD7606内部集成了模拟抗混叠滤波器。相比纯软件滤波,硬件级的模拟滤波能在信号数字化之前有效抑制带外噪声,从物理层面杜绝高频干扰混叠进有用频带。
3. 第3级:OS过采样数字滤波
当启用过采样(OS)模式时,ADC以远高于奈奎斯特频率的速率进行采样,内部进行均值抽取。这不仅提高了分辨率,还等效产生了约4次的数字滤波效果,进一步压制带内白噪声。
工程价值:这3级滤波不需要用户写一行代码,纯靠硬件特性和底层固件实现,为后端的"24位数学魔术"提供了干净的数据底座。
二、16位到24位的"数学魔术":256点滑动平均过采样
很多工程师好奇:ADC硬件明明只有16位,凭什么能输出24位的有效分辨率?DABL7606的固件给出了教科书级的答案------256点滑动平均过采样算法。
翻开《7606代码分析》文档,核心的ADC数据转换函数中藏着这样一段代码:
// Step1: 256点滑动平均滤波
u32 sumTotal = 0;
for(u16 j=0; j<256; j++)
sumTotal += _uadc.getAdc_Buf256[i][j];
_uadc.getAdcFilter16[i] = sumTotal / 256; // 16位均值
_uadc.getAdcFilter24[i] = sumTotal; // 24位累加和
1. 噪声是分辨率的"推手"
根据信号处理理论:每对信号进行4次过采样求平均,可以提升1位有效分辨率(因为白噪声的平方根关系)。
DABL7606连续采集256个点,256 = 4\^4,正好对应提升4位分辨率。16位 + 4位 = 20位。那24位怎么来的?
2. 32位累加器的巧妙移位
注意代码中的 _uadc.getAdcFilter24[i] = sumTotal;。16位数据累加256次,如果不溢出,需要 16 + 8 = 24 位的数据宽度来存储!固件直接将这个24位的累加和作为高精度数据保留下来,配合特定的缩放算法,实现了接近24位等效分辨率的μV级电压读取。
在上位机的换算代码中(《7606上位机代码分析2》),我们可以看到对应的反向工程量转换:
// 24位ADC数据转换
if (_prxData.adcRange == 1) // ±5V量程
value = (SWAPS32(adcValue) - 8388608) / 83886.08 / 10;
else // ±10V量程
value = (SWAPS32(adcValue) - 8388608) / 167772.16 / 10;
// 8388608 = 2^23, 24位ADC中位值
这种过采样极大地提高了信噪比(SNR),让DABL7606能够分辨出微伏级别的电压波动,满足热电偶等微小信号的高精度采集需求。
三、从"差不多"到"绝对精准":两点线性插值的标定哲学
硬件滤波解决了"脏",过采样解决了"分辨率",但还有一个致命问题:硬件精度 。
电阻的温漂、基准电压的偏差,会导致ADC测出来的电压值存在固定偏移。DABL7606标称硬件精度±0.02%,但通过上位机的两点标定,精度可逼近极限。
1. Y=MX+N的工程化实现
在《用户手册》和上位机代码中,标定采用经典的两点线性插值:
public static double calc_adcCalibData(double data, double d1, double a1, double d2, double a2)
{
return (((data - d1) * (a2 - a1) / (d2 - d1)) + a1);
}
// data: 原始ADC数字量
// d1, a1: A点的数字量和模拟量
// d2, a2: B点的数字量和模拟量
手册中详细解释了这个公式的巧思:不单独计算斜率M和截距N,而是直接一次性计算标定值,省略中间过程 。其中 (A2 - A1) / (D2 - D1) 即为斜率M,A1 即为截距N,data - d1 是以A点为原点计算相对偏移。
2. 为什么必须是"两点"?
手册中反复强调:只有在A、B两点同时有效时,上位机软件才会执行标定计算。
数学上,如果只有1个点(零点偏移),无法求出斜率;如果两点过近,斜率计算会产生极大误差。因此,标定时必须输入两个跨度足够大的标准电压(例如2V标定A点,3.5V标定B点)。
3. 传感器物理量直接标定
更硬核的是,这套标定不止能标电压。上位机支持17种传感器单位(V, mV, A, mA, ℃, m℃, N, kg, G, K, MPa, kPa等)。
你可以不用管传感器输出多少毫伏,直接在外部施加10kg的砝码,在标定栏输入"10kg",采集卡自动把当前的ADC数字量与"10kg"绑定。把物理量到数字量的映射,直接固化在采集卡的FRAM中,极大减轻了上位机二次开发的心理负担。
四、闭环的最后一环:断电不丢的FRAM记忆
标定参数算得再准,如果断电丢失,每次开机都要重新校准,那这个产品在工业现场就是废品。
DABL7606采用了SRAM/FLASH/FRAM铁电三级存储架构 。其中,标定参数就保存在**FRAM(铁电存储器)**中。FRAM具有类似SRAM的高速读写特性,同时具备Flash的非易失性(断电不丢),且擦写寿命几乎无限(上万亿次)。
这意味着,无论车间经历多少次意外停电,你的两点标定系数、设备地址、网络配置都会被完美保存在芯片里。上电瞬间,底层RT-Thread系统直接从FRAM加载参数,立刻进入高精度采集状态。
五、总结:数据底座的"三位一体"
| 技术维度 | 传统方案痛点 | DABL7606的解法 | 工程价值 |
|---|---|---|---|
| 抗混叠 | 纯软件滤波,高频噪声已混叠无法消除 | 输入RC + AD7606 2阶硬件滤波 + OS数字滤波 | 3级防线,从源头杜绝频率混叠 |
| 分辨率 | 受限于ADC硬件位数,成本高昂 | 256点滑动平均过采样,16bit扩展至等效24bit | 用算力换分辨率,分辨μV级微小信号 |
| 校准算法 | 单点调零,无法补偿增益误差 | Y=MX+N两点线性插值,一次性代入计算 | 精度从±0.02%逼近极限,支持物理量直接标定 |
| 参数保存 | 存于EEPROM,擦写慢且易磨损 | FRAM铁电存储,无限擦写,微秒级读写 | 断电标定参数不丢,免现场维护 |
写到这里,我想回答开头那位读者的疑问:"怎么在充满干扰的车间里把'脏信号'洗净,并凭空'算'出24位分辨率?"
答案已经非常清晰:靠硬件挡住干扰,靠算法榨干精度,靠铁电记住状态。 一条高质量的工业数据链路,绝不是买一颗昂贵的ADC芯片焊上去那么简单。它需要硬件工程师懂信号完整性,软件工程师懂数字信号处理,还要懂系统级的标定与存储调度。
ZLinear把DABL7606的过采样算法、硬件滤波拓扑和上位机两点标定代码全部开源,就是希望你在做高精度传感器采集台架时,不再被那些"飞线满天飞、电位器拧到烂"的黑盒产品所折磨,而是真正掌握从物理世界到数字世界的全链路主动权。
当你在上位机软件上勾选"24bit模式",看着满屏跳动的微伏级数据稳如泰山,你会真切地感受到:这才是数据底座的含金量。
如果你在调试过采样算法时遇到了噪声压不下去的问题,或者对两点标定的间距选择有疑问,欢迎在评论区留言交流。我们一起把"高精度采集"这门手艺,练到极致!
我是 ZLinear 开源电子。我们坚信,真正的精度,是软硬件协同艺术的最美结晶。如果今天的滤波与过采样拆解对你有帮助,欢迎点赞、收藏、关注三连,我们下期再见!