news 2026/11/5 1:07:13

基于ADS122U04与PIC18F57K42的高精度RTD测温系统设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于ADS122U04与PIC18F57K42的高精度RTD测温系统设计

温度测量在HVAC和工业现场,从来不是“接一个传感器、读一个数值”那么简单。我最近在调试一套多通道温度采集节点,核心就是 ADS122U04IPWR 这颗24位Σ-Δ ADC 和 PIC18F57K42 这颗8位MCU。把这两个器件搭在一起后,我发现与其说这是“测量温度”,不如说是在处理一整条信号链:激励电流的稳定性、参考基准的取法、数字滤波器的配置、线性化查表的精度,甚至MCU与ADC之间的电气隔离,任何一个环节掉链子,最后显示的0.1℃精度都会变成空话。这篇文章就把整个设计思路、关键参数选择、固件实现和调试中踩过的坑完整记录一遍,给正在做同类方案的人一个可复现的参考。

这个组合解决的痛点很明确:PIC18F57K42 虽然自带了12位ADC,但在工业现场的RTD测温中,12位分辨率只能做到约0.1℃~0.3℃的量化步长,加上噪声和长线干扰,稳定性很难保证。外接 ADS122U04 后,24位分辨率和内部PGA、IDAC电流源、温度传感器等外设,能让系统安安心心去测0.01℃级别的变化,而PIC专注做控制、通信和非线性运算,各司其职。下面从方案拆解、硬件连接、固件实现到问题排查,一条线讲完。

1. 方案拆解:为什么是“独立ADC + 8位MCU”的组合

1.1 温度信号链的精度瓶颈到底在哪

很多人拿到PIC18F57K42,看到里面有ADC就直接把PT100接上去读了,测完发现数值“能用但不好用”:室温下对的,放到空调回风口就漂,换一根长线又差出半度。这不是MCU本身差,而是12位ADC配合内部参考电压,在工业现场的噪声环境下很难做到高稳定度。

以Pt1000为例,温度系数大约是0.385Ω/℃,如果想分辨0.1℃,电阻分辨率就要做到0.04Ω左右。用1mA电流激励时,对应的电压变化只有40µV。12位ADC在2.048V参考下的LSB是0.5mV,也就是说一个码就要吃掉0.1℃以上,这还没算PCB漏电、电源纹波和走线耦合。不用外部高精度ADC,谈0.1℃精度基本是空中楼阁。

ADS122U04 的核心价值在于它是一条完整的模拟前端:24位Σ-Δ调制器、可编程增益放大器、两路IDAC激励电流源、内部2.048V基准、冷端温度传感器、输入开路检测,甚至UART物理层还带CRC校验。把这样一颗芯片放在传感器旁边,让模拟信号就近数字化,再用串口把数据送回MCU,是工业仪表最常见的架构。

1.2 ADS122U04 的突出特点:UART 接口比 SPI 更适合现场走线

ADS122U04 最让我看中的不是“24位”这个标签,而是它的UART接口。传统Σ-Δ ADC 大多走SPI,SPI在板内没问题,一旦传感器和主机之间隔了十几米甚至几十米屏蔽线,SCLK的沿噪声、时序抖动、时钟偏移都会成为隐患。UART是异步串行,两根线加共地就能传,线缆要求低,而且ADS122U04的串口可以配CRC校验,数据在长线传输中出错能被立刻发现。

这个特点在HVAC项目里尤其实用。比如中央空调的风管温度传感器分布在吊顶内,控制器在电控箱里,中间走线动辄十米。UART链路配合屏蔽双绞线,把波特率降到9600或19200,通信非常稳。相比之下,SPI在这种场景下有太多要操心的边沿问题。

1.3 PIC18F57K42 在这个设计里的定位

PIC18F57K42 是Microchip增强型8位MCU,最高主频64MHz,自带了EUSART、DMA、CLC、MVIO等外设。它的任务不是“测温度”,而是“管系统”:初始化ADC、轮询数据就绪、读取24位数据、做滤波和线性化、把温度值通过Modbus或CAN送出去,同时还要处理按键显示和告警逻辑。

