1. 项目概述与核心需求
在工业自动化和智能监测领域,电缆温度监测一直是个重要但容易被忽视的环节。传统的人工巡检方式不仅效率低下,而且难以及时发现电缆过热等安全隐患。我最近完成的这个基于STM32的分布式电缆温度监测系统,正是为了解决这些痛点而生。
这个系统的核心功能可以概括为三点:实时温度采集、本地显示和无线传输。选择STM32F103C8T6作为主控芯片,主要看中它的性价比和丰富的外设资源。这颗Cortex-M3内核的MCU运行在72MHz主频下,内置64KB Flash和20KB SRAM,完全能满足我们的需求。更重要的是,它有多达37个GPIO、3个USART和2个SPI接口,为后续功能扩展留足了空间。
温度传感器选用了经典的DS18B20,这款数字温度传感器有三个突出优势:一是采用单总线协议,只需要一个GPIO就能通信;二是测量范围-55°C到+125°C,精度±0.5°C;三是每个传感器都有唯一64位序列号,支持多点组网。这些特性使其特别适合分布式温度监测场景。
关键设计决策:在比较了NTC热敏电阻、PT100和DS18B20后,最终选择DS18B20是因为其数字化输出省去了ADC电路,且单总线拓扑结构简化了布线。虽然响应速度不如模拟传感器,但对于电缆监测这种对实时性要求不苛刻的场景完全够用。
2. 硬件设计详解
2.1 核心电路设计
主控电路围绕STM32F103设计,核心供电采用AMS1117-3.3V稳压芯片,为MCU和外围器件提供稳定的3.3V电源。在电源输入端加入了100μF电解电容和0.1μF陶瓷电容组合,有效滤除高频和低频噪声。复位电路采用经典的10kΩ上拉电阻配合0.1μF电容,确保复位信号干净稳定。
JTAG调试接口采用标准的20针连接器,通过SWD模式连接ST-Link调试器。实际调试中发现,如果PCB走线过长会导致下载失败,后来将JTAG接口布局在距离MCU 3cm以内的位置解决了这个问题。
2.2 传感器接口设计
DS18B20的接口设计有几个关键点:
- 单总线上必须接4.7kΩ上拉电阻
- 长距离传输时建议使用屏蔽线
- 总线电容不宜超过100pF
我们的方案是在每个监测节点放置最多8个DS18B20,通过Cat5e网线传输信号。实测在50米距离内通信稳定,超过这个距离需要增加中继器。每个节点的传感器通过防水接头连接,防护等级达到IP67。
2.3 无线传输模块
ATK-HC05蓝牙模块通过UART与STM32通信,关键配置参数如下:
| 参数 | 配置值 | 说明 |
|---|---|---|
| 波特率 | 9600 | 与STM32 USART1匹配 |
| 工作模式 | 从机模式 | 等待手机APP连接 |
| 配对密码 | 1234 | 简单易记 |
| 设备名称 | CABLE_MONITOR | 便于识别 |
模块通过PCB天线实现约10米的传输距离,如需更远距离可更换为外接天线版本。实际测试中发现,2.4GHz频段在工业环境中容易受到干扰,后来通过修改跳频方案和增加重传机制提高了可靠性。
3. 软件架构与实现
3.1 系统初始化流程
系统上电后按以下顺序初始化:
- 时钟配置:将HSE 8MHz晶振作为时钟源,通过PLL倍频到72MHz
- GPIO配置:设置DS18B20数据线为开漏输出,LCD接口为推挽输出
- 外设初始化:包括USART1(蓝牙)、SPI1(LCD)和DMA
- 中断配置:使能USART1接收中断和SysTick定时器中断
c复制void SystemInit(void) {
// 时钟配置
RCC->CR |= 0x00010000; // 使能HSE
while(!(RCC->CR & 0x00020000)); // 等待HSE就绪
RCC->CFGR = 0x001D0400; // PLL 9倍频,APB1 36MHz, APB2 72MHz
RCC->CR |= 0x01000000; // 使能PLL
while(!(RCC->CR & 0x02000000)); // 等待PLL就绪
RCC->CFGR |= 0x00000002; // 选择PLL作为系统时钟
while((RCC->CFGR & 0x0000000C) != 0x08); // 等待切换完成
// GPIO配置
RCC->APB2ENR |= 0x0000001C; // 使能GPIOA,B,C时钟
GPIOB->CRH &= 0xFFFFFF0F; // PB8(DS18B20)开漏输出
GPIOB->CRH |= 0x00000030;
}
3.2 温度采集实现
DS18B20的驱动关键在于精确的时序控制。单总线协议要求严格的微秒级延时,我们使用SysTick定时器实现高精度延时函数。温度采集流程如下:
- 发送复位脉冲(480μs低电平)
- 等待存在脉冲(60-240μs低电平)
- 发送跳过ROM命令(0xCC)
- 发送温度转换命令(0x44)
- 等待转换完成(750ms for 12-bit)
- 再次复位并发送读取命令(0xBE)
- 读取两个字节的温度数据
为提高效率,我们采用DMA+USART实现蓝牙数据传输,主循环只负责调度任务。当温度变化超过0.5°C时才会触发无线传输,避免频繁通信造成的能量浪费。
3.3 显示界面设计
2.8寸TFT LCD采用ILI9341驱动芯片,通过SPI接口通信。显示界面分为三个区域:
- 顶部状态栏:显示信号强度和电池电量
- 中部主区域:实时温度曲线图
- 底部信息栏:显示当前温度值和报警状态
使用UCGUI库实现图形界面,关键优化点包括:
- 启用DMA传输显示数据,释放CPU资源
- 采用双缓冲机制避免闪烁
- 对温度数据做滑动平均滤波处理
4. 系统优化与实测结果
4.1 低功耗设计
为延长电池供电时的使用时间,我们实施了多项低功耗措施:
- 动态调整CPU频率:无操作时降至36MHz
- 传感器轮询间隔可调:默认1秒,可设为最长60秒
- 蓝牙模块休眠控制:无连接时自动进入SNIFF模式
- LCD背光自动调节:根据环境光照强度调整亮度
实测结果表明,在1秒采样间隔下,系统平均电流为12.6mA,使用2000mAh锂电池可连续工作约6天。
4.2 抗干扰措施
工业现场测试时遇到的主要问题是电磁干扰导致通信错误,我们采取的解决方案包括:
- 为所有IO口添加TVS二极管防护
- 单总线信号线采用双绞线传输
- 软件上增加CRC校验和重传机制
- 蓝牙通信采用自适应跳频算法
经过优化后,系统在电机启停等强干扰环境下也能稳定工作,误码率从最初的5%降至0.1%以下。
4.3 实测数据对比
我们在电缆接头处布置了3个监测点,与传统红外测温仪对比测试:
| 监测点 | 系统测量值(°C) | 红外测量值(°C) | 误差 |
|---|---|---|---|
| 节点1 | 56.2 | 56.5 | -0.3 |
| 节点2 | 62.8 | 63.0 | -0.2 |
| 节点3 | 48.5 | 48.7 | -0.2 |
系统响应时间测试结果:
- 温度阶跃变化时,系统响应延迟约1.2秒
- 蓝牙数据传输延迟平均为280ms
- LCD刷新率为30fps,操作流畅无卡顿
5. 开发经验与问题排查
5.1 常见问题解决方案
-
DS18B20无响应
- 检查上拉电阻是否连接
- 测量总线电压(正常应>2.8V)
- 确认时序延时准确,特别是复位脉冲宽度
-
蓝牙连接不稳定
- 检查天线是否完好
- 尝试修改通信波特率
- 避免附近有2.4GHz频段干扰源
-
LCD显示异常
- 确认SPI时钟相位和极性设置正确
- 检查复位信号是否正常
- 重新初始化显示控制器
5.2 调试技巧分享
- 使用逻辑分析仪抓取单总线信号,直观检查时序问题
- 在关键代码段插入GPIO翻转语句,用示波器测量执行时间
- 利用STM32的硬件错误中断定位异常原因
- 分段测试各模块功能,先确保底层驱动正常再整合
5.3 扩展改进方向
- 增加NB-IoT模块实现远程监控
- 采用锂电池+太阳能供电方案
- 添加温度异常预测算法
- 支持多机组网和集中管理
这个项目从选题到最终实现历时4个月,期间遇到了不少挑战,但也收获了很多嵌入式开发的实战经验。特别是在电磁兼容设计和低功耗优化方面,通过反复测试和方案迭代,最终达到了比较理想的效果。对于想要学习STM32开发的同学,我的建议是从基础外设驱动开始,逐步增加复杂度,同时要重视调试工具的使用技巧。