工业与HVAC温度测量:ADS122U04IPWR与PIC24F16KA102高精度方案

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

工业现场和HVAC系统里的温度测量,跟实验室里拿个万用表测室温完全是两码事。前者面对的是长线缆、强电磁干扰、宽温区、多通道轮询、还要长期稳定运行不漂移。我做过好几个HVAC控制板和工业变送器的项目,踩过的坑足够写一本小册子。这次拿ADS122U04IPWR这颗24位Δ-Σ ADC搭配PIC24F16KA102这颗低功耗16位MCU来做温度采集,是我认为在中小型工业与HVAC场景里性价比和可靠性平衡得相当好的一套组合。

先说这套方案解决什么问题。工业与HVAC场景里最常见的温度传感器无非三类:PT100/PT1000铂电阻、热电偶(K型、T型居多)、以及NTC热敏电阻。它们输出的信号都很微弱——PT100在0℃时只有100Ω,满量程变化也就几十到一百多欧姆;热电偶输出是毫伏级甚至微伏级。这种信号直接进MCU的ADC,基本等于把噪声当信号读。所以必须有一级高精度、低噪声、带PGA(可编程增益放大器)的专用ADC来做前端。

ADS122U04IPWR正好卡在这个位置上。它是TI的24位Δ-Σ ADC,内置PGA,增益可到128倍,带两个差分输入通道或者四个单端通道,还有激励电流源(IDAC),可以直接给PT100供电做比例测量。UART接口,接线简单,跟PIC24F16KA102这种资源不算富裕但足够稳定的MCU搭配,刚好。PIC24F16KA102是Microchip的16位低功耗MCU,16KB Flash、1.5KB RAM,带UART、SPI、I2C,跑个温度采集、线性化、通信上报的活儿绰绰有余,而且它的低功耗特性适合那些靠电池或者总线供电的HVAC节点。

为什么不用MCU自带的12位ADC加运放自己搭?我试过。12位ADC理论分辨率是1/4096,对于PT100在-50到150℃范围、对应大约80Ω到160Ω的变化,算下来每个LSB对应的温度分辨率大概在0.1℃量级,看着够用。但实际问题是噪声和漂移——运放失调漂移、电阻网络温漂、PCB漏电流,随便一项就能把有效位数吃掉三四位,最后实际有效分辨率可能只有8到9位,温度波动一两度。而ADS122U04IPWR的24位Δ-Σ架构加上内置PGA和斩波稳定,有效位数(ENOB)在增益128、10SPS下能做到20位以上,这才是工业级测量该有的底子。

从系统架构上看,整个方案分四层:传感器层(PT100/热电偶/NTC)、模拟前端层(ADS122U04IPWR及其外围的滤波、基准、激励)、数字控制层(PIC24F16KA102负责配置ADC、读取数据、做线性化和温度换算)、通信与电源层(UART上报、隔离、供电)。这个分层的好处是每一层职责清晰,调试的时候可以逐层排查,不会一锅粥。

HVAC应用还有个特殊点:多通道轮询。一个空调机组或者新风系统,往往要同时监测送风温度、回风温度、盘管温度、室外温度,四到八个测点很常见。ADS122U04IPWR有两个差分通道,配合外部多路复用器可以扩展到更多路,或者用多颗ADC挂同一条UART总线(通过地址区分)。PIC24F16KA102的UART加上GPIO控制多路复用器,就能实现轮询采集。这里要注意轮询的时序——每次切换通道后要留足够的建立时间,让PGA和Δ-Σ调制器稳定下来,否则读到的第一个数据是"脏"的。

选型上我还对比过几颗竞品。比如某些24位ADC虽然精度够,但要么是SPI接口在长线传输时不如UART方便,要么是没有内置IDAC导致PT100激励电路要额外搭。ADS122U04IPWR把PGA、IDAC、基准(可选外部)、UART都集成进去,外围元件少,PCB面积小,这对HVAC那种空间受限的控制板很关键。PIC24F16KA102这边,我选它而不是更便宜的8位PIC,是因为16位的数据处理能力在做多项式线性化和浮点温度换算时更从容,而且它的低功耗模式(休眠电流几百nA)适合间歇采集的场景。

提示:方案选型时不要只盯着ADC的分辨率位数。24位是理论值,实际能用的是ENOB。选型第一看ENOB和噪声,第二看接口和集成度,第三才看价格。工业与HVAC场景里,可靠性永远排在成本前面。

2. 核心器件细节与硬件设计要点

2.1 ADS122U04IPWR的关键特性与引脚配置

