ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

基于ADS122U04与PIC24FJ64GB004的工业RTD测温方案设计与实现

基于ADS122U04与PIC24FJ64GB004的工业RTD测温方案设计与实现

1. 工业温度测量方案的整体设计思路

工业现场和HVAC系统里的温度测量,看起来是个老生常谈的话题,但真正做过现场部署的人都知道,坑远比想象中多。我前后做过好几个基于RTD的测温项目,从最初用运放搭恒流源加MCU内部ADC的土办法,到后来换成专用24位ADC方案,踩过的坑基本能写一本小册子。这次要聊的这套组合——ADS122U04IPWR搭配PIC24FJ64GB004——是我个人认为在中小型工业测温场景里性价比和可靠性平衡得比较好的一套方案,适合做温度变送器、HVAC控制器、冷库监控、锅炉温度采集这类应用的开发者参考。

先说清楚这套方案能干什么。ADS122U04IPWR是TI的一款24位、4通道、低功耗ΔΣ型模数转换器,内置PGA、基准电压源和激励电流源,通过UART接口跟主控通信。PIC24FJ64GB004是Microchip的一款16位MCU,64KB 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.6V,ADS122U04的模拟电源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°C,PT100在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的电流是IDAC1+IDAC2,而两根引线上的电流分别是IDAC1和IDAC2,如果IDAC1=IDAC2,引线电阻上的压降就相等,差分测量时自动抵消。

具体电路参数:选激励电流500μA,PT100在0°C时压降50mV,在100°C时约69mV。PGA增益选16,放大后0°C时800mV,100°C时1.1V。基准电压2.048V,满量程对应2.048V/16=128mV,即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,让芯片复位到默认状态。

第二步,配置寄存器0(REG0):设置MUX选择输入通道、PGA增益、数据速率。比如要测AIN0和AIN1之间的差分电压,PGA增益16,数据速率20SPS,那么REG0的值是0x08(MUX=0000,GAIN=100,DR=000)。

第三步,配置寄存器1(REG1):设置工作模式、转换模式、基准选择、滤波器类型。比如连续转换模式、内部基准、50Hz/60Hz同时抑制,那么REG1的值是0x04。

第四步,配置寄存器2(REG2):设置激励电流大小和路由。比如IDAC1和IDAC2都开500μA,IDAC1走AIN0,IDAC2走AIN2,那么REG2的值是0x55。

第五步,配置寄存器3(REG3):设置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.048V,PGA增益16,那么输入电压 = (4194304 / 8388608) × 2.048 / 16 = 0.064V = 64mV。

然后根据欧姆定律算RTD阻值:R_RTD = V_RTD / I_EXC。如果激励电流500μA,V_RTD=64mV,那么R_RTD=128Ω。

最后用Callendar-Van Dusen方程算温度。对于0°C以上的温度,方程是:

R(T) = R0 × (1 + A×T + B×T²)

其中R0=100Ω,A=3.9083e-3,B=-5.775e-7。反解T:

T = (-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μs,RDATA命令要等至少50μs。

我习惯在调试阶段用逻辑分析仪抓UART波形,看命令和数据是否正确。如果没有逻辑分析仪,可以用MCU的UART接收中断,把收到的数据存到数组里,通过串口打印出来看。但要注意,打印会占用UART资源,可能影响跟ADC的通信,最好用另一个UART口打印。

注意:ADS122U04的UART默认波特率是自动检测的,但为了可靠,建议MCU主动发送0x55同步字节,让ADC锁定波特率。这个步骤在初始化时不能省。

5.3 自热效应与响应时间权衡

前面提到自热效应,这里展开说一下。RTD的自热误差跟激励电流的平方成正比。500μA时PT100自热约0.005°C,1mA时约0.02°C,看起来很小,但如果RTD封装散热不好,比如用在静止空气中,自热会累积。我做过测试,同样的PT100,放在水里和放在空气中,1mA激励下读数差0.05°C。所以如果测气体温度,激励电流要选小一点,比如100μA。

但激励电流小了,信号也小了,对ADC噪声要求更高。ADS122U04在PGA=128、数据速率20SPS时,有效位数约21位,输入噪声约1μV。100μA激励下PT100的灵敏度是0.385Ω/°C × 100μA = 38.5μV/°C,1μV噪声对应0.026°C分辨率,够用了。所以低功耗场合可以选100μA激励,配合PGA=128。

响应时间方面,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μA,PIC24FJ64GB004在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或接线;如果不稳定,那就是电路或配置的问题。这个替换法能快速定位问题环节,省去很多猜测时间。

返回列表