第四章:数据采集系统架构

大家好,我是老张。今天咱们聊聊数据采集系统架构。说实话,这章内容在《传感器反馈与模型辨识》里属于「硬骨头」——不啃不行,啃起来又有点费劲。我当年刚入行时,就因为ADC选型没搞明白,被项目坑过一次。嗯,从那以后,我对这部分内容就格外上心。

数据采集系统,说白了就是把传感器输出的模拟信号,变成计算机能处理的数字信号。反过来,有时候我们还需要把数字信号变回模拟信号去控制执行器。这中间的关键器件,就是ADC和DAC。

核心要点:数据采集系统的性能,直接决定了整个控制系统的精度和实时性。选错了架构,后面模型辨识做得再好也白搭。

4.1 ADC与DAC原理

ADC(模数转换器)和DAC(数模转换器)是数据采集系统的「翻译官」。ADC把连续的模拟电压,翻译成离散的数字码;DAC则反过来。

我个人习惯把ADC分成三类:

  • 逐次逼近型(SAR ADC):速度中等,精度高,功耗低。我最常用这种,尤其是在多通道采集场景下。
  • Σ-Δ型(Sigma-Delta ADC):精度极高,但速度慢。适合低频高精度测量,比如温度、压力。
  • 流水线型(Pipeline ADC):速度快,但功耗大。适合高速信号采集,比如振动分析。

DAC相对简单一些,常见的有R-2R梯形网络型和PWM型。我在项目中遇到过一个问题:用PWM做DAC时,滤波电容选大了,响应慢得像蜗牛;选小了,纹波又大得离谱。后来我总结了一个经验公式,大家可以直接用:

// 一阶RC滤波截止频率计算
f_cutoff = 1 / (2 * π * R * C)

// 建议:f_cutoff 设为 PWM 频率的 1/10 ~ 1/100
// 例如:PWM频率 10kHz,f_cutoff 取 100Hz ~ 1kHz

我的小技巧:选ADC时,别只看分辨率。有效位数(ENOB)才是真实指标。我曾经被一个16位ADC坑过——标称16位,实际有效位数只有12位。后来学乖了,一定看数据手册里的ENOB曲线。

4.2 多通道采集

实际项目中,很少只采集一个传感器信号。多通道采集是常态。常见的架构有两种:

  • 多路复用型:一个ADC,通过模拟开关轮流切换通道。成本低,但通道间有串扰。
  • 并行型:每个通道配一个ADC。速度快,但成本高、PCB面积大。

你想想看,如果采集8个热电偶信号,用多路复用型就够用了。但如果是采集8个振动传感器的同步信号,那就必须用并行型。为什么?因为多路复用型采集到的数据,每个通道之间有时间差,做FFT分析时会引入相位误差。

避坑指南:我曾经在做一个多通道温度采集项目时,发现通道1和通道2的读数总是差0.5°C。查了半天,原来是模拟开关的导通电阻不一致导致的。解决办法:在软件里做通道校准,或者用低导通电阻的模拟开关。

4.3 同步采样与异步采样

这两个概念,我刚开始也搞混过。简单说:

  • 同步采样:所有通道在同一时刻采集。适合需要分析通道间相位关系的场景,比如声源定位、振动模态分析。
  • 异步采样:各通道独立采集,时间上不同步。适合对时序要求不高的场景,比如温度监控。

同步采样怎么实现?通常有两种方法:

  1. 硬件触发:所有ADC共用同一个采样时钟或触发信号。
  2. 软件同步:通过软件指令同时启动所有通道。但精度不如硬件触发高。

我记得有一次做电机控制,需要同步采集电流和位置信号。用了异步采样,结果电流环和速度环总是对不上。后来换成同步采样,问题就解决了。嗯,这里要注意:同步采样的代价是成本更高,数据量更大。

4.4 数据缓存与DMA传输

