4、数据采集层设计:传感器选型、模拟量与数字量采集、采样频率与精度、抗干扰设计

数据采集层,说白了就是储能系统的「眼睛」和「耳朵」。

你想想看,如果连电压、电流、温度这些基础数据都测不准,那后面的通信、上云、分析全是白搭。我在做第一个储能项目时,就吃过这个亏——传感器精度不够,导致SOC估算偏差超过10%,客户差点要退货。

所以这一章,咱们把数据采集层掰开揉碎了讲清楚。

4.1 传感器选型:别只看参数,要看场景

传感器选型,我个人习惯先问三个问题:

  • 测什么?——电压、电流、温度、湿度、气体?
  • 什么环境?——户外、室内、高低温、强电磁?
  • 什么精度?——0.5%还是0.1%?

拿储能系统最常见的几个传感器来说:

传感器类型 常用型号 量程 精度 适用场景
电压传感器 LV25-P 0~500V ±0.5% 电池簇电压监测
电流传感器 ACS758 0~200A ±1.0% 充放电电流检测
温度传感器 DS18B20 -55~125°C ±0.5°C 电池表面温度
湿度传感器 SHT30 0~100%RH ±2%RH 柜内环境监测
我的经验:别只看精度参数。我曾经选了一款高精度电压传感器,结果在户外高温环境下漂移严重。后来换成工业级型号,虽然精度标称值一样,但实际稳定性好得多。记住,稳定性比精度更重要

4.2 模拟量与数字量采集:两种思路,各有千秋

这里有个基本概念:传感器输出的信号,要么是模拟量(比如0~10V、4~20mA),要么是数字量(比如I2C、SPI、RS485)。

模拟量采集,说白了就是ADC采样。我建议用差分输入方式,抗干扰能力比单端输入强不少。举个例子:

// 模拟量采集示例(基于STM32)
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK) {
    uint32_t adc_value = HAL_ADC_GetValue(&hadc1);
    float voltage = (adc_value / 4095.0) * 3.3;  // 12位ADC
    // 注意:这里要加滤波算法
}

数字量采集就简单多了。传感器直接输出数字信号,MCU通过I2C或SPI读取。比如DS18B20温度传感器:

// 数字量采集示例(DS18B20)
uint8_t temp_lsb, temp_msb;
int16_t temp_raw;
float temperature;

// 启动温度转换
ds18b20_reset();
ds18b20_write_byte(0xCC);  // 跳过ROM
ds18b20_write_byte(0x44);  // 启动转换

// 等待转换完成(最大750ms)
HAL_Delay(750);

// 读取温度
ds18b20_reset();
ds18b20_write_byte(0xCC);
ds18b20_write_byte(0xBE);  // 读取暂存器

temp_lsb = ds18b20_read_byte();
temp_msb = ds18b20_read_byte();

temp_raw = (temp_msb << 8) | temp_lsb;
temperature = temp_raw * 0.0625;  // 12位分辨率
核心区别:模拟量采集需要关注ADC精度、参考电压、滤波;数字量采集需要关注通信协议、时序、校验。我个人更倾向数字量传感器——省心,但成本稍高。

4.3 采样频率与精度:别盲目追求高采样率

很多新手容易犯一个错:采样频率越高越好。其实不是。

你想想看,储能系统的电压电流变化,本质上是慢变信号。电池的SOC变化,几分钟甚至几小时才变1%。你搞个1kHz采样率,除了浪费CPU和存储,没任何好处。

我建议这样配置:

  • 电压/电流:100ms采样一次,足够了。用于SOC估算和故障检测。
  • 温度:1秒采样一次。温度变化慢,没必要太快。
  • 绝缘检测:10秒一次。这是安全要求,但变化极慢。
  • 高频纹波:如果需要分析纹波,才用1kHz以上采样率。但一般储能系统不关心这个。
注意:采样频率和ADC精度是矛盾的。采样率越高,ADC的有效位数(ENOB)越低。比如12位ADC在1kHz采样时可能还有11.5位有效精度,但到100kHz采样时可能只剩9位了。我曾经在项目中踩过这个坑——为了追求采样率,结果精度惨不忍睹。

4.4 抗干扰设计:这是最容易忽略的环节

说到抗干扰,我有一肚子话想说。记得有一次,现场调试时发现电压数据总是跳变,查了三天,最后发现是传感器信号线和动力线走在了同一个线槽里。

嗯,这里我总结几个实战经验:

  1. 屏蔽层接地:传感器信号线必须用屏蔽线,屏蔽层单端接地(通常在控制器端)。双端接地反而容易形成地环路。
  2. 隔离设计:模拟量输入通道加隔离放大器(比如ISO124),数字量通道加光耦或磁耦(比如ADuM1201)。
  3. 滤波电路:每个模拟量输入口加RC低通滤波,截止频率设为采样频率的1/10。比如采样100Hz,滤波截止频率设10Hz。
  4. 布线规则:强电和弱电分开走线,间距至少10cm。交叉时走90度垂直交叉。
  5. 软件滤波:硬件滤波之后,再加软件滤波。我常用中位值平均滤波法——去掉最大值和最小值,剩下的取平均。
// 中位值平均滤波法示例
#define FILTER_N 10

float median_average_filter(float *buffer, uint8_t len) {
    uint8_t i, j;
    float temp;
    float sum = 0;
    
    // 冒泡排序(数据量小,够用)
    for (i = 0; i < len - 1; i++) {
        for (j = 0; j < len - 1 - i; j++) {
            if (buffer[j] > buffer[j + 1]) {
                temp = buffer[j];
                buffer[j] = buffer[j + 1];
                buffer[j + 1] = temp;
            }
        }
    }
    
    // 去掉最大最小值,取平均
    for (i = 1; i < len - 1; i++) {
        sum += buffer[i];
    }
    
    return sum / (len - 2);
}
避坑指南:我曾经在项目中遇到一个奇怪问题——白天数据正常,晚上就跳变。后来发现是附近的路灯干扰。解决方案很简单:在传感器供电入口加一个共模扼流圈。所以,抗干扰设计一定要考虑现场环境,别只盯着实验室数据。

4.5 本章知识体系总览

为了让你更直观地理解数据采集层的整体架构,我画了一张图:

数据采集层设计总览 传感器选型 电压传感器 | 电流传感器 | 温度传感器 | 湿度传感器 采集方式 模拟量采集(ADC) | 数字量采集(I2C/SPI/RS485) 采样参数配置 采样频率(100ms~1s) | 采样精度(12位~16位) 抗干扰设计 屏蔽接地 | 隔离设计 | 滤波电路 | 布线规则 | 软件滤波

这张图把数据采集层的四个核心环节串起来了。从传感器选型开始,到采集方式选择,再到采样参数配置,最后用抗干扰设计收尾。每一步都环环相扣,缺一不可。

好了,数据采集层的内容就讲到这里。下一章咱们聊聊通信协议的选择——Modbus、CAN、MQTT,到底该用哪个?到时候见。


公众号:蓝海资料掘金营,微信deep3321