☰
基于ADS122U04与PIC18F86K90的高精度多路温度采集系统设计与实践
2026/11/5 7:35:12 网站建设 项目流程

提起工业和HVAC(暖通空调)里的温度测量,很多工程师第一反应是"不就是一个传感器加一个ADC嘛"。但真正做过现场项目的人都清楚,从热电偶、RTD这类微弱信号到上位机能直接使用的稳定温度值,中间隔着一条完整的信号链,而这条链上每一个环节都在悄悄影响着最终精度。今天想聊的这套方案,是用TI的24位ΔΣ ADC——ADS122U04IPWR,搭配Microchip的PIC18F86K90,专门解决工业现场和HVAC系统里多路温度采集的实际问题。为什么挑这两个器件?ADS122U04的优势在于它把PGA、激励电流源、冷端补偿温度传感器和UART接口全部做进了单芯片,而PIC18F86K90则是一款带LCD驱动、超低功耗、串口资源丰富的8位MCU,两者拼在一起刚好构成一条高精度、低成本、抗干扰又容易上手的温度采集链路。这篇文章我会从信号链拆解、硬件接线、寄存器配置、UART通信、软件解析、冷端补偿、线性化和工程校准几个维度展开,希望能给正在做类似项目的朋友一些可以直接参考的实践经验。

1. 信号链的整体构架与硬件选型逻辑:为什么ADS122U04 + PIC18F86K90

先说清楚这套系统要解决什么问题。在工业现场,测温对象通常分三类:热电偶(K型、J型、T型)、PT100/PT1000铂电阻、NTC热敏电阻。它们的输出信号形态完全不同——热电偶输出的是微伏级电压,PT100是阻抗随温度变化,NTC阻值呈指数规律变化。如果用MCU内部自带的12位ADC去采,热电偶微伏级信号基本被噪声淹没,PT100又需要额外搭恒流源和调理电路,工程量和误差源都很可观。

所以我把采集前端的任务全部交给ADS122U04。这颗芯片内部集成了可编程增益放大器(PGA,增益1到128)、两个匹配的激励电流源(IDAC,可以设置250µA到1.5mA)、内置温度传感器、50/60Hz工频抑制滤波器和UART数字接口。这意味着从传感器物理信号到24位数字结果的模拟链路全部在芯片内部完成,外部只需要接几个滤波电容和去耦电容就够了。

选PIC18F86K90作为主控,理由也很实际。第一,这款MCU有3个UART模块,可以和ADS122U04独占一路串口,剩余串口留给Modbus或人机接口;第二,它自带LCD驱动器,可以直接驱动段码液晶显示温度值,省掉外部显示驱动芯片;第三,它的NanoWatt XLP超低功耗特性对电池供电或总线供电的现场仪表非常友好,1.8V到5.5V宽电压工作范围也让电源设计更宽容。

整套信号链的流向大概是这样的:

  • 传感器(热电偶/RTD/NTC)→ 模拟输入AIN0~AIN3
  • ADS122U04内部多路复用器选择通道 → PGA放大 → 24位ΔΣ调制器 → 数字滤波器
  • 通过UART接口把转换结果传给PIC18F86K90
  • PIC负责通道切换命令、数据解析、冷端补偿计算、线性化查表,最终驱动LCD显示或通过串口输出

这套架构最大的好处是"模拟与数字分离"。高精度的模拟处理全在ADC内部完成,MCU只做数字域的事情,调试时不用担心PIC的数字开关噪声串进模拟信号。我在实际项目中还发现一个附带好处:ADS122U04自带循环冗余校验(CRC),UART传输数据帧的完整性有保障,这在工业现场长距离走线时特别有用。

2. 传感器接入与模拟前端设计:热电偶、RTD、NTC三种场景的接线细节

温度传感器的接线方式直接决定测量误差的上限。我见过不少项目,ADC选得很好,最后却因为接线疏忽导致精度崩掉,所以这块必须单独讲。

2.1 热电偶:两线接入 + 冷端补偿

