STM32+PT100温度采集系统实战:三线制接线与ADC滤波详解
2026/9/9 20:22:02 网站建设 项目流程

简介:面向基于STM32单片机的嵌入式开发与工业温度测量场景,这套PT100铂电阻温度采集系统资料,完整展示了从传感器前端到微控制器处理的实现链路,重点围绕四线制连接消除线路电阻影响、内部ADC通道配置,以及采用查找表或多项式拟合完成电阻-温度换算的软件算法。压缩包共包含277个文件,大小约18.09MB,主体为62个C源码文件与52个头文件,同时提供Keil工程文件、原理图设计文件、PCB相关文件、PDF说明文档、PNG截图和文本资料,便于对照代码理解硬件电路。目前已有2065人学习下载,适用于电子类课程设计、毕业设计,也可作为工业温度监测项目的前期参考。包内还集成了LCD显示驱动、定时器中断周期采集、文件系统读写、UART或I2C通信等模块代码,并附有完整用户手册和工程备份,设计者可直接基于STM32F10x平台移植,或参照其电路原理图、布局思路与算法进行二次开发。 很多电子相关专业的朋友,在准备毕业设计或者课程设计时,大概率都见过“基于stm32单片机PT100铂电阻温度采集系统(程序+原理图+全套资料).zip”这种压缩包。这类资源流传很广,但说实话,真正能一次点亮、温度读数靠谱的项目,十套里未必有三套。我上半年帮人调试过好几套类似的板子和代码,这里面最容易出问题的往往不是程序本身,而是硬件链路里的信号调理和软件里的滤波处理。

这篇文章就围绕STM32 + PT100这套经典组合,把温度采集系统从“拿到压缩包”到“跑出准确温度”的过程掰开揉碎讲清楚。内容适合正在做相关课题的学生,也适合想自己动手做工业级测温小项目的工程师。重点讲清楚几个关键问题:PT100信号为什么要处理、三线制接法到底怎么接、ADC采样和滤波怎么做才准,以及最常见的几个坑怎么避开。

1. 项目拆解:这套资料包里到底有什么

1.1 核心模块与功能定位

一个标准的STM32 + PT100温度采集系统,通常包含这几个核心部分:

  • 主控芯片:STM32F103系列最常见,尤其是F103C8T6(小系统板)和F103RCT6(资源更多),价格便宜、资料多、教程完善
  • 温度传感器:PT100铂电阻,0℃时阻值100Ω,温度每升高1℃阻值大约增加0.385Ω
  • 信号调理电路:PT100的阻值变化非常微弱,必须通过电桥电路把电阻变化转为电压变化,再经过运算放大器放大后送入STM32的ADC引脚
  • 显示与交互:常见搭配是0.96寸OLED屏(I2C接口)或者1602液晶屏,有的项目还会加按键设置报警阈值
  • 数据输出:通过串口把温度值发送到上位机,方便调试和后续扩展

拿到压缩包之后,第一步不是急着烧程序,而是先看原理图,确认硬件用的是哪种运放方案、哪个引脚接了ADC通道、三线制还是两线制。很多人在这一步跳过去,后面烧了程序发现读数乱跳,回头排查才发现电路和程序对不上。

1.2 为什么用PT100而不用热敏电阻

NTC热敏电阻虽然便宜,但B值一致性差,换一颗传感器就得重新校准,而且温度高了之后线性度急剧下降。PT100铂电阻的优势在于:

  • 线性度好:在-200℃到850℃范围内,阻值和温度的关系相对稳定,工程上常用查表或线性近似处理
  • 互换性强:同精度等级的PT100,换上去不需要重新标定,这对批量生产和维修特别重要
  • 稳定性高:铂的化学性质稳定,长期使用漂移很小,工业现场大量采用

这也是为什么PT100虽然成本高一些,但在电机绕组测温、管道流体测温、环境温度监测这些需要长期可靠运行的场景里依然是主流选择。

2. 环境准备与工程搭建

2.1 开发环境选择与芯片包安装

