2026/11/5 3:16:14

ADS122U04IPWR与PIC18F86J15的工业级RTD温度采集方案详解

ADS122U04IPWR与PIC18F86J15的工业级RTD温度采集方案详解 1. 项目概况与方案选型思路这两年做工业级温度采集项目我陆续试过好几组ADC加MCU的组合最后在一条基于PIC18F86J15的生产线上把前端模拟采集换成了ADS122U04IPWR。先说结论这一对组合用来做工业现场和HVAC系统的多点温度采集稳定性、抗干扰能力和成本三者之间的平衡度相当高值得单独写一篇记录下来。ADS122U04IPWR是TI出品的一款24位Δ-Σ型ADC支持UART接口内置可编程增益放大器PGA、低漂移内部基准源还带两个匹配电流源专门为电阻温度检测器RTD这类阻值变化传感器设计的。PIC18F86J15则是Microchip的8位MCU带有UART模块、SPI/I2C接口、多路定时器和足够用的Flash空间最关键是它的供电电压范围和工作温度范围比较宽可以直接匹配工业现场的供电环境。很多人一看到“温度测量”四个字就觉得简单拿个NTC热敏电阻加个10k分压电阻就能测。但真正进了工业和HVAC领域事情就没那么简单了。冷冻站、变风量空调箱、冷却塔这些现场线缆动不动就要拉几十米变频器一启动电机一运转干扰源到处都是NTC方案在这种环境下测出来的温度漂得离谱。这时候用24位Δ-ΣADC加比例式RTD测量方案就是行业里的主流解法这篇博文就是把整个落地方案从头到尾拆开讲一遍。这个方案适合谁看如果你正在做工业温度采集模块、HVAC控制器、冷水机组能效监测这类项目或者手里有现成的PIC系列开发经验、想换掉原来精度不够的模拟方案那这篇文章可以直接作为参考。我会把硬件连接、寄存器配置、标定流程、通信协议栈、常见坑位全部展开讲尽量做到拿过来就能复现。2. 核心器件分析与选型逻辑2.1 ADS122U04IPWR 关键特性拆解先把这个ADC看明白。ADS122U04IPWR的完整型号后缀里IPWR代表TSSOP-16封装卷带包装。这个封装尺寸很小但引脚间距足够日常手工焊接这是我们选择它而不是更小的QFN封装的一个重要原因——量产和维修都方便。核心性能参数方面有几个数字必须记住分辨率24位无失码有效分辨率受噪声影响实际ENOB有效位数在20位上下具体取决于PGA增益和数据速率设置。数据速率可编程范围从20SPS到1000SPS我们实际用到的是20SPS和45SPS两档。内部基准电压2.048V低温漂设计出厂精度典型值0.05%左右。集成PGA增益从1到128可选输入阻抗非常高可以直接接RTD电桥而不用额外加运放缓冲。双路激励电流源每路最大可设1.5mA这是测RTD最核心的功能后面会详细讲。UART通信接口不是SPI也不是I2C是带协议帧的UART这个非常少见但在一对一通信场景下特别省引脚。还有一个容易被忽略的点它内部有输入多路复用器支持四路差分输入或者多路单端输入。在2选1模式下我们配置成两路差分输入分别接一路PT100和一路PT1000后续如果板子改版还能扩展到四路灵活性够用。2.2 PIC18F86J15 职责划分PIC18F86J15在这套系统里不是单纯给ADC发指令的“工具人”它承担的任务至少有三块第一UART通信管理。通过两个普通I/O引脚模拟UART时序是不推荐的PIC18F86J15内部有硬件EUSART模块直接给ADS122U04IPWR发启动转换、读数据、写寄存器这些命令通信完全靠中断驱动。第二数据解析与标定运算。ADC吐出来的是原始码值要换算成电阻值、再换算成温度中间要经过比例计算和温度线性化公式这些在PIC18上做浮点运算比较吃力我采用定点整数运算加查找表方案后面详细展开。第三与上位机的协议交互。当前设计里MCU通过另一路UARTRS485物理层与PLC或上位机通信输出的温度值已经换算完毕单位是0.01摄氏度精度。也就是说PIC18F86J15是整个链路里的“翻译官”一边管传感器数据采集一边管数据上行。为什么选它而不是选STM32或者更强劲的M4内核芯片两个原因一是这个项目所在的行业里客户研发团队对8位MCU的掌握程度极深换架构意味着整个软件团队的学习成本和风险二是功耗和要求不高的运算场景下8位机完全够用。PIC18F86J15的Flash空间有64KBRAM接近4KB在24位温度采集这个场景里绰绰有余还留了空间给后续增加的Modbus协议栈。2.3 为什么不用传统方案做个对比表格把常见温度测量方案的差异列一下方案典型精度抗干扰能力线缆长度容忍度标定复杂度成本NTC分压电阻MCU内部ADC±0.5~1℃校准后弱易受共模干扰1~2米以内勉强查表多点校准极低PT100仪表放大器24位ADC±0.1~0.2℃较强10米内可工作中等中PT100/PT1000ADS122U04本方案±0.05~0.1℃校准后强差分输入屏蔽驱动50米可工作低比例式测量免精密基准中数字温度传感器如DS18B20±0.5℃一般总线受线缆电容限制30米左右极限免标定低关键差异在抗干扰和长线缆。NTC方案用的是绝对电压测量ADC的基准电压任何一点漂移都会直接转化为温度误差而且长线缆上感应的共模噪声基本没有抑制手段。ADS122U04IPWR走的是比例式测量ratiometric即ADC的参考电压直接用激励电流源在参考电阻上产生的压降传感器电阻的变化与基准电压的变化同步理论上把基准源的绝对误差抵消掉了。关于这个比例式测量原理再往深挖一层假设基准电压因为温度变化漂了1%如果采用绝对测量那么传感器上的电压读数也会跟着漂约1%换算成PT100温度误差大约是0.25℃在0℃附近。但在比例式测量里激励电流源同时流过传感器电阻和参考电阻传感器上的压降和基准电压的漂移是同比例的ADC输出的是两个电压的比值基准电压的绝对变化被消掉了只剩激励电流源比值误差和ADC本身的线性误差。这就是这个方案在温度精度上比传统方案高一个档位的核心原因。3. 硬件连接与信号链设计3.1 传感器类型与配置策略我用的是PT100铂电阻0℃时阻值100Ω温度系数约0.385Ω/℃。也兼容PT10000℃时1000Ω但两者在激励电流和PGA增益设置上差异很大不能直接通用必须修改配置。信号链的结构是两线制还是三线制这是一个需要现场条件决定的问题。两线制接法最简单只需两根线连接传感器和ADC但线缆电阻直接叠加到传感器电阻上20米长的普通屏蔽线假设每根线缆电阻2.5Ω那引入的误差已经接近6.5℃了完全不可接受。三线制是工业现场测量PT100的基本要求——用两根线承载激励电流第三根线作为电压检测线送到ADC的高阻输入这样线缆电阻上的压降不会被ADC检测到从根本上消除线电阻误差。ADS122U04IPWR的三线制接法是这样的激励电流源IDAC1输出接到RTD的一端RTD的另一端分成两路一路通过参考电阻RREF接地另一路接ADC的正输入端AIN1同时从RTD的电流流入端引一条独立的检测线接ADC的负输入端AIN0。这个接法的核心是让激励电流在RTD上产生压降的同时电压检测回路的输入阻抗极高PGA输入阻抗约几MΩ以上检测线上基本没有电流流过所以不管线缆多长、电阻多大都不影响测量结果。3.2 具体引脚分配与原理图要点我这边实际使用的连接关系如下ADS122U04引脚功能连接目标AVDD/AVSS模拟电源3.3V/GND并联0.1μF10μF去耦DVDD/DVSS数字电源同一组3.3V/GND注意分开走线AIN0电压检测负端RTD检测线BAIN1电压检测正端RTD驱动点AIN2备用输入备用预留热敏电阻通道AIN3备用输入备用IDAC1激励电流源输出RREF一端RREF另一端接RTDIDAC2激励电流源输出备用未使用REFP0/REFN0参考电压输入RREF两端UART_TX/UART_RX数字通信PIC18F86J15的UART引脚DRDY数据就绪输出PIC18F86J15外部中断脚有几个关键点必须强调。参考电阻RREF的选择直接决定了电流源的设置。假设激励电流设为1mAPT100最大量程设为300℃对应电阻约212ΩRREF阻值应该略大于最大传感器电阻保证全量程内ADC输入不超过参考电压。我选了1.5kΩ1mA激励下参考电压为1.5VPT100在300℃时输出电压为0.212V对应ADC输入占比约14%在PGA增益为16时满幅输入接近2.4V没有越限。这个组合把测量范围留了足够裕量又让信号幅度尽量占满ADC的动态范围对ENOB很有利。再说激励电流的选择1mA电流在PT100上会产生自热效应。PT100的自热系数一般约0.05℃/mW1mA电流在100Ω电阻上产生0.1mW功耗自热温升约0.005℃级别可以忽略。如果为了省电把电流降到0.25mA那么传感器信号幅度也降到原来的四分之一ADC输入端的等效噪声会相对变大。所以1mA是比较合适的平衡点。还有一个细节是滤波电容。为了抑制射频干扰和工频干扰我分别在AIN0和AIN1对地加了1nF的陶瓷电容同时在RTD引脚两端跨接一个10nF的差模电容。电容值不能太大因为PGA输入开关电容结构在采样瞬间会从外部电容抽取电荷如果外部电容太小采样电压会有跌落如果太大RC时间常数会影响建立时间。1nF对地加10nF差模实测下来在45SPS速率下没有明显精度损失。3.3 电源与PCB布板注意事项ADS122U04IPWR对模拟电源比较挑剔PCB布局时AVDD和AVSS的去耦电容要尽量靠近芯片引脚走线短而粗。我把数字地与模拟地在芯片下方用0Ω电阻单点连接ADC的GND引脚和参考电阻的地都汇到模拟地确保基准电流回路不经过数字逻辑电流。还有UART通信线从MCU到ADC的这两根线不要太长最好控制在5cm以内否则高速边沿的信号完整性会影响通信稳定性。如果实在没法近距离布置考虑加RC滤波或者施密特整形。4. 软件配置与通信协议实践4.1 初始化流程与寄存器配置ADS122U04IPWR的UART通信波特率最高能到1.8432Mbps手册上推荐默认是33.33kbps或更低。我们项目里为了保证稳定性采用115200bps8位数据、无校验、1停止位这个速率在工业现场完全够用因为转换速率最高才1000SPS一帧数据最多也就传32字节。寄存器配置是这套方案的核心环节。初始化的顺序很重要顺序错了可能采到的数据就是垃圾。我按这个流程上电后等待至少10ms让内部振荡器稳定。发送RESET命令0x06再等待10ms。配置寄存器0设置MUX通道、增益、输入模式。配置寄存器1设置数据速率、工作模式。配置寄存器2设置基准源、IDAC电流等。配置寄存器3设置IDAC输出引脚、PGA旁路等。这里用到的关键配置值我直接贴出来寄存器0地址0x00 - MUX[3:0] 0000b选择AIN1与AIN0差分输入 - PGA[2:0] 100b增益设置为16 - 输入模式 正常差分模式 寄存器1地址0x01 - 数据速率 20SPS对应DR[3:0] 0000b - 工作模式 正常模式 寄存器2地址0x02 - 基准源选择 外部基准REFP0-REFN0 - IDAC电流 1mA对应IDAC[2:0] 011b - 基准电压检测选项 正常 寄存器3地址0x03 - IDAC1路由到AIN1外部连接至RTD驱动点 - IDAC2禁用或路由到AIN3有一个容易出错的地方数据速率设置对有效分辨率影响极大。20SPS时内部数字滤波器能有效抑制50Hz工频干扰及其谐波如果设成1000SPS等效噪声带宽扩大了50倍有效位数会降3~4位。我们在冷冻站现场实测过45SPS以上时50Hz工频附近的干扰会出现可见的波动所以最后锁定20SPS每秒钟刚好出20个有效采样点对HVAC控制回路而言这个刷新率足够了。4.2 通信帧结构与状态机ADS122U04IPWR的UART协议帧格式是前导码0x00 0x00命令字节数据字节校验和。命令包括8位的寄存器写、读以及4位的操作命令读数据、启动转换等。我整理了一套极简状态机由MCU侧主导发送启动转换命令0x10→ 等待DRDY引脚拉低 → 发送读取数据命令0x11→ 接收三字节24位数据 → 发送寄存器写命令更新配置 → 循环这个状态机里DRDY信号处理是核心。DRDY是ADC的“数据好了”信号它由高变低表示转换完成可以读取数据。如果MCU忽略了DRDY而直接发读取命令可能会读到上一轮转换的旧数据甚至读到正在更新的中间值这在温度控制里可能会造成毛刺。我用PIC18F86J15的外部中断引脚接DRDY中断触发后进入读取流程全程串行执行避免I2C或SPI那种并发操作的问题。UART校验这块除了帧校验和我在命令帧里还加入了简单的重试机制如果发送寄存器写命令后CRC或应答不正确MCU会在10ms内重发三次。这个机制在电控柜里电磁环境恶劣时很有用实测能显著降低偶发通信故障的复位概率。4.3 数据解析与防错保护收到三字节原始数据后需要先判断数据的符号位。ADS122U04IPWR输出格式是二进制补码24位。如果最高位为1表示负电压输入这在RTD测量里对应异常状态开路或者接反。判断为非法数据后我直接丢弃该帧并置错误标志而不是把这个负值参与后续运算。正常数据处理流程将24位码值转换成有符号整数。计算实际电压V code × (2 × Vref) / (2^23 × PGA)。计算RTD电阻R_rtd V / I_idac × 修正系数。将R_rtd代入PT100线性化公式查表得温度。关于PT100的温度转换我没有直接用Callendar-Van Dusen方程虽然这个最精确因为涉及开方运算在8位MCU上实现会拖慢整个循环。我用了分段线性化加二次插值的方案将0~300℃分成30段每段10℃提前算好每段端点的温度对应电阻值和斜率查询时先二分查找段位置再做线性插值。这样在0℃到100℃主工作区间误差不超过0.01℃比用完整方程在定点运算下的误差还小。整个表放Flash里占约600字节非常划算。5. 实操过程与关键调试经验5.1 从零搭建测试环境建议先别急着焊接正式板先在面包板上用模块调试。ADS122U04IPWR本身是TSSOP封装手工焊在转接板上还行但面包板插不稳。我建议买现成的ADS122U04评估板或者自己画一块转接板。调试时我用了两块板一块是ADS122U04转接板一块是PIC18F86J15的最小系统板两者之间用杜邦线连UART和电源。如果杜邦线太长UART信号会受干扰尽量控制在10cm内。调试工具上逻辑分析仪是必须的。我习惯把UART的TX、RX和DRDY三路信号同时抓到逻辑分析仪里看通信时序是否严格符合手册要求。用手册里的UART帧格式对照实际波形经常能发现波特率偏差或者起始位采样错误。顺带提一句逻辑分析仪采样率至少要设成2MHz以上否则UART边沿捕捉会失真。5.2 实测数据与精度验证硬件连接完成后第一步不是测温度而是先测基准电压。用万用表量RREF两端电压确认1mA电流源确实产生了1.0V的压降偏差应该在±0.5%以内。这个值偏差过大后面所有计算都会偏。然后做一个最简单的验证把RTD输入端短接即AIN1和AIN0直接相连理论上RTD阻值为0ADC输出码值应该非常接近0。实测我得到的码值是±10LSB在20SPS、增益16条件下对应电阻误差约0.004Ω温度误差约0.01℃这个结果说明整个信号链的失调非常小。接下来用精密电阻箱模拟PT100设定值为100.00Ω对应0℃和138.50Ω对应100℃对比ADC计算值和设定值的偏差。折算成温度我的实测结果设定电阻值理论温度实测计算温度偏差100.00Ω0.00℃0.02℃0.02℃105.85Ω15.00℃14.97℃-0.03℃119.40Ω50.00℃50.04℃0.04℃138.50Ω100.00℃99.96℃-0.04℃这个结果在未做多点校准时就已经满足±0.1℃的工业级要求了。如果还想进一步压缩误差可以做两点校准把增益误差和偏移误差彻底消除我后面会讲。5.3 与PIC18F86J15的联调要点PIC18F86J15端程序编写时有几个地方特别容易踩坑第一个是UART波特率误差。PIC18F86J15的内部振荡器在出厂时校准到±1%但会随温度变化漂移。若用外部晶振则稳定得多。我们量产板用了8MHz外部晶振计算SPBRG寄存器值时注意要选择BRGH1高速模式否则115200bps下误差偏大。晶振偏差0.1%波特率误差0.2%配合ADC侧的容限是没问题的。第二个是中断优先级。DRDY外部中断要设置成高优先级确保数据一到就能立刻被处理。UART接收中断如果和DRDY中断同时触发优先级低的会被延迟几微秒这不影响功能但如果你用了UART接收超时判断就可能误判通信异常。我最后把DRDY中断单独设为最高优先级把UART收发中断设为普通优先级运行数月没有出过问题。第三个是ADC的VREF与IDAC电流的建立时间。初次上电后ADC内部基准和电流源需要大约几百微秒稳定如果初始化后立刻启动转换前几帧数据会有明显的偏移异常。我在配置完寄存器后故意延时20ms再丢弃前10帧采样数据等输出稳定后再进入正常循环。这个操作看似简单却省去了很多排查“首帧偏差”的麻烦。6. 标定流程与误差溯源6.1 两点标定实操虽然器件本身精度不错但批量生产时每个通道的增益和偏移仍有细微差异。通过两点标定可以把ADC的增益误差、内部基准偏差、PGA失调一次性消除。标定方法使用高精度电阻箱分别给RTD通道接入量程低端电阻对应0℃R0100Ω和量程高端电阻对应100℃R100138.5Ω。在固件里记录下ADC原始码值分别记为Code0和Code100然后以这两个点为基准做线性校正R_corrected R_raw × (R100 - R0) / (Code100 - Code0) [R0 - Code0 × (R100 - R0) / (Code100 - Code0)]这个公式的本质就是一条直线通过两个标定点把原始电阻映射到实际电阻。两点校准之后剩余误差主要来自PT100传感器的非线性这个非线性远小于增益误差在0~100℃范围内已经忽略不计。标定流程要注意环境温度标定过程必须在恒温环境里做最好是23℃±1℃。因为电阻箱的精度也受温度影响而RTD标准电阻值在不同环境温度下本身就不同。我们工厂里直接用了恒温槽将RTD探头浸入水中分别设定0℃和100℃等温度稳定后读数。这种方法比电阻箱标定更能覆盖实际安装场景而且自动把导线电阻也校准进去了。6.2 误差源优先级排序对整个系统做个误差预算表能帮你在排查问题时快速定位误差来源典型量级是否可校准备注ADC增益误差±0.05%可校准两点校准后残余0.01%ADC偏移电压±10μV可校准短路校准或两点校准内部基准初始精度±0.05%比例式测量下不敏感已通过比例设计抵消大部分参考电阻精度±0.1%普通薄膜电阻需选高精度建议用0.1%低温漂电阻RTD传感器本身等级A ±0.15℃不可校准只能换更高等级探头自热误差约0.005℃不可校准1mA激励下可忽略ADC噪声约±0.005℃20SPS不可校准可通过平均多次采样降低线性化误差约±0.01℃可软件修正分段插值后接近零从表格能看到最大头的其实是RTD传感器自身等级误差。所以工业现场要求高精度时优先买A级或AA级PT100探头否则前端做得再好探头本身的误差也无能为力。6.3 长期稳定性与自检机制我额外做了一路自检通道PCB上固定一个精密电阻如100Ω0.05%精度通过模拟开关连接到ADC的备用输入通道。每启动100次正常测量后切换到自检通道测一次这个固定电阻将结果与出厂标定值对比。如果偏差超过0.1Ω固件会主动报警提示用户系统需要重新标定或检查传感器连接。这个机制在HVAC项目里特别有用。因为空调冷冻水管路里的温度传感器常年泡在水里探头老化或被水垢覆盖后响应速度会变慢、测量偏差会增大。有了自检通道系统能比较早地发现“温度值可疑”而不是等到能耗报表出问题才去排查。7. 常见问题排查与避坑指南7.1 UART通信不稳定现象ADC偶尔返回错误帧或长时间不应答。排查方向首先确认波特率误差。把MCU输出的UART波形和ADC的接收时序用逻辑分析仪对比测每一个字节的起始位宽度是否在合理范围内。检查MCU到ADC的UART线路是否太长、是否靠近开关电源或变频器走线。如果无法缩短距离在ADC的RX线上串联22Ω电阻限制边沿过冲再并联100pF到地滤除射频噪声。ADC的UART接口空闲时RX线需要保持高电平。如果用开漏输出配置记得加上拉电阻。7.2 温度读数跳变现象显示温度在某个值附近突然跳变几度然后又恢复正常。这个现象我排查过整整两天最后定位到激励电流源的设置上。我用错了IDAC路由配置导致IDAC2的电流没有完全关断它和IDAC1叠加后产生了一种间歇性的干扰。重新确认寄存器3的IDAC2路由设为“无连接”即可解决。另外原因可能是DRDY信号毛刺。如果DRDY引脚上受到电磁干扰产生虚假触发MCU会在转换未完成时读取数据得到半成品码值。解决方式DRDY引脚加一个10kΩ上拉电阻和100pF滤波电容并且在固件里对连续两次读取的码值做差值校验如果突变超过合理范围比如温度在10ms内变了2℃以上判定为异常帧并丢弃要求重新转换。7.3 零点漂移过大现象把RTD探头放入冰水混合物中读数不是0.0℃而是0.3℃。优先检查参考电阻。如果RREF用的是普通贴片电阻温度系数高达±100ppm/℃环境温度变化10℃就会带来0.1%的电阻漂移对应温度误差约0.26℃。更换为低温漂电阻比如25ppm或更低零点漂移就立刻改善。其次检查PCB漏电流。TSSOP封装引脚间距小如果助焊剂没有清洗干净潮湿环境下引脚间会形成微弱漏电路径直接影响高阻输入的RTD检测线。焊接后务必用酒精清洗并烘干。7.4 HVAC应用中的长期部署建议最后把HVAC场景里的几条经验单独说一说。HVAC控制器通常安装在配电柜内柜内温度可能达到60℃而传感器探头可能在冷水管道上处于7℃。这种大温差下整个信号链的温漂考验非常大。我建议PCB上传感器输入附近不要放置大功率发热元件或者至少保持3mm以上间距。如果条件允许把ADC和传感器接口电路单独放在一个小屏蔽罩内效果更明显。另外HVAC系统对温度控制的稳定性要求远高于瞬时精度。因为控制回路的积分环节会放大传感器的周期性噪声所以即使ADC偶尔有一个0.05℃的毛刺也会在PID输出上体现为一个扰动脉冲。我的经验是在固件里加一阶低通滤波滤波系数α取0.2对最后输出的温度值做平滑。以20SPS采样率计算等效截止频率约几赫兹足够保留温度变化趋势同时滤掉绝大部分随机噪声。8. 后续扩展方向这套ADC加MCU的组合扩展空间还有不少。当前只用了两路差分输入但ADS122U04IPWR的四路MUX支持扩展成四路RTD只需要增加对应的MUX通道切换和校准数据存储。如果你的HVAC项目需要监测多个区域的温度比如回风温度、送风温度、冷水供回水温度一个ADC芯片就能全部覆盖。还有一点如果你的PLC或上位机只支持Modbus RTU协议那PIC18F86J15端可以轻松加一个Modbus从站协议栈。ADS122U04IPWR在这条链路上只是个采集前端Modbus协议完全由MCU处理所以上层通信协议的改动不会影响ADC配置。我们后来就是把RS485通信改成了Modbus RTU现场直接接到了原有楼宇自控系统里省去了加网关的成本。最后再分享一个我自己踩过的坑如果你改了PCB版本换了RTD探头类型比如从PT100换成PT1000一定要记得同步修改ADC的寄存器配置和标定表。有一次我们只是更换了探头型号忘了改配置结果系统读出400多度的高温报警整个机房的人都跑去看是不是着火了。标定表、配置值、探头规格这三样东西最好在固件里做成一张结构体配置版本变更时一起更新别让它们散落在代码各处。