手把手教你用STM32F103和LM358搞定PT100测温,精度0.2℃,附完整代码和电路图
2026/6/6 8:21:00 网站建设 项目流程

基于STM32F103与LM358的高精度PT100测温系统实战指南

1. 系统架构与核心组件解析

PT100作为工业级温度传感器,其铂电阻特性提供了优异的线性度和稳定性。要实现0.2℃的高精度测量,需要构建完整的信号链:

系统核心组件拓扑:

PT100传感器 → 恒流驱动 → 电桥电路 → 差分放大 → ADC采样 → 数字滤波 → 温度计算 → OLED显示 ↑ ↑ 精密参考电阻 LM358运放

关键参数对比表:

组件参数要求选型建议
PT100测温范围:-200℃~850℃分度号PT100,Class A级
驱动电流<5mA建议1mA恒流源
电桥电阻匹配精度0.1%金属膜电阻,25ppm温漂
运放低噪声,高CMRRLM358或AD620仪表放大器
ADC12位以上STM32内置ADC或外置ADS1115

硬件设计时需要特别注意:

  • 电桥平衡点的选择直接影响灵敏度
  • 布线时采用星型接地减少干扰
  • 电源需增加LC滤波网络
  • 信号走线尽量短且对称

2. 精密测量电路设计详解

2.1 优化型电桥电路设计

传统单臂电桥存在非线性问题,改进方案采用自动平衡电桥:

// 电桥电压计算公式 V_bridge = Vcc * (R_pt/(R_pt + R_fixed) - R_ref/(R_ref + R_balance));

实际电路参数配置:

  • 激励电压:5V(需稳定基准)
  • R_fixed:1KΩ 0.1%精度
  • R_balance:100Ω可调精密电位器
  • R_ref:与PT100初始阻值匹配

布局要点:

  • 所有电阻靠近运放放置
  • 采用四线制接法消除引线电阻影响
  • 电桥输出端加RFI滤波器

2.2 高精度差分放大电路

LM358配置为仪表放大器结构:

R1 R3 IN+ ──┬─────┤├───────┐ │ │ │ R2 R4 │ │ │ ˅ IN- ──┴─────┤├───→ OUT LM358

放大倍数计算公式:

Gain = (1 + 2*R1/R2) * (R3/R4);

推荐参数:

  • R1=R2=10KΩ
  • R3=350KΩ, R4=10KΩ → 理论增益35倍
  • 实际通过50KΩ电位器微调

注意:LM358输入共模范围需保持在1.5V~3.5V之间,超出会导致非线性失真

3. STM32软件实现关键代码

3.1 ADC采样与数字滤波

采用滑动平均+中值滤波组合算法:

#define SAMPLE_SIZE 100 uint16_t adc_filter(void) { static uint16_t samples[SAMPLE_SIZE]; static uint8_t index = 0; uint16_t temp[SAMPLE_SIZE]; // 采集新样本 samples[index++] = ADC_Read(); if(index >= SAMPLE_SIZE) index = 0; // 中值滤波 memcpy(temp, samples, sizeof(temp)); bubble_sort(temp, SAMPLE_SIZE); // 取中间20%样本做平均 uint32_t sum = 0; for(uint8_t i=SAMPLE_SIZE*0.4; i<SAMPLE_SIZE*0.6; i++) { sum += temp[i]; } return sum / (SAMPLE_SIZE*0.2); }

3.2 温度计算与分段线性化

建立PT100分度表并实现快速查表:

typedef struct { uint16_t temp; // 温度值(×10) uint16_t adc; // 对应ADC值 } TempTable; const TempTable pt100_table[] = { {200, 856}, {210, 892}, ..., {800, 3276} }; float adc_to_temp(uint16_t adc) { uint8_t i; for(i=0; i<sizeof(pt100_table); i++) { if(adc < pt100_table[i].adc) break; } // 线性插值 float slope = (pt100_table[i].temp - pt100_table[i-1].temp) / (float)(pt100_table[i].adc - pt100_table[i-1].adc); return pt100_table[i-1].temp + slope * (adc - pt100_table[i-1].adc); }

4. 系统校准与性能优化

4.1 三步校准法

  1. 零点校准

    • 将PT100置于冰水混合物(0℃)
    • 调整电桥平衡使输出为0V
    • 记录ADC基准值
  2. 满量程校准

    • 将PT100置于沸水(100℃)
    • 调整放大倍数使ADC接近满量程
    • 验证中间点(50℃)准确性
  3. 多点线性校准

    • 在20℃、40℃、60℃、80℃等点记录ADC值
    • 生成校准曲线方程

4.2 常见问题解决方案

问题1:读数跳变严重

  • 检查电源纹波(应<10mV)
  • 增加输入RC滤波(100Ω+0.1μF)
  • 优化PCB布局,缩短模拟走线

问题2:低温段精度差

  • 改用恒流源驱动(1mA)
  • 提高电桥供电电压(需注意运放输入范围)
  • 增加低温段校准点

问题3:响应速度慢

  • 减小滤波窗口大小
  • 采用动态滤波算法
  • 优化采样时序

5. 扩展应用与进阶优化

5.1 OLED显示界面设计

采用多层菜单结构:

[主界面] 温度值: 25.6℃ 历史曲线: ────┬──── 报警状态: 正常 [设置菜单] 1. 报警阈值设置 2. 校准模式 3. 数据记录

5.2 无线传输方案

通过ESP-01S模块增加WiFi功能:

void wifi_send_data(float temp) { char buffer[64]; sprintf(buffer, "GET /update?field1=%.1f HTTP/1.1\r\nHost: api.thingspeak.com\r\n\r\n", temp); USART_SendString(USART1, buffer); }

5.3 功耗优化技巧

  1. 采用间歇工作模式:

    • 每10秒唤醒采集一次
    • 其余时间进入STOP模式
  2. 动态调整时钟:

    RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI); SystemCoreClockUpdate();
  3. 外围电路电源管理:

    • 用MOS管控制运放供电
    • 背光自动调节

实际测试表明,优化后系统在3.3V供电时,平均电流可从25mA降至3.8mA,电池续航提升6倍以上。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询