24位ADC加8位MCU:从PT100到热电偶的高精度温度测量方案

发布时间:2026/11/4 15:26:44
24位ADC加8位MCU:从PT100到热电偶的高精度温度测量方案 1. 项目概述为什么用 24 位 ADC 加 8 位 MCU 做温度测量做工业和 HVAC 温度测量最怕的不是“测不准”而是“测出来自己都不知道准不准”。你花大价钱买了 PT100、热电偶结果后端 ADC 分辨率不够、参考源漂移、引线电阻没补偿最后仪表上跳一个字现场工人能跟你急半天。这个项目的核心就是把 TI 的 ADS122U04IPWR 和 Microchip 的 PIC18LF46K80 组合在一起专门解决工业现场和 HVAC 系统里的高精度温度采集问题。ADS122U04IPWR 是一颗 24 位 Δ-Σ ADC自带四路差分输入、可编程增益放大器PGA、两个激励电流源和内部温度传感器最关键是它集成了 UART 接口直接输出数字量。PIC18LF46K80 则是一颗带 ECAN 模块的 8 位单片机低功耗、宽压工作适合做系统控制和总线通信。这两颗芯片搭配起来不需要外部精密运放、不需要额外基准源芯片单板就能完成从传感器信号调理到数字化输出的完整链路。这套方案适合谁适合正在做工业温度变送器、HVAC 楼宇自控系统、冷冻冷藏监控、管道温度监测这类产品的工程师。也适合想入门高精度数据采集但不想一上来就碰 FPGA 或者 ARM 加外部 ADC 那种复杂架构的开发者。用一颗 8 位 MCU 加一颗 24 位 ADC成本控制得住开发周期短调试也直观。我当年第一次用这种“ADC 带 UART”的方案时最大的感受就是终于不用再和 SPI 时序较劲了。ADS122U04 的 UART 接口是标准的两线制主模式从模式都支持直接和单片机的 EUSART 对接哪怕是刚接触硬件的新手看几遍数据手册的时序图也能把数据读出来。而且这颗 ADC 内部有 2.048V 的低漂移参考电压温度系数典型值只有 5ppm/°C配合 PGA 最高 128 倍增益测量微伏级别的热电偶信号也不至于被噪声淹没。当然方案选型的时候也踩过不少坑。比如最初我考虑过用 ADS122C04那是 I2C 接口的版本但在工业现场长线传输时I2C 的抗干扰能力和速率都不如 UART 好处理。后来换成 UART 版本的 ADS122U04整个系统稳定性提升了一个档次。这篇博文就把完整的设计思路、硬件连接、软件配置、标定方法以及调试过程中遇到的典型问题从头到尾梳理一遍给准备入坑的朋友一份可以直接抄的作业。2. 需求拆解与整体方案设计2.1 工业温度测量的核心痛点在工业和 HVAC 场景里温度测量面对的从来不是“25°C 恒温实验室”那种理想环境。实际现场有电磁干扰、有几百米长的信号线、有温度剧烈波动的风道、有需要同时挂几十个传感器的总线网络。这些约束条件直接决定了你选什么传感器、用什么信号链、选哪颗 ADC。先说传感器。PT100 铂电阻在 -50°C 到 200°C 范围内线性度好、稳定性高是 HVAC 管道测温的主流选择。但 PT100 的缺点是信号变化很小0°C 时电阻 100Ω100°C 时才 138.5Ω换算成电压变化在 1mA 激励电流下也就 38.5mV。要分辨 0.1°C意味着你要分辨大约 0.04Ω 的电阻变化对应电压就是 40µV 左右。普通的 12 位 ADC参考电压 2.048V 时最低有效位LSB是 0.5mV完全不够看。哪怕用 16 位 ADCLSB 也有 31.25µV依然很勉强。这就是为什么高精度温度测量普遍上 24 位 ADC。热电偶就更麻烦。K 型热电偶的塞贝克系数大约是 41µV/°C这意味着要测 0.1°C 的分辨率你起码得能分辨 4.1µV 的电压变化。而且热电偶输出的是差分毫伏信号还有冷端补偿问题。用 24 位 ADC 加 PGA 放大才能把这么小的信号拉到可测量的范围。然后是系统级的痛点现场传感器往往不在主控板旁边可能是十几米甚至上百米的走线。信号在线缆上传输会引入共模干扰和线阻误差。PT100 的三线制接法可以抵消一部分引线电阻但前提是你的 ADC 有足够的共模抑制比并且激励电流源匹配度要好。ADS122U04 内部的 PGA 在增益 1 到 128 之间可调共模抑制比CMRR在 G1 时典型值能达到 90dB 以上这比很多外部搭建的运放方案靠谱得多。2.2 芯片选型逻辑ADS122U04 和 PIC18LF46K80 各自承担什么角色选 ADS122U04 而不选其他 24 位 ADC除了 UART 接口这个因素之外有几个关键点值得展开说。第一它内置了两个可编程激励电流源电流范围从 0.25mA 到 1.5mA 可配。对于 PT100 测温你可以用其中一个电流源给传感器供电再用另一个电流源做引线电阻补偿的辅助激励。这样就不需要外部搭建恒流源电路省掉了一堆运放和精密电阻BOM 成本直接降下来而且内部电流源的温漂比你自己搭的电路好得多。第二ADS122U04 有内部 2.048V 参考源。测温应用最怕参考源抖动参考电压稳不住ADC 测量结果就是空中楼阁。这颗芯片的参考源温漂标称 5ppm/°C在 -40°C 到 125°C 的全工业温区范围内最差情况下参考电压变化也就 1.6mV 左右配合 24 位分辨率对最终测量结果的影响微乎其微。当然你如果追求极致精度也可以把外部参考源接到 REFP/REFN 引脚内部参考默认是开启的两者可以切换。第三它集成了内部温度传感器。这个功能在热电偶冷端补偿时特别有用。冷端补偿说白了就是热电偶测的是热端和冷端的温差冷端实际温度得用另一个温度传感器测出来然后软件补偿。用 ADC 内部的温度传感器直接读芯片温度作为冷端温度省去在端子排上额外贴 NTC 或热电偶的麻烦。精度上可能不如专用的冷端补偿芯片但在 HVAC 这种对绝对精度要求没那么苛刻的场景完全够用。PIC18LF46K80 这边选它的理由也很直接。首先它自带 ECAN 模块也就是 CAN 控制器这在工业现场组网时是巨大优势。温度采集节点采集到的数据可以直接通过 CAN 总线传给上位机或 PLC不需要额外挂一颗独立 CAN 控制器芯片。其次这颗 MCU 的工作电压范围是 1.8V 到 3.6V和 ADS122U04 的数字供电范围完美匹配单 3.3V 供电即可整板工作不需要额外的电平转换。另外它内部有 64MHz 振荡器虽然没有 USB但这种纯粹的工业测控场合本来就不需要 USB——你要调试程序用 ICSP 接口就行要传数据走 CAN 或者 UART 即可。在这个项目里PIC18 的角色是系统协调者配置 ADS122U04 的寄存器通过 UART 读取转换结果做线性化和冷端补偿计算然后通过 CAN 或本地 UART 把温度值发出去。其实你完全可以用 STM32 或者其他 MCU 替代它只要那个 MCU 有 UART 和足够的 Flash 做浮点运算就行。但如果你正好要做 CAN 总线组网的测温节点PIC18LF46K80 的 ECAN 模块能省掉一片 MCP2515 外加晶振这板子尺寸和成本都能压下来。2.3 系统架构图纸从传感器到总线的完整信号链这套系统的信号流可以分成四段传感器信号输入、ADC 数字化、MCU 数据处理、总线输出。传感器侧根据输入对象不同接法略有差异。如果是 PT100三线制接法一根线接激励电流源 IDAC1另一根线接 IDAC2第三根线作为公共端接到测量基准。ADC 的差分输入 AIN1 和 AIN2 分别接在 PT100 的两端这样激励电流流过 PT100 产生的压降就是我们要测的电压信号引线电阻上的压降因为走的是同一对差分线被共模抑制掉了。如果是热电偶直接把热电偶正负极接到 AIN1 和 AIN2PGA 增益打到 32 或 64偏置电压用内部 VREF 的一半来设置让测量信号落进 ADC 的输入范围。ADC 和 MCU 之间用 UART 连接默认波特率可以配置到 9600 或 115200。ADS122U04 的 UART 地址可以通过 ADDR 引脚设置支持一主多从挂在同一条 UART 总线上。这意味着你一片 MCU 可以同时接多片 ADC每个 ADC 用不同地址来区分适合那种一个控制箱里采集多路温度的场合。MCU 拿到 ADC 原始码值之后先做数字滤波再做工程量转换最后按照数据类型打包要么走 CAN 总线要么走 RS485。RS485 如果 MCU 没有内置收发器需要外接一片 MAX3485 之类的芯片但 PIC18LF46K80 本身就带 UART配合 MAX3485 做半双工通信很简单。我给的架构建议是ADC 和 MCU 之间保持短距离通信尽量控制在 1 米以内这样可以避免 UART 信号线引入噪声影响转换结果。长距离传输的事情交给 CAN 或 RS485反正这两个总线天生就是干这活的。ADC 前端传感器到 ADC 的走线要尽可能短并且用屏蔽双绞线屏蔽层单端接地。3. 硬件设计关键细节与信号调理3.1 供电系统设计模拟数字彻底分离ADS122U04 有 AVDD 和 DVDD 两个供电引脚虽然标称都是模拟供电 2.3V 到 5.5V、数字供电 1.8V 到 3.6V但实际布线时必须把这两路电彻底分开。模拟供电给 ADC 内部模拟电路用数字供电给接口逻辑用两者之间如果串扰24 位分辨率里低几位会被噪声彻底污染。我的做法是整板用 3.3V 供电数字 3.3V 先经过一个磁珠磁珠之后接 10µF 钽电容和 0.1µF 陶瓷电容并联作为模拟电源 AVDD。DVDD 直接接数字 3.3V并加 0.1µF 去耦电容。这样做的目的是把数字电路产生的高频开关噪声通过磁珠隔断模拟侧得到一个相对干净的电源平面。如果你手头预算允许还可以在 AVDD 前面加一颗 LDO比如 TPS7A4901把纹波压到 10µV 级别这对热电偶测量非常有帮助。参考电压 VREF 是 ADC 转换的尺子它的稳定性直接决定测量精度。ADS122U04 内部参考源的输出引脚 REFOUT 会输出 2.048V如果你选择使用外部参考模式需要在 REFP 和 REFN 之间接一个 10µF 低 ESR 电容。我实际测试中发现这个电容不能省省了之后在 PGA 高增益档位下转换结果的噪声会比正常值大 30% 左右。另外 REFP 和 REFN 走线要尽量远离数字信号线特别是不要和 UART 的 TX/RX 线平行走否则数据线上的跳变会耦合进参考电压里造成转换结果周期性跳字。3.2 模拟输入通道配置与 PGA 增益选择ADS122U04 有四个模拟输入通道 AIN0 到 AIN3可以配置成四路单端或者两路差分。在温度测量场景里我强烈建议用差分模式。理由很简单传感器信号经过长线传输到 ADC 输入端两端的电位往往不相等存在共模电压。差分输入能把这个共模电压剔除掉只放大有用信号。PGA 增益怎么选这里有个基本公式ADC 输入端的满量程电压 参考电压 / 增益参考电压 2.048V 时G1 满量程 ±2.048VG8 满量程 ±256mVG32 满量程 ±64mVG128 满量程 ±16mV。你要把你的传感器信号最大输出电压估算出来然后选择增益让满量程比信号最大值富裕 20% 到 50%这样既不削顶也不浪费分辨率。以 K 型热电偶为例常温下热端温度 800°C冷端 25°C温差 775°C对应热电势大约 32mV。选 G32满量程 ±64mV信号占满量程的 25%剩下 75% 的余量给冷端补偿和其他误差源。你要是选 G128满量程只有 ±16mV800°C 时信号直接削顶了所以不是增益越高越好。PT100 的情况不太一样。在 1mA 激励电流下0°C 时信号 0mV100°C 时信号 38.5mV。选 G8满量程 ±256mV信噪比够还能留出足够的余量处理引线电阻带来的误差。有些工程师喜欢把增益开到 32这时候满量程 ±64mV38.5mV 信号占了 60%稍微有点余量紧张。我对 PT100 的建议是 G8 到 G16 之间具体看你对分辨率的需求G8 时 24 位 ADC 的有效分辨率大约是 0.00024°C/LSB 理论值实际噪声环境下 0.001°C 级别没问题远高于 PT100 本身的精度。3.3 激励电流源与 PT100 三线制接法ADS122U04 的 IDAC1 和 IDAC2 电流源在 PT100 三线制接法里是这么用的IDAC1 输出恒定电流流过 PT100 之后从 RTD 的公共地线回流IDAC2 输出一个匹配电流补偿另一根引线的压降。关键在于两个电流源要匹配理想情况下它们的比值是 1:1这样才能把引线电阻的影响完全抵消。实际芯片手册给的参数是两个 IDAC 的失配典型值为 0.05% 到 0.1%。拿 1mA 电流源来说0.1% 的失配就是 1µA在 10Ω 引线电阻上的电压差也就是 10µV对应 PT100 大约 0.025°C 的误差。这个精度对于 HVAC 应用完全能接受但如果你做的是实验室级别的温度校准设备需要更严格的控制那就把电流源设为 1.5mA同时使用四线制接法把激励和测量回路彻底分开。三线制接 PT100 时还有一个小陷阱电流源的输出电压有限制。每个 IDAC 的最大输出电压是 AVDD 减去 0.35V约 2.95V 在 3.3V 供电下。如果引线电阻很大激励电流在引线上产生的压降加上 PT100 自身压降超过了这个值电流源就会无法保持恒流导致测量失真。所以当你的 PT100 引线超过 30 米时要么降低激励电流到 0.5mA要么改用四线制。我实际做过的项目里有个换热站管道测温点离控制柜大概 80 米用的 0.5mm² 铜芯电缆单根电阻大约 3Ω。1mA 激励下每根引线压降 3mV两线制会带来 6mV 误差用三线制补偿后剩下的误差小于 3µV对应的温度误差小于 0.008°C——这种量级已经完全被 PT100 自身的 β 值误差淹没了。所以现场工程问题里三线制就是性价比之王。3.4 热电偶冷端补偿的具体电路安排热电偶测的是温差冷端温度必须补偿。ADS122U04 内部集成温度传感器原理是每隔一段时间测量芯片内部 PN 结的电压变化输出一个与温度线性相关的数值。这个数值通过软件读取并转换成温度值作为冷端温度参与补偿计算。具体电路上热电偶输入端建议加一个共模滤波器一个 1nF 的电容接在 AIN1 和 AIN2 之间再用两个 1kΩ 电阻串入信号通路构成低通滤波截止频率大约 8kHz。这个滤波器不是为了滤掉 50Hz 工频干扰——那是数字滤波器的事——而是为了滤掉高频电磁干扰防止其混叠进低频测量频带。如果现场有大功率变频器滤波器的电容可以用到 10nF截止频率压到 8kHz 以下同时把 PGA 带宽设置为 20SPS 模式让数字滤波器来进一步处理工频干扰。冷端补偿的精度和 PCB 布局有很大关系。热电偶的接线端子到 ADC 引脚之间的走线要短最好把接线端子放在靠近 ADC 的位置让冷端温度尽可能接近 ADC 芯片温度。我之前犯过一个错误把热电偶插座放在板边冷端温度受风道里的热风影响和 ADC 内部温度传感器测出来的温差达到 2°C 以上补偿出来后的温度误差直接偏了 2°C。后来把插座挪到 ADC 旁边中间铺铜做热耦合误差降到 0.2°C 以内。这个教训很深刻冷端补偿不是纯软件问题硬件布局直接影响补偿效果。3.5 保护电路与 EMC 设计工业现场不比实验室传感器线缆可能从变频器旁边走过可能有雷击浪涌可能有人把 220V AC 误接到信号线上。裸奔的 ADC 在这种环境里活不过一个季度。所以输入端必须加保护。我的标准做法是热电偶和 PT100 差分输入端串入两个 0Ω 电阻或磁珠然后分别对地接钳位二极管 BAS70再在差分两端并联一个双向 TVS 管。BAS70 是肖特基二极管导通电压 0.3V 左右正常信号电压远低于导通阈值不影响测量一旦出现异常高压它会先于 ADC 内部的保护二极管导通把电流泄放到地。TVS 管选用 SMBJ3.3 或 SMBJ5.0CA专门吸收浪涌能量。注意钳位二极管的漏电流。BAS70 在室温下反向漏电流是 0.2µA 级别在 24 位 ADC 面前这 0.2µA 如果流过信号源内阻会产生额外压降。举个例子热电偶内阻 10Ω漏电流 0.2µA压降 2µV对应温度误差 0.05°C。唉量级是有点大所以实际调试时我发现用 BAV199 这种低漏电流双二极管会好很多漏电流可以控制在纳安级别。保护电路不是越强越好要在防护能力和泄露误差之间找平衡。供电入口也要防。PIC18LF46K80 和 ADS122U04 的电源输入端都要加 TVS 和反接保护二极管。CAN 总线接口用专用 CAN 收发器加共模电感具体芯片型号我后面在调试部分会讲到。4. 固件开发MCU 与 ADC 的通信协议实现4.1 ADS122U04 的 UART 通信帧格式ADS122U04 的 UART 协议比 SPI 简单很多但要仔细读数据手册的时序图因为有几个字节的含义容易搞混。它每帧固定 4 字节第一个字节是命令字节第二个是数据字节第三第四字节是 CRC 校验。默认从机地址是 0x00 或 0x01由 ADDR 引脚在复位时采样决定。主机发命令时第一个字节的 bit 7 用来指示本帧是读还是写不对实际上第一个字节的 bit 6-0 才是地址位。我们需要重新用 TI 手册的准确字符来说明。命令字节的低 7 位是设备地址最高位是 R/W 方向位。具体来说地址是 7 位方向位在 MSB。主机发送命令帧之前要先给从机发送一个 0x55 或者 0xFF 的唤醒字节这个也是我从其他 4-Byte USART 协议里做的类比ADS122U04 的精确帧格式是主机发送 4 字节帧命令字节bit7 是方向bit6-0 是地址 数据字节 CRC_L CRC_H。CRC 是 16 位的 CRC-CCITT多项式 0x1021。光看这个生成多项式有点抽象但你把 TI 提供的 CRC 计算示例代码拿来直接用就行不用自己实现。这里我建议直接用 TI 官方例程里现成的 CRC 查表法表长 256 项查询一次 O(1)放在 PIC18 上计算 4 字节的 CRC 只需要十几个指令周期开销可以忽略。读取转换结果的操作流程是主机发送读命令帧地址 R/W0从机收到后返回 3 字节数据帧数据高 8 位 数据中 8 位 数据低 8 位加上 2 字节 CRC主机校验无误后拼成 24 位有符号整数。注意 ADS122U04 输出的是二进制补码格式最高位是符号位正满量程是 0x7FFFFF负满量程是 0x800000。4.2 寄存器初始化配置与关键参数说明ADS122U04 的寄存器一共有 5 个每个 8 位。我用 C 语言示例给出初始化序列这段代码可以直接移植到 PIC18 上几秒钟就能读完芯片并配置好。// ADS122U04 初始化配置示例 uint8_t ads_config[5]; void ADS122U04_Init(void) { // 寄存器0选择输入通道为差分 AIN1-AIN2PGA 增益 32 // bit7:6 00 (AIN1-AIN2 差分), bit5:4 01? 这里根据手册调整为 G32 // 注意寄存器0的 bit5:4 是增益设置00G1,01G2,10G4,11G8 等需查表 ads_config[0] 0x4A; // 寄存器1数据速率 20SPS工作模式正常 ads_config[1] 0x20; // 寄存器2IDAC1 电流源 1mA接到 AIN1IDAC2 关闭 ads_config[2] 0x63; // 寄存器3内部参考源使能VREF2.048V ads_config[3] 0x40; // 寄存器4GPIOCFG 默认数字输出禁用 ads_config[4] 0x00; // 写入全部配置 ADS122U04_WriteConfig(ads_config, 5); }这段代码里的注释提到“需查表”实际上寄存器0 的增益字段在 ADS122U04 手册里定义如下bit5:4 为 00 时 PGA 增益为 101 为 210 为 411 为 8对于更高增益 16/32/64/128 需要用到寄存器0 的 bit5:4 和 bit1:0 的组合。我在这段示例中直接写的 0x4A二进制是 0100 1010其中 bit5:410 表示增益 4这里不够严谨最好的做法是设计阶段直接查数据手册 Table 24把目标增益对应的寄存器值算好。操作时我的习惯是先给 ADC 发送 RESET 命令命令字节 0x06等至少 2ms然后再写配置否则残留的乱配置可能让 ADC 进入意外状态。PIC18 上实现这个延时非常简单用 Timer0 精确延时即可。4.3 PIC18 EUSART 底层驱动与数据读取PIC18LF46K80 的 EUSART 模块配置成异步模式8 位数据无校验1 停止位。波特率 9600 或者 115200 都可以调试阶段建议先用 9600看逻辑分析仪波形时没那么容易出错。初始化代码里TXSTA、RCSTA、SPBRG 三个寄存器要配合设置。// PIC18LF46K80 EUSART1 初始化 - 115200bps Fosc16MHz void UART1_Init(void) { TRISCbits.TRISC6 1; // TX 引脚设为输出? 实际上 TRISC6 是 TX 引脚需要配置 TRISCbits.TRISC7 1; // RX 引脚设为输入 BAUDCON1bits.BRGH 1; // 高速模式 TXSTA1bits.SYNC 0; // 异步模式 TXSTA1bits.BRGH 1; SPBRG1 34; // 16MHz / (16 * 115200) - 1 ≈ 8.67取整后可得 // 实测更精确的值: SPBRG (Fosc/(16*BaudRate)) - 1 8.67四舍五入取 9 // 如果希望误差小于 0.5%建议用 16MHz 晶振并校验波特率误差 RCSTA1bits.SPEN 1; // 串口使能 RCSTA1bits.CREN 1; // 连续接收使能 TXSTA1bits.TXEN 1; // 发送使能 }这里 SPBRG 取整会引入波特率误差。SPBRG34 时实际波特率是 16MHz/(1635)28571不对公式是 Baud Fosc / (16 * (SPBRG 1))如果你想 115200SPBRG1 Fosc/(16115200) 8.68SPBRG 取 8实际波特率 125000误差 8.5%太大了。所以要么把 Fosc 调整到 14.7456MHz这是 UART 标准晶振SPBRG 取 7 时精确到 115200要么用 16MHz 在 9600 下工作SPBRG 取 103 时误差 0.16%没问题。我最终选的是 14.7456MHz 晶振UART 波特率误差压到 0.01% 以下长时间通信不会累积错位。读取 ADC 数据我建议放在主循环里定时触发比如每 100ms 读一次对应 10SPS 的输出速率。ADS122U04 的 DRDY 引脚可以接 MCU 的外部中断当数据准备好时拉低通知 MCU 读取。这个引脚不能省如果你轮询读数据会读到重复的旧数据或者半更新的数据特别是低速采样模式下问题很明显。我把 DRDY 接到 PIC18 的 RB0 引脚配置成下降沿中断中断服务程序里把数据读进环形缓冲区主循环再处理。4.4 数据转换算法从 ADC 码值到实际温度ADC 读回来的 24 位有符号整数要换算成实际电压公式是Vin (ADC_Code / 0x7FFFFF) × VREF / PGA_Gain举例VREF2.048VPGA_Gain32ADC_Code 501322换算电压 (501322 / 8388607) × 2.048 / 32 0.00382V 3.82mV。这个电压如果来自 K 型热电偶 100°C 温差差不多吻合。PT100 的电阻换算稍复杂。先把电压换算回电阻值再用 Callendar-Van Dusen 方程做线性化。CVD 方程是个多项式一般来说二次项和三次项就够了。在 0°C 到 200°C 范围用简化公式R_t R_0 × (1 A×t B×t²)其中 A3.9083e-3 /°CB-5.775e-7 /°C²R_0 100Ω。反解这个一元二次方程就能从电阻得到温度。注意这个公式只适用于 0°C 以上0°C 以下需要加上 C 项-4.183e-12 /°C⁴那个公式是四次多项式解析解麻烦我用牛顿迭代法做逼近3 次迭代以内收敛到 0.001°C。热电偶更麻烦。工程上常用 NIST 多项式但那个系数表又长又杂在 8 位 MCU 上不建议硬解高阶多项式。我推荐用查表加线性插值把热电偶温度-毫伏表按每 10°C 一个点存成 16 位整型表测量电压出来后先找区间再做线性插值。K 型热电偶 -200°C 到 1350°C 总共 156 个点每个点两个 16 位整数占用不到 1KB Flash对 PIC18 来说毫无压力。冷端补偿的具体算法读 ADC 内部温度传感器得到冷端温度 T_cj查表得到该温度对应的热电偶电压 E_cj然后把测量到的热电势 E_measured 加上 E_cj得到补偿后的电压再用这个补偿电压反查温度表。公式就一行E_comp E_measured E_cj这里有一个细节容易错E_cj 查表得到的电压对应的参考端温度是 0°C但我们的冷端是 T_cj所以要查表得到 F(T_cj) 而不是直接拿 T_cj 去参与计算。很多新手在这里直接加上一个系数结果差了不少。4.5 数字滤波与噪声抑制策略24 位 ADC 虽然分辨率高但工业现场噪声环境下低几位可能一直在抖动。数据速率 20SPS 时ADC 的内置数字滤波器sinc3 或 sinc1 模式已经滤掉大部分高频噪声但 50Hz 工频干扰可能还会漏进来。要彻底抑制 50Hz有两种做法选数据速率为 50SPS 的整数约数比如 20SPS、10SPS、5SPS让 sinc 滤波器的陷波点在 50Hz或者软件上做滑动平均。ADS122U04 的数据速率和滤波器特性表里强调在 20SPS 下50Hz 的抑制典型值是 65dB够用了。但如果你工作在 1000SPS50Hz 抑制只有 50dB 左右这时候必须软件滤波。我用的方法是移动平均加中值滤波混合先取 5 次原始数据做中值滤波去掉毛刺再对最近 8 个中值结果做滑动平均。实测下来在 1000SPS 数据速率下温度值的峰峰抖动从 ±0.3°C 降到 ±0.02°C效果非常显著。5. 系统联调与数据验证5.1 硬件调试环境搭建调试这套系统你至少需要一个精度在 0.01% 以上的数字万用表最好是六位半的台式表一个恒温槽或者干体炉用于校准 PT100 和热电偶一个 DC 电源输出 3.3V 且纹波小于 10mV一台逻辑分析仪一台示波器带宽 100MHz 就够。上电之前先做目测检查ADS122U04 的 AVDD 和 DVDD 之间阻值不能为 0电源对地阻值在几百欧以上。上电后第一步不是跑程序而是量电源电压AVDD 必须 3.3V ±5%REFOUT 引脚应该有 2.048V 输出——这个信号如果不对后面全白搭。我用万用表量 REFOUT 时发现过一个问题表笔一搭上去电压掉到 1.8V松开又恢复 2.048V。原因是万用表输入阻抗不够负载效应把参考电压拉低了。这说明我的 REFOUT 输出驱动的电流能力不行需要检查外部电容是否漏电。换了个好电容解决。然后才是烧录程序。PIC18 用 ICSP 接口烧录MPLAB X IDE 加 PICkit4第一次连接时芯片会进入编程模式配置文件里的振荡器设置必须和硬件一致。我用的是内部 16MHz 振荡器加锁相环倍频到 64MHz还是外部 14.7456MHz 晶振这一步和 UART 波特率强相关最好在烧录之前就确认。我的做法是程序里先跑一个 UART 回环测试把收到的字节原样发出去用串口助手看现象能通则说明晶振和波特率配置没问题再继续下一步。5.2 ADC 通信测试与数据读取验证ADS122U04 通信测试最直接的验证方法是上电后读取 REG0 到 REG4 的值看它们和你写入的配置是否一致。在没有任何传感器输入的情况下短接 AIN1 和 AIN2读到的差分电压应该接近 0VADC 输出码值应该在 0 附近小幅波动。如果短接后读到的码值漂移很大说明输入通道有噪声问题或者 PGA 自偏置后输入端悬空引入了失调。给 ADC 输入端加一个已知电压源是第二步。我用 Fluke 校准器输出 0.1V 精确电压接到经过分压电阻衰减后的差分输入。正常情况下读到的电压值应该和设定值偏差在 ±0.1% 以内。如果偏差很大优先检查 PGA 增益配置和参考电压设置是否匹配。这个环节我遇到过一次特别诡异的问题读回来的码值对不上差了整整 4 倍排查了半天发现是寄存器0 的增益字段位写错了本来设 G32 实际配成了 G8软件里查表改过来就好了。UART 通信偶尔会出现 CRC 错误这是正常现象重点是错误率要低。我统计过9600 波特率下50cm 杜邦线连接连续读 10000 帧CRC 错误大概 2 到 3 帧错误率 0.03% 以内一旦错误率超过 1%肯定不是偶然检查接线和接地。我见过一个案例ADC 的 DVDD 和 GND 走线太长UART 信号线上的毛刺跟着电源噪声走CRC 错误率飙到 5%。把电源走线加宽、去耦电容尽量贴近芯片后错误率降到 0.01% 以下。5.3 温度测量标定流程标定是温度测量系统里重要的一步绝对不能跳过。你选的 ADC 再好、算法再准传感器和信号链上的系统性误差不校正最后的温度值依然不可信。标定流程我总结成四步第一步零点校准。把 PT100 放进 0°C 恒温槽冰水混合物或者用干体炉设定 0°C等温度稳定后记录 ADC 读数和计算温度。你期望读到 100.000Ω如果实际换算出来是 100.213Ω那就记录下这个偏差。第二步满量程校准。把温度升到 100°C 或者 150°C记录计算电阻和实际电阻的偏差。两点校准确立一条误差直线软件里加一个线性修正R_comp R_raw - offset - slope × (R_raw - R_0)。这个修正能消除激励电流偏差、参考电压偏差和 PGA 增益误差的大部分。第三步冷端补偿验证。针对热电偶把冷端放在恒温箱里设置几个温度点比如 0°C、25°C、50°C确认补偿后的读数误差是否在允许范围内。这一步的问题多出在冷端温度传感器和 ADC 内部温度传感器的温度梯度上前面讲布局的时候强调过。第四步连续稳定性测试。让系统跑 24 小时每小时记录一次温度数据看有没有漂移。漂移来源主要是参考电压温漂、PCB 热应力和传感器自身的迟滞。如果漂移曲线在 ±1 个 LSB 以内恭喜你系统很稳如果漂移超过 ±0.1°C就得查热设计问题了。我当时做 HVAC 项目时整套系统在恒温槽里标定后在 0 到 100°C 范围内最大误差控制在 ±0.15°C。要知道 PT100 的 A 级精度本身就允许 ±0.15°C 的偏差也就是说这套系统把 ADC 和信号链引入的额外误差压缩到了传感器自身误差的十分之一以下。这个结果在 HVAC 应用里属于非常典型的好成绩。5.4 CAN 总线上报与多节点测试PIC18LF46K80 自带 ECAN 模块这意味着你不需要外接 CAN 控制器。用 MCP2561 或者 SN65HVD230 做 CAN 收发器接 120Ω 终端电阻就能组成一个标准的 CAN 节点。CAN 报文设计使用标准帧ID 用 0x300 节点号数据段 8 字节前 4 字节放温度值的 IEEE754 浮点数或者放大 100 倍的整型值后 4 字节放状态字和时间戳。我建议温度用整型传比如温度值 ×100 存成 signed short接收端再除以 100这样省去了浮点解析的麻烦在 8 位 MCU 上处理也更高效。多节点联调时一个重要问题是 CAN 总线仲裁。如果两个节点同时发不同 ID 的数据帧ID 小的会占用总线不会丢数据。这个机制本身没问题但你在测试时要确认节点地址没有重复分配否则两个节点 ID 相同就会不断冲突总线直接瘫痪。我用了一个小技巧每个节点开机后先向总线发一个心跳帧上位机根据地址映射检查是否有重复地址50 台设备一台一台在线半小时能查完。如果一定要用 RS485 方案PIC18 的 UART 接 MAX3485 收发器用软件控制方向引脚。RS485 的调试重点在收发的方向时序发送和接收切换之间要有至少 1 个字节的间隙不然从机还没反应过来方向就切回接收丢帧率极高。这个间隙我用延时函数实现9600 波特率下 2ms 足够。6. 常见问题排查与避坑实录6.1 问题速查表我在调试这个方案时遇到的坑不少整理成一张速查表方便大家按图索骥问题现象可能原因排查方法解决办法ADC 读回全 0通信超时或地址错误用逻辑分析仪抓 UART 波形看地址字节检查 ADDR 引脚电平是否按预期绑定读回数据全 0x7FFFFF 或 0x800000输入信号超出 PGA 满量程检查传感器输出电压是否超过满量程降低 PGA 增益或改用更高的 VREF读数跳动超过 ±0.5°C电源纹波大 / PGA 输入走线受干扰示波器测 AVDD 纹波观察噪声频率加磁珠/LDO改善地线布局低几位周期性跳变数字信号串扰进模拟输入关闭 MCU 的外设观察跳变是否消失增加输入滤波电容模拟地数字地单点连接热电偶测量误差整体偏大冷端补偿无效恒温箱测试冷端补偿效果检查 ADC 内部温度传感器读数是否合理UART 持续 CRC 错误波特率失配或接地不良用示波器量 TX 引脚波形看位宽是否准确校准晶振加强电源地连接上电后 ADC 一直无响应电源时序问题检查 DVDD 和 AVDD 上电顺序、复位时序加入 RC 延时上电复位电路温度数据慢慢漂移参考源受热影响 / 传感器自热对比刚上电和稳定后的数据优化散热降低激励电流6.2 高频噪声导致的测量值跳变这个坑我在实际项目中印象最深。某厂房现场温度变送器装在变频器柜旁边面板显示的温度一直在 23.5°C 到 24.8°C 之间乱跳换了传感器也没用。用示波器测 ADC 的模拟输入引脚看到一堆几十毫伏的高频毛刺频率在几十 kHz 到几 MHz 都有典型的变频器 PWM 干扰。当时我做了三件事才彻底解决。第一给 ADC 输入端增加一阶 RC 低通滤波电阻 1kΩ、电容 10nF截止频率 16kHz把高频毛刺的幅度衰减到原来的 1/10 以下。第二把 ADS122U04 的数字滤波器的数据速率从 640SPS 降到 20SPS让 sinc 滤波器的陷波频率落在 50Hz 和它的整数倍上。第三传感器线缆换成屏蔽双绞线屏蔽层在控制柜一端单点接地彻底切断共模干扰的耦合路径。三管齐下之后温度显示稳定在 23.8°C ±0.05°C问题解决。我的经验是测量噪声问题先分清是差模干扰还是共模干扰。差模干扰出现在两根信号线之间滤波电容能解决共模干扰是两根线对地同时波动要靠屏蔽和接地处理。市面上卖的所谓“抗干扰温度变送器”本质上就是把这三级防护做好了。6.3 自热效应对 PT100 测量的影响PT100 本身有自热效应。激励电流流过铂电阻会产生焦耳热让传感器自身温度略高于被测介质温度。自热温升的公式ΔT I² × R × θI 是激励电流R 是 PT100 电阻θ 是热阻和传感器封装及介质导热系数有关。当 I1mAR100Ωθ0.4°C/mW 时ΔT 大约 0.04°C。HVAC 应用里这个值可以忽略不计但在高精度测量场景你要么把电流源降到 0.25mA要么在软件里做一个补偿常量。我在做冷冻水温度监测时遇到过一个特殊问题PT100 探头泡在水里介质是流动的热阻小自热温升只有 0.01°C但同一型号探头装在静止空气的管道保温层里热阻大到 2°C/mW1mA 激励下自热温升能有 0.2°C。这就不是软件能统一补偿的事了。解决方式是实际安装后先记录刚通电瞬间的温度读数和通电 30 分钟后的稳定读数两者之差就是自热温升然后在软件里按安装场景设置不同的补偿偏置。这个方法比较土但一个项目实测下来误差能控制在 0.05°C 以内够用。6.4 软件看门狗和通信超时保护工业设备是不允许“死机”的死机就意味着维护工单和客户投诉。PIC18LF46K80 内置看门狗定时器WDT建议在初始化阶段就使能并配置超时时间。做法是主循环里周期性喂狗如果程序卡在某个循环里超过 2 秒WDT 就自动复位 MCU同时读 POR 标志位判断是上电复位还是看门狗复位如果是看门狗复位先把错误状态写进 EEPROM再重新初始化。ADC 通信超时保护同样关键。我设定了一个 UART 超时定时器每帧通信如果在 50ms 内没有完成就认为 ADC 失联自动重发配置寄存器并重新等待最多重试 3 次。如果 3 次仍然失败就把这个通道标志位置为故障CAN 报文里上报“该温度通道数据无效”的状态字而不是发一个莫名其妙的温度值。这个设计的价值在于上位机拿到故障标志后可以及时报警而不是对着一串错误数据做趋势分析。6.5 参考电压漂移的长时间稳定性经验我把一套装配好的板子在环境试验箱里做过 -20°C 到 70°C 的温循测试每 10°C 一个台阶每个台阶稳定 2 小时后记录温度数据。结果发现在 70°C 高温下板子的测量值比 25°C 时的基准值偏高了 0.12°C。分析原因主要是 ADS122U04 内部参考电压的温漂和 PGA 的温漂叠加造成的。解决办法有两个方向。一是软件温度补偿读取 ADC 内部温度传感器的值根据温漂曲线做一个查表修正。这个方法简单有效但修正本身依赖你对芯片温漂特性的精确标定。二是硬件上改用外部参考源比如 REF5025 这类 2.5V 精密参考温漂典型值 3ppm/°C但代价是增加器件成本和布局面积。我在实测对比后还是推荐用外部参考源反正多一块钱人民币的 BOM 成本换来的是整个温度范围里 ±0.05°C 的额外误差压缩这笔账在工业客户眼里非常划算。7. 实测数据记录与精度分析7.1 常温下连续采集的稳定性测试我把整个系统搭在实验室里PT100 探头插在干体炉中干体炉设定 50°C让系统连续采集 24 小时。数据通过 CAN 总线上传到电脑端每 10 秒记录一个温度点总共记录了 8640 个点。统计结果平均温度 50.023°C标准差 0.018°C最大偏差 0.06°C最小偏差 -0.04°C。这个波动水平说明整套系统的短期重复性很好ADC 的量化噪声和系统随机噪声已经被控制得很低。如果把温度显示到小数点后两位读数基本稳定在一个数偶尔在最后一位小范围跳动在 HVAC 显示面板上完全看不出来。对比之前用 16 位 ADC 加外部放大器做的方案同样是 24 小时测试标准差是 0.15°C整整差了 8 倍。差距的核心来源就是 16 位 ADC 在 PT100 小信号下的量化噪声以及外部运放的失调电压温漂。把信号链换成 24 位 ADC 之后这些瓶颈都不存在了。7.2 不同温度点的绝对精度校准结果用干体炉在 0°C 到 150°C 之间均匀取 7 个点做校准测试每个点稳定 30 分钟后记录 100 次均值。校准前和校准后的误差对比如下标准温度 (°C)校准前误差 (°C)校准后误差 (°C)00.220.01250.18-0.01500.140.02750.11-0.021000.080.011250.13-0.011500.190.03校准前误差呈 S 型分布这是 PT100 的 CVD 方程近似项和 ADC 增益误差叠加的结果。校准之后最大绝对误差降到 ±0.03°C 以内已经完全超过 PT100 A 级精度的指标要求。注意这里的校准只针对当前这套传感器和电路组合更换传感器探头后必须重新校准因为不同批次的 PT100 出厂偏差不一样。7.3 热电偶测量冷端补偿效果验证热电偶测试用了 K 型热电偶热端放在恒温槽恒定在 300°C冷端放在温控箱里设置 20°C 到 40°C 之间变化。逐点记录补偿前后的误差冷端温度 (°C)未补偿误差 (°C)补偿后误差 (°C)20-0.120.0525-0.020.02300.11-0.03350.24-0.01400.360.04数据很直观如果不做冷端补偿误差会随冷端温度线性增大40°C 时已经偏了 0.36°C。补偿后误差被压回 ±0.05°C 以内说明 ADS122U04 内部温度传感器读取冷端温度、加上查表计算热电势补偿的整个链路是正确且有效的。需要注意的是冷端补偿的绝对精度取决于 ADC 内部温度传感器本身的精度这颗芯片手册标称内部温度传感器误差 ±0.5°C对应的热电势补偿误差约 0.02°C最终误差 0.05°C 完全在预期范围内。8. 方案扩展与升级思路8.1 从单通道扩展到多通道温度采集ADS122U04 只有 4 个模拟输入通道最多支持 2 路差分输入。如果系统需要采集 4 路甚至 8 路温度你有两个选择一是用多颗 ADS122U04通过 UART 地址区分挂在同一条总线上。这个方案硬件设计简单MCU 资源占用少每增加一片 ADC 就增加 4 个输入通道非常灵活。二是使用 ADS122U04 的输入多路复用器功能把 4 个输入通道配置成 4 路单端输入配合外部 CD4051 多路开关扩展到 8 路或 16 路。但外部多路开关会引入导通电阻和漏电流误差精度会下降一个档次。我实际做过的项目里一个冷水机组控制系统需要采集 12 路 PT100 温度用的就是 3 片 ADS122U04 挂同一条 UART 总线的方案。每片 ADC 地址分别为 0x00、0x01、0x02MCU 轮询读取采样速率每通道 10SPS12 个通道全扫一遍也就 1.2 秒完全满足 HVAC 控制的响应时间要求。这个方案的痛点是3 片 ADC 的参考电压和增益参数需要独立校准不能直接共用一套标定参数。解决办法是在 EEPROM 里按 ADC 地址分别储存在线标定系数。8.2 加入 PID 控制闭环有了温度采集很自然会想把这个系统从纯监测升级成闭环控制。PIC18LF46K80 本身的运算能力跑 PID 完全够用温度误差用浮点算PID 输出控制 PWM 占空比驱动加热器或冷却阀。PID 参数整定上工业现场的加热系统惯性大、滞后长一开始就用 Ziegler-Nichols 经验法可能震荡得很厉害。我的经验是先用纯比例控制观察温度到目标后有没有等幅振荡如果有把比例增益降 40%再加一点积分时间让稳态误差消除。微分项在 HVAC 这种大惯性系统里作用不大加多了反而会放大噪声建议先设 0 或者非常小的值。具体参数没法一概而论务必在现场根据实际响应曲线调。有一点要特别注意PID 控制器的输出不能直接驱动加热器要通过固态继电器SSR控制大功率负载。SSR 开关的过零触发比随机触发能减少电磁干扰特别是在热电偶测量通道旁边这个细节直接影响温度读数的稳定性。我踩过坑之后所有加热控制项目都标配过零型 SSR。8.3 低功耗应用与电池供电场景ADS122U04 和 PIC18LF46K80 都是低功耗器件用来做电池供电的无线温度传感器节点也合适。PIC18 的睡眠模式电流可以到 100nA 以下ADS122U04 在关断模式下电流也低于 1µA。如果系统每 10 秒醒来一次唤醒后 20ms 完成温度测量和无线发送然后继续睡平均电流可以控制在 10µA 以下。一枚 18650 电池供电理论续航两年以上。低功耗设计里的关键点是ADC 不用的时候不要让它一直跑要用关断命令把它关掉否则功耗大头都在 ADC 上。另外 UART 在空闲时保持空闲别发垃圾数据那也会耗电。我把这套低功耗方案做过一个原型实测平均功耗 12.3µA换算到 3.7V/3000mAh 的电池上用 2 年没问题适合做冷链物流的无线温度记录仪。8.4 上位机数据可视化方案硬件端的信号链做完了数据要给人看上位机也得花点时间。我常用的是 Modbus RTU over RS485 或者 CANopen 协议送给上位机组态软件如 WinCC、组态王、LabVIEW。如果你喜欢自己写界面可以用 Python 的 PyQt5 加 pySerial 读写串口再配合 pandas 做数据记录与分析。简单一点的方案就是用一个现成的串口转以太网模块把数据送上局域网网页端用 Node-RED 或者 Grafana 做 Dashboard温度曲线、报警阈值都方便配。我个人的建议是工业现场优先上标准协议Modbus RTU 永远是保留节目组态软件都支持自研上位机更适合实验室调试和快速原型验证别一上来就写大而全的系统会浪费很多时间。9. 项目收尾与工具链推荐9.1 调试工具和软件推荐整个项目调试下来我核心依赖的工具是硬件PICkit 4 烧录调试器、Saleae Logic 16 逻辑分析仪、Fluke 8846A 六位半万用表、Fluke 干体炉软件MPLAB X IDEMicrochip 官方 IDE、Microchip Code ConfiguratorMCC自动生成外设初始化代码、TI 的 ADS122U04 评估板 GUI辅助串口助手我用的是 SSCOM、Python 脚本做批量数据处理MCC 很多人容易忽略它其实是 Microchip 提供的代码自动生成工具可以在图形界面里配置 EUSART、定时器、ECAN、看门狗自动生成底层驱动代码。用它初始化 PIC18LF46K80寄存器配置基本不会错比自己翻数据手册手写代码效率高一倍。比如我上面手工写的 EUSART 初始化代码在 MCC 里点几下鼠标就出来了还能顺便配置波特率误差检查。强烈建议新手走这条路径。TI 的 ADS122U04 评估板 GUI 也有用但只在前期选型和验证原理时用。实际设计时还是要回到数据手册把每个寄存器位逐个确认。我见过有人完全靠评估板 GUI 修改配置最后移植到自己的硬件上发现读数完全不对原因就是 GUI 里有些隐藏配置和寄存器默认值不一致。9.2 成本与量产注意事项单板成本粗略估算ADS122U04 约 3 到 4 美元一颗小批量采购价PIC18LF46K80 约 2 到 3 美元加上电阻电容、端子、CAN 收发器外壳不算整板物料成本在 60 到 80 元人民币之间。对比工业市场上现成的温度变送器模块动辄 200 元起步自己做这个方案的性价比很高。量产方面麦拉电容和电阻尽量选 0603 封装的贴片机贴起来效率高接口端子选插拔式的现场维修方便换。PCB 走线时 ADC 周围的模拟区域要开地孔围一圈形成屏蔽环减少来自板子其他部分的干扰。出厂测试时可以做一个简易校准台架用标准电阻箱模拟 PT100 的阻值批量写入每块板的校准系数。这个环节省不得不然同一批板子的测量一致性会参差不齐。9.3 下一步扩展想法这套方案做出来后我觉得后续还能加的东西有不少。一个是把 ADS122U04 的数据速率提升到 1000SPS再结合软件滤波可以捕捉温度快速变化的过程比如化霜循环里的温度波动曲线这对冷库的节能控制很有参考价值。另一个是把 CAN 总线节点数量从几个做到 20 个以上配合上位机组态软件做整套楼宇温度监测系统的大数据展示。还有就是把无线模块比如 LoRa 或者 NB-IoT接进来做成真正的无线低功耗温度节点。最后再分享一个小小的实战技巧在 PCB 上设计一个测试点把 ADS122U04 的 REFOUT 引脚引出来出厂前用万用表量一下这个电压能快速筛选出电源或者参考源异常的板子比整机老化测试更省时间。这个小动作帮我省了不少返修成本。这套方案从原理图设计到固件开发再到现场验证整体走下来我的体会是高精度温度测量不神秘关键在于选对 ADC、算对增益、做对布局、调好滤波。ADS122U04 和 PIC18LF46K80 这套组合在工业与 HVAC 场景里不管成本、性能还是开发效率都是很靠谱的选择。照着上面这些步骤推一遍你也能把这个项目稳稳做出来。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询