ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

ADS122U04与ATmega644组合的RTD温度采集系统设计详解

ADS122U04与ATmega644组合的RTD温度采集系统设计详解

1. 项目概况:为什么我会把这两颗芯片凑在一起

工业现场和暖通空调(HVAC)系统里的温度测量,看起来是个老掉牙的话题。随便一个模块厂都能给你拿出 PT100 温变模块,三线制、4~20mA 输出,几十块钱就能买到。但我这个项目不是去买现成模块,而是要从零做一批测温节点,挂在已有的 ATmega644 控制器上,通过 UART 采集数据。选型时我反复比较后定下了 ADS122U04IPWR 这颗 24 位 Δ-Σ ADC,配合 ATmega644 做主控,专门覆盖从 -40℃ 到 +150℃ 的工业与 HVAC 测温场景。

为什么要自己做而不买现成模块?原因很现实:现场的安装位置五花八门,有的要 4 线制接法,有的只能用两线制,还有的要同时接 PT100 和 PT1000,现成模块的输入通道、激励电流、基准电压策略都是固定死的,很难兼容所有情况。ADS122U04 的优势在于它把输入多路复用器、可编程增益放大器、两个电流源、内部温度传感器和 UART 通信控制器全集成在了一颗 16 脚芯片里,外围电路可以压得非常小。而 ATmega644 虽然是老一代 8 位 AVR,但它有双 USART、丰富 IO、大内存空间,足够承担通信协议栈和多路巡检任务。

这篇文章适合什么样的读者?如果你正在做 RTD 温度采集,或者手里有一堆 ATmega/AVR 库存想利用起来,又或者你发现普通的 16 位 ADC 测温精度达不到要求,那么读完这篇应该能少走不少弯路。我下面讲到的内容不是照着数据手册翻译,而是我在画板、焊接、调固件和现场试运行过程中实际踩出来的经验。

2. 选型思路:ADS122U04 和 ATmega644 到底强在哪

2.1 为什么选 ADS122U04 而不是其他 ADC

选 ADC 时我当时手上的候选方案其实不少。最常见的是 ADS1220、ADS1120、MCP3421 和 ADS122U04。ADS1220 不带 UART 接口,必须用 SPI 通信;MCP3421 是 I2C 接口,分辨率同样 18 位,但输入通道、电流源配置都比较死板。ADS1120 虽然内部有振荡器,精度也够,但它同样是 SPI 接口。如果我做主控的是 STM32,SPI 接口完全无所谓;但 ATmega644 虽然有硬件 SPI,却还要用不少 IO 去驱动液晶、拨码开关和外部看门狗,SPI 引脚被占得差不多了。重新分配引脚会牵连整块板子的布线,代价不小。

ADS122U04 解决的正是这个痛点。它的对外通信接口是 UART 加一路时钟线 SCLK,也就是说主控只需要三个 IO:TXD、RXD、SCLK。ATmega644 的 USART0 直接连过去,剩下一个 USART1 还可以留给 Modbus 总线的 RS485 通讯。这样一个 ADC 芯片加一块 MCU,两路串口就完成了“采集 + 上传”的全部分工,通信结构非常干净。而且 ADS122U04 内部集成了 24 位 Δ-Σ 调制器,带 PGA、基准电压源和两个可配置的激励电流源 IDAC,这意味着 PT100、PT1000、NTC 热电偶都可以接,不用额外加恒流源或仪表放大器。

封装上 IPWR 后缀对应的是 TSSOP-16,引脚间距 0.65mm,手工贴片有点考眼力,但用加热台或者回流焊完全没有问题。采购时要注意市面上有一部分 ADS1220 的散新片冒充 ADS122U04,两者引脚定义完全不同,买到假货第一轮上电就会冒烟。我的建议是直接从正规代理商渠道买,哪怕几颗样品也不要在非授权渠道省这几块钱。

2.2 ATmega644:它凭什么还是我的选择

ATmega644 是 8 位 AVR 里一款相当“能扛”的型号。它有 32KB 程序闪存、2KB SRAM,两个独立的 USART,40 引脚封装。很多老工程师一听到 ATmega644 就想到早年那些工业控制板,虽然现在新设计几乎都转 32 位 MCU 或者用 RP2040 之类的片子,但我手头有一批已经过认证的 ATmega644 库存,温漂特性和可靠性数据都齐全,没必要为了追新而全部推翻重来。

