3、数据采集硬件搭建:微控制器选型、ADC配置与采样率设置

好,咱们进入正题。硬件搭建这块,说白了就是给传感器找个靠谱的“大脑”。我这些年折腾下来,发现选型这一步要是走偏了,后面全是坑。今天咱们就聊聊微控制器怎么选、ADC怎么配、采样率怎么设,还有那些让人头疼的同步采集和抗干扰问题。

3.1 微控制器选型:ESP32 vs STM32

我个人习惯把选型分成两派:一派是“我要连网”,另一派是“我要精度”。

  • ESP32:自带Wi-Fi和蓝牙,适合做物联网节点。我有个项目,现场布线困难,全靠ESP32无线传数据。它的ADC是12位的,但说实话,线性度一般,噪声也偏大。
  • STM32:ADC性能更稳,尤其是STM32G4系列,16位差分ADC,信噪比高。我在一个精密振动监测项目里用过,效果明显好于ESP32。

我的建议

  • 如果数据要上云,选ESP32,省一个通信模块。
  • 如果要求高精度、低噪声,选STM32,外挂一个Wi-Fi模块(比如ESP8266)做联网。

小技巧:ESP32的ADC在低电压段(0-0.1V)非线性严重。我一般会避开这个区间,或者做软件校准。

3.2 ADC配置:分辨率、参考电压与采样率

ADC配置是硬功夫。你想想看,振动信号是连续的,我们要把它变成离散的数字值。这里有几个关键参数:

参数 说明 我的经验值
分辨率 12位(4096级)还是16位(65536级) 振动分析建议至少12位,16位更好
参考电压 内部参考还是外部精密参考 外部参考(如REF5025)噪声低很多
采样率 每秒采集多少个点 振动信号一般2-10倍于最高频率

嗯,这里要注意:采样率不是越高越好。我见过有人用1MHz采样率去采一个50Hz的振动信号,结果数据量巨大,处理起来慢得要命,还浪费存储。

避坑指南:我曾经在一个项目里用了内部参考电压,结果温度一变化,ADC读数就飘。后来换成外部精密参考,问题才解决。记住:内部参考电压的温度系数通常很差。

3.3 采样率设置:奈奎斯特与工程实践

理论上,采样率要大于信号最高频率的2倍(奈奎斯特采样定理)。但工程上,我一般取5-10倍。为什么?

  • 2倍只是理论下限,实际会有混叠风险。
  • 5-10倍可以留出抗混叠滤波器的过渡带空间。
  • 振动信号往往包含谐波,高次谐波也需要被采样到。

举个例子:一个旋转机械的振动基频是100Hz,但它的3次谐波(300Hz)也有分析价值。那采样率至少要设到1500Hz(5倍于300Hz)。我一般会设到2000Hz,留点余量。

核心公式

采样率 ≥ 2 × 信号最高频率 × 安全系数(通常取5-10)

3.4 多通道同步采集:时间对齐是关键

多通道同步采集,说白了就是让多个传感器在同一时刻“咔嚓”一下。为什么重要?因为振动分析经常需要看相位差,比如两个测点之间的时间延迟。

我遇到过最坑的事:用软件轮询的方式采集4个通道,结果每个通道之间差了几个毫秒。分析相位时完全对不上,白白浪费了两天时间。

正确的做法:

  • 硬件触发:用一个外部信号同时触发所有ADC通道。
  • DMA传输:让ADC数据直接通过DMA送到内存,不经过CPU。
  • 时间戳:每个数据包打上统一的时间戳。

我的习惯:在STM32上,我会用定时器触发ADC,所有通道配置成“注入组”模式,这样能保证纳秒级的同步精度。

3.5 硬件去抖与抗干扰:别让噪声毁了数据

振动信号本身就很微弱,如果硬件抗干扰没做好,采集到的数据可能全是噪声。我总结了几条实战经验:

  1. 去耦电容:每个芯片的电源引脚旁边放一个0.1μF陶瓷电容,再加一个10μF电解电容。这是基本功,但很多人会漏掉。
  2. 模拟地与数字地分离:用0欧电阻或磁珠单点连接。我见过有人直接铺铜连在一起,结果数字噪声全串到模拟信号里了。
  3. 差分信号传输:如果传感器离MCU比较远(超过1米),用差分信号(比如RS-485)代替单端信号。抗共模干扰能力强很多。
  4. 硬件低通滤波器:在ADC输入端加一个RC低通滤波器,截止频率设为采样率的1/2左右。这能有效抑制高频噪声。

避坑指南:我曾经在一个项目里,传感器线缆和电机线缆走同一个线槽,结果采集到的振动信号里全是50Hz工频干扰。后来把信号线换成屏蔽双绞线,单独走管,问题才解决。记住:屏蔽层要单端接地,别两端都接。

3.6 实战配置示例:STM32 + 3轴加速度计

最后,给一个我常用的配置示例。假设我们要采集一个3轴加速度计(比如ADXL345)的数据:

// ADC配置:3通道,12位,连续转换
ADC_InitTypeDef ADC_InitStruct;
ADC_InitStruct.ADC_Resolution = ADC_RESOLUTION_12B;
ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;
ADC_InitStruct.ADC_ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1; // 定时器触发
ADC_InitStruct.ADC_DataAlign = ADC_DATAALIGN_RIGHT;
ADC_InitStruct.ADC_NbrOfConversion = 3;

// 采样率设置:定时器1输出1kHz触发信号
TIM_TimeBaseInitTypeDef TIM_InitStruct;
TIM_InitStruct.TIM_Prescaler = 84 - 1;  // 84MHz / 84 = 1MHz
TIM_InitStruct.TIM_Period = 1000 - 1;   // 1MHz / 1000 = 1kHz
TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;

// DMA传输:自动搬运数据到内存
DMA_InitTypeDef DMA_InitStruct;
DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)adc_buffer;
DMA_InitStruct.DMA_BufferSize = 1024;
DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;

这个配置里,定时器1产生1kHz的触发信号,ADC每1ms采集一次3个通道的数据,然后通过DMA自动存到缓冲区。CPU全程不用管,只管从缓冲区取数据就行。

总结一下:硬件搭建的核心就三件事——选对芯片、配好ADC、做好抗干扰。别贪多求全,先把基础打牢。下一章咱们聊聊数据怎么通过Wi-Fi传到服务器上。

最后提醒:调试时先用示波器看看ADC输入端的波形,确认没有明显噪声再开始采集。这一步能省你后面很多排查时间。