1. 所选主题和项目介绍
1.1 项目背景
随着工业自动化和智能化发展的不断深入,温度监测在众多领域扮演着越来越重要的角色。从工业设备的状态监控、农业大棚的环境调节,到医疗设备的温度管理,准确可靠的温度采集系统都是不可或缺的关键组成部分。传统的单点温度测量已经难以满足日益复杂的应用场景需求,分布式温度采集系统因其能够同时监测多个位置温度参数的能力而受到广泛关注。
本次设计选择以分布式温度采集系统为主题,旨在构建一个能够同时采集三通道温度数据的监测系统。该系统以NTC热敏电阻作为温度传感器核心,结合高精度的信号调理电路和微控制器,实现对环境温度的实时、准确监测,并具备超温报警功能,可广泛应用于工业现场、仓库管理、设备机房等多种需要对温度进行多点监测的场景。
1.2 项目目标
本项目设定了以下具体目标:
(1)三通道独立采集能力
设计并实现三个独立的温度采集通道,每个通道能够独立采集对应位置的温度数据,三个通道之间互不干扰,可同时工作。
(2)高测量精度
通过合理的硬件设计和软件补偿,使温度测量精度达到±1°C以内,满足大多数工业应用场景的精度要求。
(3)实时显示功能
通过液晶显示屏实时显示三个通道的温度值、报警阈值、报警状态等信息,提供友好的人机交互界面。
(4)报警功能
实现可设置的温度报警功能,当任意通道温度超过设定阈值时触发声光报警,并具有迟滞防抖机制,避免误报警。
(5)分布式部署便利性
三个传感器通道可通过线缆延长,实现远距离温度监测,适用于需要分布式布置的应用场景。
1.3 主要功能特性
本分布式温度采集系统具备以下主要功能特性:
功能特性 | 描述 |
通道数量 | 3通道独立采集 |
温度范围 | -40°C ~ 150°C |
显示精度 | 0.1°C |
测量精度 | ±1°C |
报警延迟 | <500ms |
报警方式 | 屏幕颜色指示 + 状态文字 |
按键控制 | 阈值设置、报警使能、页面切换 |
采样方式 | 中值滤波 |
2. 硬件介绍
2.1 主控芯片 - RP2040
本系统采用树莓派基金会推出的RP2040微控制器作为核心处理器。RP2040是一款功能强大的32位双核ARM Cortex-M0+处理器,主频可达133MHz,具备丰富的外设资源,非常适合用于数据采集和控制系统。
本次设计使用RP2040的三个ADC通道(IO26、IO27、IO28)分别连接三个温度采集通道,实现三路模拟信号的同步采集。
2.2 温度传感器 - NTC热敏电阻DC103G9G
本系统选用DC103G9G型NTC热敏电阻作为温度传感器。NTC(Negative Temperature Coefficient)热敏电阻是一种随温度升高而阻值减小的负温度系数电阻,具有灵敏度高、响应速度快、成本低廉等优点,是工业和消费电子领域应用最广泛的温度传感器之一。DC103G9G的标称阻值为10kΩ,这一阻值在室温附近既不会太大导致测量电路的电流过小,也不会太小导致自热效应明显,非常适合与10kΩ上拉电阻配合使用,构成标准的分压测温电路。
2.3 运算放大器 - GS6004
本系统采用GS6004运算放大器作为电压跟随器,对NTC传感器输出的信号进行缓冲放大。GS6004是一款双电源供电的通用运算放大器,具有低偏置电流、低噪声、高共模抑制比等特点,非常适合用于传感器信号调理。
在本次设计中,GS6004配置为电压跟随器工作模式,电压跟随器具有一定的低通滤波特性,可以抑制高频干扰信号,提高测量稳定性。
3. 方案框图和项目设计思路
3.1 系统总体架构
本分布式温度采集系统采用经典的"传感器-信号调理-模数转换-数据处理-显示输出"架构。整个系统由以下几个主要部分组成:
3.2 三通道分布式设计思路
针对三通道分布式温度采集的需求,本设计采用以下思路:
(1)独立通道设计:每个温度采集通道由独立的NTC传感器、分压电阻和运放通道组成。这种设计保证了三个通道之间完全电气隔离,不会产生相互干扰。
(2)远距离扩展能力:传感器与主板之间通过屏蔽电缆连接,最长可达数米。电压跟随器的使用有效补偿了长距离传输过程中的信号衰减和噪声引入。
(3)同步采集机制:RP2040的ADC支持多通道轮询采集,主循环中依次读取三个通道的ADC值,确保温度数据的同步性。
(4)软件滤波处理:每个通道采用中值滤波算法,有效抑制随机噪声和突发干扰,提高测量稳定性。
4. 原理图和PCB设计
原理图设计
PCB设计
实物如下:
5. 软件设计
软件流程图:
关键代码分析
(1)NTC温度转换
def ntc_temperature(adc_value):
r = ntc_resistance(adc_value)
if r <= 0:
return 0
try:
inv_t = 1.0 / NTC_T0 + (1.0 / NTC_B) * math.log(r / NTC_R0)
t = 1.0 / inv_t - 273.15
return t + TEMP_OFFSET # 应用校准补偿
except:
return 0
代码说明:
- 使用Steinhart-Hart方程进行温度转换,这是NTC热敏电阻最精确的温度计算方法
- 1/T = 1/T0 + (1/B) * ln(R/R0) 是其简化形式
- TEMP_OFFSET 用于补偿系统误差,包括运放offset和电路板漂移
(2)中值滤波
def read_filtered_adc(ch):
ch.buffer[ch.buffer_index] = ch.adc.read_u16()
ch.buffer_index = (ch.buffer_index + 1) % FILTER_SIZE
sorted_values = list(ch.buffer)
sorted_values.sort()
return sorted_values[FILTER_SIZE // 2]
代码说明:
- 采用中值滤波算法,取5次采样的中值
- 中值滤波能有效抑制随机噪声和偶发的尖峰干扰
- 比算术平均滤波更能处理突发性干扰
(3)带迟滞的报警判断
def check_alarm(ch, temp):
if ch.alarm_triggered:
if temp < (alarm_temp - alarm_hysteresis):
ch.alarm_triggered = False
else:
if temp >= alarm_temp:
ch.alarm_triggered = True
return ch.alarm_triggered
代码说明:
- 报警触发阈值:temperature >= alarm_temp
- 报警解除阈值:temperature < (alarm_temp - hysteresis)
- 迟滞值0.8°C,防止温度在阈值附近波动时产生频繁的报警/解除动作
(4)三通道数据结构
# 创建三通道对象
channels = [ChannelData(CHANNEL_NAMES[i], ADC_PINS[i]) for i in range(3)]
class ChannelData:
def __init__(self, name, adc_pin):
self.name = name # 通道名称 (CH1/CH2/CH3)
self.adc = ADC(adc_pin) # ADC对象
self.buffer = array.array('H', [0] * FILTER_SIZE) # 滤波缓冲
self.buffer_index = 0 # 缓冲索引
self.temperature = 0.0 # 当前温度
self.voltage = 0.0 # 当前电压
self.last_temp_str = "" # 上次显示值
self.alarm_triggered = False # 报警状态
代码说明:
- 使用面向对象的方式管理每个通道的数据
- 每个通道独立维护自己的滤波缓冲区和状态
- 三个通道完全独立,互不影响
6. 硬件功能展示
页面刷新显示:
7. 设计中遇到的难题和解决方法
在系统调试过程中,发现实际环境温度为22.5°C时,三个通道显示的温度值均为25°C左右,偏差达到2.5°C。更换传感器位置和多次测量确认,环境温度确实为22.5°C。采用软件补偿的方式,在温度转换公式中加入偏移量,通过实测校准确定补偿值为-2.5°C后,三个通道的温度显示均能准确反映实际环境温度,偏差控制在±0.5°C以内。
8. 心得体会
本次设计成功实现了一个基于DC103G9G的三通道分布式温度采集系统。从最初的需求分析、方案设计,到硬件选型、原理图PCB设计,再到软件编程、系统调试,整个过程让我对嵌入式系统开发有了更深入的理解和实践经验。通过这次项目,我深刻体会到嵌入式系统开发的复杂性和趣味性。一个看似简单的温度采集系统,涉及到的知识面非常广泛:模拟电路、数字电路、微控制器编程、传感器原理、信号处理、显示技术、用户界面设计等等。