ADS122U04+PIC18F66K40:24位Δ-Σ ADC打造高精度工业温度测量 做工业或HVAC温度测量的人多半有过这种经历控制逻辑、通信协议都调得差不多了最后卡在温度读数上。我最初在一个变频器密度很高的暖通项目里用PIC18F66K40自带的10位ADC去读NTC静调风的时候数据还像样压缩机一启动读数能跳好几度后来换成PT10010位ADC更是直接没戏——1℃的变化对应不到0.2mV电信号而5V参考下的一个LSB就有4.88mV。最后把ADS122U04IPWR这颗24位Δ-Σ ADC挂上去测量链路才算真正立住。这篇文章把ADS122U04IPWR与PIC18F66K40的完整搭配讲透芯片选型逻辑、传感器电路、UART通信配置、温度算法和现场抗干扰经验都是可以直接抄作业的内容适合正在做HVAC控制器、工业数据采集板或想给8位MCU系统补上高精度模拟前端的工程师。1. 为什么拿24位ADC配8位MCU一个精度鸿沟的账本先说结论温度测量这个事儿MCU的CPU主频再高也没用精度几乎全看ADC这条链路。PIC18F66K40本身是一颗很成熟的8位MCU64KB Flash、4KB RAM、两个EUSART、PPS外设重映射做控制逻辑和通信绰绰有余。但它内部那颗10位ADC在多数的温度测量场景里就是短板。1.1 10位ADC在PT100面前的无力拿PT100举例。PT100在0℃时电阻是100Ω灵敏度大约0.39Ω/℃。如果用500µA的恒流源激励温度每变化1℃PT100两端的电压只变化0.195mV。PIC18F66K40的内部ADC参考电压如果取5V10位分辨率对应的LSB是5V/10244.88mV。用4.88mV除以每摄氏度0.195mV算下来一个码字对应大约25℃。也就是说哪怕ADC完全无噪声你的温度分辨率也只有25℃一级。这还没把参考电压温漂、PCB漏电、电源纹波算进去实际读数跳个十几度非常正常。这不是PIC一家的问题而是几乎所有MCU内置ADC的通病为了控制成本内部参考源、采样保持电路和输入开关的串扰都做得比较一般。MCU的强项是逻辑和通信不是模拟前端。所以在工业和HVAC项目里成熟的架构永远是“MCU做控制外置高精度ADC做采集”两部分各司其职。1.2 24位Δ-Σ ADC到底做了什么ADS122U04IPWR是一颗24位、4通道的Δ-Σ ADC。注意“Δ-Σ”这个词它跟传统的逐次逼近型ADC走的是完全不同的路线。逐次逼近型ADC像一把皮尺一次性把电压切成1024份Δ-Σ ADC则像一位反复称重的计量员通过过采样、噪声整形和数字抽取滤波用速度换精度把量化噪声推到高频段再滤掉。对温度这种变化很慢的物理量来说这套策略非常合适。温度信号本身变化慢采样率不需要高20SPS就够但分辨率要求高、抗干扰要求高Δ-Σ恰好全占。以内部2.048V参考为例24位补码的满量程是2^238388608一个LSB对应0.244µV。对比PT100 500µA激励下每摄氏度0.195mV的灵敏度理论上温度分辨率能到0.001℃级别。实际有效位数受噪声限制20SPS下通常也有21位以上温度分辨率到0.01℃级毫无压力。更重要的是这颗料把模拟前端常用的东西都集成进去了可编程增益放大器PGA、两路匹配的激励电流源IDAC、内部温度传感器、可选的外部参考。以前这些得用一堆分立元件搭现在一颗TSSOP-16就搞定这对PCB面积和生产一致性都是好事。1.3 为什么选UART版本的ADS122U04ADS122U04IPWR后缀里的“U”代表UART接口这也是我当初选它而不是ADS1220SPI接口的核心原因。SPI通信至少要SCLK、MISO、MOSI、CS四根线在工业现场时钟线既是干扰源也是敏感线布线稍不注意就会把变频器的高频噪声耦合进去。UART接口只需要两根线PIC的TX接ADC的DINADC的DOUT/DRDY接PIC的RX。9600波特率下几米的板内走线非常从容抗电磁干扰能力比SPI强不少。ADS122U04的数据速率最高到330SPS温度应用通常只用到20~90SPS9600波特率的带宽完全够用。再一个原因是PIC18F66K40本身有双EUSART。一路固定给ADS122U04另一路可以接RS-485收发器跑Modbus RTU或者接人机界面屏互不干扰。PIC18F66K40还支持PPS引脚重映射UART的TX/RX能映射到任意普通IO上PCB布局非常灵活这在后面硬件设计部分会详细说。另外提一句“IPWR”这串后缀不是功能差异PW代表TSSOP-16封装R代表卷带包装。ADS112U04是这颗料的16位版本如果只做NTC这种低成本传感器用16位版能省一点成本但考虑到PT100、热电偶甚至以后要扩展更高精度的测量我建议直接上24位版省得以后重新设计。2. 传感器到MCU的硬件链路热电偶、RTD和NTC分别怎么接ADS122U04IPWR的四个模拟输入AIN0~AIN3可以配置成2路差分或4路单端具体选哪种取决于传感器类型。温度传感器里最常见的三种热电偶、RTD铂电阻、NTC热敏电阻正好对应三个典型接法。我建议把差分通道留给热电偶和RTD单端通道留给NTC。2.1 热电偶毫伏级小信号与冷端补偿电路热电偶输出的热电势很小。K型热电偶的灵敏度大约是41µV/℃0~1000℃的输出范围是0~41.276mV。这类毫伏级信号必须经过PGA放大后才能充分用足ADC的量程。ADS122U04的PGA增益从1到128可调选多少需要算一下。内部参考2.048VPGA128时满量程输入是2.048V/12816mVK型热电偶在1000℃输出41mV直接超量程。所以K型热电偶我实际用的是PGA32满量程64mV覆盖0~1000℃还有余量如果测量范围只到500℃PGA64也够。J型热电偶灵敏度约55µV/℃PGA32同样合适。热电偶自身是浮地器件两端没有固定共模电位所以要在AIN0和AIN1各接一个几百kΩ到1MΩ的偏置电阻把输入共模电压拉到ADC允许的范围。这个细节很多人会漏导致读数漂移或者跳变。还有一个所有热电偶方案都绕不开的点冷端补偿。热电偶输出的电压是热端与冷端的温差电压必须知道冷端温度才能换算出热端绝对温度。冷端温度传感器要尽可能靠近热电偶接线端子而不是贴在ADC旁边。如果你用ADS122U04的内置温度传感器做冷端补偿它测的是芯片结温只适合粗略估算真要满足工业验收我建议在端子排附近放一颗0.1%精度的NTC或者专用的冷端补偿芯片让探头去感受真正的冷端温度。2.2 RTD三线制PT100与比例式测量RTD铂电阻的测量核心是“比例式测量”这也是ADS122U04这类带IDAC电流源的ADC最大的价值。比例式测量的思路是让同一个IDAC电流同时流过PT100和一颗精密参考电阻RrefADC把Rref上的电压当作参考电压实际测量的就是PT100电阻与Rref的比值。这样一来IDAC电流的绝对值精度和温漂在计算中被抵消测量结果只取决于Rref的精度。Rref选0.1%或更高精度的金属箔电阻温度漂移做到5ppm/℃以内。具体取值要算一笔账。假设IDAC设500µAPT100在0℃时是100Ω两端电压50mV到400℃时电阻约247Ω电压变成123.5mV。外部参考Rref选3.9kΩ500µA流过它产生1.95V参考电压接近内部2.048V参考又不超限。PGA增益选8此时满量程是1.95V/8243.75mV覆盖0~400℃的123.5mV信号绰绰有余。如果选PGA16满量程变成121.9mV接近超量程风险太大。接法上两线制是最不建议的导线电阻直接串进测量回路20米的铜线几十欧姆比PT100本身还金贵。工业上最少要用三线制IDAC电流从AIN0经一根导线到PT100从PT100另一端经第二根导线回到公共端第三根导线作为电压检测线接入差分输入的负端。这样两根导线上的压降被差分测量抵消剩下的误差只剩检测线上的微小电流可以忽略。如果精度要求更高可以做四线制但HVAC领域三线制已经足够。PT100的自热效应也要留意。500µA在100Ω上产生的功率只有25µW几乎可以忽略如果用1mA激励功率变成100µW在无风密闭套管里可能带来0.1℃级别的误差。能选500µA就不要上1mA。2.3 NTC分压电路HVAC的低成本选项HVAC里大量的回风温度、送风温度、盘管温度用的是10kΩ NTCB值通常3950。NTC的接法比PT100简单得多用一颗精密电阻做分压NTC下端接地分压点接ADC的单端输入AIN2即可。分压电阻选择与NTC标称值同阻值的10kΩ在25℃时分压点恰好在中间灵敏度最高。NTC的优点是便宜、响应快、灵敏度高——在25℃附近10k NTC的温度系数大约-4.4%/℃折算成电压变化非常明显缺点是B值离散度较大批次间一致性不如PT100标定工作量会上来。所以我的经验是HVAC的舒适性控制用NTC完全够但如果是工艺冷却水这种要参与费用结算或者工艺联锁的测点老老实实上PT100。还有一个操作细节NTC分压电路的参考电压最好直接取ADC的内部参考2.048V而不是用系统3.3V电源。因为ADS122U04内部参考是稳定的基准源而电源电压会随负载波动直接决定分压比换算电阻的精度。这一点在后续固件标定里会体现出来。2.4 ADC与PIC18F66K40的UART接线和PPS重映射ADS122U04IPWR与PIC18F66K40的通信只有三根线真正关键PIC的EUSART1_TX接到ADS的DINADS的DOUT/DRDY接到PIC的EUSART1_RXADI的RESET引脚接一个GPIO用于上电复位控制。我这个配置里把RESET也接到了GPIO而不是简单用RC延时电路因为软件可控的复位对调试和异常恢复很重要。PIC18F66K40的PPS功能在这里非常加分。PPS允许把UART的TX和RX重映射到几乎任意普通IO引脚这意味着你在画PCB时可以先把模拟信号走线规划好再把UART信号安排到不穿越模拟区域的位置。用MPLAB Code ConfiguratorMCC配置时选择EUSART1模块点两下TX和RX的引脚映射就生成了比自己手工翻寄存器安全得多。硬件走线方面UART的两根线要尽量短、尽量远离功率管、变压器和继电器。ADS122U04的DIN和DOUT都属于数字信号但离模拟输入太近时翻转沿还是可能串扰到微弱的热电偶信号上所以在布局时保持至少5~10mm的间距比较稳妥。2.5 电源与去耦容易被拖后腿的环节ADS122U04IPWR是模拟混合器件AVDD和DVDD最好分开处理。我常用的做法是系统5V经过磁珠或者小电感后给AVDD供电DVDD与MCU共用3.3V两个电源域在PCB上做单点连接避免数字电流回流穿过模拟区域。每个电源引脚旁边放0.1µF陶瓷电容再在电源入口放一颗10µF钽电容或者大尺寸MLCC做低频储能。ADS122U04的参考电压如果使用内部2.048VVREF引脚的去耦电容不能省一颗1µF以上、ESR低的X7R电容直接贴近引脚放别走太多过孔。很多人忽视的是模拟地的回流路径。ADC的AGND引脚必须单独走线回到电源端子不能与MCU的数字地共享一小段铜皮。曾经有个项目模拟地走线太细继电器吸合瞬间温度读数跳了1℃多查来查去就是地线上几百毫伏的脉冲压降。把模拟地加粗、加宽、缩短回流路径之后干扰立刻消失。3. 固件落地的关键动作EUSART初始化、寄存器配置与数据解析硬件链路通完之后固件是决定项目成败的另一半。PIC18F66K40的固件其实不复杂但有几个关键动作容易被理解偏差波特率计算、上电时序、寄存器写入意图、24位数据符号扩展。一个一个过。3.1 EUSART1初始化与波特率误差ADS122U04的UART默认匹配标准8数据位、无校验、1停止位8N1。PIC18F66K40使用内部16MHz振荡器时9600波特率的SPBRG值计算如下SPBRG Fosc / (16 × Baud) - 1 16000000 / (16 × 9600) - 1 ≈ 103.17取103。实际波特率是16000000 / (16 × 104) 9615.38误差约0.16%在UART容差范围内很稳。初始化代码如下// PIC18F66K40内部16MHz振荡器9600波特率 void UART1_Init(void) { SPBRGH1 0x00; SPBRG1 103; // 16MHz/(16*9600)-1 BAUDCON1bits.BRG16 1; // 16位波特率发生器 TXSTA1bits.BRGH 1; // 高速模式 TXSTA1bits.TXEN 1; // 使能发送 RCSTA1bits.SPEN 1; // 串口使能 RCSTA1bits.CREN 1; // 使能接收 // 清掉上电时可能残留的接收标志 RCSTA1bits.CREN 0; RCSTA1bits.CREN 1; }发送和接收函数用最标准的轮询方式即可。接收这边我建议开中断因为ADS122U04在连续转换模式下会自主把数据推给MCU主循环去轮询RCIF很容易丢帧或者被别的逻辑卡住时序。void UART1_WriteByte(uint8_t byte) { while (!PIR1bits.TXIF); TXREG1 byte; } uint8_t UART1_ReadByte(void) { while (!PIR1bits.RCIF); return RCREG1; }void __interrupt() ISR(void) { if (PIR1bits.RCIF) { rxBuf[rxIndex] RCREG1; // 收进环形缓冲区/状态机 PIR1bits.RCIF 0; } }3.2 ADS122U04的上电时序与命令帧结构ADS122U04不是一上电就能通信的它需要一个复位过程。我的启动序列是MCU复位后先等待100ms让ADC电源稳定然后拉低RESET引脚至少10µs再释放等待DRDY指示就绪接着发送启动转换命令进入工作模式。它的命令帧结构遵循“命令字节 地址/参数 数据”的模式。以写配置寄存器为例主机依次发送写命令码、寄存器起始地址、要写入的寄存器数量、随后是寄存器数据。读数据的时候先发读数据命令然后从DOUT上接收对应字节。这里特别说明一下不同批次数据手册上的具体命令码可能有差异我在示例代码里用宏定义统一管理烧录前务必对照TI官方数据手册的Command Definitions章节核对。// 命令码以数据手册为准这里给出框架 #define ADS_CMD_RESET 0x06 #define ADS_CMD_WRITE_REG 0x40 #define ADS_CMD_READ_DATA 0x60 #define ADS_CMD_START 0x103.3 写寄存器按配置意图而不是背地址我见过不少新手死记寄存器地址值换一颗料就抓瞎。正确的做法是先明确配置意图再去数据手册找对应位域。下面这个表格是我在PT100三线制项目里的实际配置意图你可以对照自己的传感器改配置项选值目的输入MUXAIN0-AIN1差分接入三线制PT100PGA增益8匹配123.5mV满量程信号数据速率20SPS兼顾噪声抑制和响应时间转换模式连续转换简化主循环时序参考电压外部Rref3.9kΩ比例式测量抵消IDAC漂移IDAC电流500µAPT100激励自热可忽略IDAC路由IDAC1输出到AIN0驱动PT100写寄存器流程的代码框架uint8_t adsConfig[4]; // adsConfig[0] 对应REG0按数据手册的MUX和PGA位域填充 // adsConfig[1] 对应REG1按数据速率和模式填充 // adsConfig[2] 对应REG2按参考和IDAC档位填充 // adsConfig[3] 对应REG3按IDAC路由引脚填充 UART1_WriteByte(ADS_CMD_WRITE_REG); UART1_WriteByte(0x00); // 从REG0开始 UART1_WriteByte(0x04); // 连续写4个寄存器 for (uint8_t i 0; i 4; i) UART1_WriteByte(adsConfig[i]);写完之后我会读一遍配置寄存器回读验证。别嫌麻烦这套“写后读”在排错时能帮你快速区分是寄存器没写进去还是数据换算错误。3.4 读取24位结果并正确做符号扩展ADS122U04是24位ADC转换结果用二进制补码表示读出三个字节后需要正确合并和符号扩展。很多人栽在这里三个无符号字节直接拼起来结果一个最简单的负数就变成几百万的诡异数字。正确做法是先把最高字节强制转为有符号8位再左移16位这样符号位能自然扩展// 假设buf[0]是MSB, buf[1]是中间, buf[2]是LSB int32_t raw ((int32_t)(int8_t)buf[0] 16) | ((int32_t)buf[1] 8) | (int32_t)buf[2];如果编译器对int8_t的符号扩展行为不放心可以手动判断int32_t raw ((int32_t)buf[0] 16) | ((int32_t)buf[1] 8) | buf[2]; if (raw 0x800000UL) raw | 0xFF000000UL;电压转换公式也很关键。带符号24位补码的满量程是2^238388608所以float voltage ((float)raw) / 8388608.0f * (vref / pga);以外部参考1.95V、PGA8为例raw4194304时电压4194304/8388608×(1.95/8)0.121875V正好对应PT100在390Ω附近的压降计算链条是闭合的。3.5 连续模式还是单次模式现场判断ADS122U04支持连续转换和单次触发两种模式。连续模式下ADC转换完自动把数据推给MCU主循环只要在收到数据帧时处理就行时序最简单适合绝大多数工业和HVAC应用。缺点是MCU始终得挂着接收中断功耗略高。单次模式适合电池供电或者多通道轮询的场景每次发启动命令等DRDY变低后再读数据读完可以立刻让ADC进入低功耗状态。代价是时序控制复杂度上升而且如果DRDY处理不及时容易读到陈旧数据。我的建议是有市电的HVAC设备直接连续模式便携式仪表或者需要严格控制待机功耗的场景才用单次模式。另外如果数据速率选20SPS一个数据周期是50msMCU只要确保50ms内能响应一次接收中断就行PIC18F66K40的16MHz主频完全没问题。4. 从ADC原始码到温度值线性化、滤波与现场标定ADC原始码只是电压或者电阻的镜像距离“温度读数”还差三步传感器非线性校正、滤波、系统标定。这一步处理得好传感器精度才能被24位ADC真正发挥出来处理不好再贵的ADC也白搭。4.1 RTD温度反算用查表还是迭代PT100的电阻-温度关系使用IEC 60751标准公式就是Callendar-Van Dusen方程。0℃以上时可以简化成R(T) R0 × (1 A×T B×T²)其中A3.9083×10⁻³B-5.775×10⁻⁷。反算温度就是解一元二次方程直接在MCU上用求根公式float RTD_OhmToTemp(float R, float R0) { float ratio R / R0 - 1.0f; float disc A * A - 4.0f * B * ratio; if (disc 0.0f) return -999.0f; return (-A sqrtf(disc)) / (2.0f * B); }这个公式在0~200℃范围内精度可到0.1℃以内对HVAC和大多数工业现场完全够用。如果测量范围要延伸到0℃以下方程里会多一个C×(T-100)×T³项没法直接求根这时用查表加线性插值更省心。PIC18F66K40的64KB Flash可以轻松放一张0.1℃步进的PT100对照表查表插值复杂度低代码也更可控。4.2 K型热电偶的冷端补偿与线性化热电偶的难点不在ADC读数而在冷端补偿。K型热电偶在冷端0℃时直接输出热端毫伏值但实际上冷端不可能一直待在0℃所以必须把冷端温度换算成等效毫伏加到测量值上再反查表。过程分三步读取冷端温度。用紧贴接线端子的NTC或专用冷端传感器实测冷端25℃。查K型热电偶表得到25℃对应的热电势大约1.000mV。ADC测到的热端电压加1.000mV得到“以0℃为冷端的等效热电势”再反查表得到热端温度。在MCU里实现就是查两张表一张是从温度查毫伏冷端补偿时用一张是从毫伏查温度最终转换时用两张表间隔1℃相邻点线性插值K型整个0~1000℃范围也就1001个点Flash完全放得下。这里有个容易忽略的点热电偶表的基准是ITS-90查表前要确认ADS122U04测得的电压是经过PGA放大后的值先除以PGA还原成真实毫伏再做补偿和查表。否则放大倍数一旦带入查表过程结果错得离谱。4.3 两层滤波中值去尖峰、滑动平均去抖动ADS122U04本身在20SPS下已经有内置数字滤波器对工频50Hz/60Hz有抑制但工业现场还有变频器、继电器、接触器产生的随机尖峰干扰。我习惯在MCU里再套两层滤波先做N5的中值滤波把明显的脉冲毛刺剔除再做N8的滑动平均平滑输出。中值滤波的实现就是把最近5个采样点放进数组排序取中间值抗尖峰能力极强代价是延后两个采样周期。滑动平均本质上是一个低通滤波器N越大输出越平滑但滞后越大。温度控制回路对滞后的容忍度相对较高20SPS下N8对应0.4s延后HVAC完全够用如果是工业温控PID建议N取4避免影响控制稳定性。两层滤波顺序不能反先中值后滑动平均。如果先滑动平均一个尖峰会被平均到后续好几个点里相当于污染范围扩大处理起来更棘手。4.4 两点标定和三点标定的实操24位ADC给系统带来的好处就是标定过程变得非常“干净”。两点标定的思路是测出零点偏移和增益误差然后用线性校正修正。实际操作中我用精密电阻箱模拟PT100的电阻值比用水浴锅、干井炉更方便。把电阻箱设到100Ω记录ADC换算出的温度值记为T1再把电阻箱设到200Ω记录T2。假设电阻箱准确那么校正后的温度就是T_corrected T_raw - offset / gain其中gain (T2 - T1) / (R箱2对应温度 - R箱1对应温度)offset T1 - 标准值。如果你有干井炉或者冰水浴温度点的校正更直接0℃用冰水混合物注意要等冰水充分平衡100℃用沸水要考虑当地海拔修正沸点两个点之间做线性校正即可。要求更高就做三点标定比如0℃、50℃、100℃三个点分别计算每一段的增益非线性能被修正得更干净。标定完记住把修正系数写到EEPROM或Flash里还要在设备上电时做一次自检——读内部温度传感器确认芯片工作正常再进入正常测量流程。这个自检步骤在工业验收时很加分能避免现场装完发现整批读数偏移才发现是标定丢失。5. 现场实测踩过的坑通信时序、布线和干扰的对抗记录硬件和固件都调通之后真正的考验才刚开始。现场环境和实验室最大的差异就是干扰来源多、随机性强。这节记录的是我实际踩过并且花费不少时间才解决的几个问题全是常规文档里不会写的细节。5.1 DRDY时序不对导致的数据错位第一次上电连续模式下读数偶尔出现“飞点”一个几千欧姆的电阻突然跳成负数让排查了半天。用逻辑分析仪看UART波形才发现ADS122U04在转换完成后会自主把数据帧发出来而MCU主循环里负责读取的代码执行时机不确定数据流没有被帧边界对齐收到的三个字节错位了。解决办法有两个方向方向一利用DRDY信号。ADS122U04的DOUT/DRDY引脚在数据准备好时会拉低MCU可以把这脚接外部中断中断触发后再读取UART数据从根上保证不会错位。方向二在接收中断里做帧状态机。约定帧头MCU不断接收三个字节按命令号校验无效帧丢弃。我最终选择的是接收中断加状态机因为DRDY引脚一旦接到外部中断后续想复用这个IO做输出就麻烦了。状态机的核心是收到命令帧首字节后后续两个字节强制归位到同一帧任何超时或者命令不匹配都重启状态机。5.2 长线屏蔽层处理与输入RC滤波现场有几路热电偶线从二楼桥架拉下来长度超过20米读数在变频器启动时会有规律性跳动。起初以为是屏蔽层没接把所有屏蔽层两端都接地结果干扰反而更严重——这是典型的地环路问题。正确的做法是屏蔽层单端接地。我把它改成在控制器端子处单点接地传感器端悬空地环路电流立刻消失读数跳变幅度下降了90%。如果现场条件不允许单端接地至少保证屏蔽层与信号大地之间只有一个连接点。另外模拟输入前端要加RC低通滤波。我在AIN0和AIN1各串了一个1kΩ电阻对地接0.1µF电容截止频率约1.6kHz既能抑制射频干扰又不会影响20SPS的数据速率。注意RC滤波的电阻值不能太大否则会与传感器阻抗分压产生增益误差1kΩ对于PT100和热电偶都够安全。5.3 上电顺序、复位延时和首字节丢失有个现象很诡异设备冷启动时第一帧温度数据永远是垃圾值后面就正常了。排查到最后是MCU和ADC上电速度不一致导致的。ADS122U04的电源还没稳定MCU已经把启动命令发过去了ADC要么没收到要么收错了。解决方法是三层保险MCU上电后延时100ms再拉RESET引脚做一次软件复位复位后发送一个命令读取版本或者状态寄存器等ADC确认回复UART初始化后立刻做一次“假读”把上电瞬间误触发接收缓冲区里的残留字符清掉。首字节丢失的问题同样常见。MCU使能EUSART接收的瞬间线上噪声可能造成一个假起始位RCREG里出现一个0x00后续数据全部错位。解决办法就是初始化完成后把RCREG读一次丢弃同时检查并及时清零OERR上溢错误标志。5.4 一组实测稳定性的参考数据最后给一组实验室环境下的实测数据供大家心里有个底。所有数据都是ADC在连续模式、20SPS、两层滤波开启后的表现传感器配置连续采样100次的最大波动备注PT100三线制IDAC500µA, PGA8, 外部参考3.9kΩ±0.03℃对应电阻波动约±0.012ΩK型热电偶PGA32, 冷端NTC补偿±0.2℃主要受冷端温度和表精度影响10kΩ NTC分压到AIN2, 内部参考±0.05℃常温HVAC场景可以看到PT100通道在24位ADC下的稳定性确实对得起这颗料热电偶的波动主要来自冷端补偿和热电偶本身的噪声NTC的波动则受制于它的非线性。如果PT100通道标定后仍然有整体偏移先检查Rref的实际阻值再确认PGA设置是否和数据手册一致这两个点是所有“差一度”问题的第一嫌疑。实际接入变频器环境后干扰主要体现在热电偶通道上这是由热电偶输出阻抗高、信号电平低的天性决定的。这时的应对就是前面说的屏蔽层单端接地、输入RC滤波、中值滤波去掉尖峰三步全做下来热电偶的动态波动可以压在±0.5℃以内作为HVAC回风温度或工业管道温度的监测已经是可靠的水平。最后分享一点个人体会高精度ADC只是精度链路的起点传感器本身的精度、参考源的稳定性、布线规范、滤波算法任何一个环节拉胯最终误差都不会小。ADS122U04IPWR这颗料的24位分辨率和UART接口确实省心但真正决定你能不能在HVAC验收里拿到漂亮数据的往往是冷端补偿的位置、屏蔽层接地的那一头、以及上电时序里那100ms的耐心。把这些细节当回事温度测量这块基本就稳了。