热电偶输出的是差分热电动势,K型在0到1000°C范围内输出大约0到41mV,平均每摄氏度约41µV。这个信号幅度太小,必须用高增益放大。ADS122U04的PGA增益设置到64或128后,信号进入24位ΔΣ调制器,分辨率完全够用。

接线时注意三点:

  • 热电偶正负极分别接AIN0和AIN1,形成差分输入
  • 在AIN0和AIN1靠近芯片引脚处各接一个1nF的差模电容,滤除射频干扰
  • 热电偶线如果较长(超过几米),建议用屏蔽双绞线,屏蔽层单端接地

冷端补偿一定要做,否则高温端的测量再准也没用。ADS122U04内部集成有温度传感器,可以直接读内部温度作为冷端温度,这是最省事的方式。程序里读内部温度寄存器,再结合热电偶分度表做补偿计算。后面我会专门讲补偿算法。

2.2 PT100/PT1000:三线制或四线制接法

铂电阻测温的原理很简单,但工程实现上有讲究。PT100在0°C时阻值100Ω,到100°C时变成138.5Ω,温度系数约0.385Ω/°C。如果只用两线制,导线电阻本身就几欧姆,带来的误差能到好几摄氏度,这在HVAC回水管温度监测这种场景是没法接受的。

我推荐至少用三线制,配合ADS122U04的IDAC激励电流源来实现。接法如下:

  • IDAC1输出10µA(实际可设更大,但热效应要权衡)从AIN2引脚流入PT100
  • PT100另一端经过导线回到AIN3
  • 第三根线直接从PT100的同一端引到AIN0作为参考电压测量点

这样做的核心思想是比率式测量:VREF和传感器激励来自同一个IDAC,导线电阻的影响被数学抵消。更讲究的做法是四线制,需要占用4个模拟输入通道,ADS122U04只有4通道,所以如果系统里热电偶和RTD都要用,三线制是更现实的选择。

2.3 NTC:最简单但也最容易忽略

NTC在HVAC里用得非常多,比如空调回风温度、盘管表面温度。它的阻值呈指数变化,25°C时典型10kΩ,到85°C可能只有1kΩ左右。ADS122U04的IDAC激励配合单端输入就能测,但不建议直接用恒流源,因为NTC自身发热会引入自热误差。工程做法是采用分压法,把NTC和精密电阻组成分压网络,ADC测分压点电压,再用Steinhart-Hart方程或查表法反算温度。

顺带提醒一下,NTC探头到ADC板的连接线如果用的是普通导线,温度变化时导线电阻也会有漂移,虽然NTC本身精度不高(±1%很常见),但导线引起的误差能省则省。屏蔽线加双绞是成本最低的改善手段。

3. ADS122U04寄存器配置与UART通信协议的上手指南

ADS122U04虽然功能丰富,但配置起来并不复杂,核心是把握三个寄存器组的设置:输入多路复用与增益、参考电压与转换模式、激励电流源与故障检测。

3.1 关键寄存器配置思路

寄存器0(地址00h)负责输入选择MUX和PGA增益。MUX[3:0]位决定AIN0~AIN3如何配对,比如AIN0-AIN1作为热电偶差分输入,或者AIN0-AIN1作为RTD三线制测量的一对引脚。增益设置要根据传感器输出幅度来定,热电偶选64倍左右,RTD可选2到8倍,NTC如果接的是分压电路,1倍增益足够了。这里有个经验:增益不是越高越好,因为PGA增益增大后,输入等效噪声电压也在上升。K型热电偶在0-100°C区间输出约4mV,64倍增益后约256mV,对24位ADC来说已经接近满量程的1/8,噪声水平完全可以接受。

寄存器1(地址01h)设置参考电压源、转换模式和输出速率。ADS122U04内部有2.048V参考电压,精度不错,增益误差可校准;但如果做RTD比率测量,最好使用外部参考电阻两端电压作为VREF,这样可以消除激励电流源的绝对精度误差。数据速率在工业现场建议选20SPS,正好和50Hz工频抑制对齐。

寄存器2(地址02h)配置IDAC电流和内部参考。IDAC电流值根据传感器类型选:PT100建议1mA(自热约0.1mW,可忽略),PT1000选250µA,NTC也要控制自热功率在0.1mW以下。

