ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PT100测温实战:STM32 ADC采集与Keil工程完整设计

PT100测温实战:STM32 ADC采集与Keil工程完整设计 简介本资源是一套完整的PT100电阻温度传感器测温系统开发包面向嵌入式初学者、自动化专业学生及工业温度检测项目开发者解决RTD信号采集、AD转换与数字显示的核心实现问题。压缩包含4个关键文件总大小25KBProteus仿真电路图.dsn用于硬件逻辑验证Keil工程文件.Uv2和C源码.c提供可编译的底层驱动与温度计算逻辑.hex固件文件支持直接烧录运行。已有397人学习下载体现了其在教学实践与课程设计中的实用价值。读者可直接导入Proteus观察PT100分压—ADC0809采样—单片机处理—数码管/串口显示的全流程仿真效果并基于C源码深入理解PT100查表法或线性化算法、ADC时序控制及温度值标定方法具备即学即用、调试便捷、原理清晰三大特点。 PT100 测温这个项目我在自己的板子上从零跑通过一版从 PT100 传感器选型、桥式采样电路、运放调理、STM32 内部 ADC 采集到 Keil 工程里写滤波算法、查表标定最后在 Proteus 里做仿真验证整个链路都走了一遍。这篇文章就把这套流程完整拆解出来包括电路设计思路、AD 采样细节、Keil 代码实现、Proteus 仿真调试以及我实际踩过的坑。不管你是刚开始接触 PT100 测温还是已经在做 AD 采集但被精度和干扰问题折腾过这篇内容都值得你花点时间看完。1. 整体设计思路拆解一条完整的“温度到数字”信号链拿到这个项目很多人第一反应就是“PT100 接个电阻分压ADC 读一下就行了”真这么做你会发现读出来的数又飘又非线性温度稍微变一点显示结果毫无规律。这背后的核心问题是你缺少对整条信号链的设计意识。PT100 测温不是单一环节的事它是传感器、调理电路、模数转换、软件算法四个环节的接力赛任何一个环节掉链子最终显示的温度都是错的。1.1 为什么选 PT100传感器的特性与选型逻辑PT100 是铂热电阻0°C 时阻值 100Ω温度每升高 1°C阻值大约增加 0.385Ω。它之所以在工业测温和实验室场景里被大量使用核心优势是线性度好、重复性高、温区覆盖宽-200°C 到 850°C而且铂材料的化学稳定性很好不像热电偶那样需要冷端补偿也不像 NTC 热敏电阻那样阻值随温度呈指数变化后续处理非常麻烦。但选 PT100 也意味着你要接受它的两个“麻烦”一是阻值变化量非常小0°C 到 100°C 只有 38.5Ω 的变化对应到电压信号上可能就是几十毫伏的级别所以必须经过放大二是它本质上是电阻型传感器你没法直接“测量阻值”必须通过恒流源或者电桥电路把电阻变化转换成电压变化再送给 ADC。理解了这两点你就能明白为什么这个项目的电路不是简单一个分压电阻就能搞定的。1.2 信号链路架构从传感器到显示屏的完整通路整个系统的信号流是这样的PT100 传感器的电阻变化先经过桥式取样电路或恒流源电路转换成毫伏级的差分电压信号这个微弱信号送入仪用放大器或运算放大器进行差分放大转换成 0V 到 3.3V或者 0V 到 5V取决于你的 ADC 参考电压范围内的单端电压然后进入单片机的 ADC 引脚通过逐次逼近型 ADC 转换成 12 位数字量最后在 MCU 内部完成数字滤波、阻值反算、查表或公式标定把数字量换算成实际温度值送到 OLED 或 LCD 屏上显示。这个架构里很容易被忽略的是“接地和参考”的设计。ADC 的参考电压稳定性直接决定了测量精度如果你的 Vref 是直接从 LDO 输出的 3.3V而 LDO 又同时给运放和显示屏供电那负载变化就会导致参考电压波动ADC 的读数自然会跟着飘。我这次做的时候给 ADC 参考电压单独加了一路 RC 滤波实测下来稳定性明显改善。1.3 为什么选择 Keil STM32 作为软件平台这个项目选择 Keil MDK 作为开发环境、STM32 作为主控理由很实在STM32 的 ADC 是 12 位逐次逼近型采样速率最高能到 1MHz 以上配合内部通道扫描和 DMA完全可以满足 PT100 测温这种低速高精度场景Keil 则是最主流的 ARM 开发环境调试器界面清晰、编译效率高网上资料也多遇到问题搜一下就有人遇到过这对初学者来说非常重要。另一个选型原因是 Proteus 支持 STM32 和 Keil 的联调仿真这意味着你可以在不焊板子、不买传感器的情况下先在软件层面把整个逻辑跑通。这对于验证算法、调 PID如果后续做恒温控制、排查桥式电路参数是否合理都有很大的价值。硬件上出问题定位困难但仿真里你可以在任意节点拉波形、看电压、改参数效率完全不是一个量级。2. 硬件电路设计从电桥到 ADC 引脚的每一个细节硬件部分是 PT100 测温项目的重头戏也是大多数初学者最容易翻车的地方。很多人在面包板上搭个分压电路ADC 读到的数值跳动几十甚至上百 LSB就以为是程序滤波没写好实际上问题出在信号调理那块。这里我把电路设计的核心环节拆开讲清楚。2.1 两线制与三线制测温电路别被“少根线”骗了两线制是最简单的接法PT100 两根引线直接接入电桥的一个桥臂导线电阻就串联进了传感器电阻里。普通铜导线电阻大约是 0.1Ω/m 到 0.5Ω/m如果你用 1 米的连接线导线电阻可能就是 0.2Ω 到 1Ω折算到温度上就是 0.5°C 到 2.5°C 的误差。这个误差在实验室里可能还能忍但在现场布线较长或者对精度有要求的场景两线制就是不可接受的。三线制就是为了解决导线电阻误差而设计的标准接法也是工业测温中最常用的方案。它的原理是PT100 的两端分别接一根导线另外公共端接第三根导线电桥的两个桥臂分别包含一根导线这样两根导线的电阻对电桥的影响会在一定程度上相互抵消。更精细的做法是采用恒流源驱动三线制 PT100通过测量两次电压差来消除导线电阻影响。我在这次项目中采用的是三线制 电桥方案具体接法是电桥的上桥臂用精密电阻 R1 和 R3下桥臂一边接 PT100含导线电阻另一边接 R2等于 PT100 在 0°C 时的阻值 100Ω加上一根补偿导线。电桥输出电压 Vdiff 经过差分运放放大后送 ADC。这个方案的优点是电路简单、成本低缺点是电桥本身的非线性会叠加到 PT100 的非线性上所以软件里最后一定要做查表或多项式校正不能指望硬件精度一步到位。2.2 桥式取样与运放调理毫伏信号是如何被“放大”的如果直接用 3.3V 供电电桥PT100 在 0°C 到 100°C 范围内的差分输出大约是 0mV 到 12mV 左右具体取决于电桥电阻配比这个信号直接给 ADC 的话只能用到 ADC 量程的极小一部分精度非常浪费。所以中间必须加一级放大。我选用的方案是用 LM358 双运放搭建差分放大电路放大倍数设定在 220 倍左右。再解释一下这个倍数的计算逻辑STM32 的 ADC 参考电压是 3.3V我期望 0°C 时输出约 0V100°C 时输出约 2.5V留出裕量避免输出饱和。电桥在 100°C 时差分电压约为 11.6mV所以放大倍数 2.5V / 0.0116V ≈ 215实际取 220 倍留有调整空间。放大倍数由 Rf / Rin 决定Rf 取 220kΩRin 取 1kΩ反馈电阻两端并联一个小电容10pF 到 100pF用来抑制高频噪声。运放选型方面LM358 虽然便宜但输入失调电压较大典型 2mV折算到温度上可能造成 0.5°C 以上的误差而且在单电源供电下输出无法完全到 0V接近地电位时会进入非线性区。如果你想要更好的精度可以换成 OP07 或 AD620 这类低失调、低漂移的运放。我这次在 Proteus 里仿真时用的是 LM358实际 PCB 验证时换成了 OP07实测 0°C 点比 LM358 稳定了不少。2.3 ADC 参考电压与采样电路的关键要点STM32 的 ADC 参考电压 Vref 默认接 VDDA通常是 3.3V这个电压的稳定性直接决定了采样精度。如果你的项目里有电机、继电器、加热丝这类大功率负载VDDA 上的纹波会直接耦合到 ADC 采样结果里导致读数跳变。解决办法是VDDA 和 VSSA 之间加 1μF 和 10nF 的退耦电容Vref 引脚单独用 LC 滤波磁珠 10μF 电容如果有条件最好用独立的基准源芯片比如 REF3033给 Vref 供电。ADC 输入引脚前还需要加一个 RC 低通滤波器R 取 1kΩC 取 100nF截止频率约 1.6kHz。这个滤波器有两个作用一是滤除高频干扰二是给 ADC 内部的采样电容提供充电电荷。STM32 的 ADC 是逐次逼近型的内部采样电容需要在采样时间内完成充电如果输入阻抗太高采样时间不够测出来的值就会偏低而且不同通道的误差还不一样。所以硬件上一定要保证信号源阻抗低建议运放输出直接接一个 100Ω 左右的电阻再进 ADC 引脚既限流又能抑制反射噪声。2.4 电路图绘制中的 AD 操作要点位号批量修改与检查画电路图的时候很多人忽略了一个问题原理图和 PCB 的位号Designator管理。尤其是当你用一个运放芯片里的多个单元比如 LM358 包含两个独立的运放或者批量修改器件编号时AD 的位号管理功能能帮你省下大把时间。Ad 软件里修改位号的方式是选中所有元件在 Properties 面板里选择 Designator然后设置起始编号和后缀规则。但更常用的是“批量修改”技巧先在原理图中按快速筛选功能选中你要改位号的元件然后 ShiftF 查找相似对象在对话框中把 Designator 设置为 Same点击 OK 后会选中所有同类器件再统一打开属性面板修改前缀或数字排序方式。这个操作在学习桥式电路和对多个运放通道做标注时特别实用。另外一个实用技巧是完成原理图后用菜单栏的“Report → Bill of Materials”生成物料清单检查有没有缺件或位号重复。我在做这个 PT100 项目时就因为两个 100Ω 电阻位号重复导致 PCB 打样回来贴错料浪费了一轮调试时间。养成在画图阶段就规范位号的习惯后面能少走很多弯路。3. 软件实现Keil 工程里的 ADC、滤波与温度换算硬件电路只解决“信号存在”的问题真正让温度“显示出来”的是单片机里的软件。这一部分我按照实际开发顺序来写工程搭建、ADC 初始化、采样数据处理、温度换算以及最后显示驱动。你在 Keil 里实现时可以直接照着这个流程走。3.1 Keil 工程搭建与 ADC 采集初始化我使用的是 STM32F103C8T6在 Keil MDK 5 环境下新建工程。先提醒一句Keil 的安装和工程配置有几个坑比如下载完包装好后编译报错找不到头文件十有八九是没在 Options for Target 里配置好 Include Paths再比如用 ST-Link 下载时报 “No Target Connected”八成是 Debug 里没选对调试器或者接线有问题。这些都是初学者最高频的报错下面会在问题排查部分单独说。ADC 初始化代码的核心逻辑是这样的开启 GPIOA 和 ADC1 时钟配置 PA1 为模拟输入模式然后设置 ADC 的分频系数、对齐方式、采样周期和通道序列。因为我需要连续采集多次做平均所以开启了扫描模式和连续转换模式并且采用 DMA 方式把数据搬运到内存数组里避免 CPU 在采集过程中被中断频繁打扰。// ADC 初始化STM32F103PA1 作为 ADC1_IN1 通道 void ADC_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; // 1. 使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 2. 配置 PA1 为模拟输入 GPIO_InitStructure.GPIO_Pin GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN; GPIO_Init(GPIOA, GPIO_InitStructure); // 3. 配置 ADC 基本参数 ADC_InitStructure.ADC_Mode ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode DISABLE; ADC_InitStructure.ADC_ContinuousConvMode ENABLE; ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel 1; ADC_Init(ADC1, ADC_InitStructure); // 4. 配置采样周期这里设置 55.5 周期降低信号源阻抗影响 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5); // 5. 使能 ADC 并校准 ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while (ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while (ADC_GetCalibrationStatus(ADC1)); }这段代码里最值得关注的是采样周期那一项。我之前在 1.5 周期下采样测出来的数值总是偏低大约 20 到 30 LSB排查了很久才发现是内部采样电容没有充足电。改成 55.5 周期后数值明显稳定了。所以如果你发现 ADC 读数有奇怪的系统性偏差先检查采样周期别急着怀疑传感器。3.2 数字滤波为什么平均值滤波“够用但不够好”ADC 采集到的原始数据必然带有噪声来源包括工频干扰、运放噪声、电源纹波、甚至是 MCU 内部数字电路开关造成的耦合噪声。最基础的做法是连续采样 20 次取平均这种方式对白噪声有平滑作用但对脉冲式干扰没什么效果。我在项目中实际采用的是“中位值平均滤波法”也叫防脉冲干扰平均值滤波连续采样 N 个数据去掉最大值和最小值再对剩下的 N-2 个数据取平均。这种方式既能抑制随机噪声又能剔除偶发的尖峰干扰。实测下来相比纯算术平均温度显示在小数点后一位的稳定性有了明显提升。#define FILTER_N 12 uint16_t MiddleAvgFilter(void) { uint16_t buf[FILTER_N]; uint16_t min, max, sum; uint32_t sum_val 0; uint8_t i; for (i 0; i FILTER_N; i) { buf[i] ADC_GetValue(); // 读取一次 ADC 转换结果 } min buf[0]; max buf[0]; // 找最大值和最小值 for (i 1; i FILTER_N; i) { if (buf[i] min) min buf[i]; if (buf[i] max) max buf[i]; } // 累加所有值最后减去最大最小值 for (i 0; i FILTER_N; i) { sum_val buf[i]; } sum_val - min; sum_val - max; sum (uint16_t)(sum_val / (FILTER_N - 2)); return sum; }如果你对实时性有要求比如后面要做温度控制还可以用一阶低通滤波y[n] y[n-1] α * (x[n] - y[n-1])α 取 0.1 到 0.3调节起来非常直观。不过要注意低通滤波会引入延迟控制周期短的时候要小心震荡。3.3 电阻与温度换算查表法还是公式法ADC 读到的数字量要先换算成 PT100 的电阻值再从电阻值换算出温度。这一步有两种主流做法查表法和公式法。查表法需要你在代码里预先存放一张 PT100 分度表比如每隔 1°C 对应一个电阻值然后对采样电阻值做二分查找找到最近的两个表项后用线性插值来得出精确温度。这种方法的优点是精度最高几乎不依赖处理器的数学运算能力缺点是需要占用一定的 Flash 空间而且要保证分度表的准确性。公式法走的是物理方程的路线。PT100 在 0°C 到 850°C 范围内的电阻-温度关系为 R(t) R0 × (1 A×t B×t²)其中 R0 100ΩA 3.9083×10⁻³B -5.775×10⁻⁷更高精度还需要引入 C 系数。反算温度时要解一个二次方程用求根公式就能解决代码量很小精度在 -50°C 到 300°C 范围内可以做到 0.1°C 以内完全够用。我个人建议项目赶时间的时候用公式法后期再换查表法。要特别提醒的是温度换算里还有个雷区——ADC 基准电压的误差。如果你直接用 Vref 3.3V 代入计算而实际 VDDA 是 3.28V那电阻就会算偏约 0.6%折算到温度就是 1°C 以上。正规做法是先测一次实际的 Vref 值把它作为常量写进程序或者用内部参考电压来校准。3.4 显示驱动与刷新策略别让显示拖累采样显示用 SSD1306 驱动的 OLED 屏0.96 寸 I2C 接口在 Keil 里移植 SSD1306 驱动库非常成熟网上有现成的代码可以抄。但有几个坑要说一下I2C 通信需要延时如果每次刷新都阻塞 CPUADC 的连续采样就会断档主循环里如果频繁刷屏功耗和 CPU 占用率都会上去。更合理的做法是让 ADC 通过 DMA 持续采样定时器每 500ms 触发一次数据处理和显示刷新刷屏只在数据更新时执行。我最后采用的方案是PWM 定时器中断里每 10ms 读一次 DMA 缓冲区的滤波结果存入全局变量主循环里每 500ms 调用一次 OLED 显示函数把温度值打印到屏幕上。这样一个简单的调度结构既保证了采样的连续性也让显示刷新率在可接受范围内。实测下来温度显示刷新时没有出现闪烁和拖影CPU 占用率也很低。4. 仿真验证Proteus 和 Keil 联调的完整流程在做真实硬件之前我强烈建议你先在 Proteus 里把整个系统仿真一遍。原因很简单仿真可以让你在改电路参数上零成本、高速度地验证方案而且能看到示波器级别的信号细节这在物理电路上反而不容易观察。下面是我实际摸索出来的联调流程。4.1 Proteus 电路搭建从元件选型到参数设置Proteus 里建立新工程后从元件库中依次选取PT100 传感器在 Proteus 8 中搜索 “PT100” 可以直接找到也有虚拟的 PT100 器件可以方便地模拟温度变化、LM358 运放、若干电阻特别注意精密电阻取 0.1% 精度、STM32F103C8T6 主控芯片、OLED 屏如果 Proteus 版本没有 OLED 库可以用虚拟终端代替或者用 LCD1602 做显示验证。搭建桥式电路时需要注意Proteus 的电阻默认误差是 0%你可以把 R2和 PT100 0°C 阻值对应的那个桥臂电阻设为 100Ω 整R1 和 R3 设为 10kΩ这样电桥的共模点大致在电源电压的一半位置运放输出动态范围比较好。4.2 仿真中的 AD 采样用虚拟电压表验证每一个关键节点仿真时可以很方便地放置虚拟电压表和电流表来观察各个节点的电压。第一步先检查电桥输出把 PT100 的仿真温度设为 25°C理论上电桥差分输出应该接近某个可计算的电压值如果数值不对先检查桥臂电阻是否选对、供电电压是否正确。第二步检查运放输出看放大后的电压是否落在 ADC 的量程内如果超过 3.3V说明放大倍数太大要减小 Rf / Rin 的值。我把 PT100 的仿真温度从 0°C 步进到 100°C每 10°C 记录一次 ADC 原始值然后导入 Excel 里做线性拟合和误差分析。这一步很关键它可以提前看出系统在低温段和高温段的非线性误差有多大为你后面软件里选多项式校正还是查表法提供依据。实测在 Proteus 里用 220 倍放大0°C 到 100°C 范围内 ADC 读数大概落在 40 到 3100 之间线性度尚可但在低温段有明显向下弯曲的趋势这和电桥的非线性特性是吻合的。4.3 Keil 与 Proteus 联调一步步让程序跑起来Proteus 和 Keil 联调的流程并不复杂但有几个关键设置必须做对。第一步在 Proteus 中双击 STM32 芯片在 Program File 一栏选择你 Keil 工程编译生成的 .hex 文件路径。第二步在 Keil 中确保编译时勾选 “Create HEX File”位于 Options for Target → Output 选项卡。第三步直接点击 Proteus 的运行按钮程序就会开始执行。如果你在 Keil 中做了在线调试设置Proteus 也支持和 Keil 的联调在 Proteus 的 Debug 菜单里选择 Remote Debug Monitor然后在 Keil 的调试设置中选择 Proteus VSM Simulator这样你可以在 Keil 里打断点、看变量值同时观察 Proteus 中电路的实际响应。这种方式对调试算法逻辑非常高效我在调试滤波参数时就是靠这个联调模式边看实时温度值边改 α 系数。仿真里最值得调整的是采样周期和滤波参数。我一开始滤波窗口设得太长N50结果温度阶跃响应慢得离谱从 25°C 加热到 60°C 显示要等好几秒才跟上来。后来把 N 改到 12并配合低通滤波曲线过渡时间控制在 1 秒以内显示响应和稳定性就平衡了。4.4 波形观察与参数校正如何判断你的测量链路是否理想在 Proteus 里使用虚拟示波器可以观察运放输出端的波形。如果波形是一条带有细小毛刺的直线说明信号还行如果出现明显工频纹波50Hz 或 100Hz 的周期性波动说明滤波电容不足或者电桥供电受到干扰如果波形是阶梯状的那通常是运放输出限幅或 ADC 采样保持问题。除了波形还有一个很重要的参数就是零点输出。在 0°C 时理论上电桥应完全平衡运放输出应为 0V但实际因为电阻有误差、运放有失调电压输出可能不是 0V。这导致 ADC 在 0°C 时读到的是一个非零值如果不做零点校准温度显示就不是从 0°C 开始。校准方式是在 0°C 环境或冰水混合物中记录 ADC 原始值作为 ZERO_OFFSET软件里所有采样值都先减去这个偏移量再参与换算。我在仿真里也模拟了这个过程让系统设计阶段就预留零点校准的软件接口。5. 常见问题与排查技巧实录无论是仿真还是实物调试你大概率会碰到下面这几个高频问题。我把这次项目实际踩过的坑以及解决办法整理成一个排查清单按“现象 → 原因 → 处理方式”的顺序列出来帮你快速定位问题。5.1 Keil 常见编译错误与 L6050U 警告Keil 里最经典的问题是编译时报错 “Error: L6050U: The code size of this image exceeds the maximum allowed for this version of the MDK-ARM Professional”这是 Keil MDK 未注册或受限版本导致的代码大小限制问题。处理方式是确认你使用的是 MDK 版本并在 License Management 中检查是否有有效的授权。如果用的是非商业评估版代码超过 32KB 就会报这个错唯一的正规解法是获得合法授权。另一个高频编译报错是 “cannot open source input file xxx.h”例如缺少 “stm32f10x.h” 或 “stm32f10x_adc.h”。这个问题的 90% 原因是你的 Keil 工程中 Include Paths 没有配置正确或者对应的标准外设库文件没有添加到工程里。处理方式是从 Project 菜单进入 Options for Target → C/C 选项卡在 Include Paths 中加入包含核心头文件和标准外设库的文件夹路径。还有一个很隐蔽的坑是编译时出现大量警告 “#1-D: last line of file ends without a newline”这个不会影响功能但如果你后续使用了行号跟踪功能可能定位不准。处理方式是在源文件的末尾补一个空行可以让这个警告彻底消除。5.2 仿真中 ADC 读到 0 或满量程先从硬件节点开始查在 Proteus 仿真里如果 ADC 读到的值恒为 0先检查运放输出是否为 0V。如果运放输出了电压但 ADC 仍是 0那问题出在 ADC 引脚配置上。最常见的错误是 GPIO 的模拟输入模式没配好或者把 ADC 通道号搞错了STM32 的 PA1 是 ADC1_IN1PA0 是 ADC1_IN0别接错引脚下错通道号。如果读到的是满量程比如 4095说明运放输出已经超过了 ADC 的参考范围原因是放大倍数过高。还有一种可能是电桥的供电电压高于 Vref导致共模电压超过了 ADC 的输入范围。这时候把放大倍数调低或者提高 ADC 的参考电压就能解决。在 Proteus 里通过虚拟电压表快速确认节点电压是最高效的定位方式。5.3 温度跳变、非线性与零点漂移的实操处理温度显示跳变的根源基本可以归为三类电源噪声、算法窗口太短、信号源阻抗太高。如果你已经确认电源是干净的纹波低于 50mV滤波窗口长度也合适那问题可能就出在采样周期上。试着把 ADC 采样周期从默认的 1.5 周期改成 55.5 周期很多人说“换了这个瞬间就稳了”原因就是内部采样电容终于被充满电了。非线性误差增大要先确认 PT100 的类型是 0°C 时 100Ω 的 PT100不是 PT1000和电桥的供电电压。电桥的非线性是固有的当温度范围超过 100°C 时非线性会明显增大。处理方式有两种一种是在软件里用分段线性插值查表法替代公式法另一种是在硬件上改用恒流源驱动 PT100用比例法测量电阻经典的四线制恒流源方案可以做到极高精度。零点漂移问题是高精度测温最大的“隐形杀手”。即使你零点校准做好了运放的失调电压温漂和电阻温度系数仍然会让 0°C 点随着环境温度漂移。如果你做的是量程在 200°C 以上的项目建议直接改用带自动调零功能的仪表放大器或者用 MCU 内部集成的可编程增益放大器从硬件层面消除漂移。对于普通教学或入门项目零点校准 定期校正已经足够。5.4 问题排查速查表现象可能原因快速排查与解决ADC 读数恒为 0GPIO 未配置为模拟输入、通道号错误、运放输出为 0检查 ADC 对应 GPIO 配置用虚拟电压表测运放输出ADC 读数恒为满量程放大倍数过大、输入电压超量程计算电桥最大差分电压降低 Rf/Rin提高 Vref 电压温度显示跳变采样周期太短、滤波窗口不足、电源噪声增大 ADC_SampleTime加强滤波检查 VDDA 退耦电容低温段误差大电桥非线性、零点未校准增加零点校准偏移使用查表法做分段线性校正Keil 编译报 L6050UMDK 未授权或代码超出大小限制在 License Management 中检查授权精简代码或升级授权仿真时 OLED 不显示Proteus 版本不支持 OLED 库改用 LCD1602 做显示验证或更换支持的 Proteus 版本Keil 下载时不识别目标板调试器未选对、接线错误、驱动未装检查 Debug 设置里的调试器类型确认 SWDIO/SWCLK 接线6. 操作心得与扩展建议这个 PT100 测温 AD 显示项目做完我最深的体会是任何看似简单的测量项目一旦涉及到模拟信号链就不再是“写个代码”就能搞定的问题。你要把电路设计、元件误差、ADC 特性和软件算法当作一个整体来对待而不是拆开来各自为战。很多初学者在软件里反复调滤波参数也没办法让温度稳定原因往往在硬件环节比如参考电压不干净、运放选型不合适、采样周期不够长。先硬件后软件是这类项目必须坚持的排查顺序。如果你后续想继续深入有几个方向可以扩展。第一做恒温控制只需在现有测温链路上增加一个 PID 输出引脚控制加热器这样就能从“测量”跨入“控制”领域。第二用四线制 PT100 加高精度仪表放大器测温精度能做到 0.1°C 级别可以放到计量或者环境监测场景。第三把显示从简单的 OLED 换成带触摸屏的人机界面通过 RS485 或无线通信把温度数据上传到上位机做成一个完整的数据采集终端。最后再分享一个小技巧无论是做仿真还是实物一定要养成记录数据的习惯。我每调一组电路参数或滤波参数都会把温度设置在固定点记录 ADC 原始值然后导入 Excel 观察变化趋势。这套数据记录方法在这些项目的调试和标定过程中帮了大忙远比凭感觉调参数可靠。毕竟测温系统的最终评价标准是“测出来的数字是否可信”而不是“代码能不能跑”。本文还有配套的精品资源点击获取
返回列表