ADS122U04IPWR是TSSOP-16封装的24位ADC,我把它几个关键特性拆开讲,因为每一个都直接影响你的电路设计。

PGA增益:可选1、2、4、8、16、32、64、128。对于PT100,我一般用增益8到16;对于热电偶,用增益64到128。增益越高,输入范围越小,但对微弱信号的放大越充分。这里有个坑:增益不是越高越好。增益128时,输入满量程只有±VREF/128,如果VREF是2.048V,那满量程才±16mV。热电偶在高温时输出可能超过这个范围,会削顶。所以增益要根据传感器实际输出范围来定,留20%余量。

数据速率:5SPS到2000SPS可配。工业温度测量不需要快,我通常用20SPS或10SPS。为什么?Δ-Σ ADC的噪声和速率是反比关系,速率越低,内部数字滤波器对50Hz/60Hz工频干扰的抑制越好。20SPS时,sinc滤波器在50Hz和60Hz处都有零点,能有效压制工频干扰。如果你用1000SPS,工频抑制就没了,读数会跳。

IDAC激励电流源:两路可编程电流源,10μA到1.5mA。做PT100比例测量时,用一路IDAC流过PT100和一颗精密参考电阻(比如2.5kΩ、0.1%),ADC测量PT100上的压降,同时参考电阻上的压降作为参考电压。这样激励电流的漂移被比例消掉了,测量精度只取决于参考电阻的精度。这是PT100测量的经典接法,比恒压激励靠谱得多。

内部基准:2.048V,温漂典型值5ppm/℃。对于大多数工业温度测量够用。但如果要更高精度,建议外接一颗低漂移基准,比如REF5025(2.5V,3ppm/℃)。内部基准的好处是省元件省空间,HVAC场景里如果精度要求±0.5℃以内,内部基准完全够。

引脚配置上,模拟输入是AIN0到AIN3,可以配成两对差分(AIN0/AIN1和AIN2/AIN3)或四路单端。UART引脚是TXD和RXD,注意这是ADC的UART,不是MCU的,要交叉连接。还有CLK、CS、DRDY等控制引脚。DRDY是数据就绪中断,接到MCU的外部中断引脚上,这样MCU不用轮询,省CPU也省功耗。

2.2 PIC24F16KA102的资源分配与低功耗策略

PIC24F16KA102的16KB Flash和1.5KB RAM,在温度采集应用里怎么分配,我有个惯用的套路。

Flash这边,主程序加ADC驱动大概占4到6KB,温度线性化和查表占2到3KB,UART通信协议占2KB,剩下的留给参数存储和bootloader(如果需要现场升级)。RAM这边,采集缓冲区开64到128字节,够存一轮多通道的数据;浮点运算的临时变量占几十字节;UART收发缓冲各64字节。1.5KB看着少,但精打细算够用。

低功耗策略是这颗MCU的亮点。它支持深度休眠,休眠电流典型值只有几百nA。我的做法是:ADC配置成连续转换模式,DRDY中断唤醒MCU,MCU读一次数据、做换算、存缓冲,然后立刻回休眠。这样MCU的占空比极低,平均功耗可以做到几十微安。对于HVAC里那些用两节AA电池或者4-20mA环路供电的节点,这个功耗水平能撑好几年。

但这里有个细节要注意:ADC的功耗。ADS122U04IPWR在正常转换时电流大概几百微安,休眠时几微安。如果MCU休眠了但ADC还在连续转换,整体功耗下不来。所以更好的策略是让MCU控制ADC的转换节奏——MCU定时唤醒,启动ADC单次转换,等DRDY,读数据,然后让ADC也进休眠。这样两个器件的占空比都低,系统平均功耗最优。

2.3 模拟前端的外围电路设计

外围电路这块,我按传感器类型分开讲,因为不同传感器的前端设计差别很大。

PT100的接法:用比例测量法。IDAC1从AIN0流出,经过PT100到地,PT100上端接AIN0,下端接AIN1(差分测量)。同时IDAC2或者同一路IDAC流过参考电阻RREF,RREF上的压降接到REF+和REF-。这样ADC的读数 = (PT100压降 / RREF压降) × 满量程码值。激励电流的绝对值不重要,重要的是比例。RREF选2.5kΩ、0.1%、5ppm/℃的金属膜电阻。PT100用三线制接法可以消除引线电阻,但ADS122U04IPWR只有两路IDAC,三线制需要两个IDAC分别补偿,接线稍复杂。四线制最准但线多,HVAC现场布线不方便,我一般用三线制折中。

