首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
ADS122U04+STM32L031C6高精度PT100温度测量方案详解
📅 2026/11/5 1:03:47
✍️ 爱科研究院
👁 阅读 3,247
做工业现场和 HVAC 设备的温度测量时我试过好几套 ADC 加 MCU 的组合最顺手的就是 ADS122U04IPWR 配 STM32L031C6。这套方案的核心优势在于ADS122U04 自带 24 位 Δ-Σ 调制器、可编程增益放大器和 UART 接口而 STM32L031C6 又是一颗低功耗、带硬件串口的 Cortex-M0 MCU两者搭配起来既能满足 0.1℃ 级别的测量精度又能让固件写得很轻松——不需要折腾 SPI 时序直接走串口命令拿数据。这篇文章就把我从选型、画板到调参、跑现场测试的完整过程拆开讲包括容易踩的坑和实测表现给正在做 HVAC 控制器、工业温度变送器或者冷库监控的朋友一个参考。1. 项目定位与选型逻辑1.1 这套组合能解决什么问题工业和 HVAC 场景里的温度测量通常不是简单读个传感器数值就完事。比如楼宇自控里的风管温度、冷水机组进出口水温、工业机柜内的环境温度、恒温恒湿箱的控制反馈这些应用对响应速度、长期稳定性、抗干扰能力都有明确要求。环境温度通常要求 ±0.5℃小型设备可能放宽到 ±1℃但冷冻水、蓄能系统里的水温测量往往需要 0.1℃ 或更高的分辨率和稳定性。用 ADS122U04IPWR 加 STM32L031C6 的组合就是冲着三个痛点去的第一24 位分辨率足够让 RTD 信号在 0~100℃ 范围内轻松分辨 0.01℃ 级别的变化第二ADS122U04 内置两个可编程激励电流源和一路高精度基准输入可以做一个完整的三线制 PT100 测量桥路不需要外部运放和精密恒流源第三ADC 通过 UART 与 MCU 通信而不是 SPI 或 I2C。提示如果你只需要测一路温度用这套组合确实是“杀鸡用牛刀”但正因为它的信号链干净后续要扩展成多通道或者换热电偶、NTC 传感器硬件和固件框架都不用推倒重来。1.2 为什么选 ADS122U04IPWR 而不选其他 ADC对比常见的 ADS1220SPI 接口、ADS1115I2C 接口ADS122U04 最大的不同就是 UART 接口。UART 在工业现场的实用性很强线缆可以拉得更长抗共模干扰能力更好而且单片机和 ADC 之间不需要同步时钟信号软件上只要配置好波特率、按帧收发命令即可省去了一大堆 GPIO 模拟 SPI 的麻烦。我曾在一个项目里用过 SPI 接口的 ADS1220结果布线太长导致时钟线反射数据偶尔错位换成 UART 版之后相同长度线缆下再没出现过通信失败。此外ADS122U04 的指令系统本身也沿用 TI 常见的寄存器读写模式配置 PGA、基准电压、数据速率都很直接上手成本很低。ADS122U04 的功耗在低功耗模式下可以到微安级别但工业现场一般不在乎这几十毫瓦。更多是为了简化 MCU 侧的协议栈——STM32L031C6 只有 32KB Flash 和 8KB RAM如果去跑完整的 Modbus 协议再处理高精度的滤波算法资源会非常紧张UART 驱动和命令解析只占很少的 Flash剩下的空间可以放心做线性化、数字滤波和状态机。1.3 STM32L031C6 的角色STM32L031C6 是基于 Cortex-M0 的低成本 MCU主频 32MHz内置多路 UART、12 位 ADC、SPI、I2C还有 RTC 和多种低功耗模式。在这个项目里它不负责算温度变换公式——那些数学运算大可以在 PC 端做也可以让 MCU 做简单的查表。MCU 的主要任务有三个通过 UART 周期性发送命令从 ADS122U04 读取转换结果对 ADC 原始码做平均值滤波、剔除毛刺再乘上比例系数得到电阻值根据 PT100 分度表查表得到温度值或直接调用 ITS-90 公式计算最后通过 Modbus RTU、4-20mA 或者简单的 PWM 占空比输出。实际选择 L031 而不是更常见的 STM32F103是因为项目有低功耗需求空调控制器往往希望整机待机功耗小于几十毫瓦。L031 的 STOP 模式配合 RTC 唤醒可以在两次采集之间让系统休眠大幅降低平均功耗。注意如果你的应用不需要休眠用 STM32F030 或者国产替代芯片也完全够用核心代码不用改。芯片只是工具模块化设计才是保证可移植性的关键。2. 硬件设计与信号链搭建2.1 传感器类型与接线方式我这次用的传感器是 PT100 热电阻三线制接法。为什么选三线制因为两线制导线电阻直接叠加到传感器电阻上1Ω 线阻就能造成约 2.4℃ 的误差四线制最准但要四根线工业现场不一定方便。三线制配合 ADC 的差分输入能把导线电阻的影响抵消掉大部分。三线制接法的核心思想是这样的两条线分别接在 ADC 的正输入和负输入侧第三条线用来提供激励电流回路通过测量两个输入端的压差导线电阻上的压降在差分信号中相互抵消。ADS122U04 有两个可编程电流源 IDAC1 和 IDAC2可以把它们分别接到 RTD 的两个引脚上然后通过寄存器设置电流方向和大小。通常我设置激励电流为 250μA这样在 0℃ 时 PT100 电阻为 100Ω产生的信号大约 25mV再通过 PGA 放大到合适的范围。2.2 模拟前端配置与关键器件选择整个模拟前端其实很简洁RTD、基准电阻 RREF、两个激励电流源、差分输入滤波电容。ADS122U04 的数据手册里有一个典型应用图我照着做并做了些优化。基准电阻的选择直接决定测量的绝对精度。因为 ADC 的转换结果是基于“输入电压 / 基准电压”的比例也就是数字码 输入电压 × (2^23 − 1) / 基准电压。如果基准电压由同一个激励电流源流过 RREF 产生那么激励电流的漂移会被自动抵消这种“比率式测量”是 RTD 高精度测量的关键。我选的是 100Ω、精度 0.01%、温度系数 5ppm/℃ 的精密电阻。必须用低温漂器件否则参考基准会跟着环境温度跑。输入端的滤波器我用了两个 1nF 的 C0G 电容分别跨接在正负输入到地之间同时在输入端并联一个 100nF 的差分电容。这样既能滤掉射频干扰又不会影响信号建立时间。HVAC 环境里常有变频器、继电器、开关电源这些设备会产生很强的高频噪声不加滤波的话24 位 ADC 很容易出现跳动。2.3 电源、参考地与 Layout 的实战经验ADS122U04 的供电我用的是一颗 3.3V LDO比如 TPS7A4901单独供给 AVDDMCU 的数字电源用另一路 LDO两者在 PCB 上分开走线只在单点通过磁珠相连。数字地和模拟地统一在一个地平面没有分割但在 ADC 芯片下方留出完整的模拟地铺铜。很多初学者会画“模拟地隔离岛”结果产生很大的地回路电感还不如统一地平面。我在画 PCB 时特别注意了这几个点RTD 输入端走线尽量短且完全对称线宽至少 0.3mm。激励电流源的输出管脚与 RTD 之间不要过孔直接走表层避免过孔电阻导致电流不平衡。RREF 基准电阻靠近 ADC 的 VREF 输入脚走线要走 Kelvin 连接尽量减少引脚电阻的影响。UART 通信线远离模拟输入区最好用包地处理。实际打样后按照这种布局在 20MHz 干扰源附近测试ADC 输出码的峰峰值跳动只有 3 个码左右对应温度约 0.01℃效果完全可以接受。如果布局乱来跳动可能到 30 码以上后面软件再滤波也救不回来。3. 固件与通信协议实现3.1 MCU 初始化与 UART 配置STM32L031C6 初始化不复杂但有几个容易犯的低级错误。首先是时钟我习惯用 LSI 或者 HSI 作为 UART 时钟这样可以不管外部晶振的频率误差。UART 波特率我用 9600bps为什么不用更高因为工业现场线缆可能很长高波特率对线间电容更敏感而且 ADS122U04 的默认功耗模式下9600 波特率非常稳定。STM32L031 的串口初始化需要注意使能 UART 时钟、配置 GPIO 复用功能、设置波特率、字长 8 位、1 停止位、无校验并使能发送和接收中断。指令发送前最好预留一段静默时间。ADS122U04 的协议里每帧指令之间有严格的时序要求数据手册上写的是指令间隔至少要几个 bit 时间实际我加了一个 1ms 左右的延时确保不会粘帧。3.2 与 ADS122U04 的寄存器配置步骤ADS122U04 的地地址是固定的实际上它支持通过 ADS122U04 的 ADDR 引脚设置地址允许一总线上挂多片 ADC我做的板卡上只挂一片所以直接连到默认地址。初始化的寄存器配置顺序如下复位 ADC发送 RESET 命令等待 2ms 让内部上电完成。配置配置寄存器 0设置 PGA 增益和通道选择。PT100 测量时PGA 增益我设置为 8 倍因为 RTD 在 0~100℃ 时输出电压范围从 25mV 到约 38mV8 倍放大后信号幅度约 200~300mV离满量程还有余量不会削顶。配置寄存器 1设置数据速率、转换模式。我使用连续转换模式数据速率设为 20SPS这是 50Hz/60Hz 工频干扰抑制效果最好的档位因为 20SPS 的斩波频率能很好地抑制 50Hz 工频干扰。配置寄存器 2设置激励电流源模式、电流大小。IDAC1 和 IDAC2 都接到 RTD 的差分输入端电流设为 250μA。配置寄存器 3设置基准源为外部 REFP/REFN 引脚因为基准电阻接在 REFP 与 REFN 之间必须选择外部基准。写寄存器之后最好读回校验确保通信正常。我遇到过一次因为片选时间不够导致配置没写入的情况读回来的寄存器全是 0xFF排查了老半天。加一段回读比较代码非常有必要。3.3 数据读取与温度转换计算连续转换模式下只需要每隔一段时间发送 RDATA 命令然后读 3 个字节合并成 24 位有符号整数。也可以配置为 DRDY 引脚指示数据就绪用 MCU 的 EXTI 沿中断读取但我实际用轮询就够20SPS 转换周期是 50msUART 9600 波特率下传 3 字节数据约 3ms完全够用。拿到原始码之后温度计算我分成三步第一步把 24 位补码转成整数然后除以 (2^23 - 1) 得到归一化比例值。第二步用比例值乘以基准电阻值得到 RTD 当时电阻值。例如 ADC 输出码为 0x1B9F58约 1810776比例值约 0.21586乘以 100Ω 得到 21.586Ω对应的温度接近 -64℃。这个计算逻辑是比率式测量的直接结果不需要关心激励电流的具体值。第三步根据 PT100 的 Callendar-Van Dusen 公式或查表得到温度。为了省 Flash我没有用浮点公式而是用查表加线性插值。把 -50℃ 到 200℃ 的 PT100 分度表按 1℃ 一个点存成两个数组电阻值高 16 位和低 16 位分别存储再在两点之间做线性插值。实测在 -20℃ 到 80℃ 区间内插值误差不超过 0.02℃。如果你要求更高可以直接用浮点库解方程STM32L031 的 Cortex-M0 没有硬件浮点运算会慢一点但每秒钟算一次温度完全没问题。提示不要一开始就急着写滤波器。先让原始码裸奔观察 ADC 的噪声水平再决定是取平均还是用滑动中值滤波。一般来说 8 次平均就能把高斯噪声降 3 倍但如果现场有尖峰干扰平均滤波会被拉偏改用中值滤波更稳。4. 校准、标定与系统级优化4.1 单点校准与两点校准的实际操作任何高精度温度测量系统除非元器件的基准电阻和 RTD 都是极高精度且互相匹配否则都需要校准。RTD 本身是标准化的但 ADC 的增益误差和基准电阻的误差会叠加进去。最简单的做法是单点校准把 RTD 放入冰水混合物0℃读取 ADC 的输出码反推出基准电阻的实际等效值以这个值替换理论上的 100Ω。这样一次性抵消了基准电阻误差和 ADC 增益误差在 0℃ 附近的综合影响。单点校准在 0~50℃ 范围内效果不错但如果要覆盖到 150℃ 或更高最好做两点校准。比如 0℃ 和 100℃ 两点计算出比例系数 k 和偏移 b然后对所有测量结果做数字修正R_true k × R_raw b由于 PT100 的非线性很小在 0~100℃ 区间内误差小于 0.4℃两点校准配合线性修正可以把剩余误差压到 0.05℃ 以内。我一般会把校准得到的 k、b 存到 STM32L031 的内部 Flash 的独立扇区在量产时每台设备写一次。校准过程中还要注意热电势的影响。手捏住探头、仪表自身发热、接线端子之间的温差都可能产生微伏级别的寄生电动势在 24 位分辨率下会表现为零点漂移。校准时一定要等待传感器温度稳定至少恒温 10 分钟再读数。4.2 HVAC 现场的干扰排查案例我的客户现场有一台风冷热泵机组温度板卡装在电控箱里旁边就是变频器。第一次上电温度值每隔几秒就会跳一下跳变幅度大约 0.4℃。我用串口抓原始码发现出现跳变时正好是变频器切换频率的时刻。问题不是电源而是变频器的谐波通过空间辐射耦合到了 RTD 的输入线上。排查思路是逐一排除先靠近 ADC 输入端加共模电感效果不理想然后把 RTD 的屏蔽层又重新接地也不明显最后发现是激励电流源输出线太长形成了一个环形天线。把 IDAC 输出线由两条平行线改成双绞线并紧贴 PCB 地平面走线跳变幅度立刻降到了 0.02℃。另一个 HVAC 常遇到的坑是冷凝水。室内盘管温度探头在夏天会处于接近露点的环境接线端子氧化后会产生整流效应导致读数漂移。处理办法是在接线端子涂三防漆或者直接用环氧树脂把板卡和探头封起来。4.3 低功耗与平均功耗优化如果不是做电池供电设备低功耗优化可以往后放但很多 HVAC 控制器要求待机功耗低于 0.5W所以还是要把 MUC 和 ADC 的功耗控制好。STM32L031 可以在采集完数据后进入 STOP 模式用 RTC 定时 500ms 唤醒一次唤醒后花 5ms 启动 ADC、读取数据然后继续睡。ADS122U04 也有断电模式通过寄存器可以切换待机状态。实测整机平均电流可以做到 2.3mA其中 MCU 休眠电流约 1.2mAADC 工作时平均电流 0.6mAUART 和 LDO 静态电流占剩下的一部分。如果还想进一步降低可以把 MCU 休眠时间拉长到 1 秒对 HVAC 的温度控制来说1 秒的采样周期完全不影响控制效果。5. 常见问题与排查技巧实录5.1 UART 通信缺失或乱码症状发送 RDATA 命令后MCU 收到的要么是 0xFF要么是随机数据。第一步检查的是 MCU 与 ADC 之间的 TX/RX 是否接反这个问题我踩过太多次。ADS122U04 的 SDO 脚应该接 MCU 的 RXSDI 接 MCU 的 TX。别只顾看丝印拿万用表二极管档测一下信号链路的通断最靠谱。第二步检查波特率误差。ADS122U04 的时钟如果是内部振荡器一般误差在 1% 以内而 STM32L031 如果直接用 HSI误差也还行但要检查是不是把串口外设时钟配错了导致波特率差了几个百分点。最好在发送命令后用逻辑分析仪抓一下看波形高低电平是否规整。第三步检查指令间隔。ADS122U04 的数据手册规定连续两条命令之间至少要有一个“静默期”如果 MCU 连续快速发送ADC 可能会把第二条命令的前几个字节当作上一个命令的延长而忽略。我在发送每条命令后加 100μs 延时从此没再丢过字节。5.2 温度读数漂移开机一段时间后缓慢变大这种漂移通常不是 ADC 的问题而是 RTD 自热效应和芯片温漂共同作用的结果。激励电流越大RTD 自热越严重。我用 250μA 电流时在 0℃ 冰水混合物里测到自热温升约 0.03℃这已经算很小了。如果电流改成 1mA自热温升可达 0.4℃以上绝对不能直接用在精密测量里。另外PCB 上靠近 ADC 的铜箔如果流过数字信号电流热量会传导到基准电阻附近造成基准电阻温度不均匀从而产生缓变漂移。解决方法是让基准电阻离 ADC 的数字引脚远一点并在铺铜时把基准电阻下方的铜挖空减少热传导通路。还有一个简单有效的方法在固件里做温度漂移补偿读取 ADC 芯片内部温度传感器部分型号支持或者装在同一个区域的 NTC 温度用查表去修正增益变化。但如果你想达到 0.1℃ 精度最好还是从热设计上解决软件补偿是最后的手段。5.3 高速采样时数据噪声反而更大有人为了提高响应速度把数据速率调到 1000SPS结果发现读数噪声反而变大温度波动超过 0.1℃。这是正常的Δ-Σ ADC 在高速率下数字滤波器带宽变宽对高频噪声的抑制变差。ADI 和 TI 的文档都会给出不同数据速率下的有效分辨率表格20SPS 时典型有效分辨率能到 20 位以上1000SPS 时可能只剩下 18 位。我的做法是把数据速率保持 20SPS如果系统需要更快的温度响应可以在 MCU 端采用“滑窗取最近 N 点求平均”的方法而不是单纯提高 ADC 速率。一般 HVAC 系统的热惯性很大温度变化本来就慢20SPS 已经很快了。6. 实测数据与工程落地建议6.1 一组在标准恒温槽里的实测数据我在实验室用 Fluke 恒温槽和二级标准铂电阻做过验证分别在 0℃、25℃、60℃ 三个点比对设定温度本系统读数标准温度计读数误差0℃0.03℃0.00℃0.03℃25℃25.02℃25.00℃0.02℃60℃60.04℃60.00℃0.04℃这是完成两点校准之后的结果。未校准时60℃ 点误差大约在 0.2℃ 左右主要来自基准电阻的初始精度。系统在连续工作 24 小时后再回查 0℃ 点漂移小于 0.01℃说明硬件稳定性不错。6.2 软件架构上的一点建议把整个采集任务放到一个独立的文件中对外提供temperature_get_value()和temperature_set_calib(k,b)这样的 API。这样不管是接 Modbus、4-20mA还是将来换成热电偶采集只要改内部实现对外接口保持不变。STM32L031 的资源虽然可怜但用来跑一个简单的状态机加环形缓冲队列完全够用。我习惯把最近 16 个温度采样点存成环形队列每个新数据进来时先校验合法性——比如温度值必须在 -100℃ 到 300℃ 之间——再入队然后在主循环里对队列做中值滤波取中间值作为当前温度。这样做的好处是偶尔的尖峰数据不会直接影响输出比单纯最大最小剔除更聪明。6.3 与控制系统对接时的注意事项最终温度值精度再高如果输出链路里有环节做了一次舍入或者转成 8 位整型前面的努力都可能白费。我在给 HVAC 控制器对接时一般通过 Modbus 寄存器把温度用 0.01℃ 为单位发送也就是 25.04℃ 发送为 2504。有些第三方上位机软件默认十六位有符号数如果超过 3276.7℃ 会溢出但温度通常不会到这个值没太大问题。如果直接输出 4-20mA要仔细校准 DAC 或者 PWM 的零点位置。很多现场问题不是温度测量不准而是转换成 4-20mA 后零点偏移导致控制系统误判。建议在 0℃ 时输出 4mA100℃ 时输出 20mA工程上用 2400Ω 精密电阻采样测试电流精度至少做到 ±0.5% FS。我个人在实际操作中体会最深的一点一个温度采集系统75% 的问题出在硬件布局和连接方式上而不是芯片本身。ADS122U04IPWR 与 STM32L031C6 这套组合已经把信号链路的“最后一步”给你铺好了剩下的就是把布线、校准、通信这三件事用心做好。如果你正准备做类似项目建议先照着我第 2 节和第 3 节的思路搭一个最小系统用便宜的 PT100 探头验证通信跑通之后再往前推进到抗干扰和标定阶段这样能少走很多弯路。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/11/5 0:03:36
8G显存本地AI数字人实战:从ASR到TTS的完整搭建与调优指南
2026/11/5 0:03:36
大模型系统性入门:从原理、部署到微调应用的完整路线
2026/11/5 0:03:36
鸿蒙文件系统沙箱机制解析与开发实践
2026/11/5 1:53:49
低代码和AI Coding怎么选?做企业应用,当然是全都要
2026/11/5 1:53:49
python:3.12 镜像 1.2GB,多阶段构建后只剩 95MB:省了什么丢了什么
2026/11/5 1:53:49
基于微信小程序的智能健身运动健康监测管理系统的设计与实现毕业设计_程序源码论文_支持鸿蒙安卓
2026/11/5 1:53:49
一次 kubectl apply 到底发生了什么?六阶段全链路拆解(底座认知 08·讲解篇)
2026/11/5 1:53:49
日志达到阈值后轮转,确认程序继续写入正确文件
2026/11/5 1:48:49
网盘直链解析一键搞定:免费 Tampermonkey 脚本,8 大网盘直链随便取
2026/11/5 0:03:36
多智能体协作系统架构设计与实践优化
2026/11/5 0:03:36
大模型系统性入门实战指南:从原理到部署微调的全链路路线
2026/11/5 0:03:36
鸿蒙文件系统沙箱机制解析与开发实践
2026/11/4 4:08:30
面向复杂光照与角度的宠物面部识别鲁棒性增强策略
2026/11/4 4:08:26
DRV8818PWPR与R7FA8M1AHECBD工业步进驱动实战指南
2026/11/4 4:08:23
STM32与DRV8818双极步进电机驱动方案:从选型到调试全流程解析
2026/11/4 4:08:30
面向复杂光照与角度的宠物面部识别鲁棒性增强策略
2026/11/4 4:08:26
DRV8818PWPR与R7FA8M1AHECBD工业步进驱动实战指南
2026/11/4 4:08:23
STM32与DRV8818双极步进电机驱动方案:从选型到调试全流程解析