从工程角度看,用 ATmega644 是合理的。温度采集这个场景对算力要求极低,主要任务是:配置 ADC、读取转换值、做滤波、查表换算温度、按协议发送。这些工作用 8 位机做绰绰有余。而且 AVR 的中断响应很直接,DRDY 引脚一拉低,MCU 进中断读数据,实时性比运行裸机轮询的其他方案更可控。另一个选择 ATmega644 的原因是它的 IO 灌电流能力好,可以直接驱动小继电器和 LED 指示灯,不需要额外加驱动芯片,这在控制柜里能省下不少空间。

唯一的缺点是 ATmega644 自身不带硬件浮点单元,做浮点运算比较慢。但因为我们的温度换算可以用查表加线性插值替代浮点运算,完全能把运算时间压缩在毫秒级以内。习惯写库函数的人可能会觉得 8 位机效率低,但实际上对于 20SPS 的采样率来说,MCU 几乎有一大半时间在睡觉。

2.3 硬件方案整体框架

这套系统的总体架构非常简单:ADS122U04 通过内部 IDAC 激励 RTD,通过 PGA 放大差分电压,经过 Δ-Σ 调制输出数字量;ATmega644 通过 USART 读取转换结果,经过数字滤波和查表换算,把最终温度值通过另一路 USART 发送到 RS485 总线。电源部分则采用 24V 转 5V 的 DC-DC 模块,再从 5V 经过 LDO 转 3.3V 给模拟部分供电,数字地与模拟地单点连接,避免数字噪声串入 ADC 的基准和输入端。

3. 硬件设计细节:RTD 接法、UART 物理层与电源规划

3.1 RTD 传感器接线方式的选择

测温项目里最影响精度的往往不是 ADC 本身,而是传感器接线方式。ADS122U04 支持两线制、三线制和四线制 RTD,但实际效果天差地别。

两线制的接法最简单,直接把一根 RTD 的两条线接在 AIN0 和 AIN1 上,IDAC 电流从 AIN0 流出,经过 RTD 回到 AIN1。问题在于两线制没有消除引线电阻,假设 PT100 在 0℃ 时是 100Ω,而铜导线电阻有 0.5Ω,ADC 读出来的阻值就是 100.5Ω,查表会多出大约 1.3℃ 的误差。对于 HVAC 管道温度这种允许 ±1℃ 误差的场合勉强能用,但工业过程控制里肯定不够。

三线制是工业现场最常见的接法。原理是用两个匹配的电流源分别激励 RTD 两端,通过差分测量消除引线电阻。ADS122U04 的 IDAC1 和 IDAC2 可以分别配置。实际接线时,IDAC1 从 AIN0 注入电流,经过 RTD 后在 AIN1 处流出,IDAC2 则接到第三条引线以补偿线阻,同时 VREF 电阻也由同一个电流回路激励,这样就形成了一个比例测量系统:ADC 的结果只和 RTD 阻值与参考电阻的比值有关,而与电流源的绝对精度无关。这是 ADS122U04 测温方案能够做到高精度的关键,硬件上一定要保证 VREF 电阻是低温漂精密电阻,起码 0.1% 精度、25ppm/℃ 或更好。

四线制是实验室级别的接法,需要四个引脚:两条激励线走电流,两条传感线走电压。四线制完全消除了引线电阻影响,但因为要引出四根线到传感器,现场接线麻烦,这条路径在大多数 HVAC 项目中都用不上。如果你做的是计量仪器,建议用四线制;如果是普通工业监控,三线制是性价比最好的选择。

3.2 ADS122U04 的 UART 时钟线 SCLK 接法

ADS122U04 的 UART 接口和电脑上常见的异步串口不同:它还需要一根时钟线 SCLK。这个 SCLK 不是给 ADC 内部工作提供主时钟,而是给 UART 通信提供位时钟参考。也就是说,MCU 要主动产生固定频率的方波送到 SCLK 引脚,然后通信双方按照这个时钟来收发数据。

实际接线如下:MCU 的 TXD 接 ADS122U04 的 RXD,MCU 的 RXD 接 ADS122U04 的 TXD,SCLK 由 MCU 的任意一个定时器输出比较引脚产生。我在 ATmega644 上用的是 Timer0 的 OC0A 引脚生成方波,通过设置占空比为 50% 的 CTC 模式输出 SCLK。要注意 SCLK 频率必须和 UART 波特率匹配,ADS122U04 的数据手册里有对应关系表。我调试时用的是 2.048MHz 时钟配 128000 波特率,这个组合在接线长度小于 20cm 时非常稳定,但如果你引线较长,建议降速到 115200 以下,并且 SCLK 线尽量短、远离电源线。