热电偶的接法:热电偶输出是差分毫伏信号,直接接AIN0/AIN1,增益设64到128。关键是冷端补偿。热电偶测的是热端和冷端的温差,冷端温度必须单独测。我通常用一颗NTC或者集成温度传感器(比如LM75)贴在接线端子附近测冷端温度,然后在MCU里做补偿计算。冷端补偿的精度直接影响整体精度,NTC要选B值一致性好、精度±0.5℃以内的。

NTC的接法:NTC阻值随温度变化大,非线性强,但便宜。用分压法,NTC和一颗精密电阻串联,中点接ADC输入。NTC的线性化用Steinhart-Hart方程或者查表。查表更省MCU算力,我一般把-40到125℃按1℃间隔做成表,存在Flash里,测量时线性插值。

滤波和去耦:模拟电源和数字电源分开,用磁珠或者0Ω电阻隔离。每个电源引脚配0.1μF和1μF电容,靠近引脚放。模拟输入线上串RC低通,截止频率设在几kHz,滤掉高频噪声。但RC的电阻不能太大,否则影响ADC的输入阻抗匹配。ADS122U04IPWR的输入阻抗在增益大于1时是固定的,但增益为1时输入阻抗较低,串的电阻要小。

注意:PCB布局时,模拟地和数字地要单点连接,通常在ADC下方。模拟输入走线要远离时钟线和电源线,最好包地。这些是老生常谈,但我在实际项目里见过太多因为地没处理好导致读数跳动的案例。

3. 实操过程与核心环节实现

3.1 硬件搭建与上电检查

拿到板子后,别急着上电写代码。先做静态检查:用万用表量各路电源对地阻抗,确认没有短路;检查ADC和MCU的焊接,特别是TSSOP封装的引脚有没有连锡;确认参考电阻、滤波电容的焊接方向(电容一般无方向,但电阻要注意阻值对不对)。

上电顺序有讲究。先上数字电源,确认MCU能正常复位、晶振起振(如果有外部晶振)。再上模拟电源,用示波器看模拟电源的纹波,应该在几毫伏以内。然后测ADC的基准电压,内部基准应该是2.048V,外部基准按你选的型号。基准电压的稳定性直接决定测量精度,这一步不能省。

我第一次做这个方案时,上电后发现ADC读数一直是满量程。排查了半天,发现是IDAC的配置寄存器写错了,电流源没打开,PT100上没有压降,ADC输入悬空导致读数乱跳。所以上电后的第一步应该是读ADC的配置寄存器,确认写入的值和读回的值一致,这是验证UART通信是否正常的最快方法。

3.2 ADC的配置与初始化代码

配置ADS122U04IPWR,我习惯按这个顺序来:复位、配置寄存器、启动转换。下面是我常用的初始化流程,用伪代码表示,实际用C语言写。

// 复位ADC ADS122U04_SendCommand(RESET_CMD); delay_ms(1); // 配置寄存器0:增益、数据速率、工作模式 // MUX[3:0]=0000 选AIN0/AIN1差分 // GAIN[2:0]=011 增益8 // DR[2:0]=010 20SPS // 连续转换模式 uint8_t reg0 = 0x00 | (0x03 << 4) | (0x02 << 1) | 0x00; ADS122U04_WriteReg(0, reg0); // 配置寄存器1:基准选择、IDAC电流 // VREF选择内部2.048V // IDAC1=500uA, IDAC2=off uint8_t reg1 = 0x00 | (0x04 << 4) | 0x00; ADS122U04_WriteReg(1, reg1); // 配置寄存器2:IDAC路由、DRDY模式 // IDAC1路由到AIN0 uint8_t reg2 = 0x00 | (0x01 << 4); ADS122U04_WriteReg(2, reg2); // 启动连续转换 ADS122U04_SendCommand(START_CMD);

这段代码里,增益8、速率20SPS、IDAC 500μA,是针对PT100的典型配置。如果你用热电偶,增益改成128,IDAC关掉,基准还是内部2.048V。配置完寄存器后,一定要读回来验证,因为UART通信可能因为波特率不匹配或者干扰出错。

波特率设置上,ADS122U04IPWR支持多种波特率,我一般用9600或者19200。9600更稳,抗干扰余量大;19200快一点,适合多通道轮询。PIC24F16KA102的UART配置要和ADC一致,注意分频系数的计算。比如MCU主频8MHz,要得到9600波特率,分频值 = 8000000/(16×9600) - 1 ≈ 51。这个计算要精确,否则通信会丢包。

3.3 温度换算与线性化处理

