基于ADS122U04IPWR与PIC18LF4515的高精度温度采集方案

发布时间:2026/11/5 5:04:45
基于ADS122U04IPWR与PIC18LF4515的高精度温度采集方案

多年做工业测控,我有个很深的感受:温度采集真正难的地方,不是探头选贵选便宜,而是毫伏级信号能不能在变频器、接触器和长线电缆的环境里,安安稳稳变成控制器认得的数字。HVAC风道里测个回风温度看着简单,工业换热管道上插个探头也不过几颗螺丝的事,可等到显示值跳着±0.5°C、控制阀门一开一关来回振荡时,你就会明白,问题多半出在从传感器到MCU这段模拟链路上。

这篇文章围绕一套我实际调通过的方案展开:TI 的 24 位 Δ-Σ ADC ADS122U04IPWR,搭配 Microchip 的 PIC18LF4515 单片机,组成工业和 HVAC 通用温度测量前端。ADS122U04IPWR 内部集成了 PGA、基准电压、可编程激励电流源和 UART 串口,PIC18LF4515 则负责协议控制、数据解码和上层温控逻辑。这套组合能覆盖 PT100、PT1000、热电偶冷端补偿等常见测温场景,对做暖通控制器、工业设备温度采集的朋友,有直接借鉴价值。

1. 温控链路规划:为什么 RTD 要配一颗 24 位外置 ADC

先说结论,再讲道理。温度测量链路的核心矛盾是:传感器输出信号太小、现场干扰又太大,而控制器量产时成本又压得很紧。想在 HVAC 管道里做到 0.1°C 级别的稳定读数,在工业柜里扛住电机启停时产生的共模噪声,MCU 自带的那颗 12 位 ADC 往往不够用。外置高精度 ADC 不是炫技,而是解决工程问题的常规手段。

1.1 传感器阵营:PT100、PT1000、NTC 与热电偶

工业与 HVAC 场景里,温度传感器就那几个选项:铂电阻、NTC 热敏电阻、热电偶。铂电阻又分 PT100 和 PT1000,前者 0°C 时电阻 100Ω,后者 1000Ω。PT100 的优势是探头型号多、抗振抗腐蚀、老化慢;PT1000 的优势是自身阻值高,引线电阻影响相对小,更适合低功耗仪表。NTC 便宜、灵敏度高,0°C 到 100°C 之间变化陡峭,但元件一致性差、老化曲线不稳,我只在消费级和部分低成本 HVAC 面板上用。热电偶测量范围宽、响应快,缺点是输出为微伏级,而且必须有冷端补偿,信号调理麻烦一些。

传感器典型温度范围典型精度输出信号采集难度
PT100-200°C ~ +600°C±0.1°C 到 ±0.3°C电阻变化,约 0.385Ω/°C中,需激励电流
PT1000-50°C ~ +300°C±0.1°C 到 ±0.3°C电阻变化,约 3.85Ω/°C中,激励电流更小
NTC-40°C ~ +150°C±0.2°C 到 ±1°C电阻指数变化低,但线性化困难
热电偶-200°C ~ +1300°C±0.5°C 到 ±2°C微伏级电压高,需冷端补偿

以 PT100 为例算一笔账:温度每变化 1°C,电阻变化约 0.385Ω。如果激励电流取 1mA,对应的电压变化只有 385µV。0.1°C 的分辨率意味着你要稳定分辨 38.5µV。别小看这个数字,在风机旁边、接触器吸合瞬间,PCB 上随便一点地弹跳、一点串扰,幅度都是它的几十倍。

1.2 内部 ADC 的局限与外置 24 位 Δ-Σ ADC 的差别

MCU 内置 ADC 不是不能用,关键看用在什么场合。PIC18LF4515 这类 8 位单片机,内部 ADC 通常是 10 位或 12 位,满量程按 3.3V 算,一个 LSB 大约 0.8mV。想靠它读出 38.5µV 的变化,理论上就差 20 倍。就算你用了高增益运放把信号放大,运放本身的失调温漂、外部电阻的精度又会引入新变量。

外置 24 位 Δ-Σ ADC 解决的是另一个维度的问题。它先把输入信号经过 PGA 放大,再用 Δ-Σ 调制器做过采样,最后通过数字滤波输出。内部基准电压做在芯片里,温漂可控;PGA 能把小信号放大到接近满量程,让量化噪声占比降到最低。ADS122U04IPWR 这颗片子,数据速率从 20SPS 到 1000SPS 可调,内置两个可编程电流源,可以直接驱动电阻类传感器,省掉外部恒流源电路。这也是我选它而不是普通 24 位 ADC 的原因:一路温度采集,两片芯片加几个阻容就能凑齐,BOM 成本很干净。