提示:SCLK 不是随便给个方波就能工作的。如果你的 MCU 频率和 SCLK 不是整数倍关系,UART 采样会出现持续累积误差,表现为通信偶尔成功、偶尔丢字节。最稳的办法是先用示波器量一下 SCLK 的实际频率,再对照数据手册设置正确波特率。

3.3 电源与地线的布局经验

ADS122U04 的模拟供电 AVDD 和数字供电 DVDD 在内部是独立的,我在板上将两个引脚都接到了 3.3V,但通过磁珠隔离。模拟地 AGND 和数字地 DGND 直接连到 PCB 上的星形接地点,然后把星形接地点通过单点连接到 DC-DC 模块的输出地。这样做的目的是避免数字地线上由于 USART、LED 等开关动作产生的噪声通过地回路耦合进模拟输入。

还有一个容易被忽视的细节:VREF 电阻的位置。ADS122U04 的 VREF 引脚是 ADC 转换的参考基准,如果参考电阻离芯片太远,PCB 走线电阻和寄生电感会影响比例测量结果。我建议 VREF 电阻紧靠 VREFP 和 VREFN 引脚放置,走线加宽,并且在 VREFP 引脚旁边放一颗 0.1μF 的 C0G 电容到地。这会直接影响测量噪声水平,实测中走线摆放不对时噪声能从 ±3 个 LSB 变成 ±20 个 LSB。

4. 固件实现:UART 命令、数据读取与温度换算

4.1 ADS122U04 的通信协议概述

ADS122U04 的通信协议是主从式的,MCU 始终作为主机,ADC 作为从机。主机发送一个命令字节,ADC 返回响应。命令包括复位、读寄存器、写寄存器、启动转换、读取转换结果等。每条命令通常要配上对应的寄存器地址和数据,协议细节必须严格按 TI 数据手册的时序来,不能用普通的 UART 收发逻辑直接套。

我在初始化时执行的第一条命令是复位。给 RESET 引脚一个低脉冲,或者发送 RST 命令让芯片回到默认状态。复位后等待一段时间,然后再依次写配置寄存器。配置寄存器主要设置这几项:

  • 输入多路复用器选择,即哪个引脚作为正输入和负输入;
  • PGA 增益倍数,RTD 场景一般选择 1~8 倍;
  • 电压基准选择,必须选择外部 VREF,而不是内部基准;
  • IDAC 电流源幅值和方向,一般设置为 250μA 或 500μA;
  • 数据速率,工业测温用 20SPS 即可,需要滤波时用 20SPS 比 1000SPS 好得多。

设置完基本参数后,需要把专用 PWDAT 字节放在数据帧里发送,ADC 才会进入连续转换模式。很多新手在这步会漏掉,导致读取命令发出去后没有任何数据返回。我当时调试时也卡了一天,后来对照逻辑分析仪才发现在命令序列里少了转换模式设置。

4.2 读取转换数据的关键流程

ADS122U04 的转换结果寄存器是 24 位的,数据以二进制补码形式存储。因为 UART 一次传一个字节,所以每个转换结果要用三个字节传回 MCU。连续转换模式下,只要 DRDY 引脚拉低,就说明新数据准备好了,主机可以发送读取命令取走数据。

我从硬件层面做了个 DRDY 中断连接:DRDY 引脚接到 ATmega644 的外部中断 INT0。每次数据准备好后,MCU 进中断,在中断服务程序里发送读取命令并接收三个字节,存储到全局变量中。这样主循环里不需要轮询 DRDY,MCU 可以一边处理 Modbus 请求一边持续采集温度,程序结构更清晰。

需要注意,UART 的发送和接收在 AVR 上是全双工的,但 ADS122U04 并不是。它的通信是半双工问答式,主机发送命令后必须等 ADC 返回数据,同一时刻不能既发命令又收数据。如果 MCU 的 USART 中断设置不当,接收中断和发送中断同时触发,就会出现状态机错乱。我的经验是把 ADC 相关的发送和接收放在同一个读函数里,用轮询方式处理接收,不让它在后台自由收发。

4.3 固件里的温度换算:查表优于纯公式

读取到的 24 位原始值不能直接当温度用。标准做法是先根据比例关系算出 RTD 电阻,再查表得到温度。核心换算公式是:

R_RTD = (ADC_Code / 0xFFFFF) × R_REF

这里 0xFFFFF 是相关数字量满刻度值,R_REF 是外部参考电阻的阻值。由于 ADS122U04 的 Δ-Σ 转换是比例式测量,这个公式里不涉及激励电流的绝对精度,所以只要 R_REF 本身的温漂够小,测量结果就很稳定。