读到的ADC码值要换算成温度,这一步是软件的核心。不同传感器算法不同。

PT100的换算:先算PT100阻值。ADC码值(24位有符号)除以满量程(2^23-1)得到比例,乘以RREF得到PT100阻值。然后根据IEC 60751标准,用Callendar-Van Dusen方程反算温度。0℃以上用二次方程,0℃以下用四次方程。实际工程里为了省算力,我常用分段线性插值,把-200到850℃按10℃间隔做表,精度能到±0.1℃。

热电偶的换算:ADC码值换算成热电动势(mV),加上冷端补偿的电动势,然后查热电偶分度表(NIST提供)得到温度。K型热电偶的分度表是非线性的,查表加插值最准。冷端补偿用NTC测到的冷端温度,查NTC分度表得到冷端电动势,加到热电动势上。

NTC的换算:用Steinhart-Hart方程:1/T = A + B×ln(R) + C×(ln(R))^3。A、B、C三个系数由厂家提供或者自己标定。这个方程算起来要开方和对数,PIC24F16KA102做起来有点吃力,所以我用查表法。把NTC的阻值-温度对应关系做成表,测量时算阻值,然后查表插值。

线性化处理里有个细节:浮点还是定点。PIC24F16KA102没有硬件浮点单元,浮点运算是软件模拟,慢且占空间。我一般用定点运算,把温度放大100倍存成整数,比如25.50℃存成2550。运算时用32位整数,注意溢出。只有在最后上报或者显示时才转成浮点格式。

3.4 多通道轮询与时序控制

HVAC系统里多通道轮询是常态。ADS122U04IPWR有两个差分通道,如果测点超过两个,要么外接多路复用器,要么用多颗ADC。我用过CD4051这类模拟多路复用器,成本低,但要注意导通电阻和漏电流。导通电阻会影响PT100的比例测量,因为多路复用器的导通电阻会串在激励回路里。解决办法是把多路复用器放在激励回路之外,或者用低导通电阻的型号(比如ADG708,导通电阻几欧姆)。

轮询时序上,我的做法是:切换通道后延时至少100ms再启动转换。为什么这么久?因为Δ-Σ ADC的PGA和调制器需要时间稳定,尤其是增益切换后。100ms是保守值,实际测试下来50ms也够,但工业现场我宁可留余量。转换完成后读数据,然后切下一通道。一轮四个通道大概500ms,对于温度这种慢变量完全够。

DRDY中断的处理要注意:读数据前先清中断标志,否则会重复进中断。读数据用UART读,注意UART是异步的,要等接收完成。我一般用中断接收,收到完整帧后置标志位,主循环处理。

提示:多通道轮询时,如果某个通道的传感器断线,ADC读数会漂到满量程或者零。软件里要加断线检测——如果读数超出合理范围,标记该通道故障,不要直接上报错误温度。HVAC系统里一个错误的温度读数可能导致机组误动作。

4. 常见问题与排查技巧实录

4.1 读数跳动大、噪声高的排查

这是最常见的抱怨。我遇到过的原因有七八种,按概率排序:电源纹波大、地线处理不当、IDAC配置错误、滤波不足、传感器引线太长、工频干扰、基准不稳。

排查步骤我总结成一个流程。先看电源,用示波器测模拟电源的纹波,如果超过几毫伏,先解决电源。然后看地,确认模拟地和数字地单点连接,ADC下方的地平面完整。再看IDAC,读寄存器确认电流值对不对,用万用表测PT100上的压降,应该在几十毫伏量级。然后看滤波,模拟输入端的RC滤波有没有装,截止频率对不对。最后看传感器引线,如果引线超过一米,考虑用屏蔽线,屏蔽层单端接地。

工频干扰的典型表现是读数以50Hz或100Hz的节奏跳动。解决办法是把ADC的数据速率设成20SPS或10SPS,利用sinc滤波器的工频零点。如果还不行,在模拟输入端加共模扼流圈。

4.2 UART通信丢包与误码

UART通信在工业现场容易受干扰。我遇到过的情况:波特率不匹配、地线环路、线太长、没有隔离。

波特率不匹配最常见。ADS122U04IPWR的波特率由内部振荡器决定,有误差。PIC24F16KA102的波特率由系统时钟分频,也有误差。两者误差加起来超过3%就可能丢包。解决办法是用较低的波特率(9600),误差余量大。或者用ADC的CLK引脚输出时钟给MCU,两者同步。