寄存器3(地址03h)配置IDAC输出引脚和故障检测。IDAC1建议输出到AIN2,测量电流回路从AIN3返回,故障检测打开后可以自动识别热电偶断线,这在工业现场很实用——探头断路能从数据上直接看出来,不用等到温度值明显异常才发现。

3.2 UART协议帧格式与CRC

ADS122U04使用标准UART(8位数据、无校验、1停止位)通信,速率可配,典型用19200bps就够。它和其他ADC最大的不同是,所有寄存器读写和读取转换结果都走串口命令帧,帧格式分三部分:命令、数据、CRC。

写寄存器时,主机发送4字节帧:第1字节是起始字节(0x00加上地址的高位控制位),后面跟着数据字节,最后是CRC校验字节。读寄存器或读转换结果时,发送2字节帧(起始位+CRC,或起始位+读命令),然后从ADC接收返回数据。CRC算法用的是CRC-8多项式0x07(和Maxim 1-Wire的CRC8一样),数据手册里有查表法的伪代码,复制过来直接用就行,但我建议自己验证一遍CRC实现,因为这里一旦写错,后面所有通信都会出问题且极难排查。

通信时序上有一个细节:主机发送命令后,ADC需要一定的命令处理时间(数据手册给了具体数值),如果紧接着就发下一条命令,可能出现总线冲突或响应数据错位。稳妥做法是在两次命令之间加1ms左右的延时,实测下来几乎没有兼容问题。

3.3 上电初始化顺序

我给出一套自己用着顺手的初始化顺序:

  • PIC上电后先等50ms,等ADC内部电源稳定
  • 复位ADC:通过一条专用的系统复位命令(帧格式为起始字节+复位指令+CRC)
  • 再延时50ms,等待内部振荡器起振
  • 写寄存器0(增益和MUX)
  • 写寄存器1(参考电压和数据速率)
  • 写寄存器2(IDAC电流)
  • 写寄存器3(IDAC路由和故障检测)
  • 各寄存器回读校验一次,确认写入无误
  • 进入连续转换模式,开始循环读取转换结果

这套流程里,每一条配置命令发出后都应当回读校验。我就吃过一次亏,只写不读,上电时序异常时寄存器没写进去,温度数据全乱,排查了很久才发现是配置没生效。

4. PIC18F86K90端的UART驱动、数据解析和抗干扰设计

PIC18F86K90在这套系统里的角色是"数字域管家",它负责调度ADS122U04的转换节奏,解析温度数据,完成补偿计算。这块的软件工作量主要集中在三个部分。

4.1 UART初始化与中断接收

PIC18F86K90的UART模块配置不复杂,波特率寄存器值要根据系统时钟频率计算。比如用内部8MHz振荡器,目标波特率19200,算出来的BRG值写入SPBRG寄存器即可。有一点要特别留意:PIC的UART接收寄存器是1字节深度的FIFO,如果主循环里处理数据太慢,连续字节到达时容易溢出。稳妥的思路是开启接收中断,在中断里把每个字节塞进环形缓冲区,主循环再从缓冲区取帧解析。

中断服务程序里注意清标志位的顺序:先读RCREG清接收标志,再操作其他逻辑。如果反过来,偶尔会有一个字节被漏掉,导致帧错位,CRC又查不出来——因为CRC是加在帧尾的,漏字节后整帧对齐就错了。

4.2 24位转换结果的解析

ADS122U04的转换结果是24位二进制补码格式,通过UART以3字节形式发送(高位在前)。软件解析时先拼装成一个32位整数,再根据PGA增益和参考电压换算成实际电压值。

关键点在于符号扩展。如果最高字节的最高位是1,说明结果是负数,需要把32位整数的高8位全部填1再做后续运算。我见过新手忽略这一步,导致负温度值算出来变成几百万的奇怪数值。可以用下面这段伪代码示意:

int32_t raw = (int32_t)((byte[0] << 16) | (byte[1] << 8) | byte[2]); if (raw & 0x800000) { raw |= 0xFF000000; // 符号扩展,补齐高8位 }

转换结果和电压的换算很简单:电压 =(二进制代码 / 8388608)* VREF / PGA增益。这里的8388608是2的23次方,因为24位ADC用最高位做符号位,有效分辨率为23位。

4.3 多通道轮询与数据有效性判断

ADS122U04是单ADC核、多路复用输入的架构,同一时刻只能测一路。工程上需要多路温度时,通常的做法是:在两次转换之间切换MUX寄存器,每次MUX切换后丢弃第一次转换结果。原因很直接——输入多路复用器切换后,内部采样电容需要时间稳定到新通道的信号电平,如果不够就采,转换结果会带有上一通道的残留电压。

我在程序里维护一个通道状态机,每个通道间隔至少3次转换周期才切换,实测稳定后误差不再受切换影响。如果系统对实时性要求没那么高(HVAC的温度响应本来就慢,1秒刷新都够),还可以进一步加大切换间隔,换取更好的稳定度。

做温度测量时还有一个很重要的工程细节——软件滤波。ADS122U04本身有数字滤波器,但现场环境复杂时,我仍然会在MCU端做一次滑动平均或中值滤波。滑动平均适合平稳温度,中值滤波则能剔掉偶发的尖峰干扰(比如电机启动时产生的电磁脉冲)。两种滤波的组合方式:先中值去毛刺,再滑动平均平滑,效果最稳。

5. 冷端补偿、线性化与工程校准的落地方法

这一节是整个温度测量系统里最容易做错、也最影响最终精度的部分。很多研发人员把传感器测准了,最终温度还是偏了,十有八九是补偿和线性化这里出了问题。

5.1 热电偶冷端补偿的两种方案

热电偶测量的本质是"温差电动势",它输出的电压代表测量端和冷端之间的温度差,而不是绝对温度。所以必须知道冷端的准确温度,才能计算出测量端的绝对温度。

ADS122U04内置温度传感器恰好可以扮演冷端温度计的角色。具体流程是:先读内部温度传感器对应的通道,得到芯片附近的温度T_cold,再读热电偶通道电压V_tc,查找热电偶分度表,找到与T_cold对应的电压V_cold,最后总电压V_total = V_tc + V_cold,用V_total查分度表得到测量端温度。

这个流程在程序里实现时有几个改进细节:

  • 分度表用查表加线性插值,表格密度0.5°C一个点,插值后误差可以压在0.1°C以内
  • 冷端温度读回来后建议做一次低通滤波,因为ADC内部温度传感器也会带一点噪声
  • 补偿计算要放在每次热电偶转换之后,不要隔了几个周期才补一次,否则冷端温度变化快的场景会引入动态误差

另一种方案是外部冷端传感器(比如NTC贴在端子排上)。ADS122U04的内置传感器测的是芯片自身温度,如果环境温度场分布不均,芯片温度和端子排温度有差异,补偿精度就会打折扣。它的优势是省掉一路外部传感器和对应的线性化算法。取舍标准很简单:如果PCB布局让ADC芯片和接线端子靠近,内置传感器够用;如果传感器接插端子远离主板,就要用外置NTC。

5.2 RTD和NTC的线性化处理

PT100的阻值和温度关系在0-850°C范围内用多项式描述,实际工程中用的最多的是Callendar-van Dusen公式或查表。ADS122U04虽然不能直接输出温度,但它提供的激励电流+比率测量架构,让RTD阻值测量已经足够准了。剩下的工作就是查表。

NTC则更适合用Steinhart-Hart方程:

1/T = A + B·ln(R) + C·(ln(R))³

三个系数A、B、C由厂家数据手册或者标定得到。如果没有精确系数,也可以用两个点的简化公式(B值方程),但中温段精度会差一些。我建议HVAC应用直接用三系数版本,计算量在8位MCU上也就几十条浮点指令。

PIC18F86K90硬件浮点能力弱,软件浮点库会拖慢响应。我实际的做法是先把Steinhart-Hart方程在PC上生成一张温度-AD码的查找表(分辨率0.1°C),编译时烧进MCU的Flash,运行时查表插值。8位MCU做浮点查表比现算方程快一个数量级,还不用担心浮点库占用太多Flash。

5.3 两点标定与多点校准

发布到现场的设备,出厂前最好做一次标定。即使是高精度ADC和传感器,也存在增益误差和偏置误差,不校准就出货等于把系统精度交给运气。

我的标准流程是:

  • 零点和满量程两点标定:用一个精密电阻箱模拟传感器,在0°C和100°C对应阻值处各记录一次ADC原始读数
  • 计算实际增益和偏置,写入MCU的EEPROM(我习惯EEPROM里带一个校验和,防止被意外改写)
  • 存储时用固定结构体:一个校验字段加标定系数,读到校验失败时启用出厂默认值

校准这一步对热电偶尤其关键,因为热电偶本身的互换性误差可以到±1°C甚至更高,而一个简单的两档校准就能把系统误差收到±0.2°C以内。如果项目预算允许,也可以去做冰点槽加干体炉的三点校准,但大多数HVAC项目用两点标准电阻箱校准就足够了。

6. 在HVAC和工业现场环境下,这套方案的长期稳定性表现

硬件设计做得再好,也要在真实环境里经得起考验。我这边有两条基于项目经验的建议,一条针对HVAC,一条针对工业现场。

6.1 HVAC场景下的抗干扰与功耗平衡

HVAC系统的现场环境通常不算恶劣,但"脏"——变频器、风机、压缩机、水泵,这些都是强干扰源。特别是变频器驱动的压缩机,母线电压开关会在空间和线路上耦合出大量谐波干扰。ADS122U04的ΔΣ架构配合内部数字滤波器对工频抑制很好,但如果干扰频率在几十kHz到几百kHz之间,还是可能混进带内。

我的处理方式是:

  • 模拟输入靠近ADC芯片处加RC滤波,带宽压到几百赫兹就够,因为温度信号本身变化非常慢
  • 给ADC单独加一颗LC滤波的电源(磁珠配10µF和100nF),避免PIC的数字电源噪声通过电源引脚耦合进ADC
  • 有条件时把ADS122U04的DGND和PIC的接地在单点连接,避免形成地环路

HVAC项目的另一个痛点是24VAC供电。总线供电系统里地线长,共模电压波动大,在ADS122U04输入端加上共模扼流圈对降低共模干扰效果很明显。不过注意,加了共模扼流圈后,对高频共模有效,对50Hz纹波几乎无效,所以电源侧的整流滤波还是要做好。

6.2 工业现场的经验:从掉坑里爬出来的教训

在工业化应用里,我踩过一个跟长线传输有关的坑。K型热电偶延伸导线长度有几十米,连到控制柜里的AD板。真到了现场,温度数据在凌晨和下午的偏差忽大忽小。后来排查发现,不是ADC的问题,而是延伸导线经过的区域有强电磁场(一个是大功率电机的动力电缆桥架),感应出共模噪声。因为热电偶的参考地是控制柜的PE地,而热端在设备上,两端地电位不一致,共模噪声变成差模,ADC怎么采都抖。

解决方案是把热电偶的冷端移到靠近传感器的一端,用外部高温端子板连接补偿导线,并将补偿导线的屏蔽层在传感器端单端接地。同时把ADS122U04的AIN输入对地加100nF电容到模拟地,给高频共模噪声一条低阻抗泄放路径。这一套组合下来,凌晨下午的漂移从±3°C降到±0.3°C。

另外,工业现场的温度采集系统一定要有断线检测。热电偶断了会表现为输入电压接近VREF上限或下限,ADS122U04的故障检测功能可以自动识别这种情况。我在PIC里把这个故障标志作为最高优先级的中断信号,一旦检测到就立即报警,并把故障通道从轮询表里摘出来。否则断了一根线,系统还在继续读数据,上位机的PID控制回路会拿一个错误温度继续工作,后果可能是加热器全功率运行。

6.3 数据记录与日志查询

PIC18F86K90有足够的内存放校准参数和历史记录。我一般会分配一段Flash区域做环形日志,每1秒记录一次温度关键值,循环覆盖。现场调试时最后悔的事情就是没有日志,故障发生后什么数据都没有。有了日志哪怕只是原始AD码,定位是不是传感器问题还是通信问题,效率完全不一样。

7. 实际调试中的几个疑难问题与排查链路

最后这部分,我把自己调试过程中写得最多的三个问题的排查思路完整复现一遍。这些问题都不是芯片本身坏,而是应用细节导致的,排错顺序也值得参考。

7.1 寄存器写入成功但回读不对

现象:配置命令发出后,回读数据和写入值对不上,但偶尔又能对上。

排查链路:

  • 第一步查电压,确认ADS122U04的供电电压在2.7V到5.5V之间低于2.7V时内部逻辑不稳定,回读就会出错
  • 第二步查复位引脚,确认没有被拉低或浮空
  • 第三步查TX/RX接线,UART交叉连接不是点对点直连,如果TX接TX会完全不通,但很多问题是接触不良,时通时断
  • 第四步用逻辑分析仪抓UART波形,对比发送的帧和回读的帧在哪个字节开始错位

我最终遇到的情况是接线端子氧化导致接触电阻漂移,波形出现毛刺,CRC偶尔能过,偶尔挂掉。换镀金端子后问题消失。

7.2 转换结果整体偏大或偏小

现象:数据线性很好,就是整体偏移了一个固定值。

排查链路:

  • 先确认参考电压VREF实际值是多少,是不是内部2.048V参考不准了
  • 然后检查PGA增益设置,如果有±5%的偏差,整体数据就会跟着偏
  • 再看IDAC电流是否匹配参考电阻,做比率测量时IDAC漂移会影响斜率

这类问题的排查顺序是按"源头"到"末端":先电压基准,再增益,再激励电流。一个标准万用表就能测VREF,数据对了多半是激励电流或参考电阻的问题。

7.3 温度跳变但设备和环境温度都没变

现象:数据在某一个值附近来回跳,幅度±1°C甚至更大。

排查链路:

  • 先看ADC的转换结果原始代码值,如果原始代码很稳定,说明ADC没问题,是软件计算或查表出错了
  • 再看数据速率设置,工业现场的干扰源如果频率高于数字滤波器的截止频率,会出现周期性噪声,把数据速率降到20SPS一般会明显改善
  • 检查传感器接线屏蔽层,如果屏蔽层两端都接地,形成地环路,共模干扰会翻倍
  • 最后检查输入的RC滤波电容容值是否偏小,如果走线长且容值只有100pF,高频噪声滤不掉

这类问题往往不是单一原因,而是多个因素叠加,排查时一定要一次只改一个变量,改完立刻记录,否则会陷入来回试的泥潭。

7.4 给搜索型读者的快速排错表

这个问题整理成一张表,方便现场快速定位:

现象优先检查次要检查
全是0或满量程值UART通信、芯片供电传感器断线、MUX配置
数据有规律跳变数据速率、工频干扰电源纹波、地环路
数据整体偏移VREF电压、PGA增益IDAC电流、参考电阻
响应很慢数据速率设置软件滤波窗口过大
首次上电通信失败复位时序、电源爬升时间TX/RX接反

写在最后的一点实际操作体会

这套ADS122U04 + PIC18F86K90的组合我在两个项目里完整跑过,一个是工厂车间的温度巡检仪表,一个是中型商用建筑的HVAC控制系统。总体的感受是:硬件的上限很高,但这套系统最终能出多好的数据,很大程度取决于你对信号链的理解和软件细节的打磨。尤其是冷端补偿和通道切换时序这两块,属于那种"文档上有、但没人强调、踩了坑才知道"的隐性知识点。

如果看完这篇文章准备动手做,我的建议是先把硬件最小系统搭起来,用USB转TTL直接连ADS122U04读写寄存器,跑通通信再做PIC部分的软件。这个"先简单后复杂"的顺序能让问题边界清晰很多,不至于同时面对通信、配置、计算三层问题。最后再分享一个调试小技巧:在PIC的UART中断里加一个接收字节计数器,每一次完整帧接收完成后打一个标记。这个计数器能帮你快速判断问题是出在"没收到数据"还是"收到但解析错了",省下来的排查时间相当可观。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询