数据采集系统里,数据怎么从ADC搬到内存,是个大学问。传统方法是CPU轮询或中断——每采一个点,CPU就去读一次。但这样CPU就被「绑死」了,干不了别的。

DMA(直接存储器访问)就是来解决这个问题的。DMA控制器可以在不占用CPU的情况下,直接把ADC的数据搬到内存里。CPU可以腾出手来做控制算法、模型辨识这些更重要的活。

我建议的典型配置:

  • 环形缓冲区:DMA写数据到缓冲区,CPU从缓冲区读数据。缓冲区满了就覆盖旧数据。
  • 双缓冲区:DMA写一个缓冲区,CPU读另一个缓冲区。两个缓冲区交替使用,避免数据冲突。
// 双缓冲区伪代码示例
uint16_t buffer1[1024];
uint16_t buffer2[1024];
uint8_t active_buffer = 0;

void DMA_Complete_IRQHandler() {
    if (active_buffer == 0) {
        // buffer1 已满,开始处理
        process_data(buffer1, 1024);
        // 切换DMA目标到buffer2
        DMA_SetDestination(buffer2);
        active_buffer = 1;
    } else {
        process_data(buffer2, 1024);
        DMA_SetDestination(buffer1);
        active_buffer = 0;
    }
}

我的经验:DMA传输的触发源,我一般选定时器。这样采样率就由定时器精确控制,不受CPU负载影响。我曾经用软件延时做采样,结果CPU一忙,采样间隔就乱了。从那以后,我再也不用软件做定时采样了。

4.5 典型采集卡配置

市面上常见的采集卡,比如NI的PCIe-6363、研华的PCI-1716,配置起来大同小异。我以NI的卡为例,说说典型配置流程:

配置项 典型值 说明
采样率 100 kS/s 每通道每秒采样次数
分辨率 16 bit ADC位数
输入范围 ±10 V 模拟输入电压范围
通道数 16 SE / 8 DIFF 单端/差分模式
触发方式 软件/硬件/数字 采样触发源
缓存大小 4096 samples 板载FIFO深度

配置时,我一般按这个顺序来:

  1. 确定采样率:根据信号最高频率,按奈奎斯特定理,采样率至少是信号最高频率的2倍。实际中我取5~10倍。
  2. 选择输入模式:信号源是单端还是差分?差分模式抗干扰好,但通道数减半。
  3. 设置触发:需要同步采集就用硬件触发,否则用软件触发。
  4. 配置DMA:开启DMA传输,设置缓冲区大小和中断回调。

避坑指南:我曾经在配置采集卡时,采样率设得太高,结果DMA缓冲区频繁溢出,数据丢得一塌糊涂。后来我算了一下:采样率×通道数×每个样本字节数 = 数据速率。这个速率不能超过DMA和总线的带宽。否则,要么降采样率,要么加大缓冲区。

知识体系总览

下面这张图,是我自己画的。它把本章的知识点串起来了。你一看就明白:ADC/DAC是核心,多通道和同步/异步是架构选择,DMA和缓存是性能保障,采集卡配置是落地实现。

数据采集系统架构知识体系 数据采集系统 ADC / DAC 原理 SAR / Σ-Δ / Pipeline 分辨率 vs 有效位数 多通道采集 多路复用型 / 并行型 通道串扰与校准 同步 vs 异步采样 硬件触发 / 软件同步 相位一致性要求 数据缓存与DMA传输 环形缓冲区 / 双缓冲区 DMA触发源:定时器 典型采集卡配置 采样率 / 分辨率 / 输入范围 触发方式 / 带宽计算

好了,这一章的内容就这些。数据采集系统架构,说白了就是「怎么把信号搬进计算机」。ADC/DAC是翻译官,多通道和同步采样是架构选择,DMA和缓存是效率保障,采集卡配置是落地实操。每个环节都有坑,但只要你理解了原理,踩过的坑都会变成经验。

可可精品资料库