1.3 为什么是 ADS122U04IPWR 和 PIC18LF4515 这对组合

ADS122U04IPWR 后缀里的 U,代表它内置 UART 串行接口。这点很关键。很多高精度 ADC 输出是 SPI 或 I²C,SPI 四根线、I²C 受电容限制不适合长距离,而且引线多了,电气噪声耦合面也大。ADS122U04IPWR 用 UART 通信,两根线就能挂到单片机,哪怕把测温板放在距离主控几十米外的接线盒里,也能通过简单的 RS-485 电平转换继续工作。

PIC18LF4515 是老型号,但老型号不等于过时。它 48KB Flash、约 3.3KB RAM,带一个硬件 EUSART,工作电压 1.8V 到 3.6V。低压版本让我可以和 ADC 共用 3.3V 电源,不用做电平转换。在 HVAC 控制器和工业仪表这类成本敏感、程序逻辑又相对固定的产品里,8 位单片机完全够用,而且比 32 位平台更容易通过 EMC 认证。如果你手里只有 5V 版本的 PIC18F4515 也没关系,只要给 ADC 单独供 3.3V,通信线加个简单分压或转换即可。

2. 硬件搭建:激励电流、基准与 UART 接线

原理说得再漂亮,硬件接错一步,示波器上什么都看不出来,但读数就是不对。我按自己的调板顺序,把硬件关键点拆开讲。

2.1 先解决电源和基准:整个精度的地基

ADS122U04IPWR 的 AVDD 和 DVDD 一般都可以接 3.3V,但不要在芯片引脚旁边只放一颗 100nF 就完事。我习惯在模拟电源端并联 10µF 钽电容和 100nF 陶瓷电容,数字电源端放 100nF,两个地引脚在 PCB 上单独走线,在 ADC 底部汇合,再单点接到系统电源地。

参考电压方面,ADS122U04IPWR 内置基准可以直接用,典型值约 2.048V。对 PT100 方案来说,内部基准温漂系数通常够用,因为工业温度测量的目标精度是 0.1°C 到 0.5°C。如果你要推到 0.05°C 级别,就必须考虑外部基准芯片。外部基准还有一个好处:可以和 ADC 共用同一颗电压基准做比例测量,消除基准随温度的漂移误差。但外部基准芯片和外围电阻占面积,成本也高,HVAC 产品里一般不划算。

电源品质直接影响 ADC 噪声。我的经验是,给 ADC 供电的这一路最好从主电源用 LC 滤波单独拉出来,别让数字芯片的开关电流直接打在 ADC 电源脚上。PIC18LF4515 的 I/O 翻转、UART 发送,都会在电源平面上产生毛刺,如果 ADC 和单片机共用一条窄走线供电,转换结果低位就会周期性跳动。

2.2 RTD 接入与 PGA 增益计算

以 PT100 四线制接法为例。四线制的思路是:一对线给 RTD 通恒流,另一对线测电压。恒流源从 RTD 的电流注入端进,从回流端出;电压采样端则用高阻抗输入单独接在 RTD 两端。这样,引线上的压降不会进入测量回路,是工业上最可靠的接法。

ADS122U04IPWR 的两个可编程电流源 IDAC,量程从 50µA 到 1.5mA,可用寄存器配置。我把 IDAC 从 AIN0 引脚送出,经过 RTD 后由 AIN1 回流,同时把 RTD 两端的电压采样接到 AIN2 和 AIN3 的差分输入上。这里要特别留意:MUX 选择的输入通道是 AIN2/AIN3,而电流源输出用的是 AIN0/AIN1,两者不是一个概念,配置寄存器时别弄混。

增益怎么算?内部基准按 2.048V,PGA 满量程输入就是 ±2.048V/G。PT100 在 400°C 时约 247Ω,1mA 激励下差压约 247mV。选 PGA=8 时,满量程可测的差分输入为 256mV,刚好覆盖到 400°C 出头的量程。如果只需要 HVAC 的 -40°C 到 +150°C,PGA 取 16 也行,信号被放大得更充分,低位噪声也相对更小。

PT1000 就别照搬这个参数了。PT1000 在 0°C 时就有 1000Ω,1mA 激励会产生 1V 差压,PGA=1 时刚好在 2.048V 满量程内。所以我给 PT1000 通常配 500µA 激励、PGA=4,这样 0°C 时输出约 2V,离满量程有余量,自热也更小。

2.3 和 PIC18LF4515 的接口:UART 引脚、DRDY 与长线

PIC18LF4515 的 EUSART 在 RC6 和 RC7 引脚上,RC6 做 TX,RC7 做 RX。ADS122U04IPWR 的串口引脚和单片机对应关系是:ADC 的 DOUT/串口发送接 MCU 的 RX,ADC 的 DIN/串口接收接 MCU 的 TX。接反了通信肯定不通,这是新手最容易犯的错。

除了通信两线,我强烈建议把 ADC 的 DRDY 引脚也接出来,哪怕只接一个 GPIO。DRDY 在转换完成时会产生一个下降沿,单片机可以用外部中断或查询方式等待它,而不是盲等固定延时。固定延时也能用,但数据速率、PGA 建立时间、数字滤波起始条件都可能导致读回的数据错一拍。用 DRDY 做同步,时序上更干净,调试时也直观。

如果测温板要放到距离主控几十米外,UART 电平直接拉这么长的线不现实。我做过一版,把 UART 信号接到 MAX3485 这类 RS-485 转换芯片上,两根差分线拉 100 米没问题。ADC 板端的 3.3V 和主控端的 3.3V 必须共地,否则共模电压会直接把收发器打坏。

3. 让 ADC 开工:寄存器配置与通信序列

硬件焊好了,接下来就是烧脑的寄存器配置。ADS122U04IPWR 的寄存器不算多,但位域特别容易看错。我总结一套“先写配置、再同步、后读数据”的流程,照着做基本不会翻车。

3.1 需要打交道的几个寄存器

ADS122U04IPWR 的核心寄存器大致分四类:

寄存器主要位域我要在上面设置什么
通道/增益寄存器MUX[3:0]、PGA[2:0]选择差分输入通道,设置 PGA 增益
基准/数据速率寄存器VREF[1:0]、DR[2:0]选内部或外部基准,选 20~1000 SPS
IDAC 寄存器IDAC1[2:0]、IDAC2[2:0]设置激励电流源大小和输出引脚
偏置/比较寄存器比较器阈值、偏置电压一般不常用,保持默认

具体位值每个版本的数据手册会略有差异,我不在这里贴死十六进制数,以免你看错版本踩坑。更稳妥的做法是:把数据手册里寄存器表打印出来,对着“当前值”一栏逐个核对。我的习惯是先写 0xFF 复位寄存器,然后按顺序写配置,每写一个寄存器就回读一次,确认写入值一致再写下一个。

3.2 一套实用的配置流程与命令序列

UART 命令格式上,典型的 WREG 写寄存器命令是:命令字节 0x40,后面跟寄存器地址和数量,再后面是要写入的数据。我通常封装成一个函数:

void adc_write_reg(uint8_t addr, uint8_t len_minus_1, uint8_t *data) { uint8_t cmdbuf[2]; cmdbuf[0] = 0x40; /* WREG 命令 */ cmdbuf[1] = (addr << 2) | (len_minus_1 & 0x03); uart_write(cmdbuf, 2); uart_write(data, len_minus_1 + 1); }

注意第二个字节的低两位表示“寄存器数量减一”,高六位是起始寄存器地址。第一次写的时候我忘了减一,导致多写了一个寄存器,后面的配置全乱了,排查了半天。

完整序列大概是这样的:

  1. 上电后等待电源稳定,至少 10ms。
  2. 按照数据手册完成 UART 波特率同步或自动波特率流程。这一步不能省,否则后面读回的全是乱码。
  3. 发送复位命令 0x06,等待复位完成。
  4. 写寄存器:选择差分输入 AIN2/AIN3、PGA 增益、内部基准、数据速率 90SPS、IDAC 电流 1mA 并指定输出引脚。
  5. 回读寄存器确认。
  6. 进入单次转换或连续转换模式。
  7. 每次转换完成后,通过 DRDY 引脚或适当延时,发送 RDATA 命令读取 3 字节转换结果。

读数据命令也封装一下:

uint32_t adc_read_raw(void) { uint8_t cmd = 0x10; /* RDATA */ uint8_t b[3]; uart_write(&cmd, 1); uart_read(b, 3); return ((uint32_t)b[0] << 16) | ((uint32_t)b[1] << 8) | b[2]; }

3.3 单次转换、连续转换和数据速率选择

ADS122U04IPWR 支持单次转换和连续转换等模式。我的选择标准很简单:电池供电或对功耗敏感的设备用单次转换,每次需要读数时启动一次,读完立刻休眠;但 HVAC 控制器和工业仪表一般接 24V 或市电供电,功耗压力不大,直接连续转换更省心,单片机只要在 DRDY 下降沿后读结果就行。

数据速率要结合工频干扰来考虑。中国大陆电网是 50Hz,如果选择 20SPS,ADC 的数字滤波器对 50Hz 及其谐波有很好的抑制,读数最稳,但刷新一次要 50ms,温控回路会觉得有点慢。90SPS 时刷新间隔大约 11ms,对一般 HVAC 温控够用,抗工频串扰也还可以。我做过对比测试,同一块板上分别配置 20SPS 和 90SPS,传感器放在静止空气中,后者的峰峰值噪声大概比前者高 20% 左右,但响应速度提高了四倍多,系统控制效果反而更好。

4. PIC18LF4515 侧固件:从 24 位原始码到温度

PIC18LF4515 在这个项目里扮演的角色不复杂:初始化串口、写 ADC 寄存器、等中断、读三字节、算温度。但越是看起来简单,越容易在数据解码上翻车。

4.1 EUSART 初始化与写寄存器代码

PIC18LF4515 的 EUSART 初始化并不难,关键是波特率和引脚方向别设错。我用的晶振是 8MHz,9600bps,BRG16 置 1,SPBRG 算出来是 51。

void uart_init(void) { TRISCbits.TRISC6 = 0; /* TX 输出 */ TRISCbits.TRISC7 = 1; /* RX 输入 */ TXSTAbits.SYNC = 0; /* 异步 */ TXSTAbits.BRGH = 1; /* 高速波特率 */ TXSTAbits.TXEN = 1; BAUDCONbits.BRG16 = 1; RCSTAbits.SPEN = 1; RCSTAbits.CREN = 1; SPBRG = 51; /* 8MHz, 9600bps */ }

初始化完成后,用小函数发送命令。这里有个细节:PIC18 的 UART 发送寄存器是 TXREG,写之前要确认 TXIF 置位。在发送连续命令时,我习惯在命令之间加极短的延时,让 ADC 有足够时间处理,避免命令粘连。ADS122U04IPWR 对命令间隔有要求,指令之间留几个字节时间更安全。

4.2 24 位补码解码:最容易写错的地方

ADC 输出是 24 位二进制补码,也就是最高位是符号位。很多人在 8 位单片机上处理这个字节序列时,容易写出这样的错代码:直接把三个字节拼成 32 位整数,然后右移符号扩展。在 C 语言里,如果变量是无符号类型,右移高位补 0,负数直接变成正数;如果是有符号类型,不同编译器对“由 3 个字节组成的有符号数”处理又不一致。

我建议先把三字节拼成 uint32_t,再手动判断符号位:

float adc_raw_to_voltage(uint32_t raw, float vref, float gain) { int32_t signed_code; if (raw >= 0x800000u) signed_code = (int32_t)(raw - 0x1000000u); /* 符号扩展 */ else signed_code = (int32_t)raw; float voltage = ((float)signed_code * vref) / 8388608.0f; return voltage / gain; }

分母是 2 的 23 次方,也就是 8388608。有人会写成 2 的 24 次方,那结果整体差一倍。24 位 ADC 的满量程对应的数字是 2^23,不是 2^24。

4.3 从 ADC 码到 RTD 电阻,再到温度值

如果恒流源电流是 1mA,那么 RTD 电阻就是“输入电压 / 1mA”。代码里可以直接用浮点,但 PIC18LF4515 的浮点运算是软件库实现的,适合做低频温度采样,不适合大量循环。温度转换我推荐用查表或多项式。

0°C 到 850°C 范围内,PT100 可以用简化公式逼近:Rt = R0 × (1 + A·t + B·t²),其中 A=3.9083×10⁻³,B=-5.775×10⁻⁷。反过来由电阻求温度,用 Newton 迭代很方便:

float rtd_to_celsius(float r, float r0) { float t = 0.0f; for (int i = 0; i < 6; i++) { float f = r0 * (1.0f + 3.9083e-3f * t - 5.775e-7f * t * t) - r; float fp = r0 * (3.9083e-3f - 2.0f * 5.775e-7f * t); t = t - f / fp; } return t; }

