1. 项目背景与核心需求拆解
工业现场和HVAC系统里的温度测量,看起来是个老生常谈的话题,但真正做过现场部署的人都知道,这里面的坑远比实验室里多得多。我前后做过几个供热管网监控和洁净厂房温湿度采集的项目,从最初用NTC热敏电阻凑合,到后来逐步切换到铂电阻RTD方案,中间踩过的坑足够写一本小册子。这次要聊的这套组合——ADS122U04IPWR加PIC18F87J11——是我在多个工业温度采集节点上反复验证过的一套方案,稳定、精度够、成本可控,而且外围电路不复杂,适合中小批量部署。
先说清楚这套东西是干什么的。ADS122U04IPWR是TI的一款24位ΔΣ模数转换器,内置PGA、激励电流源和参考电压,专门为RTD、热电偶这类小信号传感器设计。PIC18F87J11则是Microchip的一款8位MCU,128KB闪存、4KB RAM,自带UART、SPI、I2C,工作温度范围覆盖工业级。两者配合,构成一个完整的温度采集节点:RTD把温度转成电阻变化,ADS122U04IPWR负责激励、放大、数字化,PIC18F87J11负责配置ADC、读取数据、做线性化和温度换算,最后通过串口或总线把结果送出去。
这套方案解决的核心问题是:在工业电磁环境复杂、温度跨度大、长期无人值守的条件下,如何稳定地拿到±0.1℃级别的温度数据。适合谁看?做工业数据采集的嵌入式工程师、HVAC控制器的开发者、以及需要自己搭温度采集板子的硬件工程师。如果你只是做个桌面小实验,用现成的模块更省事;但如果你要面对现场布线、长距离传感器引线、电源波动这些现实问题,那这套方案值得仔细看看。
关键词里提到的RTD、HVAC、MCU,基本覆盖了这个项目的三个核心维度:传感器选型、应用场景、控制核心。后面我会围绕这三个维度展开,把选型逻辑、电路细节、寄存器配置、校准方法、以及现场踩过的坑都讲清楚。
2. 为什么选这套组合:方案选型背后的逻辑
2.1 RTD方案与热敏电阻、热电偶的取舍
温度测量无非几条路:热敏电阻、热电偶、RTD、红外。热敏电阻便宜、灵敏度高,但线性度差、互换性差,每换一个探头就得重新标定,而且长期漂移让人头疼。热电偶适合高温,但冷端补偿麻烦,小信号放大对噪声要求极高。RTD里最常用的是PT100和PT1000,铂电阻的线性度好、长期稳定性强、互换性好,工业标准摆在那里,-200℃到+600℃都能覆盖,HVAC和工业场景里基本是首选。
PT100在0℃时是100Ω,PT1000是1000Ω。选哪个?PT1000的灵敏度更高,同样的激励电流下输出信号更大,对ADC的分辨率要求相对低一些,但PT1000的自热效应也更明显。PT100的功耗更低,适合对自热敏感的场景。我这边HVAC水温测量用PT1000居多,因为引线电阻的影响相对小;工业管道温度用PT100,配合三线制或四线制消除引线误差。
ADS122U04IPWR内置的激励电流源可以配置成10μA到1.5mA多档,配合PT100时通常选100μA到500μA,既能保证信号幅度,又不至于让RTD自热太严重。自热误差怎么算?举个例子,PT100在0℃时功耗P=I²R,如果激励电流500μA,功耗就是0.25μW,热阻假设50℃/W,温升只有0.0125℃,完全可以忽略。但如果用1mA,功耗翻四倍,温升到0.05℃,对于±0.1℃精度的应用就开始有影响了。
2.2 24位ADC的必要性
有人会问,温度测量用12位ADC够不够?算一下就知道。PT100在0℃到100℃范围内,电阻从100Ω变到138.5Ω,变化量38.5Ω。如果用500μA激励,电压从50mV变到69.25mV,变化量19.25mV。12位ADC在2.048V参考下,LSB是0.5mV,对应温度分辨率约2.6℃。这显然不够。16位ADC的LSB是31.25μV,对应温度分辨率约0.16℃,勉强够用但余量不大。24位ADC的LSB是0.122μV,理论分辨率极高,实际有效位数受噪声限制,但即便有效位数只有18位,分辨率也能到0.01℃级别,留足了余量。
ADS122U04IPWR的PGA可以设置增益1到128,配合内部2.048V参考,小信号可以直接放大到接近满量程,充分利用ADC的动态范围。这是它比普通24位ADC更适合RTD的原因——内置的PGA和激励电流源省掉了外部运放和基准源,电路更简洁,噪声控制也更容易。
2.3 PIC18F87J11的角色定位
MCU这边,PIC18F87J11不是性能最强的,但胜在稳定、外设齐全、开发工具成熟。128KB闪存足够放温度换算的查找表和校准系数,4KB RAM对于采集节点绰绰有余。它自带SPI接口,和ADS122U04IPWR通信很方便。工作电压2.0V到3.6V,工业级温度范围-40℃到+85℃,和ADC的工作范围匹配。
有人可能想用STM32或者ESP32,性能更强、生态更好。但在工业现场,8位MCU的优势在于确定性——中断响应时间固定、没有复杂的时钟树和缓存机制、功耗控制简单。PIC18F87J11的指令周期在16MHz晶振下是62.5ns,SPI时钟可以跑到5MHz以上,读取ADS122U04IPWR的24位数据一次不到10μs,完全跟得上温度采集的节奏。而且Microchip的XC8编译器对代码优化做得不错,浮点运算虽然慢,但温度换算可以用定点数或者查表法绕过去。
2.4 通信接口的选择
ADS122U04IPWR支持SPI和UART两种接口,我选SPI。原因很简单:SPI是全双工、速率高、协议简单,PIC18F87J11的SPI模块配置起来很直接。UART虽然线少,但波特率受限,而且ADS122U04IPWR的UART模式需要额外的起始字节同步,反而麻烦。SPI模式下,MCU拉低CS,发送命令字节,然后读回数据,时序清晰,调试时用逻辑分析仪一看就明白。
3. 硬件设计细节与实操要点
3.1 RTD接口电路:三线制还是四线制
RTD接线方式直接决定精度。两线制最简单,但引线电阻直接叠加到测量结果里,每米铜线约0.02Ω,10米引线就是0.2Ω,对应PT100约0.5℃误差,完全不能接受。三线制通过两次测量消除引线电阻,前提是三条引线电阻相等,实际布线时用同规格同长度的线就能满足。四线制最精确,两条线走激励电流,两条线做电压检测,引线电阻完全不影响结果,但线缆成本高。
HVAC现场我一般用三线制,性价比最高。ADS122U04IPWR支持两路激励电流源,可以配置成三线制模式:IDAC1从RTD一端流入,IDAC2从另一端流入,两个电流源汇合后流过RTD,同时测量RTD两端电压和其中一条引线的电压,通过计算消除引线影响。具体配置后面寄存器部分会讲。
四线制在实验室校准或者高精度场合用,比如计量级的温度采集。三线制在工业现场足够,只要引线电阻匹配得好,残余误差可以控制在0.05℃以内。
3.2 激励电流源与参考电阻的选择
ADS122U04IPWR的激励电流源有多个档位:10μA、50μA、100μA、250μA、500μA、1000μA、1500μA。选哪个取决于RTD类型和参考电阻。参考电阻的作用是把激励电流转换成参考电压,ADC的测量结果是RTD电压与参考电压的比值,所以参考电阻的精度和温漂直接影响测量精度。
我通常选500μA激励,参考电阻用精密电阻,阻值根据RTD量程来定。PT100在0℃到100℃时电阻100Ω到138.5Ω,电压50mV到69.25mV。参考电阻如果选1.65kΩ,参考电压就是825mV,ADC的输入范围是±VREF/PGA,PGA设8的话,输入范围约±103mV,RTD信号69.25mV在范围内,而且留了余量。参考电阻的功耗是I²R,500μA下1.65kΩ的功耗是0.41mW,用0805封装足够,温漂选25ppm/℃以内的金属膜电阻。
这里有个细节:参考电阻要和RTD放在同一个温度环境里,或者至少远离热源。如果参考电阻温漂大,整个测量系统的温漂就大。我见过有人把参考电阻放在电源芯片旁边,结果温度一上来读数就飘,排查了半天才发现是参考电阻受热了。
3.3 电源与去耦
ADS122U04IPWR的模拟电源和数字电源要分开去耦。模拟电源用10μF钽电容加0.1μF陶瓷电容,数字电源同样配置。模拟地和数字地在芯片下方单点连接,避免数字噪声串到模拟部分。PIC18F87J11的电源也要去耦,每个电源引脚配0.1μF陶瓷电容。
现场供电通常用24V直流,经过DC-DC降到5V,再经过LDO降到3.3V给ADC和MCU。LDO的PSRR很重要,选60dB以上的型号,能把电源纹波压到μV级别。如果直接用开关电源给ADC供电,纹波会直接调制到测量结果里,读数跳动会很明显。
3.4 PCB布局要点
模拟部分和数字部分分区布局,ADS122U04IPWR放在模拟区,PIC18F87J11放在数字区。RTD输入走差分线,尽量短,远离时钟线和电源线。参考电阻靠近ADC的REF引脚,走线对称。激励电流源的走线要够宽,减少压降。
晶振靠近MCU,负载电容匹配好。SPI走线等长,CS、SCLK、MOSI、MISO尽量短。如果SPI线超过10cm,考虑加串联电阻匹配阻抗,减少反射。
地平面完整,不要被走线割裂。模拟地和数字地通过0Ω电阻或磁珠单点连接,位置选在ADC下方。如果板子有金属外壳,外壳接地要单独处理,避免形成地环路。
4. 固件实现:从寄存器配置到温度换算
4.1 ADS122U04IPWR初始化流程
上电后,PIC18F87J11先初始化SPI模块,配置时钟极性、相位、速率。ADS122U04IPWR的SPI模式支持CPOL=0/CPHA=1,SCLK空闲低电平,数据在第二个边沿采样。SPI时钟先设低速,比如1MHz,等配置稳定后再提高到4MHz。
然后发送RESET命令(0x06),等待至少50μs让ADC内部复位。接着配置寄存器。ADS122U04IPWR有四个配置寄存器,需要设置输入多路复用器、增益、数据速率、工作模式、激励电流源、参考选择等。
配置示例:输入选AIN0和AIN1差分,增益8,数据速率20SPS,连续转换模式,激励电流源500μA从IDAC1输出,参考选外部REF0。这些配置写入寄存器后,发送START/SYNC命令(0x08)启动转换。
4.2 寄存器配置详解
寄存器0控制多路复用器和增益。MUX[3:0]选输入通道,比如0000是AIN0/AIN1差分。GAIN[2:0]选增益,011对应8。寄存器1控制数据速率和模式,DR[2:0]选20SPS,CM位选连续转换。寄存器2控制参考和激励电流,VREF[1:0]选外部参考,IDAC[2:0]选500μA。寄存器3控制IDAC路由和校准。
具体配置值需要查数据手册的寄存器映射表。我一般把配置写成宏定义,方便修改:
#define ADS122U04_REG0 0x08 // MUX=AIN0/AIN1, GAIN=8 #define ADS122U04_REG1 0x04 // DR=20SPS, continuous mode #define ADS122U04_REG2 0x30 // external ref, IDAC=500uA #define ADS122U04_REG3 0x00 // IDAC1 to AIN0, IDAC2 disabled写寄存器时,先发送WREG命令(0x40 | 寄存器地址),然后发送配置值。读寄存器时发送RREG命令(0x20 | 寄存器地址),然后读回数据。
4.3 数据读取与转换
连续转换模式下,ADS122U04IPWR的DRDY引脚会在新数据准备好时拉低。PIC18F87J11可以用外部中断检测DRDY下降沿,然后在中断服务程序里读取数据。读取时发送RDATA命令(0x10),然后读三个字节,组成24位有符号数。
转换结果转成电压:V = (code / 2^23) × VREF / PGA。VREF是参考电压,PGA是增益。然后根据RTD的电阻-温度关系算温度。PT100在0℃以上可以用Callendar-Van Dusen方程:
R(T) = R0 × (1 + A×T + B×T²)
其中R0=100Ω,A=3.9083e-3,B=-5.775e-7。反解T可以用二次方程求根,或者用查表加线性插值。PIC18F87J11的浮点运算慢,我一般用定点数或者查表法。查表法把-50℃到+150℃分成200个点,每点间隔1℃,表里存对应的ADC码值,实际测量时找最近的两个点做线性插值,精度足够。
4.4 三线制引线电阻补偿
三线制模式下,需要两次测量。第一次IDAC1从RTD一端流入,IDAC2关闭,测量RTD两端电压,得到V1 = I×(RRTD + Rlead1 + Rlead2)。第二次IDAC1关闭,IDAC2从RTD另一端流入,测量同一对引脚,得到V2 = I×(Rlead2 + Rlead3)。假设Rlead1=Rlead2=Rlead3,则RRTD = (V1 - V2) / I。
实际实现时,切换IDAC路由需要重新配置寄存器3,然后等待转换稳定。两次测量之间要留足够的时间让ADC建立,20SPS下每次转换50ms,两次测量间隔至少100ms。对于温度变化缓慢的HVAC应用,这个速度完全够用。
4.5 校准方法与系数存储
出厂校准用精密电阻箱模拟PT100,在0℃、50℃、100℃三个点测量,记录ADC码值,拟合出线性系数。校准系数存在PIC18F87J11的EEPROM里,上电时读取。如果现场需要重新校准,可以通过串口发送校准命令,MCU进入校准模式,提示用户接入标准电阻。
校准系数包括增益误差和偏移误差。增益误差用两点校准消除,偏移误差用零点校准消除。如果要求更高,可以做多点校准加分段线性插值。我一般做三点校准,精度能到±0.05℃以内。
5. 现场常见问题与排查技巧
5.1 读数跳动大怎么办
读数跳动是最常见的问题。先查电源纹波,用示波器看ADC的模拟电源引脚,纹波超过1mV就要处理。然后查参考电阻,如果参考电阻温漂大或者功耗超标,读数会随温度漂移。再查RTD引线,如果引线太长且没有屏蔽,工频干扰会串进来,读数会有50Hz或60Hz的周期性波动。
ADS122U04IPWR内置50Hz/60Hz陷波滤波器,配置寄存器1的滤波器选择位可以开启。如果跳动还是大,降低数据速率,20SPS比1000SPS的噪声低很多。还可以开启ADC的内部斩波模式,进一步降低低频噪声。
5.2 温度读数偏高或偏低
如果读数整体偏高,先查自热效应。激励电流太大、RTD散热不好都会导致自热。降低激励电流试试,如果读数下降,就是自热问题。如果读数偏低,查引线电阻补偿,三线制模式下如果引线电阻不匹配,补偿会不准确。
还有一种情况是参考电阻的阻值偏差。参考电阻如果比标称值大1%,读数就会偏小1%。用高精度万用表测一下参考电阻的实际阻值,在固件里修正。
5.3 SPI通信失败
SPI通信失败通常有几个原因:CS信号时序不对、SCLK极性相位配置错误、MOSI和MISO接反。用逻辑分析仪抓SPI波形,对照ADS122U04IPWR的数据手册时序图检查。注意ADS122U04IPWR的SPI模式是CPOL=0/CPHA=1,和常见的模式0不同。
如果通信偶尔失败,检查SPI线是否太长、是否有干扰。加串联电阻和下拉电阻试试。电源上电顺序也有影响,如果MCU先上电、ADC后上电,MCU可能在ADC准备好之前就发送命令了。在初始化代码里加延时,等ADC电源稳定后再配置。
5.4 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 读数跳动大 | 电源纹波、参考电阻温漂、引线干扰 | 示波器看电源、测参考电阻温度、检查屏蔽 | 加去耦电容、换低温漂电阻、加屏蔽线 |
| 读数偏高 | 自热效应、参考电阻偏小 | 降低激励电流看读数变化 | 减小激励电流、改善RTD散热 |
| 读数偏低 | 引线电阻补偿不当、参考电阻偏大 | 检查三线制接线、测参考电阻 | 匹配引线电阻、修正参考电阻值 |
| SPI通信失败 | 时序错误、接线错误、上电顺序 | 逻辑分析仪抓波形、检查接线 | 修正SPI模式、加延时、检查电源 |
| 温度响应慢 | 数据速率低、RTD热惯性大 | 提高数据速率、换小封装RTD | 配置更高SPS、选薄壁RTD |
5.5 实操心得
我在现场调试时养成了一个习惯:每次改完硬件或固件,先用标准电阻箱验证一遍,确认ADC读数正确,再接RTD。这样可以区分是ADC问题还是RTD问题。另外,ADS122U04IPWR的配置寄存器写完以后,回读一遍确认写入成功,有时候SPI干扰会导致配置丢失,回读能及时发现。
还有一点,PIC18F87J11的EEPROM写入次数有限,校准系数不要频繁写。我一般只在出厂校准和现场校准时写一次,平时读取就行。如果现场需要频繁校准,考虑外挂一片FRAM或者铁电存储器。
6. 精度验证与长期稳定性测试
6.1 实验室精度验证
板子焊好之后,先做精度验证。用Fluke 754或者同等精度的过程校准器输出标准电阻信号,模拟PT100在-50℃、0℃、50℃、100℃、150℃的阻值,记录ADC读数和换算后的温度。计算每个点的误差,画误差曲线。如果误差在±0.1℃以内,基本合格。
注意校准器的精度要足够,至少比目标精度高一个数量级。Fluke 754的电阻输出精度是0.01Ω,对应PT100约0.025℃,足够验证±0.1℃的指标。
6.2 长期稳定性测试
工业现场要求长期稳定性,实验室精度好不代表现场稳定。我一般做72小时连续老化测试,把板子放在恒温箱里,设定25℃、50℃、-20℃三个温度点,每个点保持24小时,记录读数变化。如果读数漂移超过0.05℃,就要查原因。
长期稳定性主要受参考电阻温漂、RTD长期漂移、焊点热电动势影响。参考电阻选25ppm/℃以内的,RTD选A级铂电阻,焊点用低温焊锡减少热电动势。如果要求更高,做定期自动校准,用内置的参考电阻切换来校正增益。
6.3 现场安装注意事项
现场安装时,RTD的引线要远离动力电缆,至少保持30cm距离。如果必须交叉,垂直交叉,不要平行走线。RTD的接线端子要拧紧,接触电阻变化会直接影响测量。如果RTD安装在管道上,确保RTD的感温部分和管道壁充分接触,涂导热硅脂。
变送器或者采集板要放在振动小、温度稳定的地方。如果放在变频器旁边,电磁干扰会很大,读数跳动明显。实在避不开,加金属屏蔽盒,屏蔽盒接地。
7. 方案扩展与变体
7.1 多通道温度采集
如果需要多个温度点,ADS122U04IPWR只有一个差分输入,但可以通过外部多路复用器扩展。比如用CD4051或者ADG708切换多路RTD,MCU控制多路复用器的地址线,分时采集。注意多路复用器的导通电阻会影响测量,选低导通电阻的型号,或者在测量时补偿导通电阻。
另一种方案是用多个ADS122U04IPWR,每个负责一路RTD,通过SPI片选切换。这样成本高一些,但每路独立,互不干扰,采样速度也快。我做过8通道的采集板,用8片ADS122U04IPWR,PIC18F87J11的SPI片选线不够,用74HC138译码器扩展。
7.2 热电偶兼容设计
ADS122U04IPWR也支持热电偶,但需要冷端补偿。可以在板子上加一个高精度温度传感器,比如TMP117或者DS18B20,测量冷端温度,然后在固件里做冷端补偿计算。热电偶的增益配置和RTD不同,需要重新配置寄存器和校准。
7.3 通信接口扩展
PIC18F87J11自带UART,可以接RS485收发器,变成RS485总线节点,适合工业现场的长距离通信。也可以接CAN控制器,比如MCP2515,变成CAN节点。如果走无线,接LoRa模块或者NB-IoT模块,但要注意无线模块的功耗和干扰。
7.4 低功耗设计
如果采集节点用电池供电,低功耗很重要。ADS122U04IPWR支持单次转换模式,转换完自动进入休眠,MCU可以定时唤醒读取数据。PIC18F87J11有休眠模式,功耗可以降到μA级别。RTD的激励电流也可以降低,比如用100μA,牺牲一点信噪比换功耗。
我做过一个电池供电的管网温度节点,用2000mAh锂电池,每小时采集一次,续航超过两年。关键是RTD的激励电流只在采集时开启,采集完立刻关闭,平均功耗控制在50μA以内。
8. 个人实操体会
这套方案我用了三年多,从最初的样板到现在的量产版本,改了五六版。最大的体会是:模拟电路的性能取决于细节,每一个去耦电容、每一段走线、每一个焊点都可能影响最终精度。ADS122U04IPWR本身性能很好,但如果外围电路没做好,24位ADC也只能当12位用。
另一个体会是校准的重要性。出厂校准只能保证板子本身的一致性,现场安装后,RTD的引线、安装方式、环境温度都会引入误差。我现在的做法是每半年做一次现场校准,用便携式校准器接标准电阻,记录偏差,在固件里修正。这样长期稳定性有保障。
最后分享一个小技巧:ADS122U04IPWR的DRDY引脚在连续转换模式下会周期性拉低,如果MCU的中断响应不及时,可能错过数据。我一般用DRDY触发DMA或者用定时器查询DRDY状态,避免中断丢失。PIC18F87J11没有DMA,用定时器查询更可靠,定时器周期设成转换周期的一半,保证不会漏数据。