资讯详情

资讯详情

基于24位ADC与8位MCU的高精度RTD温度采集方案

做工业和 HVAC 现场的温度测量我自己最大的感受是测点又散又远线缆环境乱精度要求却越来越高。项目最开始我也考虑过传统的 4-20mA 变送器加 PLC/DDC 模拟量采集但一个项目动辄几十个温度点每个点一对信号线布线成本高模拟量还容易漂移和受干扰。后来我把前端测温方案换成了 ADS122U04IPWR 超声?和 PIC18LF46K42 的组合——一颗带 UART 接口的 24 位 Δ-Σ ADC配一颗皮实耐用的 8 位低功耗 MCU体温、水冷、风管温度都能直接数字化处理。这篇博文就围绕这两颗芯片把我在 HVAC 冷热源监控和工业管道测温项目里的实际做法、计算过程、固件思路和踩过的坑一起整理出来适合正在做温度采集硬件、嵌入式固件或者自控系统集成的人参考。1. 选型逻辑为什么是 ADS122U04 和 PIC18LF46K42 这对组合1.1 ADC 带 UART 接口省掉的不只是一根线ADS122U04 这颗 24 位 Δ-Σ ADC 最特别的地方是它直接把 UART 接口做在了芯片里面。板级 ADC 一般用 SPI 或 I2C 和 MCU 通信SPI 在板内好用但一旦传感器节点要拉出去几十米SPI 的同步时钟线就是灾难信号完整性差、抗干扰弱、隔离成本高。I2C 虽然只有两根线但容性负载有限制多设备地址也要规划。用 UART 就完全不一样。UART 是异步串行天生适合点对点远距离传输中间加一个 RS-485 收发器就能把测温节点挂到现场总线上。而且 UART 隔离非常成熟数字隔离器或光耦都便宜不像 SPI 隔离那样还要考虑时钟和数据同步时序。对温度采集这种更新率本来就不高的场景9600 波特率已经完全够用。另外这颗 ADC 还内置了可编程增益放大器PGA、两个激励电流源IDAC和内部 2.048V 基准。这意味着 RTD 测温时外面只需要一个精密参考电阻不需要额外加仪表放大器BOM 非常干净。24 位分辨率对 PT100 来说意味着巨大的设计余量——PT100 灵敏度约 0.385Ω/°C24 位 ADC 配合 PGA 可以轻松分辨 0.001°C 级别的电阻变化实际噪声限制远大于 ADC 位数限制。1.2 PIC18 在这套系统里负责什么PIC18LF46K42 在方案里不是负责“测”的而是负责“管”的。它的任务包括初始化并控制 ADS122U04、接收 24 位转换结果、做 RTD 线性化计算、把温度换算成工程单位再通过 RS-485 或者 Modbus 协议上报给上位机。选 8 位 MCU 而不是 32 位是刻意为之。温度采集任务逻辑简单8 位处理器足够PIC18LF46K42 的工作电压范围宽1.8V 到 3.6V适合现场总线供电或者电池供电的节点低功耗模式下静态电流非常低两次采集之间可以让 MCU 睡大觉。它在内部还集成了可配置逻辑单元CLC和硬件 CRC 模块后期做通信协议的帧校验和引脚脉冲处理时很顺手。实际项目中我让 PIC 既当 UART 主机又当 Modbus 从站。PIC 与 ADS122U04 之间是板级 UART 连接PIC 与上层系统之间是 RS-485 总线连接。这样每个测温节点都是一个完整独立的小系统替换、调试、扩展都灵活。1.3 什么场景不适合这套方案也不是所有场景都推荐这个组合。如果只是单个 2 线制 PT100放在仪表柜里距离不超过 20 厘米那随便一颗带 16 位 ADC 的 MCU 就够了没必要上这么完整的信号链。如果测温点非常多且全部集中在一块板上用 ADS122U04 的四路输入 MUX 加多路复用器或者直接换多通道同步采样 ADC 更合适。另外如果传感器是热电偶需要额外设计冷端补偿电路用带内部温度传感器的 ADC 会更方便——当然 ADS122U04 也能配合外部冷端补偿方案但复杂度会上升。这套组合最舒服的应用区间是工业现场和 HVAC 项目中测点分散、要求高精度、希望全数字化和总线化管理的场景比如冷冻水供回水温度、冷却塔进出口温度、风管送风温度、机房设备表面温度监测。2. 测温链路设计比例式 RTD 测量与信号调理2.1 比例式测量为什么能省掉“电流源精度”RTD 测温的核心是测电阻变化。常见做法是用恒流源给 PT100 供电测传感器两端的电压然后根据已知电流算出电阻。这个方案对电流源的精度要求极高假设激励电流是 500μA漂移 1%也就是 5μA在 100Ω 的 PT100 上会产生 0.5mV 的电压误差折合温度差不多 1.3°C。现场温度一变电流源跟着漂读数就会出问题。比例式测量ratiometric measurement完美解决了这个问题。ADS122U04 的 IDAC 电流同时流过 RTD 和一个精密参考电阻 RREFRTD 两端的电压接到 ADC 的差分输入RREF 两端的电压接到 ADC 的参考输入 REFP/REFN。转换结果变成ADC 输出码 V_RTD / V_RREF (I × R_RTD) / (I × R_RREF) R_RTD / R_RREF电流 I 在分子分母同时出现直接约掉了。无论电流源怎么漂移、纹波有多大对结果都没有影响。最终读数只取决于 RTD 和参考电阻的阻值比这就在原理上把最关键的不确定因素排除了。参考电阻 RREF 的质量反而成了决定精度的核心元器件。工程上我会选择温漂 25ppm/°C 或更好的精密金属膜电阻阻值精度 0.05% 到 0.1%。0.1% 的 RREF 误差会给温度带来约 0.26°C 的偏差PT100 情况下所以如果目标精度是 0.5°C0.1% 还能接受要做到 0.1°C 级就必须选 0.02% 或 0.05%并且在出厂时做校准。2.2 RTD 探头接法2 线、3 线与 4 线的取舍RTD 探头接线方式直接影响精度。2 线制最简单但导线电阻全部串进测量回路。工业现场常用的 1.5mm² 铜线每 100 米电阻约 1.2Ω对应 PT100 大约 3°C 的误差——这对任何高精度应用都是不可接受的。3 线制是工业现场的常见妥协方案一根线承载激励电流两根线分别采 RTD 两端的电压。只要 ADC 输入阻抗足够高采压线上基本没有电流导线压降不会影响电压测量。剩下的导线电阻误差主要来自激励线上的压降因为 IDAC 电流流过激励线会在 RTD 前引入一个电压偏置。如果激励线和采压线是同一根这个误差仍然存在需要用两个 IDAC 和匹配电阻做补偿。ADS122U04 有两路 IDAC配合外部匹配电阻可以搭出标准的 3 线制补偿电路但调试时需要细心。4 线制最省心两根线专门走激励电流两根线专门测电压。电压测量线路上几乎无电流导线电阻完全不影响读数。我自己做 HVAC 和工业项目时只要现场允许一律用 4 线制探头。很多号称“4 线制”的工业 PT100 探头实际内部就是 4 根引出线接上 ADS122U04 的两个差分输入几乎不用额外补偿逻辑。2.3 IDAC 电流、PGA 增益和参考电阻的计算配置 ADS122U04 时激励电流大小、PGA 增益和参考电阻阻值是互相关联的不能随便拍脑袋。我常用的计算流程是这样PT100 在 0°C 时阻值约 100Ω在 100°C 时约 138.5Ω满量程电阻变化约 38.5Ω。激励电流取 500μA 时RTD 上的压降范围是 50mV 到 69.25mV。这个信号比较小需要 PGA 放大。参考电压 V_REF 来自 RREF 两端电压。如果 RREF 取 2kΩ500μA 激励下参考电压是 1V。ADS122U04 的 PGA 输出要小于参考电压所以 PGA 增益可以取 16 或 32。32 倍增益下RTD 最大信号 69.25mV 被放大到 2.216V这个值超过了 1V 参考电压会饱和。所以这里增益只能取 8 或 16。更稳妥的组合是激励电流 250μARREF 取 4kΩ参考电压还是 1VRTD 压降 25mV 到 34.6mVPGA 取 16最大输出 553mV余量足够。之所以不把参考电压选太低是因为 ADS122U04 的参考输入缓冲器有共模范围要求参考电压太小会影响线性度。自热效应也要算一下。250μA 激励电流在 100Ω 上产生的功耗只有 6.25μW对薄膜 PT100 来说自热可以忽略。如果用到 1mA 档400Ω 时功耗 0.4mW薄膜探头自热可能带来 0.05 到 0.1°C 的误差高精度场景不建议用大激励电流。数据速率方面20SPS 模式通常有较好的 50Hz/60Hz 工频抑制能力。变频器扎堆的 HVAC 机房噪声频谱很杂我一般默认选 20SPS若需要更快刷新率再往上调但噪声会相应增大。3. 电路设计与硬件坑位布局、电源和总线拓扑3.1 参考电阻的开尔文接法很多人画 PCB 时不够重视 RREF 的布局导致实际精度比理论差很多。RREF 两端的电压是 ADC 的参考电压而 RREF 同时流过了激励电流。如果 RREF 到 REFP/REFN 引脚的走线上有额外压降这个压降会直接混进参考电压造成不可消除的系统误差。我把 RREF 用开尔文接法Kelvin connection连到 ADC 的 REFP 和 REFN 引脚RREF 的两个焊盘分别引出两条走线一条走激励电流一条走电压采样。两条采样线要走成差分对尽量短、尽量对称并且远离数字信号线。在实际测量时我遇到过用普通两线接法的板子RREF 走线长了 5mm在 500μA 激励电流下引入约 2.5μV 压降虽然绝对值不大但经过 PGA 放大后会影响低端读数一致性。3.2 多点测温时的通信拓扑ADS122U04 和 PIC 之间是点对点 UART 还是走 RS-485 总线取决于节点数。一个常见架构是每个 ADC 配一颗 PIC组成独立的温度采集节点节点之间用 RS-485 手拉手连接PIC 作为 Modbus 从站。这样上层只需要一个主站比如 PLC 或者边缘网关轮询所有节点协议简单故障隔离性好——单个探头短路不会影响整条总线。如果只是两三个测点且距离在几米内也可以让 ADS122U04 直接挂在一对 UART 线上。但要注意UART 是异步点对点协议多个从机共用一条总线需要地址仲裁机制所以更建议“ADC 到 PIC 走本地 UARTPIC 到上层走 RS-485”这种两层架构工程可靠性和可维护性都要好得多。架构方案优点缺点适用场景ADC直连MCU板级UART最简单成本低距离短节点少单板多通道采集ADC直连RS-485网络省掉中间MCU地址管理复杂故障影响面大少量远距离测点ADCPIC节点再上RS-485功能独立易维护易扩展每节点多一颗MCUHVAC/工业多点系统我在 HVAC 项目中用的是第三种。每个 PIC 节点负责 4 路温度刚好用满 ADS122U04 的四路输入节点再统一上 RS-485上层走 Modbus RTU。一个节点坏掉不影响其他节点这是现场调试中最实用的特性。3.3 电源、ESD 与探头线缆处理ADS122U04 的模拟性能和电源质量直接相关。IDAC 电流源由 AVDD 供电如果 AVDD 上有纹波纹波会直接调制到激励电流上最终表现为 RTD 电压上的噪声。我给每个节点都用独立 LDO 供电LDO 输出对地并联 10μF 和 0.1μF 电容在 ADC 电源引脚旁边再加一个 1μF 到 10μF 的储能电容。尽量避免和继电器、风机、水泵驱动器共用电源。RS-485 接口必须加 TVS 保护管和共模扼流圈。现场总线被感应雷打坏设备的事情我遇到不止一次TVS 选双向、钳位电压略高于总线收发器工作电压的型号共模扼流圈能有效抑制变频器产生的共模干扰。探头线缆如果是屏蔽线屏蔽层在采集节点端单点接地就行不要两边都接地否则地环路会把噪声引入测量回路。PCB 布局上模拟输入走线、参考电阻、滤波电容要放在 ADC 附近数字线UART、电源开关信号尽量远离模拟输入。有条件就铺一圈保护地环。这些看似基础但对 24 位 ADC 来说差一点布局噪声可能差好几倍。4. 固件实现从 UART 命令到温度数值4.1 初始化顺序先让 ADC 准备好ADS122U04 上电后需要一段时间完成内部上电复位PIC 如果在它还没准备好时就发配置命令命令会被丢掉。我在固件里做的第一件事是上电后延时 10ms 到 50ms再发送复位或同步命令最后才开始写配置寄存器。这个延时是很多人容易忽略的MCU 启动比 ADC 快很多抢跑发命令导致“ADC 不响应”排查半天其实只是时序问题。PIC 侧初始化 EUSART 时波特率设置为 96008 位数据无校验1 停止位。用 PIC18LF46K42 的内部振荡器时建议在配置字里使能 HFINTOSC 并校准或者干脆接一颗外部晶振。内部振荡器在 -40°C 到 85°C 范围内的误差通常能满足 9600bps 的要求但温度变化大的工业现场我会选择外部晶振以求心理踏实。配置 ADS122U04 的代码框架大概是这样的寄存器位段的具体编码以你手头的 datasheet 为准// 示意代码具体位段需按 ADS122U04 数据手册 Table 确认 void ads122u04_init(void) { // 延时等待 ADC 上电复位完成 delay_ms(20); // 复位 ADC恢复默认配置 ads122u04_send_cmd(CMD_RESET); delay_ms(2); // 配置 Config0: 选择内部 2.048V 参考、PGA 增益 16 ads122u04_write_reg(REG_CONFIG0, 0x10 | 0x04); // 配置 Config1: 数据速率 20SPS开启工频滤波 ads122u04_write_reg(REG_CONFIG1, ADS122U04_DR_20SPS); // 配置 Config2: IDAC 电流 250uA选择 IDAC 输出引脚 ads122u04_write_reg(REG_CONFIG2, ADS122U04_IDAC_250uA); // 配置 Config3: 选择差分输入通道 AIN0/AIN1 ads122u04_write_reg(REG_CONFIG3, ADS122U04_MUX_DIFF_0_1); }4.2 24 位数据怎么拼、怎么判断正负ADS122U04 的转换结果是无符号二进制补码格式的 24 位数据。通过 UART 读取时数据按字节从高位到低位发出来。我在 PIC 侧用一个 3 字节缓冲区接收收到完整帧后拼接uint32_t raw ((uint32_t)buf[0] 16) | ((uint32_t)buf[1] 8) | (uint32_t)buf[2]; int32_t code 0; if (raw 0x800000UL) { // 24 位符号扩展为 32 位有符号数 code (int32_t)(raw | 0xFF000000UL); } else { code (int32_t)raw; }拼完的数据是一个比例值。ADC 满量程对应二进制补码范围结合参考电压和 PGA 增益就可以算出 RTD 电阻值。但更实用的做法是直接用比例关系因为参考电压就是 RREF 上的电压RTD 电阻 code / full_scale × RREF × 某个系数。用比例关系可以避开中间电压这一层减少浮点误差。4.3 从电阻比值到温度线性化计算代码PT100 的温度-电阻关系在 0°C 以上可以用 IEC 60751 公式描述R(T) R0 × (1 A×T B×T²)其中 R0 是 0°C 时的标称电阻100ΩA 3.9083×10⁻³B -5.775×10⁻⁷。0°C 以下需要加 C 项C×(T-100)×T³C -4.183×10⁻¹²。从电阻反算温度0°C 以上是二次方程可以显式求解。为了同时覆盖 0°C 以下我自己常用的做法是牛顿迭代初值用线性近似迭代五六次就能收敛到很高精度float rtd_temp_from_resistance(float R, float R0) { const float A 3.9083e-3f; const float B -5.775e-7f; const float C -4.183e-12f; float t (R - R0) / (R0 * A); // 线性初值 float r_calc; float dr_dt; for (int i 0; i 6; i) { if (t 0.0f) { r_calc R0 * (1.0f A * t B * t * t); dr_dt R0 * (A 2.0f * B * t); } else { r_calc R0 * (1.0f A * t B * t * t C * (t - 100.0f) * t * t * t); dr_dt R0 * (A 2.0f * B * t C * (4.0f * t * t * t - 300.0f * t * t)); } t t - (r_calc - R) / dr_dt; } return t; }如果 MCU 没有硬件浮点单元这颗 8 位 PIC 做浮点迭代会稍慢。工业上很多做法是查表加线性插值把 PT100 的温度-电阻表按 1°C 间隔存成整型数组通过二分查找找到所在区间再线性插值。查表法速度快、代码直观适合 0.1°C 级别的显示精度如果要 0.01°C 级精度还是公式法更合适。4.4 断线检测与通信异常处理现场最烦人的故障是探头断线。RTD 断开时输入引脚呈现高阻电压会被拉到接近参考电压的位置ADC 转换结果会跑到满码附近。我在固件里设了两个阈值结果大于满量程的 95% 判断为断线结果小于 2% 判断为短路或者激励异常。这样上位机可以明确报“传感器故障”而不是显示一个离谱温度值。通信层面CRC 校验一定要开。ADS122U04 的 UART 模式支持 CRC 选项开启后每个命令和响应帧末尾都会附带一个校验字节。校验字节的具体多项式见数据手册固件里实现一个查表法 CRC-8 即可。不要图省事关掉它因为现场电机启停产生的电磁干扰真的会造成字节翻转没有校验时偶发一个坏数据温度曲线就多一个尖刺排查起来很难受。协议设计上主站每发一条命令从站都应在一个明确时间窗内响应。我一般设 50ms 超时超时重发一次连续三次失败就把该节点标记为离线并告警。重发前最好重新同步一下 UART 状态机清空接收缓冲避免残留字节干扰下一帧。5. 标定与实测误差来源和校准方法5.1 误差分配表把所有误差源列出来才能判断最终系统能不能达到目标精度。我的误差估算表大概长这样误差来源典型量级影响对策RREF 初始精度0.1%对应约0.26°C固定偏置选0.05%以下精密电阻出厂校准RREF 温漂25ppm/°C随温度漂移低漂移电阻控制节点温度ADC 增益误差数十 ppm 量级固定非线性内置自校准命令ADC 失调可校准固定偏置上电自校准 系统两点校准探头自热0.01~0.1°C随机偏置降低IDAC电流线缆电磁干扰看现场噪声尖刺屏蔽、滤波、CRCRTD 本身精度看等级A级约±0.15°C系统误差选A级或1/3DIN级探头HVAC 项目一般要求温度误差±0.5°C经过合理设计和一次两点校准这套方案可以做到±0.1°C量级的重复性。工业过程测量如果需要更高一致性就要考虑 A 级 RTD 探头和更严格的恒温槽标定。5.2 单点/两点校准的操作流程出厂校准我建议至少做两点。第一点是 0°C用冰水混合物注意要用纯净水加碎冰等温度稳定后读取原始值作为失调。第二点可以是 100°C 沸水或者用恒温槽设置在 50°C 或 100°C读取第二个点。校准公式是 y k×x bk 是增益修正系数b 是失调修正系数。固件里把这两个系数存在 PIC 的 EEPROM 或 Flash 数据区每次上电读出来应用到计算结果上。如果只有单点校准则只修正 b不修正 k。校准系数需要支持在线修改。我在 Modbus 协议里额外定义了写校准系数的寄存器这样出厂调试时不用重新烧录固件直接通过上位机工具校准。批量产线校准时用恒温槽 自动校准脚本一个节点平均两分钟效率可观。5.3 实测数据与温差测量的注意事项在我自己的测试平台上恒温槽 冰点瓶 沸水器实测一组数据是0°C 冰点连续采集 20 次均值 0.012°C峰峰值 0.02°C25°C 恒温槽均值 24.995°C峰峰值 0.015°C100°C 沸水均值 100.03°C。这个水平对 HVAC 冷量计量和工业过程监控完全足够。做温差测量时要特别注意两点。第一个是两只探头必须配对校准因为单只探头有系统偏差测温差时偏差会相减但不会消失最好用同一批次探头并对每对做差分标定。第二个是不要指望单颗 ADS122U04 通过 MUX 轮流采两路来测高精度温差因为 ADC 逐次采样有时间差中间温度波动会引入误差。真要测冷冻水供回水温差做冷量计算我建议用两颗 ADC 同时采样或者用同一颗 ADC 的外部同步采样电路方案。6. 我踩过的几个坑和最终心得6.1 看似正常的板子读数为什么漂第一次做出来的板子静态测试挺准一装到现场就开始漂。排查到最后问题出在 RREF 的走线上——我最初为了布线方便把 RREF 放在 ADC 较远的地方采样走线绕了半圈正好经过一片数字地平面。数字地上的噪声耦合到参考采样线上参考电压跟着抖读数自然不稳定。改成开尔文接法且远离数字区后读数的峰峰值降了接近一个数量级。另一个常见问题是电源。有段时间读数在风机启动时会出现固定偏差后来发现是 AVDD 走线经过了一个继电器驱动管继电器吸合瞬间拉低了 AVDD。给 ADC 单独加 LC 滤波后问题消失。这类问题用示波器抓 AVDD 纹波比死磕代码高效得多。6.2 通信偶发失败的排查ADS122U04 偶发“无响应”其实多数不是芯片坏而是上电时序或波特率误差问题。我遇到过一版固件用 HFINTOSC 配置波特率在高温下误差接近 2%接收端偶发帧错误表现为十分钟掉一次线。把波特率从 115200 降到 9600并检查了 OSCTUN 校准值后通信非常稳定。还有一次是 RS-485 半双工方向切换太快发完命令立刻切接收本机还处于发送状态时回显把自己收进来了导致状态机错乱。解决方法是发完最后一字节后延时 1 到 2 个字节时间再拉低发送使能。这个细节做现场总线的人基本都踩过。6.3 这套组合的扩展玩法方案稳定以后我在后续项目里做了几件事。让 PIC 同时采集 ADS122U04 的温度和自身的内部温度传感器用来做简单的环境温度补偿增加 Modbus 从站接口后PLC 可以直接读每个节点的温度不需要再配模拟量模块还做了探头断线故障上报上位机能精确定位是哪一路传感器出问题。如果你也打算复现这套方案我的建议是先买一块评估板或自己做转接板把 ADS122U04 和 PIC 之间的 UART 链路先跑通再写温度换算逻辑。硬件链路一通后面全是软件优化的事。这个组合真正聪明的地方在于把“测量”和“通信”解耦了模拟前端交给专门的 24 位 ADC 去处理协议和业务逻辑交给皮实的 8 位 MCU各司其职反而比用一颗高配 MCU 硬做模拟采集更容易做稳定。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →