1. 项目概述与系统拆解搞温度测量这件事说简单很简单说难也真难。简单的是拿个NTC电阻加个单片机ADC口就能读个大概难的是在工业和HVAC这种环境里你要的是长时间稳定、可重复、抗干扰、还要能校准的可靠数据。我这次用的组合是TI的ADS122U04IPWR加Microchip的PIC18F86J55前者是一颗带UART接口的24位Δ-Σ ADC后者是一颗80引脚的高性能8位单片机。这套方案很适合那些对精度有要求、但又不想把系统搞得太复杂的场景。先说说为什么选这两颗料。ADS122U04IPWR这颗ADC最特别的地方是它把UART接口直接做进了芯片里单片机只需要两根线就能跟它通信不用去折腾SPI时序也不用占用宝贵的IO口。对于PIC18F86J55这种8位机来说这简直是省心到家了——本来8位机的资源就紧巴巴的能省一个外设是一个。另外这颗ADC是24位的内部自带可编程增益放大器PGA、温度传感器、低漂移基准源还能做内部校准基本上是给传感器测量量身定做的。PIC18F86J55这边它跑在3.3V有64KB flash两个UART模块还有足够多的IO口。在HVAC控制板这种场景里它除了读温度还经常要管风机、阀门、继电器这些东西一个单片机全包了不用再挂协处理器。所以从系统架构上看这其实是一个高精度前端通用控制核心的经典组合各干各擅长的活。这个项目适合谁来参考主要是三类人一是做工业现场仪表开发的工程师天天跟PT100、热电偶打交道的二是做HVAC机组控制、楼宇自控、商用空调系统的人三是想学高精度数据采集但不想一上来就啃ARMLinux那种复杂平台的学生或爱好者。这套方案的好处在于MCU门槛低ADC又帮你扛了绝大部分精度压力整个系统做出来不那么玄学一次成功率非常高。2. ADS122U04IPWR核心原理与工程要点2.1 Δ-Σ架构到底好在哪很多第一次接触这款芯片的人会问同样是24位为什么不用SAR型ADC这里面的门道在于Δ-Σ架构和SAR型在测量场景上的根本差异。SAR型ADC是逐次逼近一次转换一个点速度快但噪声性能一般Δ-Σ型则是过采样加噪声整形用极高的采样率把量化噪声推到高频段再由数字滤波器把高频噪声削掉。放在温度测量这种信号本身变化很慢的场景里Δ-Σ架构的优势是压倒性的它可以在几百毫秒的转换时间内把有效分辨率做到20位以上这是SAR型很难做到的。ADS122U04内部结构你可以这么理解前面是一个可编程增益放大器把微伏级别的传感器信号放大到ADC核心能吃的幅度中间是Δ-Σ调制器负责把模拟信号变成密集的1位数据流最后是数字滤波器把数据流整理成标准的结果。整个过程下来芯片对噪声的压制能力不是靠堆电路而是靠算法和架构赢来的。2.2 数字滤波器的选择与转换时间计算ADS122U04的数字滤波器有两种工作模式正常模式和快速模式。正常模式下滤波器带宽低噪声最低但转换时间也长输出速率在20SPS左右快速模式牺牲一部分噪声性能把输出速率提升到400SPS以上。我在这个项目里用的是正常模式把输出速率设成20SPS因为温度信号本身就是慢变量1秒能出20个稳定读数已经绰绰有余换来的是更好的噪声抑制能力。这里有个实际的计算经验可以分享ADS122U04的转换时间不是固定的它跟你的输出速率、滤波器配置都有关系。如果你设成20SPS单次转换时间大约是50毫秒左右但如果你开启了内部校准校准过程会额外占用一定时间。所以在固件设计上我强烈建议把校准放在上电初始化阶段执行一次而不是每次读取都做。每次读数前都去校准白白浪费了宝贵的转换时间而且对慢变温度信号来说毫无必要。2.3 激励电流源与RTD的匹配ADS122U04内部有两个可配置的激励电流源用于给RTD热电阻供电。电流大小可以设成10μA、50μA、100μA、250μA、500μA、750μA、1000μA这几档。这个选择不是拍脑袋定的核心考量是自热效应和信号幅度之间的平衡。电流越大RTD上的压降越大ADC读到的信号信噪比越高但电流通过电阻产生的焦耳热会让电阻自身温度升高导致测量偏差。以PT100为例0℃时阻值100Ω如果你用1mA电流信号幅度是0.1mV这个信号其实已经很不小了但PGA增益设置到128倍时满量程范围内的检测能力非常高。不过1mA电流在100Ω电阻上产生的功耗是0.1mW虽然听起来不大但在高精度测量中自热误差已经不可忽视了。我实际测下来PT100用500μA到1mA的激励电流自热误差大概在0.05℃到0.15℃之间具体取决于探头封装和散热条件。如果是PT1000因为阻值大、同样电流下压降大、功耗也更大就适合用250μA或者500μA。我做HVAC项目时系统传感器用的是PT1000激励电流就选了250μA电流小、功耗低自热几乎可以忽略。做工业项目时要用PT100激励电流提到500μA在精度和自热之间取了一个平衡点。3. 传感器选型与信号链计算3.1 PT100、PT1000、热电偶怎么接ADS122U04有四个模拟输入通道可以配置成多种工作模式针对不同传感器有不同的接法。我在这套系统里实际验证过三种传感器的接入方式PT100、PT1000、K型热电偶。它们的信号链参数差异很大需要逐个来算一遍。先看PT100。如果做高精度测量必须用4线制接法两个引脚给激励电流两个引脚测电压。这种接法能彻底消除引线电阻的影响——由于测量回路中几乎没有电流流过所以测到的电压就是纯RTD两端压降。如果现场条件只能拉三根线那就用3线制用两个相同的激励电流源分别给传感器引线和参考电阻供电通过比例测量抵消引线电阻。2线制最简单但引线电阻直接串入测量回路PT100每根线多1Ω电阻温度读数就会偏2.6℃这在工业上是完全不可接受的我只能说2线制适合那种完全不在乎精度的场合。PT1000的好处是阻值大1000Ω起步同样激励电流下信号幅度比PT100大10倍PGA增益压力小信噪比高而且自热效应相对弱。代价是PT1000的灵敏度只有约3.85Ω/℃比PT100差了10倍左右但这在24位ADC面前根本不是问题。热电偶则是另一条技术路线。热电偶的阻值跟温度无关输出的是毫伏级电压信号而且是差分信号不需要激励电流。接入ADS122U04时需要把PGA配置成高增益模式同时开启内部冷端补偿功能——芯片内部有温度传感器会实时测芯片温度再由固件做冷端温度换算。热电偶的好处是测温范围极宽从-200℃到1300℃都能覆盖坏处是精度受限即使做了冷端补偿整体误差也很难优于±1℃适合工业烤箱、烟道这类高温场景。3.2 增益、基准与分辨率计算信号链设计最核心的就是把传感器输出幅度和ADC的量程匹配好。ADS122U04的PGA增益有1、2、4、8、16、32、64、128共8档模拟输入满量程取决于增益和基准电压。拿PT100接4线制来算激励电流500μA温度范围0℃到100℃时RTD阻值从100Ω变化到138.5Ω压降从50mV变化到69.25mV。差分信号最大幅度约19.25mV。如果用PGA增益32倍输入ADC核心的信号变成616mV这没有超过基准电压的一半完全在合理范围内。此时理论上能分辨的温度由ADC位数决定24位ADC配合这个增益理论分辨率远小于0.001℃但实际受噪声限制有效分辨率大概能到0.005℃到0.01℃之间这就足够用了。这里有个非常关键的工程问题——基准电压。ADS122U04内置基准源默认是2.048V这个基准值直接参与了ADC转换的比例关系。你不需要知道具体的电压值是2.048V还是2.047V因为Δ-Σ ADC采用的是比例测量原理信号电压和基准电压的比值就决定了数字输出。只要是同一个基准同时供给了ADC和激励电流源或者参考电阻基准源的绝对精度就不会影响最终测量结果。这就是比例测量带来的最大好处。做热电偶时就又不一样了。K型热电偶在0℃到1000℃范围内热电势大概是4mV到41mV。这个信号幅度变化很大但热电偶测量不需要激励电流冷端补偿靠内部温度传感器增益建议设在64倍或128倍把小信号抬起来。3.3 一个小型HVAC系统的完整信号链我做了一个实际项目空调机组的回风温度和送风温度各接一个PT1000冷水盘管的进出水温度各接一个PT1000这4路一共占了ADS122U04的四个通道。每路都配了可切换的激励电流源采用3线制接法激励电流250μA。信号链算下来0℃时PT1000压降是250mVPGA增益设为8倍时信号幅度约2V配合2.048V基准量程刚好不溢出。整个系统上电后25℃时的实测数据非常稳短时噪声在±0.02℃以内这个表现远超当初的预期。4. PIC18F86J55的工程角色与固件实现4.1 为什么这颗8位机完全够用有人可能会觉得都2025年了还用8位单片机做数据采集是不是有点老派但如果看穿了系统的实际需求你会发现PIC18F86J55在这套架构里承担的角色非常轻。它只做三件事通过UART跟ADC说话读取转换结果然后执行温度换算和控制策略。所有的模拟精度问题都在ADC这边解决了单片机不需要碰任何模拟信号也不需要对信号做复杂的数学处理。温度换算也就是查表和线性插值PT100/PT1000的阻值-温度对照表是现成的存到Flash里用二分查找加线性插值就能算出来这套流程在8位机上跑起来毫无压力。而HVAC的控制逻辑比如PID调节风机转速、控制阀门开度本身也不需要大算力PIC18F86J55的MSSP模块、PWM模块、UART模块都够用。我特别想强调PIC18F86J55的耐温和宽电压特性。在工业现场有些器件的运行温度能到85℃甚至105℃这颗单片机在宽温范围内的工作稳定性是经过长期验证的在空调机组里靠着压缩机旁边也能扛得住。这种可靠性不是只看主频或者RAM大小就能评判的。4.2 UART通信时序与命令设计ADS122U04的UART接口逻辑电平是1.8V到5.5V兼容的所以跟3.3V的PIC18F86J55直连是没有问题的。通信协议是标准的8N1波特率最高到1Mbps但实际项目里我建议用57600或115200低了浪费高了在长导线上容易出误码。ADS122U04的命令格式值得一提芯片有两个独立寄存器组命令字里有一个字节用来区分是读寄存器还是写寄存器是启动转换还是读转换结果。这个芯片没有传统的片选引脚它的UART通信全靠帧结构来识别所以每一帧数据的字节数和时序必须严格对齐。我踩过的坑就是刚上手时按照习惯每次发送命令后不等响应就接着发下一条结果芯片状态机完全错乱读回来的数据全是垃圾。正确做法是发一条命令等芯片回完整响应帧再发下一条命令。这个一问一答的时序在固件里必须严格执行。4.3 核心固件逻辑框架初始化流程里我要做这么几件事配置PIC18F86J55的UART1模块波特率1152008位数据无校验1位停止位配置需要的IO口把ADC的PGA增益、基准、通道多路复用器、激励电流、滤波器全部通过寄存器配置写好执行一次自校准把偏移和增益误差校准掉。然后进入主循环周期性地读取四路温度。每次读取的过程是选择通道启动转换等待DRDY信号这个信号可以从ADC的DRDY引脚拉出来接到PIC的INT引脚做中断也可以靠延时轮询读数据。我用的是DRDY引脚接中断的方式这样单片机在转换期间可以去处理风机控制、通信这些任务不用死等。实测下来四路温度全部读完大概需要200多毫秒完全满足HVAC系统的控制周期要求。这里放一段核心初始化代码PIC18F86J55用的是MPLAB X IDE XC8编译器void ADC_Init(void) { // 配置UART1用于与ADS122U04通信 U1BRG 51; // 115200波特率Fosc64MHz U1MODE 0x8008; // 8位数据无校验使能UART U1STA 0x8400; // 使能发送和接收 // ADC寄存器0: 配置PGA增益8启用内部基准 // ADC寄存器1: 配置激励电流250uA接入AIN0-AIN1通道 // 具体命令字节需要参考ADS122U04数据手册的寄存器映射表 }上面代码里的注释写得比较宽泛因为不同项目的通道配置差异较大。但核心思路很清楚UART先通再配寄存器最后做校准。这个顺序不能反如果寄存器没配好就启动转换读出来的数据毫无意义。4.4 温度换算的最优实现方式从ADC读回来的是24位原始码值这个码值经过两步换算才变成温度先把码值换算成电阻值再把电阻值换算成温度。第一步比例换算R (Code / 0x7FFFFF) × Reference / Gain / Iexcite。这个公式里的每个参数你都必须心里有数。第二步查表加线性插值。我把PT1000的R-T表按每10℃一个点存进Flash里然后用二分查找找到区间再做线性插值。PT1000的温度系数非线性比较明显但在10℃的区间内做线性近似精度损失可以控制在0.02℃以内完全够用。5. 工业现场的抗干扰设计与PCB布局实战5.1 噪声来源根本不是你想的那个很多人一提到工业环境抗干扰就想着怎么加屏蔽、怎么上隔离却忽略了最基本的问题——参考地。ADS122U04这种高精度ADC对参考地的要求远高于普通数字芯片。如果你把ADC的模拟地跟继电器的驱动地混在一起哪怕PCB走线只长了那么几厘米地弹噪声都会直接叠加在测量信号上。我在这个项目里做的最关键的决定是PCB面分割。整个板子分成三个区域模拟信号区ADS122U04、传感器接口、精密电阻、数字控制区PIC18F86J55、UART、继电器驱动、电源区DCDC、LDO。模拟地和数字地在ADC芯片下面单点汇合通过一个0Ω电阻回到系统地。这条地线原则看起来老生常谈但很多人就是不执行最后读到的数据毛刺严重还误以为是ADC不行。还有一个容易被忽略的噪声源是开关电源的纹波。如果系统的24V电源纹波有50mV这个纹波会通过LDO的PSRR衰减一部分但高频段的衰减能力有限最后可能会以共模噪声的形式出现在ADC输入端。解决办法是传感器信号线走双绞线或者在ADC输入端加一个RC低通滤波器。电容用100nF配合电阻形成约1kHz的截止频率就行太高了滤不掉高频噪声太低了会把有用的慢变信号也衰减掉。5.2 PCB布局时我实际踩过的坑我在这个项目的第二版PCB上翻过车——把激励电流源的参考电阻选成了普通的厚膜电阻。结果温度读数在25℃时正常70℃时偏了大约0.4℃。后来查明原因厚膜电阻的温度系数能达到±100ppm/℃在70℃环境下阻值就漂了几十ppm。这0.4℃的误差完全就是参考电阻漂出来的。解决办法是把参考电阻换成金属箔电阻或者精密薄膜电阻温度系数做到±5ppm/℃以内价格贵一点但对比整套系统的制造成本来说是值得的。我又把所有精密电阻都选了Vishay或者国巨的精密系列并且在PCB布局时把它们放在远离发热元件的地方——尤其是DCDC芯片和继电器这些器件发热能轻松把局部温度推高10℃以上。另一个方案是用磁珠做模拟电源和数字电源之间的隔离。ADS122U04的供电从LDO出来后先过一个磁珠再接去耦电容到芯片引脚。磁珠能压住高频段的噪声串扰实测对ADC输出的标准差改善非常明显。但要注意磁珠的额定电流得留够余量如果ADC功耗本来就小电流不大选一个100Ω100MHz的磁珠就够了。5.3 ESD和浪涌防护工业现场有个残酷现实操作人员会随手摸传感器接头电缆可能几十米长雷击感应也会在线缆上产生浪涌。这些能量如果不加防护直接进ADC引脚就是烧芯片的节奏。我在传感器接口端加了一级TVS管双向钳位电压5V加一级串联电阻组成最基础的防护网络。TVS管吸收瞬态能量串联电阻限流确保到达ADC引脚的电压不会超过绝对最大额定值。HVAC系统里还有个特例室外温度传感器经常安装在屋顶雷雨季节特别容易出事。我给室外传感器的输入通道增加了额外的二级防护——在PCB上加了一个气体放电管再配合TVS和电阻形成三级防护。这套方案虽然不是军工级但在实际项目中用了两年没发生过一次雷击损坏。6. 系统集成与HVAC场景适应性分析6.1 HVAC项目中的精度需求到底有多苛刻做HVAC的人可能听惯了精度±0.5℃就够了这种说法但真到了工程验收时很多项目要求的精度其实是显示精度±0.1℃控制精度±0.5℃。这个差距很大。显示精度是给人看的如果回风温度显示24.9℃实际是25.4℃虽然不影响机组运行但客户拿红外测温枪一对比就会质疑你整个系统的水平。这套方案能保证的是在15℃到35℃这个HVAC核心测温区间内系统长期稳定性在±0.05℃以内短期噪声在±0.02℃左右。这意味着显示值可以安心理直气壮地显示到小数点后两位而不被人打脸。控制精度则主要取决于控制策略PID调好了送风温度稳定在设定值±0.2℃以内是有可能的。6.2 与传感器安装位置相关的工程细节传感器装在哪对测量结果的影响有时比ADC本身的精度还大。HVAC机组里常见的问题是回风温度探头离风口太近直接吹到冷风读出来的温度就不代表回风平均温度误差甚至能到2℃-3℃。这完全不是电子设计能解决的是测量方法学的范畴。我在实际项目里总结了一条经验所有温度探头都要加防辐射罩尤其是室外温度和屋顶管道温度。阳光直射会让探头本体温度升高好几度导致测温偏高。具体做法是探头放在百叶式的通风罩里保证气流正常流通但辐射热量进不去。另外探头要尽量延长到管道中心位置而不只是贴在管壁测外壁温度管壁热阻会造成不可控的测量延迟。6.3 多传感器一致性校准方法HVAC系统动辄要用到6路、8路甚至更多温度传感器这些传感器之间的一致性直接影响了整个系统的控制效果。如果同一工况下各路传感器读数差了0.3℃控制逻辑就会认为各区域温差很大从而做出错误的调节动作。这是工业现场最常见的隐性故障。我的做法是出厂前做一轮多传感器校准把整机所有探头放到同一恒温槽或同温块上设定25℃和50℃两个校准点记录每路的偏差值然后把这些偏差补偿值写进系统的Flash里。后续运行时固件直接把每路ADC读数加上各自的补偿值再参与控制逻辑。这个方法能让系统内各路传感器的一致性做到±0.05℃以内成本几乎没有增加但效果立竿见影。7. 常见问题与排查技巧实录7.1 读数全是零或者固定值这个现象我见过太多次了新手尤其容易遇到。第一步查激励电流源有没有正常输出。方法很简单用万用表电流档串在传感器回路上看电流有没有250μA或500μA。如果没有检查寄存器配置特别是激励电流源有没有被意外关闭。第二步查通道选择。ADS122U04的多路复用器配置在寄存器里如果你选了AIN0-AIN1但传感器其实接在AIN2-AIN3上读数肯定是固定值。拿着万用表直接量ADC输入引脚上的电压看有没有信号这一步能快速定位是前端接线问题还是配置问题。7.2 读数飘、噪声大这种情况十有八九是地线没处理好或者传感器信号线受到了干扰。先做一个简单的测试把ADC输入端直接短路看输出码值的标准差。如果短路时的噪声都很大说明问题在ADC自身或电源如果短路时很稳一接真传感器就飘那大概率是传感器侧引入了共模噪声或标称值不对的干扰源。我遇到过一个有趣的问题设备离变频器很近变频器一启动温度读数就开始周期性跳变跳变频率跟变频器的载波频率重合。最后通过在信号线加屏蔽层并单端接地以及ADC输入端加100nF电容彻底解决了。7.3 UART通信时好时坏通信不稳定的排查思路要从电平、波特率、时序三个维度入手。先示波器看波形确认幅值是否达到芯片要求的逻辑电平门限再用逻辑分析仪量UART帧的时间间隔确认波特率误差在2%以内最后检查固件的收发流程是否严格遵守一问一答时序。我特别提醒PIC18F86J55的UART中断优先级和主循环的时序要协调好如果中断响应不及时缓冲区溢出丢了字节那通信失败就防不胜防了。7.4 一个我从没在文档里看到的坑ADS122U04内部有一个转换器忙状态芯片在转换过程中收到新的命令时不会立即响应而是等当前转换完成才会处理。很多工程师在代码里发完启动转换命令后立刻去读结果寄存器结果读回来的是上一次的旧数据白白产生了一个周期的延迟。我的解决办法是启动转换后轮询DRDY引脚等它拉低后再读数据。这样能保证你读到的永远是本次转换的结果而不是陈年老数据。8. 工具与调试设备建议做这类高精度的模拟采集项目工具选对了能省一半的调试时间。我平时必用这三样一个四位半以上的万用表用来量激励电流和基准电压一台双通道示波器查UART时序和观察干扰波形一台逻辑分析仪抓UART报文逐字节核对。总投入不到2000元这是值得的。另外强烈建议在固件里加一条用来输出内部诊断信息的调试命令。可以通过第二路UART把ADC寄存器内容、校准系数、各通道原始码值等实时打印到电脑串口助手。这个工具在排查问题时有时候比示波器还管用尤其是当你需要确认芯片内部配置和预期一致的时候。再补充一句ADS122U04建议先拿一块TI官方的评估板跑通再画自己的板子。评估板上的布局布线是经过验证的你照着抄一遍等于把别人踩过的坑全避开了。当年我就是太自信跳过评估板直接画了PCB结果第一版硬件连UART都通不了白白浪费了一个多月。后来买了评估板对照着才找出了布局问题。所以先评估板后自制能省下大量时间这个顺序不要颠倒。