1. 项目概述
去年夏天帮本地一家食品加工厂做设备改造时,他们最头疼的问题就是无法实时监控冷链车间的温度变化。传统的人工记录方式不仅效率低下,还经常出现漏记错记的情况。这个基于STM32的温度采集系统就是为解决这类工业现场监测需求而设计的。
这个系统本质上是个智能化的温度数据采集终端,核心功能包括:通过数字温度传感器实时采集环境温度数据,通过STM32微控制器进行数据处理,最后将数据存储到本地SD卡并可通过串口或无线模块上传到上位机。整套方案硬件成本控制在200元以内,采样精度达到±0.5℃,特别适合中小型企业的设备监控场景。
2. 系统架构设计
2.1 硬件选型解析
主控芯片选用STM32F103C8T6这颗经典款,72MHz主频完全够用,自带12位ADC和多个定时器,最关键的是价格只要十几块钱。对比过STM8和51单片机,最终选择STM32是因为:
- 内置硬件SPI接口,驱动SD卡更稳定
- 充足的RAM空间(20KB)可以建立数据缓存区
- 丰富的外设资源方便后期扩展无线模块
温度传感器方面,DS18B20和DHT11是常见选择,但实测发现:
- DHT11的±2℃精度达不到工业要求
- DS18B20单总线协议在长距离传输时容易受干扰
最终选用Maxim的MAX31865搭配PT100铂电阻,虽然成本高些(约50元/套),但支持三线制接法,在30米线缆下仍能保持±0.5℃的测量精度。
2.2 电源方案设计
工业现场经常遇到电压波动,电源部分特别加了双重保护:
- 采用LM2596-5.0将24V工业电源降至5V
- 再用AMS1117-3.3给MCU供电
关键细节:
- 每个电源输入端都并联TVS二极管防浪涌
- 在3.3V输出端增加100μF钽电容滤除低频干扰
- 给数字传感器单独供电,与MCU电源隔离
3. 核心功能实现
3.1 温度采集模块
PT100的电阻-温度转换采用Callendar-Van Dusen方程:
code复制Rt = R0(1 + A*t + B*t²) (t>0℃时)
在STM32中通过查表法实现快速计算,预先将-200℃~850℃对应的ADC值存入Flash。实测发现,比起实时计算,查表法将转换时间从15ms缩短到0.5ms。
传感器驱动关键代码:
c复制void MAX31865_Init(void) {
SPI_WriteReg(0x80, 0xC1); // 配置寄存器:三线制、自动转换
SPI_WriteReg(0x01, 0x00); // 故障检测阈值低字节
SPI_WriteReg(0x02, 0xFF); // 故障检测阈值高字节
}
float Get_Temperature(void) {
uint16_t adc_val = SPI_ReadReg(0x01) << 8;
adc_val |= SPI_ReadReg(0x02);
return LookupTable[adc_val >> 1]; // 舍弃最低位噪声
}
3.2 数据存储方案
选用MicroSD卡存储数据,文件系统用FatFS R0.12。为提高写入可靠性,特别做了以下优化:
- 开辟8KB的环形缓冲区
- 每收集50条记录(约2KB)才实际写入一次SD卡
- 每次写入前检查卡状态
- 文件命名采用"TEMP_年月日时分.csv"格式
实测发现,这种批处理方式比单条记录立即写入的方式,SD卡寿命延长约20倍。文件内容示例:
code复制2023-08-15 14:30:00, 25.6℃
2023-08-15 14:31:00, 25.7℃
...
4. 系统优化技巧
4.1 抗干扰设计
在食品厂实测时遇到两个典型问题:
- 变频器导致传感器读数跳变
- 金属机柜内温度比实际高2-3℃
解决方案:
- 传感器线缆改用双绞屏蔽线,屏蔽层单点接地
- 在PT100输入端增加RC滤波(10Ω+0.1μF)
- 对ADC采样值做滑动平均滤波(窗口大小=8)
- 将传感器安装在通风良好的非金属保护盒内
4.2 低功耗优化
虽然本项目主要接市电,但为应对突发停电,设计了备用方案:
- 主电源掉电时自动切换至18650电池供电
- 触发低功耗模式:关闭LED、降低采样频率(1次/5分钟)
- 在SRAM中缓存数据,恢复供电后再写入SD卡
通过上述措施,800mAh电池可维持系统运行约72小时。
5. 常见问题排查
5.1 传感器读数异常
现象:温度值固定为-200℃或850℃
排查步骤:
- 检查PT100三根引线是否接触良好
- 测量MAX31865的VREF引脚电压(应为3.3V±1%)
- 用示波器观察SPI时钟信号(应无振铃)
- 检查配置寄存器值是否正确写入
5.2 SD卡写入失败
现象:f_open()返回FR_DISK_ERR
解决方法:
- 重新格式化卡为FAT32(分配单元大小32KB)
- 在sdio.c中调整时钟分频系数(SDIO_TRANSFER_CLK_DIV=2)
- 检查PCB上SD卡座的弹力是否足够
- 在mount前添加2秒延时(部分低速卡需要初始化时间)
6. 项目扩展方向
这套基础框架其实可以衍生出很多变种:
- 增加LoRa模块实现无线传输(需注意433MHz频段在工业环境易受干扰)
- 改用RT-Thread系统实现远程OTA升级
- 添加继电器输出实现超温报警
- 结合Modbus协议接入PLC系统
实际在另一个养殖场项目中,我们就在此基础上增加了氨气传感器和GPRS模块,构建了完整的环境监测系统。关键是要根据具体场景调整硬件选型和软件逻辑,STM32的生态优势这时候就体现出来了——各种外设驱动都能找到现成参考。