1. 项目概述
最近在实验室完成了一个实用的变压器温度监控系统,这个项目从硬件选型到软件编程全部自主实现。作为一名电力电子工程师,我深知变压器过热是导致设备故障的主要原因之一。传统的人工巡检方式存在滞后性,而市面上的专业监控设备又价格昂贵。于是决定自己动手开发一套低成本、高可靠性的温度报警系统。
这个系统的核心功能包括:
- 实时监测变压器顶层油温和绕组温度
- 根据变压器类型自动匹配温度阈值
- 超温时触发声光报警
- 通过LCD屏显示实时温度值
- 支持历史温度数据记录(后续扩展功能)
系统采用模块化设计,硬件部分包含主控模块、温度采集模块、显示模块和报警模块;软件部分则实现了温度采集、数据处理、阈值判断和报警控制等功能。整个开发过程涉及Keil C编程、Proteus仿真和Altium Designer电路设计,下面将详细介绍各环节的实现细节。
2. 硬件设计与选型
2.1 主控芯片选择
经过多方比较,最终选择了STM32F103C8T6作为主控芯片,主要基于以下考虑:
- 性价比高:零售价约10-15元,批量采购可低至8元
- 性能足够:72MHz主频,20KB RAM,64KB Flash
- 外设丰富:内置12位ADC,支持多达37个GPIO
- 开发便捷:有完善的生态系统和丰富的库函数支持
提示:对于初次接触STM32的开发者,建议先使用STM32CubeMX工具生成初始化代码,可以大幅降低开发难度。
2.2 温度传感器选型
温度传感器的选择至关重要,经过对比测试了几种常见方案:
| 传感器型号 | 精度 | 接口方式 | 价格 | 适用性评估 |
|---|---|---|---|---|
| DS18B20 | ±0.5℃ | 单总线 | 5-8元 | 布线简单,抗干扰强 |
| PT100 | ±0.3℃ | 模拟量 | 15-20元 | 需信号调理电路 |
| LM35 | ±1℃ | 模拟量 | 3-5元 | 线性度好但易受干扰 |
| DHT11 | ±2℃ | 单总线 | 8-10元 | 精度不足 |
最终选择DS18B20数字温度传感器,主要优势在于:
- 数字输出:避免模拟信号传输过程中的干扰
- 单总线协议:仅需一根数据线即可通信,简化布线
- 防水封装:可直接浸入变压器油中测量
- 宽量程:-55℃~+125℃满足变压器监控需求
2.3 显示与报警模块
显示部分选用常见的1602字符型LCD,主要考虑:
- 成本低廉:约10元左右
- 接口简单:4位或8位并行接口
- 功耗低:工作电流约1mA
报警模块采用有源蜂鸣器(5V驱动)配合红色LED,实现声光双重报警。为提高可靠性,在蜂鸣器驱动电路中加入了续流二极管,避免反电动势损坏MCU。
3. 系统软件设计
3.1 温度采集与处理
DS18B20的读取需要严格遵守单总线时序,以下是关键代码实现:
c复制#define DS18B20_DQ_PIN GPIO_Pin_0
#define DS18B20_DQ_PORT GPIOA
void DS18B20_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = DS18B20_DQ_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DS18B20_DQ_PORT, &GPIO_InitStructure);
}
float DS18B20_ReadTemp(void) {
uint8_t tempL, tempH;
uint16_t temp;
DS18B20_Reset();
DS18B20_WriteByte(0xCC); // 跳过ROM
DS18B20_WriteByte(0x44); // 启动温度转换
Delay_ms(750); // 等待转换完成
DS18B20_Reset();
DS18B20_WriteByte(0xCC); // 跳过ROM
DS18B20_WriteByte(0xBE); // 读取暂存器
tempL = DS18B20_ReadByte();
tempH = DS18B20_ReadByte();
temp = (tempH << 8) | tempL;
return (float)temp / 16.0;
}
为提高测量稳定性,实现了滑动平均滤波算法:
c复制#define FILTER_WINDOW_SIZE 5
float temperature_buffer[FILTER_WINDOW_SIZE];
uint8_t buffer_index = 0;
float get_filtered_temperature(void) {
// 采集新数据
float new_temp = DS18B20_ReadTemp();
// 更新缓冲区
temperature_buffer[buffer_index] = new_temp;
buffer_index = (buffer_index + 1) % FILTER_WINDOW_SIZE;
// 计算平均值
float sum = 0;
for(uint8_t i=0; i<FILTER_WINDOW_SIZE; i++) {
sum += temperature_buffer[i];
}
return sum / FILTER_WINDOW_SIZE;
}
3.2 温度阈值管理
根据变压器类型不同,系统预设了两组温度阈值:
c复制typedef struct {
uint8_t oil_normal; // 常规油温上限
uint8_t oil_alarm; // 油温报警阈值
uint8_t winding_alarm; // 绕组报警阈值
} TempThreshold;
const TempThreshold cooling_types[2] = {
{85, 80, 95}, // 自冷/风冷型
{75, 70, 90} // 强油循环型
};
阈值判断采用状态机实现,避免瞬时干扰导致误报警:
c复制typedef enum {
NORMAL_STATE,
PRE_ALARM_STATE,
ALARM_STATE
} TempState;
TempState oil_state = NORMAL_STATE;
uint8_t alarm_counter = 0;
void check_temperature_threshold(float temp, uint8_t threshold) {
switch(oil_state) {
case NORMAL_STATE:
if(temp > threshold) {
oil_state = PRE_ALARM_STATE;
alarm_counter = 0;
}
break;
case PRE_ALARM_STATE:
if(temp > threshold) {
if(++alarm_counter >= 3) {
oil_state = ALARM_STATE;
trigger_alarm(1);
}
} else {
oil_state = NORMAL_STATE;
}
break;
case ALARM_STATE:
if(temp < threshold - 2) { // 加入2℃回差防止震荡
oil_state = NORMAL_STATE;
trigger_alarm(0);
}
break;
}
}
3.3 显示界面设计
1602 LCD显示采用4位数据接口,为显示温度单位"℃"自定义了字符:
c复制void LCD_CustomSymbol(void) {
// 自定义℃符号
unsigned char degree[8] = {0x0E,0x0A,0x0E,0x00,0x00,0x00,0x00,0x00};
LCD_SendCmd(0x40); // CGRAM地址
for(int i=0; i<8; i++) {
LCD_SendData(degree[i]);
}
}
void LCD_DisplayTemp(float temp) {
char buffer[16];
sprintf(buffer, "Temp: %.1f\x00C", temp); // \x00为自定义字符地址
LCD_SetCursor(0, 0);
LCD_SendString(buffer);
}
4. 电路设计与PCB布局
4.1 原理图设计要点
在Altium Designer中设计原理图时,特别注意了以下关键点:
- 电源滤波:在MCU电源入口处添加了10μF电解电容和0.1μF陶瓷电容组合
- 信号保护:所有外部接口都加入了TVS二极管防止静电损坏
- 复位电路:使用10kΩ上拉电阻和0.1μF电容构成可靠复位电路
- 传感器接口:DS18B20数据线加入4.7kΩ上拉电阻
4.2 PCB布局注意事项
实际PCB布局时遵循以下原则:
- 分区布局:将电路板划分为数字区、模拟区和功率区
- 地平面处理:采用星型接地,数字地和模拟地在MCU下方单点连接
- 走线优化:
- 电源线加粗至0.5mm
- 敏感信号线(如传感器数据线)远离高频信号
- 保持完整的地平面
- 散热考虑:大电流路径使用铺铜增加散热面积
注意:DS18B20传感器建议通过接线端子外接,方便安装在变压器不同位置测量温度。
5. 系统调试与优化
5.1 常见问题排查
在实际调试过程中遇到并解决了以下典型问题:
-
传感器无响应
- 检查上拉电阻是否连接正确
- 确认时序控制严格符合DS18B20规格要求
- 测量电源电压是否稳定(4.5-5.5V)
-
温度读数跳变
- 增加软件滤波算法
- 改用屏蔽线连接传感器
- 检查接地是否良好
-
LCD显示异常
- 调整对比度电压(通常10kΩ电位器可调)
- 检查初始化序列是否正确
- 确保电源稳定(避免与蜂鸣器共用电源)
5.2 性能测试结果
经过系统测试,主要性能指标如下:
| 测试项目 | 测试条件 | 测试结果 | 达标要求 |
|---|---|---|---|
| 温度测量范围 | -20℃~120℃ | 符合 | -55℃~125℃ |
| 测量精度 | 25℃室温 | ±0.3℃ | ±0.5℃ |
| 响应时间 | 温度突变 | <3秒 | <5秒 |
| 报警精度 | 设定80℃ | 79.8℃触发 | ±0.5℃ |
| 工作电流 | 正常监测 | 15mA | <50mA |
5.3 系统优化建议
根据实际使用经验,提出以下优化方向:
- 增加通信接口:添加RS485或CAN总线实现多机组网
- 扩展存储功能:使用EEPROM或Flash记录温度历史数据
- 改进报警方式:增加继电器输出用于远程报警
- 增强防护等级:设计防水防尘外壳适应户外环境
- 低功耗优化:采用间歇工作模式延长电池供电时间
6. 项目总结与心得
这个变压器温度报警系统从构思到实现历时约两个月,期间遇到了不少技术挑战,也积累了许多宝贵经验:
-
传感器选型:数字传感器在抗干扰方面确实比模拟传感器有优势,但要注意时序控制的精确性。DS18B20虽然使用简单,但对时序要求严格,稍有偏差就会导致读取失败。
-
硬件设计:良好的PCB布局能大幅提高系统稳定性。最初版本因为地线处理不当导致温度读数波动较大,重新设计地平面后问题得到解决。
-
软件优化:简单的滑动平均滤波就能显著改善数据稳定性。对于温度这种变化相对缓慢的物理量,不需要复杂的滤波算法。
-
调试技巧:分段调试非常重要。先确保传感器能正确读数,再添加显示功能,最后实现报警逻辑,这样能快速定位问题所在。
这个项目最让我满意的是它的实用性和性价比。全部材料成本不到50元,但实现了商业设备上百元的功能。后续计划增加无线传输模块,实现手机远程监控,这将使系统更加实用。
