第三章 数据采集系统设计:基于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数字输出的。怎么把它们统一接入?
我一般这样设计前端电路:
- 模拟输入通道:每个传感器对应一个独立通道
- 信号调理:放大、滤波、电平转换
- 多路复用器:用模拟开关切换通道
- 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浓度变化,时间差就会引入误差。
我常用的几种策略:
- 顺序采样:最简单,通道依次采集。适合变化缓慢的信号。
- 同步采样:每个通道配一个采样保持器,同时保持,然后依次读取。适合需要精确时间对齐的场景。
- 定时中断采样:用定时器触发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透传,成本低 |
嗯,这一章的内容差不多就这些。硬件架构设计没有标准答案,关键是根据你的传感器类型、精度要求、成本预算来权衡。下一章我们会聊数据融合算法,到时候这些硬件采集的数据就要派上用场了。
记住一句话:硬件是骨架,软件是血肉。骨架没搭好,后面再好的算法也救不回来。