1. 项目概述
这个红外测温系统设计源于我在医疗电子设备开发中的实际需求。传统接触式体温计存在交叉感染风险,而市面上商用红外测温仪要么价格昂贵,要么精度不足。于是决定基于STM32开发一套低成本、高精度的非接触式测温方案。
系统核心在于通过红外传感器捕捉人体辐射能量,结合环境温度补偿算法,实现±0.2℃的医疗级测温精度。相比市面常见方案,我们特别优化了传感器校准流程和温度补偿算法,使得在15-35℃环境温度范围内都能保持稳定测量。
2. 硬件设计方案论证
2.1 主控MCU选型分析
在医疗电子设计中,MCU选型需要平衡性能、功耗和成本。我们对比了两款主流方案:
方案一:80C51单片机
- 优势:价格低廉(约2-3元),开发资料丰富
- 劣势:
- 仅128B RAM和4KB ROM,难以运行复杂算法
- 需要外置ADC模块,增加电路复杂度
- 烧录需专用编程器,调试效率低
方案二:STM32F103C8T6
- 优势:
- Cortex-M3内核,72MHz主频,满足实时处理需求
- 内置64KB Flash+20KB SRAM,可存储校准参数
- 集成3路12位ADC,直接连接传感器
- SWD调试接口,支持在线编程
- 成本:约8-10元(批量采购价)
实际选型建议:医疗设备对可靠性要求高,建议选择工业级(-40℃~85℃)的STM32F103系列。我们最终选用STM32F103C8T6,其64KB Flash完全满足需求,且LQFP48封装便于手工焊接。
2.2 红外传感器关键技术对比
红外测温精度主要取决于传感器性能,我们重点评估了两种方案:
| 型号 | IRTR-3605 | MLX90614ESF-BAA |
|---|---|---|
| 测量范围 | -20~300℃ | -40~125℃ |
| 精度 | ±2℃ | ±0.5℃(医疗级) |
| 分辨率 | 0.1℃ | 0.02℃ |
| 输出方式 | 模拟电压 | I2C数字输出 |
| 视场角 | 90° | 35° |
| 典型应用 | 工业设备 | 医疗/家电 |
选择MLX90614的关键考量:
- 内置17位ADC和DSP单元,减少信号干扰
- 出厂时每个传感器都经过校准,自带EEPROM存储校准参数
- 窄视场角(35°)更适合测量人体局部温度
- I2C接口简化电路设计,仅需4根连线
2.3 显示模块设计要点
显示模块需要平衡信息量和功耗,我们的对比测试数据:
LED数码管方案
- 优点:功耗低(约5mA),成本低(2-3元)
- 缺点:只能显示数字,无法显示单位/状态信息
- 实测问题:强光环境下可视性差
LCD1602方案
- 优点:
- 可显示两行16字符,包含温度值、单位、状态提示
- 对比度可调,适应不同光照环境
- 功耗约1mA(带背光时约20mA)
- 特殊处理:增加了光线传感器自动调节背光
最终选用LCD1602并做了以下优化:
- 采用3.3V供电的型号,与STM32电平匹配
- 添加74HC245作为电平缓冲,防止信号干扰
- 设计PWM调光电路,根据环境光自动调节亮度
3. 硬件电路实现细节
3.1 系统架构设计
整个硬件系统包含以下关键模块:
code复制[电源模块] → [STM32主控] ←→ [MLX90614传感器]
↑
[按键输入] [LCD显示]
↓
[蜂鸣器报警] [环境温度传感器]
电源设计要点:
- 采用AMS1117-3.3稳压芯片,输入5V输出3.3V
- 每个IC电源引脚添加0.1μF去耦电容
- 传感器供电单独走线,避免数字噪声干扰
3.2 传感器接口电路
MLX90614的典型连接方式:
c复制// STM32硬件I2C配置(PB6-SCL, PB7-SDA)
I2C_InitTypeDef i2c_init;
i2c_init.I2C_ClockSpeed = 100000; // 100kHz
i2c_init.I2C_Mode = I2C_Mode_I2C;
i2c_init.I2C_DutyCycle = I2C_DutyCycle_2;
i2c_init.I2C_OwnAddress1 = 0x00;
i2c_init.I2C_Ack = I2C_Ack_Enable;
i2c_init.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_Init(I2C1, &i2c_init);
常见问题排查:
- I2C无响应:检查上拉电阻(4.7kΩ)是否接好
- 数据异常:确保电源电压稳定(3.3V±5%)
- 通信失败:尝试降低时钟频率至50kHz
3.3 PCB设计经验
-
布局原则:
- 传感器与MCU距离不超过10cm
- 模拟部分与数字部分分区布局
- 晶振尽量靠近MCU,周围铺地保护
-
布线技巧:
- I2C走线等长,避免平行走线过长
- 电源线宽≥0.3mm,关键信号线加粗
- 四层板设计时,专用地层提高抗干扰性
-
实测问题记录:
- 初版PCB因未做阻抗匹配导致I2C通信不稳定
- 改进后增加了终端匹配电阻(100Ω)
4. 软件系统实现
4.1 系统软件架构
采用模块化设计,主要包含以下组件:
code复制main.c
├── sensor_driver
│ ├── mlx90614.c
│ └── ds18b20.c
├── display
│ └── lcd1602.c
├── algorithm
│ └── temp_compensate.c
└── hardware
├── i2c.c
└── gpio.c
4.2 关键算法实现
温度补偿算法流程:
- 读取MLX90614原始数据(物体温度Ta,传感器温度Tobj)
- 获取DS18B20环境温度Tamb
- 计算补偿温度:
c复制float compensate_temp(float Ta, float Tobj, float Tamb) { // 经验系数,需根据实测数据调整 const float k1 = 0.12f, k2 = 0.05f; return Ta + k1*(Tamb-25) + k2*(Tobj-25); } - 滑动平均滤波(窗口大小=5):
c复制#define FILTER_SIZE 5 float filter_buf[FILTER_SIZE]; float moving_average(float new_val) { static uint8_t index = 0; filter_buf[index] = new_val; index = (index + 1) % FILTER_SIZE; float sum = 0; for(uint8_t i=0; i<FILTER_SIZE; i++) { sum += filter_buf[i]; } return sum / FILTER_SIZE; }
4.3 人机交互设计
状态机实现按键控制:
c复制typedef enum {
IDLE,
MEASURING,
SETTING,
ALARM
} SystemState;
void key_handler(SystemState *state) {
static uint32_t last_press = 0;
if(HAL_GetTick() - last_press < 200) return; // 消抖
if(KEY1_PRESSED) {
switch(*state) {
case IDLE: *state = MEASURING; break;
case MEASURING: *state = IDLE; break;
// 其他状态处理...
}
last_press = HAL_GetTick();
}
}
显示优化技巧:
- 使用自定义字符实现温度符号"℃"
- 添加测量状态动画(如旋转图标)
- 异常温度值闪烁提示
5. 系统调试与优化
5.1 校准流程详解
医疗设备需要严格的校准,我们采用黑体炉作为标准源:
-
准备阶段:
- 将传感器固定在距黑体炉表面3cm处
- 设置黑体炉温度为35.0℃(人体温度范围)
-
校准步骤:
python复制# 示例校准脚本(通过串口与STM32交互) import serial ser = serial.Serial('COM3', 115200) # 发送校准命令 ser.write(b'CALIB_START,35.0\n') # 读取10组数据求平均 samples = [] for _ in range(10): line = ser.readline().decode().strip() samples.append(float(line.split(':')[1])) offset = 35.0 - sum(samples)/len(samples) ser.write(f'CALIB_OFFSET,{offset:.2f}\n'.encode()) -
验证方法:
- 测试35.0℃、37.0℃、40.0℃三个关键点
- 要求各点误差≤±0.2℃
5.2 性能优化记录
问题1:响应速度慢
- 现象:从按下按键到显示温度需1.5秒
- 分析:I2C通信速率低(默认100kHz),且滤波算法耗时
- 解决:
- 提升I2C时钟至400kHz
- 优化滤波算法,减少计算量
- 结果:响应时间缩短至0.3秒
问题2:低温环境精度下降
- 现象:环境温度<10℃时误差增大到±0.5℃
- 分析:传感器自身温度影响增大
- 解决:
- 增加二阶温度补偿项
- 添加加热电阻维持传感器工作温度
- 结果:全温度范围保持±0.2℃精度
6. 实测数据与改进建议
6.1 精度测试数据
我们在三种典型环境下进行测试(单位:℃):
| 标准温度 | 室内(25℃) | 高温(35℃) | 低温(5℃) |
|---|---|---|---|
| 36.5 | 36.4 | 36.6 | 36.3 |
| 37.0 | 37.1 | 37.2 | 36.9 |
| 38.0 | 38.1 | 38.0 | 37.8 |
6.2 可能的改进方向
-
低功耗设计:
- 改用STM32L系列低功耗MCU
- 添加运动传感器,无人时自动休眠
-
无线功能扩展:
- 增加蓝牙模块(HC-05)
- 开发手机APP记录温度曲线
-
外壳设计建议:
- 3D打印专用支架,固定测量距离
- 添加激光定位辅助瞄准
在实际部署中发现,传感器镜面容易沾染灰尘影响精度。后来我们增加了定期清洁提醒功能,当检测到读数波动异常时,LCD会显示"请清洁传感器"提示。