地线环路是隐蔽的问题。如果ADC和MCU分别供电,两地之间有电位差,UART的参考地就漂了。解决办法是单点接地,或者用数字隔离器(比如ADuM1201)隔离UART。工业与HVAC场景里,隔离是标配,别省这个钱。

线太长的话,UART的TTL电平驱动能力有限,超过几十厘米就可能误码。解决办法是加RS-485收发器,差分传输抗干扰强,传输距离也远。HVAC系统里RS-485是主流,ADC和MCU可以本地UART,MCU对外用RS-485。

4.3 温度读数漂移与长期稳定性

长期漂移是工业测量的大敌。我做过一个项目,板子刚出厂时精度±0.2℃,运行三个月后漂到±1℃。排查下来是参考电阻的温漂——选的电阻温漂50ppm/℃,机柜内温度变化20℃,电阻变化0.1%,对应温度误差0.25℃。再加上ADC内部基准的温漂,累积起来就大了。

解决办法:参考电阻选5ppm/℃以内的,最好用金属箔电阻。ADC用外部低漂移基准。PCB布局上,把参考电阻和ADC放在一起,远离发热元件。如果机柜内温度变化大,考虑加温度补偿——用板上的温度传感器测环境温度,对读数做补偿。

还有一个漂移源是PCB漏电流。如果板子受潮或者助焊剂没洗干净,模拟输入引脚之间的漏电流会导致读数漂移。解决办法是清洗PCB,涂三防漆。HVAC现场湿度大,三防漆是必须的。

4.4 常见问题速查表

现象可能原因排查方法解决措施
读数跳动大电源纹波大示波器测模拟电源加LC滤波,换LDO
读数跳动大地线处理不当检查地平面和单点连接重新布局,单点接地
读数跳动大工频干扰看跳动频率是否50/100Hz降速率到20SPS,加共模扼流圈
读数满量程IDAC没开读寄存器,测PT100压降正确配置IDAC寄存器
读数满量程传感器断线测传感器阻值检查接线,加断线检测
UART丢包波特率不匹配示波器测波形降波特率或用同步时钟
UART丢包地线环路测两地电位差单点接地或加隔离
长期漂移参考电阻温漂测不同温度下阻值换低漂移电阻
长期漂移PCB漏电流清洗后看是否改善清洗PCB,涂三防漆
多通道串扰多路复用器导通电阻测切换后读数换低导通电阻型号,调整时序

4.5 实操心得与避坑技巧

做了这么多项目,我攒了几条书上不会写的经验。

第一,ADC的配置寄存器写完一定要读回验证。UART通信在工业现场不是100%可靠,配置写错了后面全错。读回验证花不了几毫秒,但能省你几天调试时间。

第二,PT100的三线制接法,引线电阻要匹配。三线制的原理是假设三根线电阻相同,实际布线时三根线要等长、同材质。如果不等长,补偿就不准。我见过用不同长度引线的,误差能到好几度。

第三,热电偶的冷端补偿,传感器要贴近接线端子。冷端补偿测的是接线端子处的温度,如果传感器离得远,测的是PCB温度而不是端子温度,补偿就错了。我一般把NTC贴在端子焊盘旁边,用导热胶固定。

第四,多通道轮询的建立时间,宁长勿短。我一开始用20ms,读数偶尔跳。改成100ms后稳定了。时间就是精度,别省这点时间。

第五,低功耗设计要实测。数据手册的功耗是典型值,实际板子有漏电流、有外围器件功耗。我用电流表实测休眠电流,发现比预期高一个数量级,排查下来是UART引脚的上拉电阻在休眠时还在耗电。把上拉电阻改成MCU控制,休眠时断开,功耗就下来了。

第六,温度换算的精度要和ADC精度匹配。有人用24位ADC但用一阶线性换算PT100,结果精度还不如12位ADC加查表。换算算法要和ADC精度匹配,该查表就查表,该用高阶方程就用高阶方程。

第七,工业现场一定要加隔离。不管是UART隔离还是电源隔离,别省。我见过因为没隔离导致ADC被现场浪涌打坏的案例,修板子的成本远高于隔离器。

第八,留调试接口。板子上留UART调试口和几个测试点,调试时能省很多事。量产时可以不放,但样板一定要留。

这套ADS122U04IPWR加PIC24F16KA102的方案,我在三个HVAC项目和一个工业变送器项目里用过,精度稳定在±0.3℃以内(PT100,-40到150℃),长期漂移小于0.1℃/年。关键是把前端设计、时序控制、线性化算法和隔离这几块做扎实。温度测量看着简单,但要做到工业级稳定,每个环节都得抠细节。