首页 / 资讯中心 / 文章详情

基于ADS122U04与PIC18F67K40的RTD高精度温度采集方案

基于ADS122U04与PIC18F67K40的RTD高精度温度采集方案 ★ FEATURED ARTICLE
工业现场的温度测量说起来简单做起来全是细节。PT100、PT1000 这类 RTD 传感器本身精度可以做到很高但真正决定系统精度的往往不是传感器而是前端信号链和参考基准。我最近在做一个 HVAC 风管温度采集模块用的就是 ADS122U04IPWR 这颗 24 位 ΔΣ ADC 配 PIC18F67K40中间踩了不少坑也积累了一些实测数据。这篇文章就把整个设计过程拆开讲清楚从为什么选这两颗芯片、RTD 的激励方式怎么定、寄存器怎么配、到实测中遇到的噪声和自热问题尽量把每个决策背后的逻辑都说明白。如果你也在做工业或 HVAC 领域的温度采集不管是刚入门还是想优化现有方案应该都能从里面找到能直接用的东西。1. 为什么是 ADS122U04IPWR 加 PIC18F67K40 这个组合1.1 温度测量对信号链的真实需求先想清楚一件事工业温度测量到底难在哪。HVAC 场景下风管温度通常在 -40°C 到 125°C 之间精度要求一般是 ±0.5°C 到 ±1°C看起来不苛刻。但问题在于RTD 的灵敏度很低。以 PT100 为例0°C 时阻值 100Ω温度系数约 0.385Ω/°C。也就是说1°C 的变化只对应 0.385Ω 的阻值变化。如果激励电流是 1mA那 1°C 对应的电压变化只有 385μV。要分辨 0.1°C就得分辨 38.5μV 的信号。这个量级意味着什么意味着你如果用 12 位 ADC、3.3V 参考一个 LSB 就是 0.8mV根本不够看。所以必须上高分辨率 ΔΣ ADC而且参考电压的稳定性要和信号精度匹配。这就是为什么 24 位 ADC 在 RTD 测量里几乎是标配。另一个容易被忽略的点是激励电流的精度。RTD 是比率式测量最终算出来的是 R_RTD V_RTD / I_EXC。如果激励电流本身漂了测量结果就跟着漂。所以要么用高精度电流源要么用比率式接法让激励电流和参考电压同源把电流漂移抵消掉。ADS122U04 支持外部参考正好可以做比率式测量。1.2 ADS122U04IPWR 的关键特性拆解ADS122U04 是 TI 的一颗 24 位、4 通道、ΔΣ 架构的 ADC带 PGA内置 2% 精度的振荡器支持 UART 接口。选它主要看中几个点。第一是 PGA。RTD 信号很小直接进 ADC 会浪费动态范围。ADS122U04 的 PGA 可以设 1 到 128 倍增益把 385μV/°C 的信号放大到接近满量程再量化等效分辨率就上去了。比如用增益 8参考 2.048V那满量程输入是 ±256mV1°C 对应 385μV×83.08mV占满量程的 1.2%24 位下理论分辨率绰绰有余。第二是内置的激励电流源。ADS122U04 有两路可编程激励电流源IDAC1 和 IDAC2电流值可选 10μA 到 1.5mA。这个直接省掉了外部恒流源电路对成本和板面积都友好。而且 IDAC 可以路由到任意模拟输入引脚配合外部参考做比率式测量很方便。第三是 UART 接口。这一点和常见的 SPI 接口 ADC 不太一样。UART 的好处是接线简单两根线就能通信而且可以隔离。工业现场往往需要电气隔离UART 配光耦或者数字隔离器比 SPI 省事SPI 要隔离四根线UART 两根就够。PIC18F67K40 本身有多个 UART 外设对接起来很自然。第四是 4 个模拟输入通道。一个通道接 RTD另外的通道可以接参考电阻、或者接第二个 RTD 做双路测量也可以接 NTC 做冷端补偿。灵活性够用。1.3 PIC18F67K40 在这个方案里的角色PIC18F67K40 是 Microchip 的 8 位 MCU128KB Flash3.5KB RAM带 12 位 ADC、多个 UART、SPI、I2C工作温度范围 -40°C 到 125°C。选它有几个实际考虑。首先是工业温度等级。HVAC 设备可能装在室外或者机房环境温度范围宽PIC18F67K40 的 -40 到 125°C 工业级版本能覆盖。其次是外设够用两个 UART 一个接 ADS122U04一个接上位机或者 Modbus 总线正好。再就是 8 位 MCU 的开发门槛低代码量小不需要 RTOS裸机跑状态机就够了对于这种单一功能的采集模块来说复杂度和成本都更优。它在这个方案里主要做三件事配置 ADS122U04 的寄存器和激励电流、读取转换结果并做温度换算、通过另一路 UART 把温度数据上报给主控或者上位机。换算部分可以用查表加线性插值也可以用 Callendar-Van Dusen 公式后面会详细讲。2. RTD 激励方式与比率式测量的电路设计2.1 两线、三线、四线制到底怎么选RTD 接线方式直接决定精度这是设计第一步就要定的事。两线制最简单RTD 两端各引一根线。但导线本身有电阻铜线每米大概 0.02Ω 到 0.05Ω如果引线 10 米来回就是 20 米附加电阻可能到 1Ω 以上。1Ω 对应约 2.6°C 误差这完全不能接受。所以两线制只适合引线极短、精度要求不高的场合。三线制是工业上最常见的折中方案。它多引一根线配合两次测量或者特定的电流换向可以抵消掉引线电阻。原理是假设三根线电阻相同通过测量不同组合把引线电阻从结果里消掉。ADS122U04 有两路 IDAC正好可以做三线制IDAC1 从 RTD 一端注入IDAC2 从另一端注入两根引线的压降相互抵消。这是我最推荐的方案成本和精度平衡得最好。四线制精度最高两根线走激励电流另外两根线做高阻输入测电压引线电阻完全不影响测量。但多两根线接线和成本都上去了。一般实验室标准或者高精度计量才用。接线方式引线电阻影响所需线数适用场景两线制完全计入误差2短引线、低精度三线制基本抵消3工业现场主流四线制完全消除4高精度计量2.2 比率式测量为什么能干掉激励电流漂移这是整个设计里最关键的思路。假设你用固定电流源激励 RTD然后 ADC 用一个独立的参考电压去量化 RTD 上的压降。那么测量结果 V_RTD I_EXC × R_RTD而 ADC 输出码值 V_RTD / V_REF × 满量程。如果 I_EXC 随温度漂了 1%R_RTD 的计算结果就漂 1%对应温度误差可能好几度。比率式测量的做法是让同一个激励电流流过 RTD 和一个高精度参考电阻 R_REF然后用 R_REF 上的压降作为 ADC 的参考电压。这样 ADC 输出码值 (I_EXC × R_RTD) / (I_EXC × R_REF) × 满量程 (R_RTD / R_REF) × 满量程。激励电流 I_EXC 被约掉了它的漂移完全不影响结果。剩下的误差只来自 R_REF 的精度和 ADC 本身的线性度。R_REF 要选高精度、低温漂的电阻比如 0.1% 精度、10ppm/°C 的金属箔电阻。R_REF 的阻值选择要配合激励电流让 R_REF 上的压降接近但不超过 ADC 的参考输入范围。比如用 1mA 激励R_REF 取 1.6kΩ压降就是 1.6V参考范围合适。2.3 具体电路连接与元件取值把电路说具体一点。RTD 用三线制接法RTD 一端接 AIN0另一端接 AIN1第三根补偿线接 AIN2。IDAC1 从 AIN0 注入IDAC2 从 AIN1 注入两路电流都流向 RTD 然后汇合到地。参考电阻 R_REF 串在激励回路里它两端的电压接到 REFP 和 REFN。具体取值激励电流选 500μA这个值在自热和信噪比之间平衡得比较好。PT100 在 500μA 下的自热功率是 I²R (500μA)² × 100Ω 25μW非常小自热误差可以忽略。R_REF 取 3.3kΩ压降 1.65V作为参考电压。RTD 在 0°C 时压降 50mV在 100°C 时约 69mV经过 PGA 放大后进 ADC。PGA 增益设 16那 0°C 时放大后是 800mV100°C 时约 1.1V都在参考电压 1.65V 以内不会饱和。这个增益下1°C 对应的放大后电压变化是 385μV × 16 6.16mV24 位 ADC 在 1.65V 参考下 1LSB 约 0.1μV分辨率完全够。滤波方面RTD 输入端加 RC 低通R 取 1kΩC 取 100nF截止频率约 1.6kHz。这个滤波主要抑制高频干扰对 50/60Hz 工频干扰靠 ADC 的数字滤波器就够了。ADS122U04 的 sinc 滤波器在 20SPS 输出速率下对 50Hz 和 60Hz 都有很好的抑制。注意IDAC 的电流路径和参考电压的取样点要仔细规划确保激励电流先流过 R_REF 再流过 RTD或者反过来但一定要保证 R_REF 上的压降真实反映激励电流大小。布线时 R_REF 的 Kelvin 连接很重要否则走线电阻会引入误差。3. ADS122U04 寄存器配置与采样流程落地3.1 四个寄存器的功能划分ADS122U04 有四个配置寄存器0 到 3。每个寄存器 8 位通过 UART 命令读写。搞清每个位的含义是配置的基础。寄存器 0 管输入多路选择器 MUX、增益 PGA、以及工作模式。MUX 位选哪个模拟输入对接到 PGA比如 AIN0 和 AIN1 组成差分对。PGA 位设增益000 到 111 对应 1 到 128 倍。工作模式位选连续转换还是单次转换。寄存器 1 管数据速率、工作模式、转换模式、温度传感器、 burnout 电流源、参考选择。数据速率从 5SPS 到 2000SPS 可选。参考选择位决定用内部 2.048V 参考还是外部参考比率式测量必须选外部参考。寄存器 2 管 IDAC 电流大小、IDAC 路由、以及一些杂项。IDAC 电流值 000 到 111 对应 10μA 到 1.5mA。IDAC1 和 IDAC2 的路由分别配置可以路由到 AIN0 到 AIN3 任意引脚。寄存器 3 管 IDAC 的进一步配置、以及一些保留位。配置顺序很重要先配寄存器 3 和 2 把 IDAC 设好再配寄存器 1 设参考和数据速率最后配寄存器 0 设 MUX 和增益并启动转换。顺序错了可能导致中间状态异常。3.2 关键寄存器位的实际取值针对前面说的三线制 PT100、500μA 激励、增益 16、外部参考、20SPS 的方案寄存器配置如下。寄存器 0MUX 选 AIN0 和 AIN1 差分PGA 增益 16对应 100工作模式连续转换。二进制大概是 0b0000_1000 附近具体要查数据手册的 MUX 编码表。寄存器 1数据速率 20SPS对应 011转换模式连续外部参考burnout 电流源关闭。这里要注意20SPS 下 sinc 滤波器对 50Hz 和 60Hz 抑制最好工业环境首选。寄存器 2IDAC 电流 500μA对应 100IDAC1 路由到 AIN0IDAC2 路由到 AIN1。寄存器 3IDAC 相关配置一般默认值即可但要注意 IDAC 的 compliance voltage 设置确保电流源有足够裕量。寄存器关键位取值说明REG0MUXAIN0/AIN1差分输入对REG0PGA16增益设置REG1DR20SPS数据速率REG1VREF外部比率式测量REG2IDAC500μA激励电流REG2IDAC1AIN0激励路由REG2IDAC2AIN1激励路由3.3 从原始码值到温度值的换算链路ADC 读回来的是 24 位有符号数先要转成电压。公式是 V (code / 2^23) × V_REF / PGA。注意这里 code 是补码形式最高位是符号位。然后算 RTD 阻值。比率式测量下R_RTD (V_RTD / V_REF) × R_REF。因为 V_REF 就是 R_REF 上的压降所以 R_RTD (code / 2^23) × R_REF / PGA × 2这个 2 是因为差分测量的满量程是 ±V_REF。拿到 R_RTD 后用 Callendar-Van Dusen 公式算温度。0°C 以上用 R R0 × (1 A×T B×T²)0°C 以下还要加 C×T³ 项。PT100 的系数 A 3.9083e-3B -5.775e-7C -4.183e-12。反解 T 可以用二次方程求根或者用查表加插值。实际代码里我一般用查表法。预先算好 -40°C 到 125°C 每 1°C 对应的阻值存成数组测量时二分查找定位区间然后线性插值。这样计算量小精度也够8 位 MCU 跑起来毫无压力。Callendar-Van Dusen 公式虽然精确但反解涉及开方和浮点运算在 PIC18 上跑浮点比较费劲查表法更实际。// 简化的查表加插值示例 float rtd_to_temp(float r_rtd) { int low 0, high TABLE_SIZE - 1; while (high - low 1) { int mid (low high) / 2; if (rtd_table[mid] r_rtd) low mid; else high mid; } float r_low rtd_table[low]; float r_high rtd_table[high]; float t_low TEMP_MIN low * TEMP_STEP; return t_low (r_rtd - r_low) / (r_high - r_low) * TEMP_STEP; }4. 实测中暴露的噪声、自热与漂移问题4.1 噪声来源的逐项排查板子焊好第一次上电读数跳得厉害峰峰值有 0.5°C 左右。这个不能接受目标精度是 ±0.1°C。于是开始逐项排查。先看电源。ADS122U04 的模拟电源和数字电源要分开模拟电源用 LDO 单独供数字电源可以共用。我一开始图省事用了同一个 LDO结果数字部分的开关噪声串到模拟侧。改成模拟电源单独走一路 LDO并且在 AVDD 引脚就近加 1μF 加 100nF 去耦噪声明显下降。再看参考电压。R_REF 的走线如果太长或者取样点不对会引入走线电阻的误差。我把 R_REF 的 Kelvin 连接重新做了一遍取样点直接落在电阻焊盘上噪声又降了一些。然后是输入滤波。RTD 引线如果和电源线捆在一起走会耦合工频干扰。我把 RTD 引线改成屏蔽双绞线屏蔽层单点接地50Hz 干扰基本消失。最后看 ADC 配置。数据速率从 20SPS 提到 90SPS 时噪声变大因为 sinc 滤波器对工频的抑制变差了。改回 20SPS配合 50/60Hz 同步抑制噪声峰峰值降到 0.05°C 以内。排查项现象处理措施效果电源耦合读数随机跳动模拟电源独立 LDO明显改善参考走线缓慢漂移Kelvin 连接漂移减小引线耦合周期性波动屏蔽双绞线工频消失数据速率高频噪声改回 20SPS峰峰值 0.05°C4.2 自热误差的量化与抑制自热是 RTD 测量里容易被忽视的问题。激励电流流过 RTD 会产生焦耳热让 RTD 自身温度高于环境温度测量结果就偏高。自热误差 I²R × R_thR_th 是 RTD 的热阻。以 PT100 为例500μA 激励下自热功率 25μW。如果 RTD 的热阻是 100°C/W封装不同差异很大自热误差就是 25μW × 100°C/W 0.0025°C可以忽略。但如果激励电流提到 1mA自热功率变成 100μW误差就到 0.01°C还是很小。真正要担心的是小封装贴片 RTD热阻可能到 500°C/W 以上那 1mA 下误差就有 0.05°C 了。所以激励电流的选择要权衡。电流大信噪比好但自热大。电流小自热小但信号弱对 ADC 和 PGA 要求高。500μA 是个比较稳妥的折中。如果用的是绕线式或者大封装 RTD热阻小可以适当加大电流到 1mA 提升信噪比。提示判断自热是否可忽略可以做一个简单实验。把激励电流从 500μA 切到 250μA看读数是否变化。如果变化超过 0.01°C说明自热有影响需要降低电流或者改善 RTD 的散热。4.3 长期漂移与温度循环测试工业设备要长期运行漂移是必须关注的。我做了 72 小时连续采集环境温度从 10°C 变到 40°C记录读数变化。结果发现读数在环境温度变化时有约 0.1°C 的漂移。排查下来主要是 R_REF 的温漂。一开始用的 R_REF 是 25ppm/°C 的普通精密电阻环境温度变 30°C阻值漂 750ppm对应温度误差约 0.19°C。换成 10ppm/°C 的金属箔电阻后漂移降到 0.03°C 以内。另一个漂移源是 PCB 的铜箔走线。铜的电阻温度系数约 3900ppm/°C如果 RTD 的引线走线在 PCB 上很长走线电阻随温度变化会引入误差。三线制能抵消一部分但前提是三根线走线等长等宽。我在布局时把三根 RTD 走线做成等长并且尽量靠近让它们温度一致抵消效果就好。温度循环测试还暴露了一个问题焊点热电势。不同金属接触处会产生热电势如果 RTD 引线和 PCB 焊盘材质不同在温度梯度下会产生 μV 级的热电势影响测量。解决办法是让 RTD 连接处的温度梯度尽量小或者用同种金属连接。实际中把接线端子远离发热元件保持等温就能把热电势影响降到可接受范围。5. 从样机到现场HVAC 场景的适配经验5.1 风管温度测量的特殊要求HVAC 风管温度测量和实验室测量不一样有几个特殊点。第一是响应速度。风管里风速可能到 5m/s 甚至更高温度变化快RTD 要有足够快的响应。这时候 RTD 的封装很关键细径的铠装 RTD 响应快但机械强度差。折中方案是用带保护套管的 RTD套管壁薄一点响应和强度兼顾。第二是安装位置。RTD 要插到风管中心位置避开管壁的边界层。边界层温度受管壁影响不代表气流真实温度。一般插入深度是管径的 1/3 到 1/2。如果风管很大可能需要多点测量取平均。第三是电磁环境。风管附近可能有风机、变频器电磁干扰强。前面说的屏蔽双绞线、独立模拟电源、20SPS 数据速率在这里都是必须的。有条件的话在 ADS122U04 和 PIC18F67K40 之间加数字隔离器把模拟侧和数字侧完全隔开抗干扰能力更强。5.2 多点测量的通道扩展思路一个 HVAC 系统往往要测多个点的温度比如送风、回风、新风、混风。ADS122U04 有 4 个通道可以接 4 路 RTD但激励电流只有两路 IDAC怎么接方案一是用外部模拟开关切换。两路 IDAC 固定接参考电阻和当前测量的 RTD模拟开关负责切换不同 RTD 到测量通道。这样成本低但开关的导通电阻会影响精度要选低导通电阻的模拟开关并且把开关放在激励回路之外。方案二是用多颗 ADS122U04每颗管几路。PIC18F67K40 有多个 UART但一般只有两个不够接多颗 ADC。可以用 UART 加地址的方式或者改用 SPI 接口的 ADC 型号。不过 UART 隔离方便多颗的话隔离成本会上去。实际项目里我一般用方案一4 路 RTD 加一个 4 选 1 模拟开关成本可控精度也够。切换时要注意等模拟开关稳定后再启动转换一般延时 10ms 足够。5.3 与上位机的通信协议设计PIC18F67K40 采集完温度后要通过另一路 UART 上报。协议设计要考虑可靠性和实时性。我用的是简单的帧格式帧头 0xAA 0x55然后是通道号、温度值定点数比如放大 100 倍存成 int16、校验和。帧长固定解析简单。波特率 9600 或 19200工业现场够用抗干扰也好。温度值用定点数而不是浮点是因为 8 位 MCU 传浮点要 4 字节定点 2 字节就够而且上位机解析也简单。比如 25.34°C 存成 2534上位机除以 100 就行。校验和用简单的累加和或者 CRC8。累加和实现简单但检错能力弱。CRC8 计算量也不大PIC18 跑起来没问题推荐用 CRC8。注意UART 通信一定要加超时和重试机制。工业现场干扰多偶尔丢帧正常。上位机如果 500ms 没收到数据就重发请求。下位机收到请求再上报而不是主动不停上报这样总线利用率高也不容易冲突。6. 几个能直接抄的实操细节6.1 上电初始化顺序与自检ADS122U04 上电后不能立刻配置要等电源稳定。我的做法是上电后延时 100ms然后发复位命令再延时 10ms然后读一遍所有寄存器确认通信正常再开始配置。自检可以这样做配置好后先不接 RTD读一次空载码值应该在 0 附近。然后接一个精密电阻模拟 RTD比如 100Ω读回来的温度应该在 0°C 附近偏差不超过 0.1°C。如果偏差大检查参考电阻和增益配置。PIC18F67K40 这边UART 初始化要注意波特率误差。8 位 MCU 的波特率发生器有误差9600 波特率下误差要控制在 2% 以内否则通信会出错。用 16MHz 晶振BRG 值算出来是 103实际波特率 9615误差 0.16%没问题。6.2 校准方法与校准周期再好的硬件也有初始误差校准是必须的。我用两点校准冰水混合物 0°C 和沸水 100°C注意气压修正。记录两个点的 ADC 码值算出斜率和截距存到 MCU 的 EEPROM 里测量时用这个校准系数修正。校准周期看应用要求。一般工业场合一年校准一次。如果环境恶劣或者精度要求高半年一次。校准时要记录环境温度因为校准设备本身也有温漂。6.3 常见故障的快速定位现场出问题快速定位很重要。我总结了一个简单的排查流程。读数一直是 0 或者满量程先查 RTD 是否断路或短路用万用表量 RTD 阻值。然后查激励电流是否正常量 R_REF 上的压降。再查 ADC 配置是否正确。读数跳动大查电源纹波查 RTD 引线屏蔽查数据速率设置。读数缓慢漂移查参考电阻温漂查 PCB 走线是否等长查环境温度变化。通信不上查波特率查 UART 接线查隔离器供电。故障现象优先排查项工具读数固定RTD 通断、激励电流万用表读数跳动电源、屏蔽、速率示波器缓慢漂移参考电阻、走线温度记录仪通信失败波特率、接线逻辑分析仪这套方案我从样机做到小批量前后调了大概两个月中间返工过两次 PCB。最大的体会是RTD 测量看着简单但每个环节都有讲究尤其是参考电阻和布线省不得。ADS122U04 和 PIC18F67K40 这个组合性能够用成本可控开发难度也不高适合中小批量的工业温度采集产品。如果你也在做类似的东西希望这些经验能帮你少走点弯路。
阅读完成 · 觉得有帮助?
咨询建站