基于单片机的30路PT100温度数据自动采集系统设计
在工业现场,大型设备如高压配电柜、化工反应釜或储能电池组往往需要对数十个关键节点进行实时温度监控。一旦某一点过热未被及时发现,轻则影响工艺稳定性,重则引发安全事故。传统的巡检方式效率低、响应慢,而市售的多通道测温仪又普遍存在成本高、扩展性差的问题。有没有一种方案,既能实现30路以上的高精度温度采集,又能控制成本并具备二次开发能力?答案是肯定的——基于单片机构建自主可控的数据采集系统。
这套系统的起点是一个看似简单的元件:PT100铂电阻。它在0°C时阻值为100Ω,随着温度升高线性增加,符合IEC 60751标准,在-200°C到+850°C范围内都能保持优异的重复性和长期稳定性。但问题在于,它的电阻变化非常微弱——每摄氏度仅变化约0.385Ω。以1mA恒流激励为例,对应电压变化仅为0.385mV。这意味着整个信号链必须具备极高的分辨率和抗干扰能力,否则有用信号将完全淹没在噪声中。
如何把这几十微伏级别的电压波动准确捕捉下来?第一步是从源头保证激励的纯净。我们采用由精密基准源REF200(提供1.2V低温漂参考电压)驱动的压控恒流源结构,配合OP07运放与MOSFET搭建闭环控制电路,确保输出电流稳定在1.000mA,温漂小于5ppm/°C。所有30路传感器共用同一恒流源,避免因多个电流源之间的微小差异引入测量偏差。实际测试表明,这种设计可将自热效应控制在0.1°C以内,同时显著提升通道间一致性。
接下来是通道切换问题。若为每一路都配备独立ADC,硬件成本和PCB空间都将难以承受。因此,我们选择使用两片CD4067 16通道模拟开关级联,构成32选1多路复用器,支持30路输入加2路冗余备用。MCU通过4位地址线(A/B/C/D)控制选通路径,代码实现极为简洁:
#define ADDR_A P1_0
#define ADDR_B P1_1
#define ADDR_C P1_2
#define ADDR_D P1_3
void Select_Channel(uint8_t ch) {
ADDR_A = ch & 0x01;
ADDR_B = (ch >> 1) & 0x01;
ADDR_C = (ch >> 2) & 0x01;
ADDR_D = (ch >> 3) & 0x01;
_delay_us(10); // 留足建立时间
}
这里的关键细节是延时处理。CD4067的导通时间为典型值250ns,但在高阻抗信号源下,还需考虑分布电容的充电过程。实验发现,若采样前不预留足够等待时间,前几路读数会出现明显跳变。最终确定10μs延时即可满足所有通道的稳定需求。
然而,直接将PT100两端的小信号送入ADC仍不可靠。长距离传输会引入工频干扰、共模噪声甚至地环路压降。为此,我们在模拟开关后加入INA128仪表放大器,配置增益为100倍(外接Rg=500Ω),将100mV满量程信号放大至接近5V,充分匹配ADC输入范围。其高达100dB的共模抑制比能有效滤除50Hz及其谐波干扰。同时,在输入端加入RC低通滤波(R=10kΩ, C=1μF),截止频率约16Hz,进一步抑制高频噪声。
至此,信号调理已完成,下一步便是数字化。我们选用TI的ADS1115——一款内置PGA的16位Σ-Δ型ADC,通过I²C接口与主控通信。相比常见的12位ADC(如STM32自带ADC),16位分辨率意味着最小可分辨电压达15.6μV(±4.096V量程下),足以捕捉PT100的细微变化。更重要的是,它支持差分输入模式,可以直接测量PT100两端压降,彻底规避单端测量中的参考地漂移问题。
驱动ADS1115的核心代码如下:
#include "i2c.h"
#define ADS1115_ADDR 0x48
#define CONV_REG 0x00
#define CONFIG_REG 0x01
void ADS1115_Start_Single(char channel) {
uint8_t config[3];
config[0] = CONFIG_REG;
config[1] = 0xC0 | ((channel & 0x07) << 4);
config[2] = 0x83; // 1600SPS, 单次转换
i2c_write(ADS1115_ADDR, config, 3);
}
int16_t ADS1115_Read_Conversion() {
uint8_t data[2];
i2c_read_reg(ADS1115_ADDR, CONV_REG, data, 2);
return (int16_t)(data[0] << 8 | data[1]);
}
整个采集流程由STC12C5A60S2单片机统筹调度。这款增强型8051芯片虽非高性能ARM,但主频可达35MHz,集成60KB Flash和1280字节RAM,足以胜任轮询式多通道采集任务。其优势在于生态成熟、开发工具链完善,Keil C51即可完成全部编程工作。系统初始化后,MCU按顺序切换通道、延时稳定、启动ADC、读取结果、计算温度,并通过串口上传数据:
void main() {
System_Init();
while(1) {
for(uint8_t ch = 0; ch < 30; ch++) {
Select_Channel(ch);
Delay_ms(10);
int16_t adc_val = ADS1115_Read_Conversion();
float voltage = adc_val * 4.096 / 32768.0;
float rt = voltage / 0.001; // R = V/I
float temp = Calculate_Temperature(rt);
Send_UART_Data(ch, temp);
Display_Temp(ch, temp);
}
Delay_ms(1000); // 每秒一轮
}
}
温度计算环节采用了查表法结合线性插值的方式。预先将IEC 60751标准下的RT表存储在Flash中,查找最接近的两个点并进行插值运算,既保证精度又避免浮点开销过大。对于Class B级PT100,在0~100°C区间内查表误差小于±0.1°C。
当然,理论设计再完美也需经受实战考验。在实际部署中,我们曾遇到几个典型问题:首先是通道间串扰,表现为相邻通道读数异常接近。排查发现是模拟开关关断通道存在漏电流耦合,解决方案是在每路输入端增加100pF陶瓷电容作旁路,有效隔离高频串扰。其次是工频干扰严重,尤其在靠近变频器的环境中,原始数据呈现明显的50Hz正弦波动。除了硬件上的差分放大和低通滤波外,软件层面加入了数字陷波滤波器,中心频率锁定50Hz,Q值设为30,实测可将干扰幅度降低90%以上。
另一个常见问题是ADC读数抖动。即使在同一温度下,连续采样也会出现±3~5LSB的波动。对此,我们采用滑动平均滤波(窗口长度=8)结合卡尔曼滤波进行平滑处理。卡尔曼增益根据过程噪声和观测噪声动态调整,在快速变温阶段保留响应速度,在稳态时提高稳定性,兼顾了灵敏度与平滑性。
PCB布局方面,坚持“模拟与数字分离”原则。电源部分采用磁珠将AVDD与DVDD隔离,模拟地与数字地在电源入口处单点连接。恒流源电路尽量靠近接线端子,减少走线电阻影响;差分信号线全程等长并包地处理,避免与数字时钟线平行布线。所有PT100接入端均焊接屏蔽双绞线,屏蔽层统一接到机壳地,形成完整电磁防护。
校准环节不容忽视。出厂前需在冰水混合物(0°C)和沸水(100°C)中对每一路进行标定,记录实测值与理论值的偏差,存入内部EEPROM作为补偿系数。后续运行中,软件自动调用该偏移量进行修正,确保全量程内的绝对精度优于±0.5°C。
最终系统不仅实现了本地OLED显示和RS485通信(支持MODBUS RTU协议),还可接入PLC或上位机监控平台。整套方案物料成本控制在200元以内,远低于同类商用产品,且开放全部设计文件——包括Altium Designer格式的原理图与PCB、Keil工程源码及通信协议文档,便于用户根据具体需求修改或扩展。
回看整个设计,其价值不仅在于完成了30路温度采集这一具体功能,更在于展示了一种面向工业场景的嵌入式系统构建思路:从传感器特性出发,逐级解决信号获取、调理、转换与处理中的关键技术难题,最终整合成一个可靠、精确、可维护的整体。这样的架构同样适用于压力、液位等其他电阻式传感器的采集系统,具备良好的通用性和推广潜力。

7144

被折叠的 条评论
为什么被折叠?



