基于ADS122U04与PIC24FJ64GB004的工业RTD测温方案设计与实现
1. 工业温度测量方案的整体设计思路工业现场和HVAC系统里的温度测量看起来是个老生常谈的话题但真正做过现场部署的人都知道坑远比想象中多。我前后做过好几个基于RTD的测温项目从最初用运放搭恒流源加MCU内部ADC的土办法到后来换成专用24位ADC方案踩过的坑基本能写一本小册子。这次要聊的这套组合——ADS122U04IPWR搭配PIC24FJ64GB004——是我个人认为在中小型工业测温场景里性价比和可靠性平衡得比较好的一套方案适合做温度变送器、HVAC控制器、冷库监控、锅炉温度采集这类应用的开发者参考。先说清楚这套方案能干什么。ADS122U04IPWR是TI的一款24位、4通道、低功耗ΔΣ型模数转换器内置PGA、基准电压源和激励电流源通过UART接口跟主控通信。PIC24FJ64GB004是Microchip的一款16位MCU64KB Flash、8KB RAM带USB和多个串口工作温度范围覆盖工业级。两者配合可以做到四路RTD或热电偶的高精度温度采集分辨率能到0.01°C级别整体功耗控制在毫安级非常适合电池供电或者总线供电的工业节点。为什么选这个组合而不是更常见的“MCU内部ADC外部运放”方案核心原因在于精度和抗干扰。工业现场电磁环境复杂电机启停、继电器动作、变频器工作都会在信号线上耦合大量噪声。MCU内部ADC通常是12位SAR结构有效位数在噪声环境下可能只剩8到9位换算成温度误差就是好几度根本没法用。ADS122U04的ΔΣ架构配合内置数字滤波器对工频干扰有很强的抑制能力加上PGA可以把微弱的RTD电压信号放大后再量化信噪比提升非常明显。另一个考虑是接口简单。ADS122U04用UART跟MCU通信只需要两根线TX/RX不像SPI那样需要额外的片选和时钟线布线简单隔离也方便。对于需要多路隔离采集的场合这个优势很实在。PIC24FJ64GB004本身有多个UART可以同时挂好几片ADS122U04扩展性不错。注意ADS122U04的UART接口是TTL电平如果MCU和ADC之间需要电气隔离得加数字隔离器比如ISO7721这类双通道隔离芯片别想着直接连。整套方案的信号链是这样的ADS122U04内部的激励电流源给RTD提供恒流RTD两端的电压经过PGA放大后送入ΔΣ调制器转换成数字码流再经过数字滤波器输出24位结果。MCU通过UART读取转换结果根据RTD的阻值-温度关系Callendar-Van Dusen方程计算出实际温度最后通过显示、总线或者无线方式上传。整个链路里基准电压的稳定性、激励电流的精度、PGA的增益误差、RTD自身的精度都会影响最终测量结果后面会逐个拆开讲。2. 核心器件选型与关键参数解析2.1 ADS122U04IPWR的关键特性与选型理由ADS122U04IPWR这个型号里IPWR是封装代码TSSOP-16封装工业级温度范围-40°C到125°C。选它主要看中几个点第一内置双匹配激励电流源典型值10μA到1.5mA可编程。做RTD测量时激励电流的精度和温漂直接决定测量精度。外部搭恒流源的话运放的失调电压漂移、电阻的温漂都会引入误差调试起来很麻烦。ADS122U04内部的电流源匹配度做到0.1%以内温漂典型值50ppm/°C对于大多数工业测温场景够用了。第二PGA增益可编程从1到128。PT100在0°C时阻值100Ω如果激励电流选500μA那么RTD两端电压只有50mV。这个信号直接送给ADC即使24位分辨率有效位数也会被噪声吃掉很多。用PGA放大16倍后变成800mV接近基准电压的一半量化噪声的影响就小多了。这里有个经验公式PGA增益的选择要让放大后的信号尽量接近但不超过基准电压这样能最大化利用ADC的动态范围。第三内置2.048V基准电压源初始精度0.05%温漂典型值5ppm/°C。基准的稳定性对测量精度影响极大外部基准芯片要做到这个水平成本不低。用内部基准省事又省钱当然如果对精度要求特别高也可以外接更好的基准比如REF5025。第四数字滤波器可配置。ADS122U04提供多种滤波模式包括sinc3、sinc1等还有50Hz/60Hz工频抑制选项。工业现场工频干扰是最常见的噪声源选对滤波模式能省掉很多硬件滤波电路。2.2 PIC24FJ64GB004的资源分配与外围设计PIC24FJ64GB004在整套方案里负责几件事通过UART配置ADS122U04的寄存器、读取转换数据、运行温度计算算法、驱动显示或通信接口。64KB Flash和8KB RAM对于这个任务绰绰有余即使加上Modbus协议栈和LCD驱动也够用。时钟方面我用的是8MHz外部晶振配合PLL倍频到32MHz这样UART波特率可以做到115200甚至更高读取ADC数据的速度更快。ADS122U04支持的最高UART波特率是2Mbps但实际用115200就足够了因为温度变化本身很慢每秒采样10次都算高频了。电源设计上要注意PIC24FJ64GB004的工作电压是2.0V到3.6VADS122U04的模拟电源AVDD是2.3V到5.5V数字电源DVDD是2.3V到5.5V。如果整个系统用3.3V供电两者可以直接共电源。但要注意模拟电源和数字电源之间加磁珠或电感隔离减少数字噪声对模拟部分的干扰。我在PCB上通常会把AVDD和DVDD分开走线在芯片引脚附近各放一个0.1μF和一个1μF的退耦电容AVDD再串一个10Ω电阻或者磁珠。实操心得ADS122U04的模拟输入引脚前面一定要加RC滤波典型值1kΩ100nF截止频率约1.6kHz。这个滤波电路要尽量靠近ADC引脚走线要短否则滤波效果大打折扣。2.3 RTD选型与接线方式对比RTD选PT100还是PT1000这是个常见问题。PT100在0°C时100ΩPT1000是1000Ω。同样的激励电流下PT1000上的电压信号大10倍对噪声相对不敏感但自热效应也更明显。自热效应是指激励电流流过RTD时产生的焦耳热导致RTD自身温度升高引入测量误差。PT1000在1mA激励下自热约0.1°CPT100在1mA下约0.02°C。所以如果追求低自热选PT100配小电流如果追求抗噪选PT1000配小电流。接线方式有二线制、三线制、四线制。二线制最简单但引线电阻直接叠加在RTD阻值上每米铜线约0.02Ω100米就是2Ω对应PT100约5°C误差完全不能接受。三线制可以补偿引线电阻前提是三根线材质长度一致。四线制最准完全消除引线电阻影响但多一根线。工业现场一般用三线制配合ADS122U04的两个激励电流源可以做到很好的引线补偿。ADS122U04做三线制RTD测量的原理是这样的两个匹配的激励电流源分别从RTD两端注入电流第三个引脚中间引线连接到ADC的另一个输入通道。通过测量两个通道的电压差可以消掉引线电阻的影响。具体寄存器配置后面会讲。3. 硬件电路设计与实操要点3.1 模拟前端电路设计细节模拟前端的核心是RTD接口电路。以三线制PT100为例接线是这样的ADS122U04的AIN0接RTD的一端AIN1接RTD的另一端AIN2接RTD的中间引线端。两个激励电流源IDAC1和IDAC2分别从AIN0和AIN2流出汇合到AIN1后流回地。这样RTD的电流是IDAC1IDAC2而两根引线上的电流分别是IDAC1和IDAC2如果IDAC1IDAC2引线电阻上的压降就相等差分测量时自动抵消。具体电路参数选激励电流500μAPT100在0°C时压降50mV在100°C时约69mV。PGA增益选16放大后0°C时800mV100°C时1.1V。基准电压2.048V满量程对应2.048V/16128mV即RTD阻值256Ω对应温度约400°C。这个量程覆盖了大多数工业测温需求。电阻R1和R2选0.1%精度、10ppm/°C温漂的金属膜电阻用于将激励电流转换为基准电压。等等这里要说明一下ADS122U04的基准可以选内部2.048V也可以选外部。如果用外部基准通常是用一个精密电阻将激励电流转换成电压作为基准这样基准和激励电流同源比例关系抵消温漂影响大大减小。这是高精度测量的常用技巧。注意如果用内部基准激励电流的温漂会直接反映在测量结果里。如果用外部基准电阻要选低温度系数的电阻比如Vishay的PTF系列或者VPG的箔电阻虽然贵但值得。3.2 PCB布局与接地策略PCB布局对ADC性能影响巨大尤其是24位高精度ADC。我总结了几条铁律第一模拟地和数字地分开最后在ADC下方单点连接。ADS122U04有AGND和DGND引脚PCB上要分别铺铜然后用0Ω电阻或磁珠在芯片下方连接。第二模拟输入走线要远离数字信号线尤其是时钟线和PWM线。如果实在避不开中间加地线屏蔽。差分输入的两根线要等长、平行走线间距保持一致。第三基准电压引脚和激励电流引脚的退耦电容要尽量靠近芯片走线要短而粗。基准电容选1μF的X7R陶瓷电容再并一个100nF的C0G电容。第四晶振要靠近MCU底下不要走线周围包地。晶振的外壳接地。第五电源走线要宽至少20mil减少压降和噪声耦合。我遇到过一个问题ADC读数跳动很大排查了半天发现是数字地和模拟地在PCB上有多点连接形成了地环路。改成单点连接后噪声立刻降下来了。这个坑很典型新手容易犯。3.3 隔离与保护电路设计工业现场的信号线可能很长容易引入浪涌和静电。RTD输入端口要加保护电路每个输入引脚串一个100Ω电阻然后对地接一个TVS二极管比如SMBJ5.0A。电阻要选精度高的因为它的阻值会影响测量但100Ω相对于RTD的100Ω来说太大了会引入误差。所以实际上保护电阻要选小一点比如10Ω或者用自恢复保险丝代替。如果RTD和MCU之间需要隔离可以用数字隔离器隔离UART信号比如ISO7721。模拟部分如果要隔离得用隔离电源模块给ADS122U04供电比如B0505S。隔离方案成本高一般只在高压或者强干扰场合用。4. 固件开发与温度计算实现4.1 ADS122U04寄存器配置流程ADS122U04有四个配置寄存器通过UART命令读写。上电后的初始化流程是这样的第一步发送RESET命令0x06等待至少50μs让芯片复位到默认状态。第二步配置寄存器0REG0设置MUX选择输入通道、PGA增益、数据速率。比如要测AIN0和AIN1之间的差分电压PGA增益16数据速率20SPS那么REG0的值是0x08MUX0000GAIN100DR000。第三步配置寄存器1REG1设置工作模式、转换模式、基准选择、滤波器类型。比如连续转换模式、内部基准、50Hz/60Hz同时抑制那么REG1的值是0x04。第四步配置寄存器2REG2设置激励电流大小和路由。比如IDAC1和IDAC2都开500μAIDAC1走AIN0IDAC2走AIN2那么REG2的值是0x55。第五步配置寄存器3REG3设置IDAC旁路、基准旁路等。一般用默认值0x00。配置完成后发送START/SYNC命令0x08启动转换。然后等待DRDY引脚变低表示数据就绪通过RDATA命令0x10读取24位转换结果。// PIC24FJ64GB004 UART发送单字节函数 void ADS122U04_WriteByte(uint8_t data) { while(U1STAbits.UTXBF); // 等待发送缓冲空 U1TXREG data; } // 写寄存器 void ADS122U04_WriteReg(uint8_t reg, uint8_t value) { ADS122U04_WriteByte(0x40 | (reg 2)); // WREG命令 ADS122U04_WriteByte(value); } // 读寄存器 uint8_t ADS122U04_ReadReg(uint8_t reg) { ADS122U04_WriteByte(0x20 | (reg 2)); // RREG命令 while(!U1STAbits.URXDA); // 等待接收 return U1RXREG; }4.2 温度计算算法与校准ADS122U04输出的是24位有符号整数对应输入电压。计算公式是输入电压 (ADC码值 / 2^23) × 基准电压 / PGA增益比如ADC码值是0x400000即2^22基准2.048VPGA增益16那么输入电压 (4194304 / 8388608) × 2.048 / 16 0.064V 64mV。然后根据欧姆定律算RTD阻值R_RTD V_RTD / I_EXC。如果激励电流500μAV_RTD64mV那么R_RTD128Ω。最后用Callendar-Van Dusen方程算温度。对于0°C以上的温度方程是R(T) R0 × (1 A×T B×T²)其中R0100ΩA3.9083e-3B-5.775e-7。反解TT (-A sqrt(A² - 4B(1 - R/R0))) / (2B)这个计算在MCU上可以用浮点数做PIC24FJ64GB004有硬件乘法器算一次大概几十微秒完全够用。如果嫌浮点慢可以用查表加线性插值但精度会差一点。校准是提高精度的关键。我一般做两点校准在0°C冰水混合物和100°C沸水中分别读取ADC值然后计算增益误差和偏移误差在固件里做补偿。校准后的精度可以做到±0.1°C以内。实操心得校准用的冰水混合物要加冰块搅拌确保是0°C。沸水的温度跟气压有关最好用标准温度计对比。校准点要覆盖实际使用范围如果只测0到50°C就在0°C和50°C校准。4.3 数字滤波与噪声抑制虽然ADS122U04内部有数字滤波器但MCU端还可以做二次滤波。我用的是滑动平均滤波窗口大小16对20SPS的数据速率来说响应时间约0.8秒对于温度这种慢变量完全够用。如果要求更快响应可以用中值滤波加滑动平均的组合先去掉脉冲干扰再平滑。#define FILTER_WINDOW 16 int32_t filter_buf[FILTER_WINDOW]; uint8_t filter_idx 0; int32_t MovingAverage(int32_t new_val) { int64_t sum 0; filter_buf[filter_idx] new_val; filter_idx (filter_idx 1) % FILTER_WINDOW; for(uint8_t i 0; i FILTER_WINDOW; i) { sum filter_buf[i]; } return (int32_t)(sum / FILTER_WINDOW); }如果发现ADC读数有周期性波动很可能是工频干扰。检查ADS122U04的滤波器配置选50Hz/60Hz同时抑制模式数据速率会降到20SPS但抑制效果最好。如果还是不行检查RTD引线是否太长、是否靠近动力线。5. 常见问题排查与实战经验5.1 ADC读数异常问题速查现象可能原因排查方法解决方案读数始终为0UART通信失败用示波器看TX/RX波形检查波特率、接线、MCU引脚配置读数跳动大电源噪声示波器看AVDD纹波加退耦电容、磁珠隔离读数偏大激励电流偏大测量RTD两端电压检查IDAC配置寄存器读数偏小PGA增益设置错误读回寄存器值确认重新配置REG0温度计算错误方程参数不对用已知电阻代替RTD测试检查R0、A、B参数通信时好时坏地环路检查模拟地和数字地连接改为单点接地这个表是我实际调试中总结的覆盖了八成以上的问题。其中“读数跳动大”是最常见的十次有八次是电源或接地问题。5.2 UART通信调试技巧ADS122U04的UART接口有个特点它是半双工的发送和接收共用一根线不对ADS122U04的UART是标准的全双工TX和RX分开。但它的协议是命令-响应式的MCU发命令ADC回数据。调试时要注意时序发完命令后要等ADC处理完才能读响应不同命令的处理时间不同RESET命令要等50μsRDATA命令要等至少50μs。我习惯在调试阶段用逻辑分析仪抓UART波形看命令和数据是否正确。如果没有逻辑分析仪可以用MCU的UART接收中断把收到的数据存到数组里通过串口打印出来看。但要注意打印会占用UART资源可能影响跟ADC的通信最好用另一个UART口打印。注意ADS122U04的UART默认波特率是自动检测的但为了可靠建议MCU主动发送0x55同步字节让ADC锁定波特率。这个步骤在初始化时不能省。5.3 自热效应与响应时间权衡前面提到自热效应这里展开说一下。RTD的自热误差跟激励电流的平方成正比。500μA时PT100自热约0.005°C1mA时约0.02°C看起来很小但如果RTD封装散热不好比如用在静止空气中自热会累积。我做过测试同样的PT100放在水里和放在空气中1mA激励下读数差0.05°C。所以如果测气体温度激励电流要选小一点比如100μA。但激励电流小了信号也小了对ADC噪声要求更高。ADS122U04在PGA128、数据速率20SPS时有效位数约21位输入噪声约1μV。100μA激励下PT100的灵敏度是0.385Ω/°C × 100μA 38.5μV/°C1μV噪声对应0.026°C分辨率够用了。所以低功耗场合可以选100μA激励配合PGA128。响应时间方面RTD本身的热时间常数取决于封装金属封装约10秒陶瓷封装约5秒薄膜RTD约2秒。ADC的转换时间可以忽略。所以整体响应时间由RTD决定选型时要考虑。5.4 多通道扩展与隔离方案如果需要测多路温度有两种方案一是用一片ADS122U04的4个通道轮流切换二是用多片ADS122U04。前者成本低但通道间切换需要时间而且不同通道的引线电阻可能不同校准麻烦。后者成本高但每路独立精度和速度都更好。我用过一片ADS122U04测4路PT100的方案MUX轮流切换每路采样10次取平均循环周期约2秒。对于大多数HVAC应用够用了。如果要求每路都高速采样那就得多片方案。隔离方面如果RTD在现场MCU在控制室中间距离超过10米建议加隔离。UART隔离用ISO7721电源隔离用B0505S。隔离后的地要分开不能共地。隔离方案会增加成本约20元但能大幅提高可靠性。6. 实际部署中的经验与建议整套方案我从实验室做到现场部署前后迭代了三版硬件。第一版没加模拟前端滤波现场读数跳得没法看第二版加了RC滤波但没做隔离雷雨天打坏了两片ADC第三版加了TVS和隔离稳定运行了两年多。这些经验告诉我工业测温方案不能只盯着ADC精度保护电路和接地设计同样重要。功耗方面ADS122U04在20SPS连续转换模式下约200μAPIC24FJ64GB004在32MHz运行约15mA如果加LCD显示和Modbus通信整体约25mA。用3.3V供电功耗约80mW。如果做电池供电可以让MCU间歇工作每秒唤醒一次读ADC平均功耗可以降到1mA以下。成本方面ADS122U04IPWR约15元PIC24FJ64GB004约20元加上外围器件和PCB整体BOM约60元。相比买成品温度变送器模块自己搭方案成本更低而且可以根据需求定制。最后分享一个调试小技巧如果怀疑ADC有问题可以用一个精密电阻代替RTD比如100Ω 0.01%的电阻看读数是否稳定在0°C附近。如果稳定说明ADC和电路没问题问题在RTD或接线如果不稳定那就是电路或配置的问题。这个替换法能快速定位问题环节省去很多猜测时间。