如果资料包里的代码是用标准外设库写的,建议直接用Keil MDK5打开工程文件。如果是HAL库写的,也同样是MDK5为主。个别新版本资源会基于STM32CubeMX生成,那样就更省事,直接重新生成初始化代码就行。

Keil MDK5装好之后,必须在包管理器里装好对应芯片的器件支持包,STM32F1系列对应的是Keil.STM32F1xx_DFP。没装这个包,工程打开后芯片型号是空的,编译直接报错。装好后还有一个高频问题:程序下载时提示“Error: No STM32 Target Found! If your product embeds debug authentication, please…”这类错误。绝大多数情况是ST-Link驱动没装好、连接线没接对、芯片供电不足,或者Debug设置里没选对调试器类型。

我自己调试时遇到过一种特殊情况:手头的ST-Link是盗版克隆的,固件版本太老,连上芯片后总是掉线。后来换了新版驱动,同时在MDK的Debug设置里把Reset and Run勾选上,问题就解决了。如果是新买的开发板,先确认板子上的供电跳帽、BOOT0跳线是否是默认的Flash启动模式,这些细节不看,很容易卡在下载这一步。

2.2 工程模板与代码结构识别

打开资料包的时候,先看一眼目录结构,通常会有这几个文件夹:

  • HARDWARE:外设驱动,比如OLED、ADC、按键
  • CORE:启动文件和内核相关代码
  • SYSTEM:延时、串口、中断优先级等基础功能
  • USER:主函数和中断处理

主程序的核心逻辑并不复杂:初始化系统时钟、配置ADC和DMA、初始化OLED,然后进入一个while循环,不断读取转换结果、做滤波运算、计算温度,再送显示。这个流程可以说是所有STM32采集类项目的骨架,搞清楚了,任何传感器采集项目都能举一反三。

3. 硬件电路设计:PT100信号链路的核心逻辑

3.1 PT100三种接法对比

PT100的接线方式有讲究,这个必须单独拉出来讲。

两线制最简单,一根线接电源正,一根线接信号地,但导线本身有电阻,这个电阻会直接叠加到PT100的阻值上。假设导线电阻是1Ω,换算成温度误差就是2.5℃左右,这在很多场景下根本没法接受。

三线制是工业测温最常用的方案。原理是在电桥电路中,一根线接在电桥的电源端,另外两根线分别接在电桥的两个桥臂上,这样导线电阻在桥臂上产生的压降可以相互抵消。需要注意,三根导线的长度和材质要尽量一致,否则抵消效果会打折扣。

四线制精度最高,用开尔文接法,两根线通恒流源,两根线测电压,电压采样回路几乎没有电流流过,所以导线电阻完全不影响测量。但代价是多一根线,成本高一些,通常用于实验室级精密测量。

资料包里如果原理图画的是三线制,那说明设计者考虑了工业场景的实用性。如果画的是两线制,你要心里有数,这只能用在导线很短、精度要求不高的场合。

3.2 电桥与运放参数计算

PT100的阻值变化量很小,0℃时100Ω,100℃时才138.51Ω,变化幅度只有38.51Ω。如果直接用电阻分压,假设电桥输出开路电压,每变化1℃只有零点几毫伏的变化,STM32的ADC参考电压通常是3.3V,12位分辨率是0.8mV/LSB,这种级别的信号根本没法直接用。

所以必须用仪表放大器或者运放把信号放大到ADC能分辨的区间。常见方案如下:

  • 电桥:三个固定电阻和PT100构成惠斯通电桥,桥臂电阻通常取和PT100同量级的电阻,比如100Ω或1kΩ
  • 运放:LM358、OP07、AD620都很常见,单电源供电就可以
  • 放大倍数:根据电桥输出电压范围和ADC输入范围推算

举个例子,一个简单的恒流源方案(虽然原理图里可能用恒流源替代电桥,效果更好):给PT100加1mA恒流源,在0℃时输出100mV,100℃时输出138.5mV,变化38.5mV,这个信号依然偏小,需要放大到接近3.3V的满量程才能发挥12位ADC的精度。放大倍数取G = (3.3 - 0.3) / 0.138 ≈ 21倍,实际取20倍左右比较稳妥。

我见过很多学生抄原理图时,把运放的增益电阻焊错,导致输出直接顶到电源轨,ADC读出来永远是4095,然后怀疑传感器坏了。其实只要拿万用表量一下运放输出引脚的对地电压,就能立刻判断信号链路是否正常。

4. 软件核心:ADC采集、滤波与温度换算

4.1 ADC采样与DMA配置

STM32F103的ADC是12位逐次逼近型,转换时间最快1us左右,但对于温度采集这种慢变信号,根本不需要开满速。实际工程中,我用得最多的配置是:ADC1的通道1,采样时间设置为239.5周期,启用扫描模式,配合DMA自动搬运数据到内存,避免CPU频繁进中断。

// ADC1 初始化(HAL库风格示例,实际代码请以资料包为准) ADC_HandleTypeDef hadc1; DMA_HandleTypeDef hdma_adc1; void MX_ADC1_Init(void) { hadc1.Instance = ADC1; hadc1.Init.ScanConvMode = ENABLE; hadc1.Init.ContinuousConvMode = ENABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 1; HAL_ADC_Init(&hadc1); ADC_ChannelConfTypeDef sConfig = {0}; sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; HAL_ADC_ConfigChannel(&hadc1, &sConfig); }

如果是标准外设库版本,配置思路完全一样,只是API名称不同。这里说一个关键点:采样时间尽量设长。PT100信号本身是缓变信号,不需要高采样率,但要尽量降低ADC采样电容充电不充分带来的误差。较长的采样时间可以显著提高读数稳定性。

4.2 温度换算是核心中的核心

ADC读到的数字只是电压值,要换算成温度,必须先转换回电阻值,再查PT100分度表或者用公式计算。

计算公式法用的是Callendar-Van Dusen方程,但实际工程中常用简化处理。在0~100℃范围内,PT100的阻值和温度关系近似为:

Rt = R0 * (1 + A*t) 其中,R0 = 100Ω,A = 0.00385/℃,t为温度。

所以只要知道当前电阻Rt,温度约为:

t = (Rt - 100) / 0.385

但ADC输出到电阻的换算取决于电路结构。如果是恒流源方案,R = V_adc / I_fixed,足够简单。如果是电桥+运放方案,需要先根据放大倍数反向推演电桥输出电压,再求解电阻值,这就麻烦得多。很多资料包里的代码写的是查表法,直接用标准分度表数据,配合线性插值计算中间值,这种做法精度更高,推荐优先使用。

另外,数字滤波一定要做。STM32的ADC内置采集有随机噪声,直接读取原始值会看到温度跳动1℃甚至更多。最实用的方法是多次采样取平均:

#define SAMPLE_COUNT 32 uint32_t get_adc_average(void) { uint32_t sum = 0; for (uint8_t i = 0; i < SAMPLE_COUNT; i++) { sum += read_adc_value(); HAL_Delay(10); } return sum / SAMPLE_COUNT; }

32次采样取平均之后,显示出来的温度基本能稳定在±0.1℃以内,效果非常明显。有人喜欢用滑动滤波或者卡尔曼滤波,但对这个项目来说,均值滤波完全够用,别过度设计。

4.3 OLED显示与串口调试

0.96寸OLED用I2C接口,数据线走PB6和PB7(I2C1),软件模拟I2C或者硬件I2C都行。资料包里如果有OLED驱动,直接包含头文件,调用显示函数就行。

实际调试的时候,我习惯在代码里同时开启串口输出,把原始ADC值、计算后的电阻值、最终温度值一起打印到串口助手。这样每改一次参数,不用盯着屏幕看,直接看串口数据流就能判断每个环节有没有问题。

举例来说,如果ADC原始值接近4095,说明输入超量程,要么运放饱和,要么接线错;如果原始值正常但计算温度离谱,那就是换算公式或者电路参数没对应上。这种分步定位问题的方法,比对着整个系统瞎猜高效得多。

5. 常见问题与排查技巧实录

这部分都是实操中真正会遇到的问题,直接整理成表格,方便对照排查。

故障现象可能原因排查方法
下载程序时报No STM32 Target FoundST-Link驱动异常、接线错误、芯片未供电查看设备管理器是否识别ST-Link;确认SWDIO/SWCLK/GND三线连接;检查板子供电跳帽
OLED不显示任何内容I2C地址错误、GPIO复用冲突、模块供电不足用扫描程序查设备地址(常见0x3C或0x3D);核对代码中引脚和实际接线是否一致
温度读数比实际值偏高或偏低三线制接错、固定电阻精度不足、PT100型号不匹配万用表量PT100阻值,对照分度表估算温度;查桥臂电阻是否与原理图标注一致;确认用的是PT100不是PT1000
温度读数跳变剧烈未滤波、电源纹波大、信号线受干扰加均值滤波;ADC采样电容供电路径加0.1uF和10uF电容;信号线远离电机等干扰源
温度始终不变ADC通道配置错、传感器开路量PT100两端是否有电压;检查传感器引脚是否虚焊
上电后程序不运行BOOT0跳线不对、复位电路异常确认BOOT0接GND(Flash启动);检查NRST引脚电压是否正常

还有一个很典型的坑:很多人用开发板上的3.3V给整个电路供电,但板载稳压芯片给的驱动能力有限,如果OLED、运放、ST-Link全挂在上面,电压会被拉低到2.8V左右。这时ADC参考电压也跟着掉,算出来的温度自然就不准。我通常会在调试时用万用表量一下3.3V引脚,如果低于3.2V,就该换独立供电或者加强电源模块了。

很多人遇到“No STM32 Target Found”就直接怀疑芯片坏了,其实大多数时候是调试器的驱动或者接线问题,芯片反而比较耐用,很少因为操作不当烧坏。如果SWD连不上,可以给板子断电重新上电,或者按住复位键再点击下载,等出现烧录进度提示时松开复位键,这个方法在极端情况下非常管用。

6. 全套资料的验证与扩展

6.1 拿到资料后的完整验证流程

资源包下载下来之后,不要急着烧程序,按下面的顺序过一遍,基本能避开90%的新手坑:

  1. 先看原理图,记录PT100接入的是哪个ADC通道、运放型号、恒流源还是电桥方案
  2. 核对代码里的引脚定义和原理图是否一致
  3. 打开工程,编译一遍,确认没有报错和警告
  4. 接好ST-Link和板子,先烧一个LED翻转的最小程序,确认调试链路通畅
  5. 再烧录温度采集程序,串口输出原始ADC值和计算温度
  6. 用万用表量PT100两端,确认传感器正常
  7. 用手捏住PT100,看温度能否明显上升
  8. 用冰水混合物或者沸水做简单校准(如果项目精度要求高)

这个过程其实就是把系统拆成“最小可验证单元”逐个确认,而不是一把梭直接整体调试。很多人一上来就烧整个程序,出了问题不知道是传感器的、运放的还是代码的,最后只能干瞪眼。

6.2 后续扩展方向

如果项目做完之后还有余力,这个系统可以往几个方向扩展:

  • 用STM32的定时器PWM控制加热丝,构成简单的闭环恒温系统
  • 加ESP8266模块,把温度数据上传到云平台,变成物联网测温节点
  • 用RS485总线挂多个PT100采集节点,构成分布式测温网络,适合大棚、仓库等场景
  • 增加按键和报警电路,设置超限报警

我个人在实际调试中的体会是,PT100项目最大的价值不在于“采集温度”这件事本身,而在于它串联了模拟电路设计、信号调理、ADC采集、数字滤波、通信协议、显示驱动这几个嵌入式开发的核心环节。把这套系统吃透了,以后做其他传感器项目会顺畅很多。

最后再分享一个小技巧:调试时可以准备一个标准电阻箱或者精密的100Ω电阻,代替PT100接入电路,这样可以把“传感器误差”和“电路/软件误差”分开排查。如果程序配合100Ω电阻时显示0℃,说明整个采集链路是准的,温度不准的锅就甩给传感器本身了。

本文还有配套的精品资源,点击获取

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

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

立即咨询