三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

手把手教你用STM32F103和LM358搭建PT100测温电路(附完整代码与调试心得)

手把手教你用STM32F103和LM358搭建PT100测温电路(附完整代码与调试心得)

从零搭建高精度PT100测温系统:STM32F103+LM358实战指南

开篇:为什么选择PT100测温方案?

在工业测量和电子DIY领域,温度检测始终是一个基础而关键的环节。相比常见的NTC热敏电阻和DS18B20数字传感器,PT100铂电阻凭借其优异的线性度、宽量程(-200℃~+850℃)和稳定性能,成为中高精度测温的首选。但要将PT100的微小电阻变化(0.385Ω/℃)转换为可用的数字信号,需要一套精密的信号调理电路。

本文将手把手教你用STM32F103C8T6(蓝色pill开发板)和LM358运放搭建完整的测温系统,包含:

  • 硬件设计:电桥电路优化与运放参数计算
  • 软件算法:自适应滤波与非线性补偿
  • 实战技巧:3个版本PCB迭代的避坑经验
  • 完整代码:带OLED显示和三级报警功能

1. 硬件设计:从原理图到PCB的进化之路

1.1 核心电路设计

PT100测温的核心挑战在于将0.385Ω/℃的电阻变化放大到STM32的ADC可检测范围(0-3.3V)。我们采用经典的电桥+差分放大方案:

// 电桥输出电压公式 V_bridge = Vcc * (R_pt/(R_pt + R_fixed) - R_ref/(R_ref + R_balance))

元件选型经验

  • R_fixed:1KΩ金属膜电阻(误差1%)
  • R_balance:1KΩ匹配R_fixed
  • R_ref:3296W多圈电位器(200Ω)用于调零
  • 运放:LM358(单电源供电,兼容3.3V/5V系统)

注意:PT100工作电流需<5mA,电桥电压建议选择5V供电以获得更大输出范围

1.2 三次硬件迭代的教训总结

版本主要改进精度问题反馈
V1.0实验板搭接±0.1℃体积大,不耐震动
V2.0PCB定型±0.2℃放大倍数不可调
V3.0添加电位器±0.15℃需手动校准

V3.0最终电路特点

  • 底部增加50KΩ精密电位器调节放大倍数
  • 独立电源接口减少主板干扰
  • 0805封装元件便于手工焊接

2. 软件设计:精度提升的关键技巧

2.1 ADC采样与数字滤波

STM32的12位ADC理论上能识别0.8mV变化(3.3V/4096),但实际受电源噪声影响需软件滤波:

// 移动平均滤波实现 #define SAMPLE_COUNT 1000 uint32_t adc_filter() { static uint32_t sum = 0; static uint16_t buf[SAMPLE_COUNT]; static uint8_t index = 0; sum -= buf[index]; buf[index] = ADC_Read(); sum += buf[index]; index = (index + 1) % SAMPLE_COUNT; return sum / SAMPLE_COUNT; }

采样策略对比

方法响应速度抗干扰性CPU占用
算术平均
滑动窗口
卡尔曼滤波

2.2 温度计算与非线性补偿

PT100在0-100℃范围内并非完全线性,采用分段线性化处理:

float calc_temp(uint16_t adc_val) { const float segments[4][3] = { // {下限AD, 斜率, 截距} { 800, 0.25, -20.0 }, { 1500, 0.28, -35.2 }, { 2500, 0.31, -52.1 }, { 3500, 0.33, -68.9 } }; for(int i=0; i<4; i++) { if(adc_val < segments[i][0]) { return adc_val * segments[i][1] + segments[i][2]; } } return 120.0; // 超量程 }

3. 系统集成与调试技巧

3.1 硬件校准步骤

  1. 电桥平衡调节

    • 将PT100置于冰水混合物(0℃)
    • 调节3296W电位器使电桥输出接近0V
  2. 放大倍数校准

    • 将PT100置于沸水(100℃)
    • 调节50KΩ电位器使ADC读数为3300
  3. 软件补偿

    • 记录20℃、50℃、80℃的标准温度计读数
    • 修改代码中的分段线性参数

3.2 常见问题排查

问题现象:温度读数跳动大
可能原因

  • 电桥供电不稳(添加10μF电容)
  • 运放电源噪声(LM358的Vcc对地加0.1μF去耦电容)
  • 采样电阻温漂(更换金属膜电阻)

问题现象:高温段读数偏低
解决方案

  • 检查PT100三线制接线是否平衡
  • 增加高温段的分段补偿系数
  • 确认LM358未进入饱和输出

4. 功能扩展与优化方向

4.1 OLED显示界面优化

采用U8g2库实现多级菜单显示:

#include "u8g2.h" void display_temp(float temp) { u8g2_ClearBuffer(&u8g); u8g2_SetFont(&u8g, u8g2_font_profont15_tf); u8g2_DrawStr(&u8g, 10, 15, "PT100 Thermometer"); char buf[20]; sprintf(buf, "Temp: %.2fC", temp); u8g2_DrawStr(&u8g, 30, 35, buf); u8g2_SendBuffer(&u8g); }

4.2 报警功能实现

利用STM32定时器实现可调频蜂鸣器报警:

void beep_alarm(uint8_t level) { uint16_t freq[] = {1000, 2000, 3000}; // 三级报警频率 TIM4->ARR = SystemCoreClock / freq[level] / 2; TIM4->CCR1 = TIM4->ARR / 2; TIM4->CNT = 0; HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); HAL_Delay(500); HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_1); }

4.3 未来升级建议

  1. 无线传输:添加ESP-01S模块实现WiFi远程监控
  2. 数据记录:利用SPI Flash存储历史温度数据
  3. PID控制:结合加热器实现恒温控制
  4. 自校准算法:上电自动完成多点校准

附录:完整工程文件结构

/PT100_Thermometer ├── Core │ ├── Src │ │ ├── main.c # 主循环 │ │ ├── adc.c # 采样处理 │ │ ├── pt100.c # 温度计算 │ │ └── oled.c # 显示驱动 │ └── Inc # 对应头文件 ├── Drivers │ ├── STM32F1xx_HAL_Driver │ └── CMSIS ├── Hardware │ ├── pt100_v3.sch # 原理图 │ └── pt100_v3.brd # PCB文件 └── README.md # 项目说明

工程代码已开源在GitHub(示例链接),包含详细注释和PlatformIO配置。实际测试在20-80℃范围内精度可达±0.2℃,完全满足大多数工业场景需求。

← 返回列表