这个函数在 0°C 到 400°C 区间内,一般 4 次迭代就收敛了,误差来自公式本身,大约在 0.1°C 以内。如果你做的是 -200°C 到 0°C 的低温段,PT100 需要引入 C(t-100)t³ 项,公式形式会变。更省事的做法是直接生成一张 1°C 间隔的电阻-温度表,用分段线性插值,误差可以做到 0.05°C 以内,而且 MCU 不需要处理复杂的浮点迭代。

4.4 滤波处理:给温控回路的稳定数据

很多人觉得 24 位 ADC 输出的数字一定很干净,实际上原始码会有低位跳动,尤其在工业现场。数据速率越高,噪声越大。滤波是必须的,但别在温度控制里用会引入大滞后的低通滤波。我常用的组合是:先做 5 点中值滤波,剔除偶尔出现的毛刺;再做滑动平均或一阶 IIR。

一阶 IIR 写起来很简单:

float filter_temp(float x) { static float y; y = 0.2f * x + 0.8f * y; return y; }

这个系数相当于时间常数很轻的平滑,对温控回路响应影响很小。如果你需要更平滑的读数,把系数从 0.2 改成 0.05,但要注意,读数会明显变“钝”,探头碰到冰水时,温度要很久才能到 0°C。工业现场调试时,我习惯先在无滤波状态下观察原始码跳幅,再决定滤波强度:原始码跳 5 个 LSB 还是跳 500 个 LSB,处理策略完全不同。

5. 误差校正:0.1°C 精度是怎么抠出来的

ADS122U04IPWR 本身是 24 位 ADC,但系统的实际精度从来不是 ADC 位数决定的。传感器误差、激励电流误差、引线电阻、自热、PCB 漏电,每一处都能把精度拉到 0.5°C 以上。要抠到 0.1°C,必须做校准。

5.1 失调与增益校准:短路、标准电阻与两点校准

失调校准最简单的方法是:把 ADC 输入端短路,读到的码值就是失调。有的芯片内部有自校准命令,直接发命令即可。如果采用外部校准,在量产阶段可以让未接传感器的板子自动测一次失调并存入 EEPROM。

增益校准比失调麻烦。常见做法是用两支高精度电阻模拟 RTD 的 0°C 和 100°C 状态:一支 0.01% 精度的 100Ω 电阻,一支 0.01% 精度的 138.5Ω 电阻。先接 100Ω 电阻,记录 ADC 码值;再接 138.5Ω 电阻,记录 ADC 码值。两个点之间的斜率就是实际增益,和理论增益的偏差作为系数保存在固件里。冰水混合物和沸水也能用来校准,但沸水受气压影响大,高海拔地区 100°C 根本不成立,所以标准电阻校准更适合工厂产线。

校准系数我建议用 32 位整数保存,放大 10000 倍,避免浮点误差和 EEPROM 存储空间问题。PIC18LF4515 的 EEPROM 存储量不大,但存几个校准系数绰绰有余。

5.2 自热效应与激励电流的取舍

恒流源激励必然在传感器上产生功耗,功耗转化成热量,会让 RTD 自身温度高于被测介质。这就是自热误差。1mA 电流流过 100Ω 的 PT100,功耗是 0.1mW。放在流动空气中,温升可能只有 0.02°C;放在静止空气中,如果探头封装又小,温升可能到 0.1°C 以上。

所以在设计时要做一个选择题:激励电流大,信噪比高,但自热大;激励电流小,自热小,但噪声影响更明显。我通常这样定:PT100 用 500µA 到 1mA,PT1000 用 250µA 到 500µA。如果探头装在风道里,流速大,取上限;如果是密闭水箱这类静止液体,取下限。ADS122U04IPWR 的 PGA 能放大信号,即使激励小,配合 24 位 ADC 的分辨率也足够。

5.3 引线电阻、热电势与 PCB 布局的影响

两线制 RTD 的引线电阻是最大的隐性误差。假设探头的两根引线各 2Ω,总共 4Ω,对 PT100 来说相当于差不多 10°C 的偏差。这个误差在工业现场很容易被忽视。三线制可以用两次测量的差值推算引线电阻,四线制则直接消除引线压降。如果你只能做两线制,必须在软件里做引线电阻补偿,补偿值要靠实际测量得到,不能拍脑袋。