得到 R_RTD 后,用 IEC 60751 标准给出的 PT100/PT1000 分度表查对应温度,这是最稳妥的方法。我在固件里把 -50℃ 到 +200℃ 范围内的分度表按每 10℃ 一个点存成数组,读到的电阻值落入哪两个点之间,就用线性插值算出当前温度。10℃ 间隔的插值误差在 PT100 上约为 0.05℃,足以满足 HVAC 需求。

注意:如果应用环境是低温(-40℃ 以下),线性插值就不够用了,因为 RTD 的电阻-温度关系是一条略微弯曲的曲线。此时建议改用 Callendar-Van Dusen 方程,或者把分度表按 5℃ 间隔存储,否则会引入额外误差。

我写完固件后专门用标准电阻箱校准过一次。把 R_REF 设为 3300Ω,IDAC 电流设为 250μA,这样 VREF 上大约有 0.825V 的电压,留给 RTD 的信号范围足够覆盖 -50℃ 到 +200℃。配 PGA 增益 2 倍时,整个量程内的分辨率比 0.01℃ 还小,但实际上系统噪声大约有 0.02℃ 的水平,所以最终显示分辨率设定为 0.1℃ 是贴近真实的。

5. 校准方法与精度分析

5.1 两点校准法:零点和增益校正

即使使用了低漂移参考电阻,ADC 自身的失调电压、PGA 失调以及 PCB 上的接触热电势仍然会引入固定偏差。要解决这个问题,最直接的方法是做两点校准。我在批量生产前会准备两个标准电阻:一个 100Ω,一个 200Ω,模拟 0℃ 和 268℃ 的 PT100 阻值。

先接上 100Ω 标准电阻,读取 ADC 原始值,记为 CODE_0;再换 200Ω 标准电阻,读取 CODE_1。根据这两组数据求出每个板子的零点增益系数,存入 ATmega644 的 EEPROM。以后每次换算电阻值时,都先减去零点,再乘以增益系数。这样可以把板间偏差从 ±0.3℃ 压缩到 ±0.05℃ 以内。

两点校准必须用的标准电阻精度至少要 0.01%,否则校准本身就没有意义。我用的是国产精密线绕电阻,温漂 5ppm/℃,放在恒温恒湿环境里校准,效果很不错。对于单块板子开发调试来说,做不做两点校准差别不大;但是批量如果超过 10 块板子,不做校准会让你在后续调试中崩溃,因为每块板子的底数都不太一样。

5.2 引线电阻补偿的实际效果

三线制接线配合 IDAC1 和 IDAC2 的电流匹配度,是决定引线补偿效果的关键。ADS122U04 的 IDAC1 和 IDAC2 不一定完全一致,虽然芯片内部做了匹配,但误差一般控制在 ±1% 以内。对于 10 米长的铜导线,线阻约 1Ω,如果电流失配 1%,就相当于引入了 0.01Ω 的残余误差,换算成温度只有 0.026℃,完全可以忽略。

不过,如果你的导线长度到了 50 米以上,就不得不认真对待这个问题了。做法是使用更大阻值的 RTD,比如 PT1000。PT1000 在 0℃ 时阻值是 1000Ω,同样的引线电阻占比只有 PT100 的十分之一,即使电流失配,误差也会成比例缩小。很多 HVAC 项目选用 PT1000 就是这个原因,不是 PT1000 的芯片精度更高,而是工程实现上更宽容。

5.3 噪声与分辨率之间的关系

24 位 ADC 的“24 位”只是理论满量程分辨率,实际无噪声分辨率取决于 PGA 增益、数据速率和基准电压。ADS122U04 在 20SPS、PGA 增益 1 时,数据手册给出的无噪声分辨率大概是 19 位左右;增益开到 8 倍后,输入信号摆幅更小,等效噪声会相应增加。

实际测量中,我观察到 20SPS 下的 RMS 噪声约为 ±2μV,折算到 PT100 大约 0.005℃。但这个数字是在屏蔽良好的实验环境里测到的。到了工业现场,如果传感器线经过变频器旁边,噪声会明显变大。解决办法有三个:第一,把数据速率降到 20SPS 以下;第二,在固件里用移动平均滤波,连续取 8 次读数平均;第三,传感器线一定使用屏蔽双绞线,并且屏蔽层单端接地。这三招叠加,基本能把现场噪声拉回到和实验室差不多的水平。

6. 现场常见问题与排查经验

6.1 读到的数值全是满码 0x7FFFFF

这种故障现象通常是传感器断路,或者 RTD 引线接触不良。因为 RTD 断路后,输入引脚悬空,PGA 输入变成不确定状态,ADC 会输出最大满码。排查时先看 DRDY 引脚是否有脉冲,如果 DRDY 正常,再用万用表量 RTD 两端电阻。工业接线端子排上经常出现螺丝没拧紧的情况,RTD 线被拉断的案例也遇到过。

