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 抗干扰设计:这是最容易忽略的环节
说到抗干扰,我有一肚子话想说。记得有一次,现场调试时发现电压数据总是跳变,查了三天,最后发现是传感器信号线和动力线走在了同一个线槽里。
嗯,这里我总结几个实战经验:
- 屏蔽层接地:传感器信号线必须用屏蔽线,屏蔽层单端接地(通常在控制器端)。双端接地反而容易形成地环路。
- 隔离设计:模拟量输入通道加隔离放大器(比如ISO124),数字量通道加光耦或磁耦(比如ADuM1201)。
- 滤波电路:每个模拟量输入口加RC低通滤波,截止频率设为采样频率的1/10。比如采样100Hz,滤波截止频率设10Hz。
- 布线规则:强电和弱电分开走线,间距至少10cm。交叉时走90度垂直交叉。
- 软件滤波:硬件滤波之后,再加软件滤波。我常用中位值平均滤波法——去掉最大值和最小值,剩下的取平均。
// 中位值平均滤波法示例
#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 本章知识体系总览
为了让你更直观地理解数据采集层的整体架构,我画了一张图:
这张图把数据采集层的四个核心环节串起来了。从传感器选型开始,到采集方式选择,再到采样参数配置,最后用抗干扰设计收尾。每一步都环环相扣,缺一不可。
好了,数据采集层的内容就讲到这里。下一章咱们聊聊通信协议的选择——Modbus、CAN、MQTT,到底该用哪个?到时候见。
公众号:蓝海资料掘金营,微信deep3321