选这颗芯片的另一个理由是它的智能模拟和数字外设配合得很顺手,尤其DMA可以把UART收到的ADC数据直接搬到内存,不占用CPU中断时间。MVIO(多电压I/O)也很有用,如果ADC的数字电源是5V而MCU核心是3.3V,I/O端口可以配置在不同电压域,省去一部分电平转换电路。实测下来这颗芯片在-40℃到85℃环境下的表现稳定,UART波特率误差用内部振荡器也能控制在合理范围内,但建议关键帧加校验,这个后面固件部分会细说。

2. 硬件设计:从传感器到UART链路的每一个细节

2.1 RTD类型选择和IDAC激励电流的权衡

传感器类型是整个方案的地基。HVAC系统里我常用Pt1000,因为工作温度范围通常在-20℃~150℃,Pt1000的阻值大,导线电阻占比小,自热效应也更容易控制;工业场合如果客户习惯Pt100,就直接改三线制接法。两者的线性度一致,固件里只要换一组查表数据就行。

ADS122U04内部有两路IDAC电流源,电流可以配置为0.15mA、0.25mA、0.5mA、1mA等挡位。电流越大,传感器上的信号电压越高,信噪比越好,但自热也越严重。假设用1mA激励一个1000Ω的Pt1000,热功率是1mW,在静止空气中可能引起0.1℃以上的自热误差,这在高精度应用里不能接受。我的经验是:Pt1000优先选0.5mA,Pt100四线制选1mA,如果传感器封装特别小、导热差,甚至降到0.25mA去换稳定度。

代码里我把激励电流做成一个配置宏,出厂前根据传感器类型改一行即可,不动其他逻辑。

2.2 比例式测量:让参考基准跟随激励电流漂移

这一节是RTD测量最容易遗漏的地方。如果ADC用内部2.048V基准,而测量回路用IDAC激励RTD,那么基准电压的温度漂移和激励电流的温度漂移是两条独立的误差路径,分别都会体现在最终温度里。

正确的做法是比例式测量:把IDAC电流同时引到一个高精度参考电阻RREF上,RREF两端的电压作为ADC的REFP/REFN。这样激励电流无论是1mA还是0.994mA,变化了多少,RTD上的电压和参考电压同时等比例变化,最终ADC码值只取决于RTD与RREF的电阻比,电流源的绝对精度和温漂基本被抵消掉了。

我原型的参考电阻选4.02kΩ,0.1%精度,25ppm/℃温漂,配合0.5mA激励,参考电压约2.01V,ADC输入范围足够覆盖温度范围内RTD的电压变化。需要注意的是,参考电阻一定要用低温度系数的金属膜或精密薄膜电阻,不能用普通贴片电阻。

2.3 PIC与ADC之间的UART连接、电平匹配和隔离

ADS122U04IPWR支持2.3V~5.5V供电,PIC18F57K42我跑在3.3V。最稳妥的办法是让两个器件共用3.3V电源,UART的TX、RX直接互联,不需要电平转换。如果ADC这边用了5V供电,那PIC的3.3V发送端无法直接满足5V逻辑,必须加电平转换芯片或分压电阻;ADC的TX输出到PIC的RX则相对安全,但最好确认高电平阈值。

工业现场建议做数字隔离。PLC、变频器、压缩机启停会在共地回路里注入共模电流,直接破坏测量结果,甚至打坏芯片。原型阶段我用过ISO7721隔离器,把UART的TX/RX分别隔离,电源用隔离型DC-DC给传感器侧供电,效果立竿见影:原本变频器一启动读数就会跳的现象,隔离后完全消失。

物理层连接顺序也要说清楚:PIC的TX接ADC的RX,PIC的RX接ADC的TX,这是最容易被新手上板反接的一步。反了之后表现是ADC完全不响应,排查方式就是拿示波器看有没有波形。

2.4 PCB布局和长线布线的心得

布局上,我建议把ADS122U04放在传感器接口附近,模拟输入走线短而粗,避免和UART数字线平行。模拟电源和数字电源从不同引脚进入芯片,各自用0.1µF陶瓷电容贴近引脚去耦,再在附近放一个10µF钽电容或大容量MLCC稳定低频。

RREF和RTD周边的走线要注意防漏电,板面清洗不干净、潮湿环境下,相邻走线间的漏电流可能达到几十纳安,对高阻信号来说是很大的误差源。我的办法是模拟输入周围铺一圈接地Guard环,并且在传感器端子和PCB之间涂三防漆。长线走线用屏蔽双绞线,屏蔽层单端接地,避免屏蔽层形成地环路。

