第三章 数据采集系统设计:基于STM32/ESP32的多通道数据采集硬件架构

好,咱们进入正题。这一章讲的是数据采集系统的硬件架构设计。说白了,就是怎么把传感器信号稳稳当当地送进单片机里。

我个人习惯把采集系统分成三块:传感器接口、信号调理、以及主控单元。这三块缺一不可。你想想看,传感器信号再准,调理电路没做好,进到ADC里也是白搭。

3.1 主控芯片选型:STM32 vs ESP32

先聊主控。温室场景下,我常用的就两个系列:STM32和ESP32。它们各有各的脾气。

对比项 STM32F4/H7系列 ESP32系列
ADC精度 12位/16位(内置) 12位(内置,噪声偏大)
多通道能力 最多16通道(规则+注入) 2个SAR ADC,最多18通道
无线通信 需外挂WiFi/蓝牙模块 内置WiFi+蓝牙
实时性 强(硬件定时器精准) 中等(FreeRTOS下可接受)
功耗 低(可做到uA级) 较高(WiFi开启时mA级)

我在项目中遇到过这样的情况:一个客户要求采集8路温度、4路湿度、2路光照,还要实时上传到云平台。当时我选了ESP32,因为省了外挂无线模块的麻烦。但如果采集精度要求高,比如要测土壤水分含量,我肯定用STM32加外部ADC。

我的建议:

  • 本地控制为主、精度优先 → 选STM32
  • 需要联网、采集精度要求一般 → 选ESP32
  • 两者结合:STM32采集 + ESP32透传,也是常见方案

3.2 多通道模拟信号采集架构

温室里的传感器五花八门。有输出0-5V的,有输出4-20mA的,还有I2C数字输出的。怎么把它们统一接入?

我一般这样设计前端电路:

  1. 模拟输入通道:每个传感器对应一个独立通道
  2. 信号调理:放大、滤波、电平转换
  3. 多路复用器:用模拟开关切换通道
  4. ADC采样:单端或差分输入

举个例子,8路模拟输入的典型架构:

传感器1 → 运放调理 → 低通滤波 → 
传感器2 → 运放调理 → 低通滤波 → 
...                              → 74HC4051(8选1) → STM32 ADC
传感器8 → 运放调理 → 低通滤波 → 

嗯,这里要注意。多路复用器不是随便选的。我曾经用过CD4051,发现切换后需要稳定时间。如果采样频率太高,前一通道的残余电压会影响后一通道。后来我改用ADG708,切换时间更短,串扰也更小。

避坑指南:

我曾经在项目里犯过一个低级错误:多路复用器的使能引脚没拉高,结果所有通道都导通了,采集到的数据乱成一锅粥。排查了整整两天才发现。所以,上电初始化时一定要先关闭所有通道,再逐个使能。

3.3 信号调理电路设计要点

信号调理是数据采集的命门。传感器信号往往很微弱,或者有共模干扰。不处理直接进ADC,数据根本没法用。

我总结了几种常见场景:

  • 温度传感器(PT100/热电偶):需要差分放大 + 冷端补偿。我习惯用AD620仪表放大器,共模抑制比高。
  • 湿度传感器(电容式):需要交流激励 + 整流滤波。直流测量会极化,数据漂移严重。
  • 光照传感器(光敏电阻):分压电路 + 电压跟随器。注意光敏电阻的非线性,需要查表校准。
  • CO2传感器(电化学):跨阻放大器 + 低通滤波。输出电流极小,pA级别,PCB走线要加屏蔽。

你想想看,一个PT100在0℃时电阻100Ω,温度变化1℃才变化0.385Ω。如果不做差分放大,直接用单片机ADC测分压,分辨率根本不够。

个人经验:

我习惯在调理电路后加一级二阶低通滤波器,截止频率设在10Hz左右。温室环境变化很慢,没必要采集高频噪声。滤波后数据平滑多了,省了软件滤波的功夫。

3.4 采样时序与同步策略

多通道采集最头疼的问题是什么?时序不同步。

比如你要同时采集温湿度和光照,如果依次采集,时间差可能达到几十毫秒。对于温室来说,这点时间差影响不大。但如果你要采集风速或CO2浓度变化,时间差就会引入误差。

我常用的几种策略:

  1. 顺序采样:最简单,通道依次采集。适合变化缓慢的信号。
  2. 同步采样:每个通道配一个采样保持器,同时保持,然后依次读取。适合需要精确时间对齐的场景。
  3. 定时中断采样:用定时器触发ADC,每个通道固定时间间隔采集。我习惯用STM32的定时器+ADC的DMA模式,CPU几乎不占用。

举个例子,用STM32的定时器触发ADC,DMA传输数据:

// 定时器3配置为1kHz触发
TIM3->PSC = 84-1;      // 84MHz / 84 = 1MHz
TIM3->ARR = 1000-1;    // 1MHz / 1000 = 1kHz

// ADC配置为定时器触发
ADC1->CR2 |= ADC_CR2_EXTSEL_SRC_TIM3_TRGO;
ADC1->CR2 |= ADC_CR2_EXTEN_RISING_EDGE;

// DMA循环传输到内存数组
DMA1_Channel1->CMAR = (uint32_t)adc_buffer;
DMA1_Channel1->CNDTR = 8;  // 8个通道
DMA1_Channel1->CCR |= DMA_CCR_CIRC;  // 循环模式

这样配置后,每1ms自动采集8个通道,数据直接存到数组里。CPU只需要在需要时读取数组就行。

关键点:

采样频率不是越高越好。温室里温度变化每秒不超过0.1℃,你每秒采1000次纯属浪费。我一般设成每10秒采一次,取平均值。既省电,数据又稳定。

3.5 电源与抗干扰设计

这一节容易被忽略,但恰恰是项目成败的关键。

温室环境里,电机、水泵、电磁阀一启动,电源上全是毛刺。如果不做隔离,ADC采集的数据会跳得你怀疑人生。

我的做法:

  • 模拟电源和数字电源分开:用磁珠或LC滤波隔离
  • 每个传感器独立供电:用LDO稳压,避免相互干扰
  • ADC参考电压用外部基准:比如REF3033,温漂低,精度高
  • PCB布局:模拟信号走线远离数字信号,地线采用星形接地

我曾经在一个项目里,所有传感器共用一个5V电源。结果湿度传感器一工作,温度数据就跳变。后来改成每个传感器单独供电,问题立刻解决。

特别提醒:

温室里湿度大,PCB要做好三防漆处理。我见过一个案例,客户没做防护,三个月后PCB上全是水珠,ADC引脚间漏电,数据全废了。

3.6 实际项目中的硬件选型清单

最后,给出一份我常用的硬件清单,供参考:

功能模块 推荐型号 备注
主控MCU STM32F407VGT6 带2个12位ADC,12通道
外部ADC ADS1256 24位,8通道,适合高精度
多路复用器 ADG708 8通道,低导通电阻
仪表放大器 AD620 共模抑制比高,适合差分信号
电压基准 REF3033 3.3V,温漂3ppm/℃
隔离电源 B0505S 5V转5V隔离,1W
无线模块 ESP8266/ESP32 WiFi透传,成本低

嗯,这一章的内容差不多就这些。硬件架构设计没有标准答案,关键是根据你的传感器类型、精度要求、成本预算来权衡。下一章我们会聊数据融合算法,到时候这些硬件采集的数据就要派上用场了。

记住一句话:硬件是骨架,软件是血肉。骨架没搭好,后面再好的算法也救不回来。