热电势也不能忽略。RTD 引线端子、PCB 焊盘、铜导线、不同金属之间都会形成热电偶,产生几微伏到几十微伏的直流电势。对 24 位 ADC 来说,这个量级的误差在 0.1°C 精度目标下已经很明显了。我遇到过一块板子校准完读数很准,放一晚上再开机偏了 0.15°C,后来发现是端子处两种金属的接触温差导致的。解决办法是尽量让传感器引线和 PCB 之间使用同材质镀层,同时保持端子两侧温度一致,避免局部受热。

PCB 布局方面,RTD 的采样线要尽量短,远离继电器、变压器等发热源。模拟输入走线附近不要铺太近的数字地,我习惯在两路差分线之间铺一层接地隔离,但注意不要形成地环路。

6. HVAC 系统与工业柜里的实战经验

最后这部分是我在实际项目里踩过、也帮别人排查过的坑,针对性很强,直接按场景说。

6.1 HVAC 管道测温的几个关键点

HVAC 系统里最常见的是新风温度、回风温度、送风温度和盘管进出口水温。管道里的风速不高,但空间大,探头装的位置比信号链更重要。传感器尽量装在风管中心,避开死角,探头插入深度至少 10 厘米,否则测到的是管壁温度而不是空气温度。

电气问题上,HVAC 盘柜里常有风机变频器,变频器输出 PWM 波的辐射干扰会被长引线拾取。我的处理方式是:传感器引线用双绞屏蔽线,屏蔽层单端接地,接在 ADC 板的地上,而不是两端都接。两端都接会形成地环路,干扰反而更大。ADC 板的输入接口加一个 100Ω 串联电阻和 1nF 电容到地,组成低通滤波,实测能明显压掉高频噪声。

还有一个常见现象:读数整体偏高 1°C 到 2°C,但用冰水校验探头本身是准的。这往往是探头装在风道里受到了电机、照明灯辐射热的影响,或者探头贴着加热片太近,不是信号链的问题。排查时先把探头拆下来放在空气中比较读数,基本能判断是哪一侧的锅。

6.2 工业现场:隔离、滤波与通讯

工业柜里的环境比 HVAC 恶劣得多,接触器吸合、电焊机火花、电机正反转都会在电源和信号线上感应出瞬态干扰。所以工业场合我分三层处理:

第一层是电源隔离。ADS122U04IPWR 的供电从系统 24V 经过 DC-DC 转换后,再经过 LDO 稳压到 3.3V,DC-DC 后级必须加滤波。如果系统里已经有很强的功率地弹跳,可以考虑给测温板用隔离电源模块。第二层是信号接口保护。RS-485 输出端用 TVS 管和共模电感,通信线和电源线分开走线,绝对不能捆在同一束线缆里。第三层是软件抗干扰。UART 报文加简单的校验和,连续两包校验失败就把数据丢弃,不要用污染数据去驱动温控输出。

工业设备还有一个容易被忽略的点:校准周期。民用 HVAC 可能五年都不需要校准,但工业现场的传感器老化、探头污染、引线氧化会明显改变误差特性。我在程序里做了校准标识位,每次开机时如果距上次校准超过设定天数,会在维护界面上提个醒。这个功能并不复杂,但对现场维护帮助很大。

6.3 快速定位故障:一张现成的排查表

最后分享一张我自己调试时用的排查表,照着顺序查,能省很多时间:

现象可能原因排查顺序
读数一直满码输入通道配置错、PGA 超量程先查 MUX 是否选中正确通道,再算增益上限
读数全零激励电流没开启、RTD 开路测 IDAC 输出引脚电压,查 RTD 是否断路
读数跳动 >0.2°C电源滤波不够、长线感应、DRDY 同步错误看原始码噪声幅值,查电源纹波,加滤波
校准后仍整体偏移引线电阻未补偿、热电势、探头位置偏差用短接端子测零位,判定偏置来源
UART 通信经常失败波特率偏差、命令时序不对、共地不良示波器看波形眼图,检查电平共地

排查顺序是固定的:先电气,再通信,后软件。不要一上来就怀疑 ADC 芯片坏了。我见过好几次,问题出在单片机串口配置上,ADC 本身一点毛病没有。

这套方案我在 HVAC 控制器和一台工业循环水测温板上都用过,整体表现稳定。如果你也在调 ADS122U04IPWR 和 PIC18LF4515,我给你一个最实用的建议:先把原始码在固定温度下打出来,盯着最低几位看一段时间。什么时候你能读懂原始码的噪声规律,什么时候配置和地板就算真正调通了。后面遇到温度不准,至少能分清是前端问题、通信问题,还是算法问题。