我还见过一种隐蔽情况:IDAC 电流源输出配置错误。正常配置下,IDAC 电流从 AIN0 流入,经过 RTD 到 AIN1 再流回 AGND。如果把 IDAC 配置成从 AIN1 流出,RTD 上的压降就会反向,ADC 读数变成接近满量程的负值,显示出来就是 -200℃ 之类的离谱数字。这类问题要优先检查寄存器配置。

6.2 UART 通信时好时坏,重启后恢复正常

这个问题十有八九和 SCLK 时钟或者波特率设置有关。用示波器看 SCLK 频率是否漂移,再看 MCU 的波特率发生器是否对分频系数设置正确。ATmega644 用内部 RC 振荡器时,频率误差可以到 ±3%,如果原厂设置的校准值被误擦除,UART 通信就会间歇性失败。我一直采用外置 16MHz 晶振作为主时钟,SCLK 用定时器分频出来,这样频率精准,通信非常稳定。

另一个坑是 MCU 复位后 UART 引脚处于高阻状态,如果直接接 ADS122U04 的 RXD 引脚,可能产生毛刺被 ADC 当成复位命令。解决方案是在 MCU 初始化完成后延时 100ms,再拉高 RXD 引脚并发送第一条复位命令,分别让两端的通信模块进入确定状态,避免上电时序竞争。

6.3 温度读数波动大,但平均值是准的

如果单个读数波动幅度超过 0.5℃,平均值却稳定,那么电磁耦合干扰的概率最大。常见干扰路径包括:传感器线和动力电缆在同一个线槽里;VREF 引脚附近走位不当;屏蔽层两端都接地形成地环路。解决办法是屏蔽层采取单端接地,传感器线单独走槽或选用带绝缘层的双绞屏蔽线。固件方面,用一阶低通滤波或者滑动窗口平均,都能把显示波动压到 ±0.1℃ 以内。

不要寄希望通过提高 PGA 增益来压制噪声,增益一高,噪声同样会被放大,信噪比并不会变好。正确的做法是提高激励电流,比如从 250μA 改成 500μA,这样在 RTD 上产生的压降翻倍,而噪声基本不变,等效信噪比就提高了。但要注意激励电流不能超过 RTD 的自热限制,PT100 裸探头用 1mA 以上就可能产生自热误差,这个参数不是越大越好。

6.4 典型参数速查表

参数项推荐配置备注
数据速率20SPS工业/HVAC 够用,噪声最低
PGA 增益2 或 4兼顾量程和噪声
IDAC 电流250μA~500μA视 RTD 类型和线阻确定
参考电阻3.3kΩ 0.1% 25ppm严格按低温漂规格选择
传感器接线三线制工业现场通用方案
MCU 时钟外置 16MHz 晶振避免内部 RC 偏差影响 UART
SCLK 频率2.048MHz对照波特率表设置
滤波算法移动平均 8 点有效抑制工频干扰

7. 扩展想法与个人体会

这个方案我后来又做了两个变体。一个把 ADS122U04 换成能直接上报信号路数的版本,用于现场 8 路温度巡检;另一个保留了 ADS122U04,但把 ATmega644 换成了更低功耗的 ATmega328P,配合锂电池和 LoRa 模块做无线温度记录仪。核心固件几乎不需要改动,只需要调整 UART 和电源管理部分。这说明选型时把接口和算法剥离干净,后面做产品线扩展会省很多事。

最后分享一个很多人容易忽略的小细节:ADS122U04 的内部温度传感器其实可以用来做冷端补偿或芯片自身温度监控。在 PCB 上靠近 RTD 接线端子放一个热敏电阻,或者直接用芯片内部温度传感器判断探头是否异常发热,能帮助排查接线端子松动引起的接触电阻升高问题。虽然这个设计不常被写到说明书里,但我在实际运维中发现它非常有用,尤其柜内环境温度变化大的时候,通过内部温度传感器可以自动修正一部分热电势误差。

做测温项目,我的体会是真正花精力的地方从来不在“选一颗好 ADC”那一关,而在传感器接线、基准电阻的布局、固件滤波和校准流程这些不起眼的环节。ADS122U04 和 ATmega644 这套组合把很多繁琐的外部电路省掉了,但该遵守的模拟设计规则一条都不能少。只要把上面这些细节都处理好,你也能用两三天时间搭出一台精度不输商业温变模块的测温节点。

返回列表