3. 固件实现:寄存器配置、命令帧和温度换算

3.1 PIC侧EUSART初始化和命令帧交互

PIC18F57K42的EUSART初始化和普通UART一样,波特率由SPBRG寄存器产生。ADS122U04的串口Works in两种模式:一种是从机模式,由MCU发命令帧控制;一种是连续输出模式,ADC自己定时发数据。我在工程里用的是最稳妥的命令响应模式,只有MCU发命令,ADC才回数据,天然适合工业轮询协议。

命令帧的交互逻辑我封装成三个基础函数:写寄存器、读寄存器、读转换结果。发送时统一加CRC校验字节,接收时先判断帧头,再验证CRC,任何一步不对就直接丢弃,避免错位数据污染换算结果。下面这段是核心示意,注意命令码和寄存器位图建议以你手头数据手册为准,我这里重点展示交互逻辑。

#define ADC_START 0x02 #define ADC_RDATA 0x10 #define ADC_RREG(addr) (0x20 | ((addr) & 0x03)) #define ADC_WREG(addr) (0x40 | ((addr) & 0x03)) static void adc_send_command(uint8_t cmd) { uint8_t buf[4]; buf[0] = 0x00; // 帧头/同步 buf[1] = cmd; buf[2] = 0x00; buf[3] = crc8(buf, 3); eusart_write(buf, 4); } static int32_t adc_read_raw(void) { uint8_t raw[3]; adc_send_command(ADC_RDATA); if (!eusart_read_timeout(raw, 3, 50)) return ADC_TIMEOUT; if (!verify_crc_after_data()) return ADC_CRC_FAIL; return combine_24bit_signed(raw[0], raw[1], raw[2]); }

实际调试中,CRC校验不是可选项,尤其是ADC和MCU之间有十几米线缆时,偶尔误码不可避免。固件里如果连续出现CRC错误,我会触发重发,并累计错误计数用于现场诊断。

3.2 ADS122U04的四个配置寄存器怎么设

ADS122U04的寄存器不多,核心是四个。REG0里选输入通道和PGA增益;REG1里设数据速率和转换模式;REG2里配IDAC电流大小和基准缓冲器;REG3里管激励电流输出引脚和传感器开路检测。不需要死记每个bit,但要理解“增益、速率、电流”这三者的联动关系。

我的初始配置思路是:PGA设置在4倍或8倍,把RTD信号抬到足够幅度,同时数据速率选20SPS或45SPS,利用内部数字滤波把50Hz工频干扰压下去。如果客户需要更快刷新率再做175SPS等高速挡,但HVAC的控制周期普遍是几百毫秒,低速高稳更合适。需要注意的是,改REG1后要让ADC重新冷启动或发送START命令,否则配置可能不会立即生效,这个我调试时也遇到过。

3.3 24位原始数据的解析和RTD温度换算

读回来的三个字节需要拼成24位补码。ADS122U04输出是二进制补码格式,正温度信号对应正码值,所以合并时要把三个字节左移拼接,然后判断最高位是否为1。下面这段代码我实际在用,已经处理过负数问题:

static int32_t combine_24bit_signed(uint8_t hi, uint8_t mid, uint8_t lo) { int32_t val = ((int32_t)hi << 16) | ((int16_t)(mid << 8)) | lo; if (val & 0x800000) val |= 0xFF000000; // 符号扩展,保证负数正确 return val; }

得到ADC码值后,按比例式测量的公式算电阻:R_RTD = (code / 0x7FFFFF) * R_REF / PGA。为什么分母是0x7FFFFF?因为24位ADC的正向满量程码值是±8388607,读出码值对应满量程电压,而电压与RREF电压成比例。这个计算我放在PIC里用整数和定点乘法完成,避免动辄调用浮点库拖慢主循环。

接下来是把电阻换算成温度。最直接的方法是用IEC60751的Callendar-Van Dusen公式,但在PIC上每通道做浮点多项式运算不划算,硬件里查表插值是更稳的做法。我烧录了一张从-50℃到250℃的Pt1000电阻-温度关系表,步长1℃,闭环运行时先用二分法查表找到相邻两个温度点,再线性插值出0.01℃的分辨率。

static int16_t resistance_to_temp(uint32_t r_ohm_x1000) { // r_ohm_x1000 是电阻值乘1000后的整数 int lo = 0, hi = TABLE_POINTS - 1; while (lo < hi - 1) { int mid = (lo + hi) >> 1; if (pt1000_table[mid].res_x1000 < r_ohm_x1000) lo = mid; else hi = mid; } int32_t span = pt1000_table[hi].res_x1000 - pt1000_table[lo].res_x1000; int32_t now = r_ohm_x1000 - pt1000_table[lo].res_x1000; int32_t t100 = (int32_t)pt1000_table[lo].temp_x100 + ((int64_t)now * (pt1000_table[hi].temp_x100 - pt1000_table[lo].temp_x100)) / span; return (int16_t)t100; }

这个函数的好处是全程无浮点、无非线性逼近误差积累,代码量小,查表加插值在64MHz主频下耗时不到0.5ms。工程单位用0.01℃表示,送给上位机或Modbus寄存器时直接缩放。

3.4 两点标定和校准参数的存储

即便用了比例式测量,RREF电阻的0.1%误差、差分输入端的失调电压、以及PCB走线的微小不对称,都会带来系统性的增益和偏移误差。我的做法是校准两个点:0℃和100℃,用精密电阻箱模拟标准RTD,把ADC实际读到的码值与理论码值比较,计算出增益校正系数和偏移校正系数,然后存到PIC18F57K42的数据EEPROM中。

校准公式很简单:修正后温度 = 查表温度 × K_gain + K_offset。K_gain和K_offset在每次上电时加载,并设一个“校准有效”标志。如果客户更换了传感器或线缆长度,只需要重新校准,不需要重新编译固件。这个思路也可以扩展到单点校准,比如只做0℃偏移校准,能省掉一个冰水槽或精密电阻源。

4. 调试实录:从“有数据”到“数据可信”的三道坎

4.1 通信异常:无响应、CRC错误、数据错位的排查路径

第一次上电最典型的故障是ADC完全无响应。我的排查顺序是:先用示波器量PIC的TX引脚有没有波形的确在发命令,再量ADC的RX引脚有没有接收到,最后量ADC的TX有没有回数据。多数情况下是RX/TX接反,其次是ADC处于POWERDOWN模式还没被唤醒,还有少部分是波特率误差过大。

波特率误差是容易被忽视的。PIC18F57K42内部振荡器在常温下精度尚可,但温度或电压变化时会让UART位宽度偏移。如果通信距离又长,累计误差扩大,就会出现“能收到部分数据但CRC总是错”的问题。我的解决方法是使用外部晶振或者把波特率从115200降到19200。实测下来9600/19200在长线下几乎不丢帧。

另一个坑是命令帧错位。如果在发START后立刻发送RDATA,ADC可能还在转换,回的是上一次的数据或者空帧。固件要设计超时重读或者查询状态位,确保拿到的是新转换结果。我会在RDATA命令前先等待一个固定时间,时间长度根据数据速率算出来,宁可慢一点也不要错数据。

4.2 噪声和漂移:50Hz干扰、自热、风吹的影响

现场噪声问题往往不是“读数乱跳”,而是“有规律地跳”。风管机一启动,压缩机变频器开始PWM调制,读数就跟着波动。这种共模干扰在长线测温里非常常见。

我做过三组对比试验:不隔离、隔离、隔离加屏蔽接地。结果显示,数字隔离加屏蔽层单端接地后,噪声从±0.3℃降到±0.03℃以内。这说明在工业场合,隔离不是可选项,是必选项。

自热效应则是另一种隐蔽问题。传感器贴在风管里,风速高时散热快,自热误差小;风机关闭后空气静止,自热误差变大,读数会自己“升”上去。遇到这种情况,我会把IDAC从0.5mA降到0.25mA,并且用软件做了滑动平均滤波。另外,传感器本身的热质量也会带来时间滞后,这种滞后不是故障,是物理属性,上位机调PID时要考虑进去。

4.3 精度验证:用精密电阻箱代替RTD

为了验证整条链路,我用0.01%的精密电阻箱模拟Pt1000,分别在0℃、50℃、100℃、150℃四点标定。先记录下ADC原始码值和换算后的温度显示值,再和电阻箱对应的理论温度对比,得到误差表。下面是我其中一次记录的格式:

电阻箱设置理论温度上电显示校准后显示误差
1000.00Ω0.0℃0.13℃0.02℃+0.02℃
1194.03Ω50.0℃50.31℃50.04℃+0.04℃
1385.03Ω100.0℃100.56℃100.03℃+0.03℃
1573.19Ω150.0℃150.87℃150.05℃+0.05℃

从这个表能看出,硬件本身有约0.5℃的增益误差,主要来自RREF的精度;校准后全量程误差压在0.05℃以内,这个量级对HVAC和多数工业应用已经完全够用。如果要求更高,就得换更高精度的RREF电阻,并在出厂前做逐台校准。

5. 系统扩展:从温度采集节点到完整的仪表终端

5.1 把UART数据接入Modbus RS485总线

ADS122U04给MCU送来的是温度原始值,而现场需要的往往是标准仪器协议。我的做法是让PIC18F57K42的另一个EUSART挂RS485收发器,固件里实现一个轻量Modbus RTU从站,把四路温度值映射到保持寄存器里。这样PLC、DDC控制器或者组态软件直接就能读地址,不需要关心底层ADC是哪个型号。

Modbus寄存器表我习惯定义为:0x0000开始放通道1温度(0.01℃单位),0x0001放通道2,依此类推;0x0010放ADC状态字,低四位分别表示四个通道是否开路。这样维护固件的人一看地址就知道布局。

5.2 低功耗和电池供电场景

楼宇无线传感器经常要求用电池供电。ADS122U04本身有POWERDOWN模式,PIC18F57K42也有多种休眠模式。做低功耗方案时,可以让PIC定时醒来,发送START唤醒ADC,完成一次温度转换后立即进入POWERDOWN和MCU休眠。假设每分钟唤醒一次,转换时间200ms,平均电流能压到100µA以下。不过要注意,热电偶冷端补偿和RTD同一个节点,休眠时内部温度传感器也会关闭,所以要在唤醒后先读一次内部温度再测RTD,否则冷端温度会滞后。

5.3 量产时的器件批次和传感器一致性

硬件样机调通了,不代表能直接量产。ADS122U04虽然一致性很好,但RREF电阻批次之间可能有偏差;Pt1000传感器按IEC60751分A级、B级,A级在0℃最大偏差只有±0.15℃,而B级是±0.3℃。如果客户要求±0.2℃,就不能混用B级传感器。

生产装配还有一个细节:传感器接口端子松紧、线缆截面积不同,会产生额外接触电阻。四线制可以完全消除线阻影响,但采用三线制时每一欧姆线缆电阻都会变成误差。我的建议是,出厂前每台设备都做一次离线校准,把校准系数写进EEPROM,并且在校准标签上记录传感器编号和校准日期,这样将来售后追溯就有据可依。


这套项目做下来,我最大的体会是:24位ADC本身不难,难的是把整条信号链当成一个整体来设计。从RREF的温漂、激励电流的自热、UART长线的共地问题,到固件查表的精度、校准参数的存储,每一步看上去都只影响零点几度,叠加起来就是“显示稳定但实际不准”的尴尬结局。如果你正在做同类系统,我建议别急着堆硬件,先把“精度预算”算清楚,再决定哪里用0.1%电阻、哪里用隔离器、哪里加屏蔽。最后分享一个小技巧:调试阶段把ADC的CRC错误计数、开路过压标志都通过串口打印出来,会让你在现场排查效率翻倍,这些内部诊断信息不要等出问题时才去看。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/5 1:06:54

基于ADS122U04与PIC18F87J50的工业级温度测量方案设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 1:05:57

ADS122U04+PIC18LF45K42高精度温度采集方案与实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 1:05:28

用STM32F745ZG与串口24位ADC搭建多路远距离温度采集系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 1:04:39

STM32F411RE搭配ADS122U04:24位UART接口ADC实现高精度抗干扰温度采集

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 1:04:37

基于ADS122U04与PIC32的工业温度传感器采集方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 1:04:23

基于ADS122U04与RA4M1的工业及HVAC高精度温度测量方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华