做工业和 HVAC 温度采集这些年,我有一个很深的体会:很多项目看起来只是“测个温度”,真正落地时却要同时面对传感器线长、现场干扰、器件温漂、成本控制一堆问题。ADS122U04IPWR 配 PIC18F87K22 这套组合,就是我在这类项目里用得比较顺手的“精密测温前端 + 主控”方案。ADS122U04IPWR 是带 UART 接口的 24 位 Δ-Σ ADC,自带可编程增益放大器、基准源和激励电流源;PIC18F87K22 则提供充裕的 Flash/RAM 和多路串口资源。整套方案非常适合恒温器、锅炉控制、管道温度监测、冷库告警等 HVAC 应用,也适合在 PLC 温度采集模块、工业变送器上做前端采样。如果你正在选型或者刚接手类似测温项目,这篇内容会从方案选型、传感器接入、硬件布局、寄存器配置一路讲到现场排障,基本是按我实际做过的项目流程来写的。
1. 方案选型的出发点:为什么是“ADS122U04IPWR + PIC18F87K22”
1.1 工业和 HVAC 测温面临的实际问题
工业现场和 HVAC 设备里的温度测量,和实验室台架上的测量完全是两回事。传感器探头可能要装在几十米外的风管里,信号线经过变频器、继电器、大功率开关旁边,环境温度能从 -40℃ 跑到 85℃,供电还经常是从开关电源拉出来的。这些因素叠加在一起,会让“高精度 ADC”这个指标变得非常脆弱。
常见的痛点大概有四类。
第一类是长线传输带来的电压跌落和干扰。普通模拟信号线走几十米,线阻和分布电容会让信号衰减,变频器启动时还会在线上耦合出大量共模噪声。第二类是传感器本身的非理想性。PT100、PT1000、热电偶都存在非线性,导线电阻、冷端温度、激励电流漂移都会直接影响测量结果。第三类是温漂。控制柜夏天暴晒后内部温度能到 60℃,ADC 的基准源和运放失调会跟着温度漂,很多标称“高精度”的方案在工业温度范围内根本稳不住。第四类是系统集成成本。每个通道都用独立仪表放大器加高精度基准源,BOM 成本立刻失控,而 HVAC 产品偏偏对成本非常敏感。
ADS122U04IPWR 这套方案能解决这些问题,核心思路不是堆料,而是把一个完整的模拟前端集成到 ADC 里:激励电流源、可编程增益放大器、基准源、温度传感器、数字滤波器全部封装进一颗芯片。主控端只需要用 UART 和它通信,剩下的模拟链路交给芯片自己去管理。
1.2 这两颗芯片各自解决什么
先说 ADS122U04IPWR。它是 TI 推出的 24 位低功耗 Δ-Σ ADC,和常见 ADS1220 系列最大的区别在于接口从 SPI 换成了 UART。芯片内部有 4 路输入多路复用器、PGA、两个恒流源 IDAC、内部基准源和内部温度传感器,还带一个能寻址多个从机的工作模式。对,你没看错——这是一颗可以通过 UART 总线挂多颗的 ADC,并不是一颗只能点对点通信的普通芯片。
再说 PIC18F87K22。它是 Microchip 的 8 位 PIC18 系列高端型号,80 引脚封装,程序存储器和数据存储器都达到这个级别里比较充裕的水平,内部有多个 EUSART、SPI、I2C 接口,还有丰富的数字 I/O 和定时器资源。用来驱动 ADS122U04IPWR 完全足够,甚至可以说绰绰有余——ADC 和它通信占用一个 UART 就够了,剩下的资源可以用来跑控制逻辑、显示驱动、通信协议栈。
这个组合的分工非常明确:ADS122U04IPWR 负责把所有模拟信号变成干净的数字化结果,PIC18F87K22 负责读数据、算温度、跑应用逻辑。模拟部分和数字部分被 UART 接口隔开,也方便后续做隔离或者长距离传输。
1.3 谁适合参考这套方案
这套方案适合两类人参考。一类是做 HVAC 控制器、工业数据采集模块的硬件工程师,手头需要低成本、高分辨率、抗干扰能力强的测温通道,又不希望在模拟前端上花费太多精力。另一类是刚接触精密 ADC 的嵌入式开发者,想找一个“不用把 SPI 时序玩到极致也能把 24 位数据读回来”的方案。
如果你只是做实验室里几厘米长的短距离测温,或者测温精度要求只有 ±1℃,完全可以用更便宜、更简单的器件。但如果你要在工业现场把温度信号稳定地送进控制器,这套组合的集成度和接口设计优势会非常明显。下面我先把两颗芯片的关键特性拆开讲清楚,再进入实际设计。
2. ADS122U04IPWR 的器件特性和设计价值
2.1 24 位 Δ-Σ ADC 的关键参数
ADS122U04IPWR 本身是一颗 24 位 Δ-Σ ADC,采样率最高可以到 20kSPS 这个数量级。对于温度测量来说,根本不需要这么高的速率,反而应该降低数据速率来获得更好的噪声性能。Δ-Σ 架构的好处在于内置数字滤波器,可以在降低输出速率的同时抑制带外噪声。
这颗 ADC 的输入支持差分方式,输入范围由基准电压和 PGA 增益共同决定。例如基准 2.048V、增益 4 时,满量程大约是 ±0.5V;增益 8 时,满量程降到 ±0.25V。输入信号很小的时候,PGA 能把信号放大后再送进调制器,等效分辨率会高很多。
另外它还有一个内置温度传感器,可以用来监测芯片自身结温,这在实际项目中很有用。一方面是诊断用,防止 PCB 局部过热;另一方面在做热电偶冷端补偿时,这个温度值可以直接参与计算,省去外置热敏电阻的标定工作。当然,结温并不完全等于热电偶冷端温度,真要高精度做冷端补偿,还是建议把传感器端子温度作为参考,芯片内部温度传感器可以作为辅助。
2.2 内置 PGA、激励电流源和基准:让模拟前端简化
做精密测温时,最麻烦的就是激励源。RTD 传感器需要恒流源激励,普通方法是用基准电压芯片加运放搭一个恒流源,温度和负载一变,电流精度就受影响。ADS122U04IPWR 内部直接集成了两个可编程 IDAC 电流源,电流范围从几十微安到毫安级,寄存器里配一下就能用。
内部基准源也把外部基准电路省掉了。基准电压的温漂指标对于工业温度测量尤其重要,外部基准芯片可能本身精度很高,但 PCB 上不同器件之间温度梯度会产生误差;内部集成的基准和 ADC 在同一颗芯片里,热耦合更好,温漂特性也更一致。
真正让模拟前端大幅简化的是“比例式测量”能力。激励电流同时流经 RTD 和参考电阻,ADC 既测量 RTD 上的电压,又把参考电阻上的电压作为基准。由于激励电流是同一个,电流波动被同时引入分子和分母,等于自动抵消了。这个原理后面我会用具体公式展开。
2.3 用 UART 接口的长线缆和隔离优势
选型时让我最感兴趣的其实是 UART 接口。传统精密 ADC 几乎都用 SPI,高速时钟、片选、数据线好几根线,长线传输时信号沿的完整性和时钟同步都是问题。UART 只有两根线,加上地线三根就能通信,而且波特率容错性比 SPI 时钟好很多。
用 UART 还有一个隐藏好处:方便加隔离。HVAC 设备里经常有继电器、接触器,数字隔离是最可靠的抗干扰手段之一。UART 接口可以直接通过数字隔离器把模拟前端和主控隔离开,隔离器型号选择范围也广,成本比隔离 SPI 要低。
在组网方面,UART 的地址帧模式允许一条总线上挂多个 ADS122U04IPWR,每颗芯片有自己的地址。如果你要做 8 路、16 路温度采集,不用堆 8 颗 MCU,用一颗 PIC18F87K22 通过同一串口轮询所有 ADC 就行。不过要注意,挂载数量和线长有关,现场实际测试时不能只看理论值。
3. PIC18F87K22 的角色:主控与协议处理
3.1 作为主控的资源匹配
PIC18F87K22 在这个方案里负责所有“非模拟”的活。它在 8 位 MCU 里算资源比较宽裕的,程序空间在百 KB 级别,SRAM 也有数 KB,跑温度查表、PID 控制、Modbus 协议栈都够用。更关键的是它内部有多路串口,就算把一路 UART 专门分配给 ADS122U04IPWR,还能留出另一路 UART 做上位机通信或者调试打印。
在实时性上,8 位 MCU 主频并不高,但温度测量本身是慢速过程,1 秒刷新 10 次已经非常快了。PIC18F87K22 完全有能力在 ADC 转换期间同时处理显示刷新、按键扫描和通信任务。用定时器中断驱动一个状态机来管理 ADC 会话,是这套方案里我比较推荐的做法。
3.2 通信与系统管理的分工
ADC 端做好三件事:初始化、发起转换、取回数据。主控端则负责更上层的逻辑,比如判断传感器是否断线、温度是否超限、要不要启动继电器。从系统可靠性角度来看,把通信协议和业务逻辑分离非常重要——通信状态机只管数据帧,业务代码只管用数据,两者不要耦合在一起。
我习惯的做法是:PIC18F87K22 上电后先对 ADS122U04IPWR 做一次配置写入,然后进入周期性轮询模式。每次轮询发送读数据命令,等到 UART 收到完整数据包,再把 24 位原始码值换算成温度值存入全局变量。这样即使 ADC 暂时通信失败,控制器还能用上一次有效数据进行安全判断,不会直接导致误动作。
3.3 还有哪些替代主控
如果你手头没有 PIC18F87K22,用其他带 UART 的 MCU 也完全可以,比如 PIC18F 系列其他型号、STM32、AVR、甚至一颗很便宜的 8 位单片机都行。因为 ADS122U04IPWR 对外只有 UART,对主控的算力和外设要求很低,反而是 Flash 大一点更好——温度线性化查表、各种诊断逻辑都需要放代码。
不过 PIC18F87K22 在电气性能和引脚数量上比较适合做中小型控制器:I/O 多,适合同时驱动继电器、LCD、按键;多个硬件 UART 省软件模拟串口的麻烦;宽工作电压和工业级温度范围对 HVAC 应用友好。若是做大批量消费级产品,选一颗更便宜、资源更精简的 MCU 也合理。
4. 传感器前端:PT100/PT1000 与热电偶的接入设计
4.1 比例式电阻测量的原理
比例式测量是这套方案的精髓,我尽量用最直白的方式讲。假设有一个恒流源 I 流过参考电阻 Rref 和 RTD 电阻 Rrtd,那么参考电阻上的电压是 Vref = I × Rref,RTD 上的电压是 Vrtd = I × Rrtd。把 Vref 接到 ADC 的基准输入端,把 Vrtd 接到 ADC 的测量输入端,那么 ADC 输出的数字码值和这两个电压的比值成正比。
由于 Vrtd / Vref = Rrtd / Rref,激励电流 I 在计算过程中被约掉了。也就是说,即使电流源有温漂,只要它同时流过两个电阻,测量结果就不受影响。这是一种天生抗电流漂移的方案,也是 RTD 高精度测量的标准思路。
实际电路里,Rref 要选择低温漂精密电阻,比如 ±0.1% 精度、温漂 5ppm/℃ 以内的金属箔电阻或者薄膜电阻。Rref 的精度直接决定测量绝对精度,因为整个测量链路的基准就是它。我一般把 Rref 放在 RTD 附近,尽量不要靠近发热元件。
4.2 三线制 PT100 接线与导线补偿
二线制接法最简单:两根导线接 RTD,电流从一根线流入,从另一根线流出。但导线上有电阻,测出来的电压包含了导线压降,几十米的铜线可能带来好几欧误差,对 PT100 来说就是好几度偏差。
四线制最精确,用一对线提供激励电流,另一对线单独采样电压,电压线上几乎没有电流,所以导线电阻不影响测量。缺点是线缆成本高,现场很多场合不愿意拉四根线。
工业上折中的方案是三线制。三线制里有一根线专门用来做补偿,或者用两个 IDAC 分别从两端注入电流,让两条电流路径上的导线压降在差分测量中互相抵消。ADS122U04IPWR 有两个 IDAC,正好适合做这件事。
我实际用的方法是:第一个 IDAC 从 RTD 一端注入电流,经过 RTD 后从参考电阻回到地;第二个 IDAC 以相同电流从另一条导线注入,方向相反,用来抵消第一条导线上的压降。然后用 ADC 做差分测量,两次切换配置取平均。这样在导线电阻不平衡不超过一定范围时,测量结果基本不受线阻影响。具体切换顺序需要参考数据手册里 IDAC 路由寄存器的配置,不同引脚组合会有不同的补偿效果。
4.3 热电偶冷端补偿的实现
热电偶的输出是热端和冷端之间的温差电动势,所以要得到真实温度,必须知道冷端温度。传统做法是在冷端附近贴一个热敏电阻或集成温度传感器,再做冷端补偿计算。ADS122U04IPWR 内部自带的温度传感器能省一部分事,不过我更推荐在接线端子上放一个外部测温点,或者用 ADC 内部的传感器做粗补偿,然后用系统校准消除误差。
热电偶信号是毫伏级的直流电压,K 型热电偶大约 40μV/℃,所以需要比较大的 PGA 增益,同时还要做系统偏移校准。芯片提供了校准命令,先短路输入测零偏,再在标准温度下测增益误差,把校准系数存到 MCU 的非易失存储里。这个流程对热电偶方案几乎是必须的,不做校准的热电偶精度很难保证。
4.4 前端保护与滤波电路
无论 RTD 还是热电偶,现场传感器线都可能引入共模过压和静电。我的建议是在 ADC 输入引脚前面串联合适的电阻,并在差分线之间并联滤波电容,限制进入芯片的电流和电压变化速率。串联电阻的阻值不宜太大,否则会和 Δ-Σ 调制器的采样电容形成分压,反而引入增益误差。
还需要加钳位保护。可以用双二极管或者 TVS 管把输入电压限制在电源轨附近。在 HVAC 设备里,传感器线缆还可能因为雷击浪涌感应出高压,如果产品要过浪涌测试,前端保护电路一定要认真设计,这部分不能图省事。保护电路本身会带来漏电流,和 IDAC 的激励电流相比如果占比太高,会直接影响测量精度,所以要选低漏电流的器件。
5. 硬件连接、电源与 HVAC 环境布板
5.1 ADS122U04IPWR 与 PIC18F87K22 的引脚级连接
硬件连接不算复杂。ADS122U04IPWR 的模拟输入 AIN0/AIN1 接 RTD 差分信号,REFP0/REFN0 接参考电阻 Rref 的两端,IDAC1 和 IDAC2 根据接线制式配置到对应引脚。数字部分就是那颗芯片的 UART 引脚接到 PIC18F87K22 的一个 EUSART 上,同时把两个器件的电源和地连好。
PIC18F87K22 这边我建议留出调试串口和编程接口。ICSP 编程引脚要引出,方便产线烧录和现场升级。调试打印建议用另一个 UART,这样不会和 ADC 通信互相干扰。中断引脚如果有的话接出来更好,可以做成“转换完成触发主控读取”的方式,比纯轮询更省主控资源。
5.2 电源方案与地去耦
ADS122U04IPWR 对模拟电源的干净程度比较敏感,我建议用低噪声 LDO 单独供电,不要在开关电源输出上直接并联滤波电容就完事。如果系统里已经有 3.3V 数字电源,可以考虑用磁珠或者小电阻把模拟电源和数字电源隔离一下,虽然不能和真正独立电源比,但成本低、效果明显。
电源去耦要遵循“每颗芯片都有完整回路”的原则:ADC 的模拟电源引脚和基准引脚旁边放 0.1μF 陶瓷电容,再加 10μF 钽电容或者多层陶瓷电容稳住低频。PCB 上模拟地和数字地要做单点连接,ADC、参考电阻、输入滤波电容的地必须回到同一个模拟地参考点,不能和继电器驱动地混在一起。
一个很容易踩的坑是:HVAC 控制器里有加热器、风机驱动,功率地和模拟地如果大面积铺在一起,地电流会形成电压梯度,直接反映到测量结果里。我一般会把功率地单独走,只在电源输入端做单点汇合。
5.3 长线缆、继电器和 EMC 处理
HVAC 设备中,传感器线缆经常要和 220V 动力线一起走线。这时候首先考虑屏蔽双绞线,屏蔽层单端接地,不要两端都接地形成地环路。传感器信号属于低频信号,屏蔽对低频电场干扰作用比较明显,但对磁场干扰帮助有限,所以还要尽量远离电感性负载。
如果主控和传感器之间的距离超过两三米,我建议不要直接传模拟信号,而是让 ADC 靠近传感器,用 UART 数字信号返回主控。UART 信号是电平跳变,抗干扰能力比毫伏级模拟信号强很多,再远就用 RS485 收发器转差分信号。
板级 EMC 方面,输入连接器附近放共模电感或磁珠,UART 线上串联 22Ω 到 100Ω 电阻,继电器驱动电路一定要做续流二极管,这些细节能避免很多现场返工。
6. 固件实现:从 UART 配置到温度换算
6.1 初始化流程和寄存器配置
固件的第一步是把 PIC18F87K22 的 UART 波特率配置好,一般选 19200bps 或 38400bps 就足够。温度数据刷新率不高,不需要跑很快。波特率过高反而在长线传输时更容易受干扰。ADS122U04IPWR 的 UART 帧格式默认是 8 位数据、无校验、1 位停止位,这一点要和主控端严格对齐。
初始化 ADC 时按照下面这个顺序做比较稳妥:先复位 ADC,让芯片回到默认状态;然后读取寄存器确认通信正常;接着写寄存器配置,配置内容包括输入多路复用器选择、PGA 增益、数据速率、基准源选择、IDAC 电流值和路由;最后再做一次读回验证,确保写入成功。
以 PT100 三线制为例,假设激励电流设为 1mA,那么 0℃ 时 PT100 阻值 100Ω,差分电压 100mV。如果把 PGA 增益设为 8,输入到调制器的信号是 800mV,距离满量程还有余量;如果测量范围要到 300℃ 以上,Rrtd 会超过 200Ω,电压超过 200mV,增益 8 时输入达到 1.6V,依然可行。但如果要测 500℃ 以上,建议改用增益 4。具体寄存器位的值要对照数据手册来填,不同位段代表的功能不能搞混。
6.2 数据读取与状态机设计
读取 ADS122U04IPWR 数据时,关键要处理好字节对齐。数据是 24 位,分三个字节返回,可能是高字节在前也可能是低字节在前,以手册为准。主控收到的帧如果不完整,直接丢弃,不要拿半个帧去换算温度。
我推荐用状态机管理通信流程,不要让主程序阻塞等待 ADC 响应。比如状态机包含“空闲、等待转换完成、发送读命令、等待数据、解析数据”几个状态,每次定时器中断推进一次状态机。这样主循环还能处理按键、显示、通信,不会因为 ADC 卡住而整个系统崩溃。
还要加超时保护。如果 UART 发送命令后几百毫秒都没收到完整响应,就重试一次;重试三次还不行,就上报通信故障。现场环境复杂,偶尔一次干扰丢帧很常见,软件恢复能力比硬件堆料有时还关键。
6.3 原始码值到摄氏度:完整计算过程
这一步是很多新手容易出问题的地方。24 位原始码值通常是二进制补码格式,最高位为符号位。要先把三个字节拼成一个 int32,再根据符号位做符号扩展,得到有符号的整数 code。
对于比例式测量,码值和输入电压的关系是:Vin = (code / 0x7FFFFF) × (Vref / Gain)。如果 Vref 来自 IDAC × Rref,也就是 Vref = I × Rref,那么 Rrtd = Vin / I。把前面的式子合并一下,Rrtd 的计算就会简化成只和 code、Rref、Gain 有关,I 和 Vref 都被约掉了。
举个例子。设 Rref = 2kΩ,IDAC = 1mA,Vref = 2V,Gain = 4。0℃ 时 Rrtd = 100Ω,Vin = 100mV,满量程 Vref/Gain = 0.5V,code = (0.1 / 0.5) × 0x7FFFFF ≈ 0x199999。反过来,读取到 code = 0x199999,先还原 Vin = 0.1V,再算 Rrtd = 100Ω。100℃ 时 PT100 约 138.5Ω,code ≈ 0x23D70A,换算回来就是约 138.5Ω。
得到电阻之后要转温度。PT100 在 0℃ 以上可以用 Callendar-Van Dusen 方程,简化形式是 R(T) = R0 × (1 + A×T + B×T²),其中 A = 3.9083×10⁻³,B = -5.775×10⁻⁷。直接反解这个二次方程就能得到温度。如果精度要求更高,还要加三次项修正。我实际项目里习惯用查表加线性插值,把 -50℃ 到 300℃ 范围内每 1℃ 的电阻值做成表格,比对最近的节点后线性插值,速度和精度都不错。
6.4 典型代码片段(C 语言,PIC18 平台)
下面这段是示意性伪代码,体现核心流程,具体库函数和寄存器名请按实际数据手册和编译器调整。
#define ADS_ADDR 0x40 /* 从机地址,按手册定义 */ #define REG0_CONFIG 0x01 /* 举例:AIN0/AIN1 差分,增益 4 */ int32_t code24; uint8_t buf[3]; /* 从 UART 接收缓冲区取回三字节数据 */ void ads_read_data(void) { /* 发送读数据命令,然后等待 UART 接收三字节 */ uart1_send_byte(ADS_ADDR); uart1_send_byte(0x10); /* 读转换结果命令,实际操作以手册为准 */ while (uart1_rx_count() < 3); buf[0] = uart1_get_byte(); buf[1] = uart1_get_byte(); buf[2] = uart1_get_byte(); } /* 三字节补码转 int32 */ int32_t ads_to_int32(uint8_t hi, uint8_t mid, uint8_t lo) { int32_t v = ((int32_t)hi << 16) | ((int16_t)mid << 8) | lo; if (v & 0x800000) v -= 0x1000000; /* 符号扩展 */ return v; } float rtd_temperature(int32_t code, float rref, float gain) { float vin = ((float)code / 0x7FFFFF) * (2.0f / gain); /* Vref=2V */ float r = vin / 0.001f; /* IDAC=1mA */ /* 用线性近似转温度,高精度建议查表 */ return (r - 100.0f) / (0.00385f * 100.0f); }代码里的注释很重要,特别是寄存器地址和命令字,因为不同版本的芯片手册可能存在差异。建议每写完一段配置代码,就在样机上用逻辑分析仪抓一遍 UART 波形,确认帧格式和手册完全一致。
7. 调试实录与常见问题排查
7.1 读数全零或接近满码先查什么
我调试时最常遇到的现象是读取结果一直是全零。先别急着怀疑 ADC,第一步检查 IDAC 是否真的输出了激励电流。如果电流源没有启动,RTD 上根本没电压,读数自然是零。检查方法可以用万用表测 Rref 两端电压,正常应该有 Vref = I × Rref,比如 1mA × 2kΩ = 2V。
另一种情况是读数接近满码,看起来像 0x7FFFFF 或者 0x800000,这通常是输入信号超出 ADC 量程了。可能原因包括:PGA 增益设置太高、传感器引线接反、输入引脚上残留过压。先用万用表实测输入电压,再和理论值对比,基本能定位。
如果输入电压正常但读数还是异常的,要检查基准电压。基准引脚如果悬空或者对地短路,ADC 内部转换结果会完全乱掉。REFP/REFN 的差分电压必须稳定且极性正确,否则输出码值没有意义。
7.2 噪声和跳动压不下去怎么办
温度读数跳动,通常先看数据速率。Δ-Σ ADC 的数据速率越低,数字滤波器的噪声抑制效果越好,有效分辨率也越高。如果当前跑的是几百 SPS,量产现场会受到电源纹波和辐射干扰影响,建议降到 20SPS 或更低,温度测量完全来得及。
再看电源纹波。把示波器探针直接测 AVDD 引脚,如果发现和开关频率同步的纹波,就需要加强滤波。另外 PCB 走线也是重要因素,RTD 的激励线和信号线如果形成大环路,会像天线一样拾取磁场噪声,尽量把差分走线靠近走。
软件上可以做数字滤波。一阶低通滤波或者滑动平均都能明显改善显示值跳动,但要注意不能滤掉真实变化。我一般用一阶 IIR:y = y_prev + k × (x - y_prev),k 取 0.1 到 0.3。如果响应速度要求不高,可以k取小一点;HVAC 温度变化本来就慢,滤波系数可以很平滑。
7.3 UART 偶发丢帧与波特率误差
UART 丢帧很多情况下是波特率误差导致。PIC18F87K22 的内部振荡器精度通常可以满足串口通信,但如果你用的是外部晶振或者内部振荡器没有校准,两边晶振误差累积可能导致偶尔丢字节。排查方法很简单:发一串固定数据,用示波器量实际波特率,和标称值对比。
如果真的出现丢帧,优先检查主控时钟源配置。把波特率调到 9600bps 会大大降低对时钟精度的要求,但数据吞吐也下降。温度应用不算高吞吐,9600 或 19200 都够用。
如果用了数字隔离器或者 RS485 收发器,还要检查隔离器延迟。某些低速光耦的延迟时间会吃掉半个波特周期,导致采样点偏移。这种情况下要选高速数字隔离器,或者把波特率降低到光耦能承受的范围。
7.4 常见问题速查表
| 现象 | 可能原因 | 建议处理 |
|---|---|---|
| 读数为全零 | IDAC 未启动、传感器没接好、接线断 | 测 Rref 两端电压,确认激励电流 |
| 读数接近满码 | 增益过大、输入超量程、引脚接反 | 万用表实测输入电压,检查 PGA 配置 |
| 读数轻微跳变但幅度不大 | 电源纹波、线缆拾噪、电磁干扰 | 降低数据速率,加软件滤波,优化布线 |
| 读数严重漂移 | Rref 温漂大、传感器自热、基准源异常 | 换低温漂电阻,降低激励电流 |
| UART 偶发丢帧 | 波特率误差、时钟不准、隔离器延迟 | 抓波形实测波特率,换高速隔离器 |
| 温度偏低且随线长变化 | 导线电阻未补偿、三线制配置错误 | 检查 IDAC 路由和补偿配置 |
8. 实测效果与扩展方向
8.1 我项目里的实测结果
这个组合我在一套冷库温度监控板上用过,环境温度从 -30℃ 到 50℃,传感器线缆长约 10 米,三线制 PT100,激励电流 1mA,增益 4,数据速率 20SPS。实测读数稳定性大概在 ±0.05℃ 以内,和标准铂电阻温度计对比,系统误差在 ±0.3℃ 左右,主要受限于 Rref 精度和非线性。
换到锅炉管道温度监测场景后,现场有水泵接触器频繁动作,UART 线通过数字隔离器接到主控。即使在接触器动作瞬间,温度数据也没有出现明显毛刺,通信一天下来误码率非常低。对我来说,这个方案的抗干扰能力不是吹出来的,而是真能从现场数据上看出来。
功耗方面也值得提一句。ADS122U04IPWR 的低功耗特性配合主控睡眠,可以让整套设备长期电池供电。我测过约半小时刷新一次温度、用间歇式读取方式,平均电流可以压得很低。这对于偏远位置的无线温度采集节点很有意义。
8.2 这套组合还能扩展成什么
扩展方向很多。如果你需要采集多路温度,可以在同一条 UART 总线上挂多颗 ADS122U04IPWR,利用地址帧区分不同从机。另一端如果想接入 PLC 或上位机,可以把 PIC18F87K22 的另一个 UART 通过 RS485 转成 Modbus RTU,温度数据直接进组态软件。
这套前端也可以不只测温度。ADS122U04IPWR 是通用 ADC,配合不同的传感器,还能测压力、应变片、桥式传感器、4-20mA 电流信号。我在测试中发现,只要把前端保护电路和传感器类型对应改一下,同一套主控代码可以复用很大一部分。
如果产品对精度要求更高,可以在 MCU 里做多点温度校准,把全温区误差拟合成多项式,每个传感器单元校准一次,误差能进一步压住。产线校准需要自动化,但方案本身有这个余量。
8.3 个人最终体会
这套组合我实际用了两年多,踩过最深的坑是寄存器配置里一个不起眼的位:IDAC 路由选择错误,导致 3 线补偿根本没生效,现场温度随线缆长度明显变化。当时查了两三天才定位到问题。所以就算方案集成度再高,数据手册的寄存器表也应该逐位对照检查,不能心存侥幸。
另一个体会是:做工业测温,不要上来就追“24 位”这个数字。24 位只是 ADC 的分辨率,系统最终精度取决于传感器、参考电阻、接线方式、校准流程,任何一个环节都会拖后腿。把原理吃透,把每个误差源都控制住,才能在真实环境里拿到那个“过得去的数字”。
如果你打算做类似项目,我建议先按这篇文章搭建一套最小系统:一块 MCU 板、一颗 ADS122U04IPWR、一只 PT100、一个精密电阻,把比例测量跑通。别看东西少,这套最小系统能帮你把整个链路的所有细节验证清楚,之后再扩展通道、加隔离、上协议,都会顺很多。希望这篇内容能让你少走点弯路,也欢迎在实际调试中形成你自己的心得。