☰
基于ADS122U04与TM4C129的工业级温度采集方案详解
2026/11/5 5:04:15 网站建设 项目流程

做工业或 HVAC 温度测量的人,多半都遇到过这种两难:精度要求高、现场干扰大、传感器离控制器又远。温度虽然是工程里最基础的物理量,但想测准反而比想象中麻烦。这篇要聊的是一套我自己搭过的方案,用 TI 的 ADS122U04IPWR 做远端采集前端,配合 TM4C129ENCPDT 做主控,覆盖从 PT100/热电偶/10K NTC 到 4-20mA 变送器的常见温度接入方式。ADS122U04 是 24 位 Δ-Σ ADC,自带 PGA、双路恒流源和内部温度传感器,最关键的是它用 UART 对外通信,这让 ADC 可以跟 MCU 分开布置到传感器端;TM4C129ENCPDT 是 Cortex-M4F 内核、集成以太网 MAC+PHY 的主控,我拿它做数据汇聚、标定和上报。对想在工业现场和 HVAC 系统里做可靠温度采集的硬件、嵌入式工程师,这套组合的选型逻辑、接线方法、固件链路和现场踩过的坑,下面一条条讲清楚。

1. 为什么选这对组合:分布式温度采集的系统逻辑

1.1 把 ADC 搬到传感器旁边:UART 接口解决了什么

先聊为什么非得用 ADS122U04,而不是传统的 SPI 或 IIC 接口 ADC。工业现场传感器和控制器之间的距离不是板卡上那种 3cm,而是走线槽穿过的三五米甚至几十米。SPI 的时钟和数据线在这种距离下非常容易受串扰和地电位差影响,IIC 的开漏结构和寻址方式在抗噪方面也不合适。ADS122U04 把接口换成 UART,等于把通信问题从"高速同步并行时序"降维成"低速异步串行",对布线和隔离都友好得多。

它把一整套 ADC 前端直接放进一个小封装里,传感器侧只需要 3.3V 电源加两根信号线,就能和主控双向通信。我在现场布过不少这种拓扑:主控柜在配电间,传感器在风管旁边,中间走屏蔽双绞线,距离大概 8 米。实际跑下来 UART 在 9600 波特率下这个距离很稳。如果你想更稳一点,在主控端加一片数字隔离器把地和现场地分开,或者用隔离电源模块供电,这套前端依然不需要改动。IPWR 后缀代表 TSSOP 封装加工业温度范围,-40°C 到 125°C,用在风管、机房、冷水管这种环境完全够。

1.2 TM4C129ENCPDT 在系统里的真实分工

TM4C129ENCPDT 在这套系统里不只是"用 UART 读个 ADC"。它是一颗 120MHz 的 Cortex-M4F,1MB Flash、256KB RAM,自带以太网控制器,我可以把温度数据直接汇总成 Modbus TCP 或 HTTP JSON 上报到上位机。在 HVAC 这类场景里,温度采集往往只是楼宇自控系统的一个环节,主控需要同时处理多个传感器节点、输出控制信号,还要和上层平台通信,这颗芯片的资源和外设数量就比较合适。

我用它接了 4 个 ADS122U04 节点,每个节点独立 UART,轮流读取,再加上一路以太网上报,CPU 占用很低,还有余量去跑 PID 控制逻辑。这也是选型的一个体会:ADC 解决"测准"的问题,主控解决"汇拢和控制"的问题,先把这两层拆开,选型就不会纠结。很多人纠结"这个 MCU 能不能同时处理这么多 UART",实际跑下来 TM4C129 的多个 UART 加中断接收完全扛得住,瓶颈反而在你自己代码的缓冲和调度设计上。

2. 传感器侧的接线与信号链设计

2.1 RTD 测量:IDAC 激励 + 比例式参考的搭法

PT100/PT1000 是工业现场最常见的温度传感器。ADS122U04 内部有两个可编程恒流源 IDAC,测量 RTD 的标准做法是让恒流源流过 RTD,再用同一个恒流源流过一个精密参考电阻产生参考电压。这样 ADC 的参考电压和传感器激励来自同一电流源,构成比例式测量——电流源的温漂和波动会被自动抵消掉,这是 24 位 ADC 能测出稳定温度的基础。

传感器类型典型信号量级引线电阻影响适合场景
PT1000.385Ω/°C大,需三线/四线制工业管线、冷热水系统
PT10003.85Ω/°C小,二线也可接受HVAC 风管、近距测点
K 型热电偶41µV/°C无,但需冷端补偿高温、低成本工业点
10K NTC非线性,阻值变化大小房间温度、舒适度控制

接线时最需要注意的是 RTD 引线电阻。两线制最简单,但 10 米铜线的引线电阻可能有好几欧,对 PT100 来说就是好几度的误差,完全不可接受。我在 HVAC 水系统里一般用三线制:一根激励电流走信号线,另一路 IDAC 专门补偿引线压降。对精度要求很高的工业场合就直接上四线制,激励和测量回路完全分开,引线电阻影响基本可以忽略。

选 PT100 还是 PT1000 也有一点讲究。PT100 灵敏度高但自身阻值低,引线电阻影响大;PT1000 阻值高,同样的激励电流下信号电压更大,对接触电阻和线阻不太敏感,缺点是对噪声更敏感,需要把数据率调低配合滤波。我的经验是:工业管线、测点距离远、干扰大的用 PT100 加三线制;HVAC 风管或房间温度这种距离近、干扰小的用 PT1000 更省事。

2.2 热电偶测量:冷端补偿不能靠想当然

热电偶输出电压非常小,K 型也不过 41µV/°C,所以必须把 PGA 增益开到最高,同时把数据率降下来压制噪声。ADS122U04 内部自带温度传感器,可以用它估算冷端温度做补偿。

很多新手在这个环节容易翻车:冷端补偿的关键不是"知道芯片温度",而是保证热电偶冷端和 ADC 芯片处在同一个等温体上。我见过有人把热电偶端子直接压在 PCB 上,结果端子两头温差就有 2°C,补偿做得再精细也没用。正确做法是让接线端子和 ADC 尽量靠近,周围不要放功率器件,必要时在 PCB 上做铺铜等温处理,让整个冷端区域的温度梯度尽量小。

2.3 10K NTC 与 4-20mA 变送器场景

HVAC 里大量使用 10K NTC 热敏电阻,便宜、响应快,精度要求也不高。接 ADS122U04 时把它当作分压电阻接入,用内部参考电压,激励电流选 100µA 左右,避免自热。NTC 线性度差,需要查表或多项式拟合,固件部分再细说。

至于 4-20mA 变送器,现场如果已经有变送器输出,直接把它接在 100Ω 精密电阻上,把电流变成电压给 ADC。这种场景反而不用考虑传感器自热和引线电阻,只要注意共模电压别超过 ADC 输入范围就行。

3. ADS122U04 的寄存器配置与通信协议要点

3.1 四个配置寄存器的功能分区

ADS122U04 的配置集中在几个寄存器里,功能分配延续 TI Δ-Σ ADC 的一贯思路。我按功能把要关心的区域列一下,方便对着手册填值:

寄存器区域控制内容我的常用配置方向
输入 MUX选哪两个引脚做差分输入,或组成单端模式RTD 用 AIN0/AIN1,NTC 用 AIN2/AIN3
PGA 增益1 到 128 倍热电偶 128,RTD 用 16 或 32
参考电压内部 2.048V 或外部参考比例式 RTD 必须用外部参考电阻
数据率与模式连续转换或单次,数据率档位优先带 50/60Hz 抑制的档位
IDAC 电流电流大小和输出引脚路由RTD 激励一般 500µA 到 1mA

具体到每个 bit 的位置,我建议手边放一本 datasheet 的 register map,对着填,别凭记忆写。我给项目写配置时走过弯路:一开始想省事直接抄网上的例程,结果 IDAC 输出路由配错,RTD 始终读出来是满量程,后来对照手册逐个寄存器核对才调好。这种问题在 datasheet 里往往一两页就能定位,但现场没有手册的时候非常抓瞎。

3.2 UART 命令流:读数据、写寄存器、数据就绪

UART 接口的通信格式和 SPI 版本类似,只是字节不再靠时钟同步,而是靠波特率。主机发命令字节,ADC 回数据字节。常用操作就三个:写寄存器(配置)、读寄存器(校验配置)、读转换结果。

比较关键的是"数据就绪"的处理。ADC 完成一次转换后数据寄存器更新,主机再发读数据命令就能拿到结果;读得太早就会读到上一次的旧数据。我实测的做法是:配置好连续转换模式后,按数据率换算出的周期去读,或者在读之前先卡一个空闲时间,宁可慢一点也不要读到错位的帧。

UART 是字节流,没有 SPI 那种 CS 片选信号做帧定界,命令收发时序要自己在协议层管好,这是和 SPI 版本 ADC 最大的习惯差异。我的协议层里固定用"命令字 + 数据"的结构,每条命令之间留出足够的字节间隔,避免把上一次的响应当作下一次命令的回复。

3.3 数据率、滤波与 50/60Hz 抑制

24 位 ADC 的噪声和速度是直接对立的。数据率越高,有效分辨率越低。工业现场有 50Hz 工频干扰,选择数据率时最好选那些能在数字滤波器里对 50Hz 及其谐波形成陷波的档位,相当于在软件里加了一个免费工频陷波器,效果比事后滤波好得多。

我在一个项目里做过对比:同样测 PT100,最高数据率时峰峰值噪声有将近 1°C 的波动,把数据率降到自带 50/60Hz 抑制的档位后,噪声压到 0.1°C 以内。所以如果不追求响应速度,别舍不得降数据率,这是性价比最高的抗干扰措施。

3.4 通信失败的常见原因:波特率与电平

UART 通信出问题,十有八九是波特率偏差或电平不匹配。ADS122U04 是 3.3V TTL 电平,直接接在 5V 单片机或者带 RS232 转接的电路上都会出问题。另外波特率一般控制在 115200 以内,我长期跑 9600,稳字当头。

调试时先用 USB-TTL 小板直接连 ADC,手动发命令,看能不能收到正确的寄存器回读内容,把通信问题隔离出来,再去连主控。这样能省掉大量排查时间。曾经有一次我直接在主控上调,怎么调都乱码,最后用 USB-TTL 单独测才发现是主控板上一颗上拉电阻影响了 UART 空闲电平。

4. TM4C129 固件链路:从接收字节到工程温度

4.1 引脚分配与 UART 外设初始化

TM4C129 的多个 UART 引脚有复用功能,用之前要把 GPIO 配成 UART 复用。我给每个节点分配独立 UART,中断接收、主循环处理,既不用轮询占 CPU,又能保证时序稳定。初始化时有两个容易忽略的细节:一是 UART 的时钟源要选对,TM4C129 片上 UART 时钟可以源自系统时钟,也可以独立配置,配错会导致波特率差一截;二是引脚使能顺序,先开 GPIO 时钟、再配复用、再开 UART 外设,顺序反了会出现间歇性乱码。

// TM4C129ENCPDT UART0 初始化参考 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); GPIOPinConfigure(GPIO_PA0_U0RX); GPIOPinConfigure(GPIO_PA1_U0TX); GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 9600, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE)); UARTEnable(UART0_BASE); IntEnable(INT_UART0);

这一段代码本身没什么稀奇的,但我在实际项目里因为少了一个 SysCtlPeripheralEnable 的调用,UART 完全没反应,查了半天才发现是外设时钟没打开。Tiva 系列这个特性坑过不少人,初始化顺序尽量养成固定模板。

4.2 通信处理状态机

从 UART 收到 ADC 的字节到得到温度,中间要经过一套状态机。我写得比较朴素:一个环形缓冲区收字节,一个解析函数按协议切包,一个回调函数把原始 ADC 码值交给换算模块。重点是分清楚"通信层"和"业务层",不然以后加节点、加协议时代码很快就会糊成一团。

ADS122U04 回的数据一般是 3 个字节的 24 位转换结果,要对齐好字节序。踩过的坑是在两个节点共用同一套解析代码时,没有把节点号带进缓冲区索引,结果经常串数据,后来给每个节点分配独立的缓冲和状态变量才解决。另外一个细节是接收缓冲区要足够大,并且处理要够快,否则在连续转换模式下会丢字节,导致整帧错位。我一般是把解析放在中断外的主循环里做,中断只负责往环形缓冲填数据。

4.3 温度换算:查表还是计算

拿到原始码值后,不同传感器算法不一样:

  • RTD 用比例关系转成电阻,再做线性化。PT100 可以用 Callendar-Van Dusen 公式,或者查 ITS-90 分度表。在 Cortex-M4F 上做多项式计算没问题,但如果传感器批次多、表不一致,查表反而更方便。
  • NTC 用 Steinhart-Hart 方程,三个系数标定好,精度就够。
  • 热电偶需要先算毫伏,加冷端补偿,最后查热电偶分度表。

我一般把查表和线性拟合做成统一的抽象接口,每个通道提供一个转换函数指针,上层只关心"得到多少摄氏度",不关心底下是什么传感器。温度单位方面建议全程用 float 保存,保留两位小数,输出给上位机时再格式化。

// PT100 比例式测量换算(示意) float rtd_resistance = (float)adc_code / FULL_SCALE * ref_resistor; float temp_c = calc_pt100_cvd(rtd_resistance); // Callendar-Van Dusen

这里有个容易忽略的问题:比例式测量时参考电阻必须用低温漂的精密电阻,比如 ±10ppm/°C 甚至更好的。很多人省了这颗电阻的钱,结果温度随室温漂移,回头怪 ADC 不行。

4.4 以太网对接:让温度数据"上系统"

TM4C129 自带以太网 MAC 和 PHY,省掉一颗外部 PHY 芯片。在 HVAC 和工业场合,最常见的对接是 Modbus TCP 或简单的 TCP 上报。我这边是让每个温度通道注册成 Modbus 寄存器,上位机轮询读取,同时定期主动上报 JSON 到监控平台。

以太网驱动跑起来之后,反而要注意"管理面"和"数据面"的优先级。温度数据更新率不高,但要求稳定,不要让 TCP 重传阻塞 ADC 读取。我把温度采集放在最高优先级中断驱动,通信任务单独成任务,实测断网重连时温度数据也不会断。这也是选 TM4C129 的一个附带好处——协议栈跑起来之后,省下来的精力足够让你好好打磨业务代码。

5. 现场调校与坑位记录

5.1 标定流程:零点与增益校准

无论传感器类型,上电后第一件事是标定。最简单的做法是准备一个标准电阻箱和两个基准温度点。对 RTD 通道,我会在传感器位置分别接入 100Ω 和 150Ω 精密电阻,记录 ADC 码值,算出每个通道的实际增益和偏移,存到 Flash。

标定要分通道做,因为每片 ADC 的参考电阻、PGA 偏移都不一样。曾经为了省事让四个通道共用一套标定系数,结果其中一个通道偏了 0.3°C,查了半天才发现是标定系数没分开。别嫌麻烦,每通道一组系数是底线。

5.2 工业现场的噪声案例:VFD 干扰怎么治

工业现场最大的敌人是变频器。VFD 启动瞬间,母线上的噪声会通过线缆耦合进传感器信号。我遇到过一个典型案例:压缩机一启动,温度读数波动立刻变大,ADC 输出出现明显毛刺。

排查顺序是这样:先用电池供电的 USB-TTL 直接看 ADC 原始码值,排除主控侧问题;再用示波器挂在传感器输入端看尖峰;然后把信号线换成屏蔽双绞线,屏蔽层单端接地,输入端加共模电感和 RC 滤波;最后把 ADC 数据率降到工频抑制档位。四步下来,读数从波动 ±0.8°C 稳定到 ±0.05°C。经验是:先隔离环境噪声,再谈滤波参数,上来就改软件滤波常常是治标不治本。

注意:屏蔽层一定要单端接地,最好是传感器侧或主控侧择一,别两端都接形成地环路。地环路带来的低频干扰比不屏蔽还严重。

5.3 HVAC 场景的响应速度与滤波矛盾

HVAC 场景和工业过程控制不完全一样。风管温度变化慢,但对响应时间有要求;水系统温度惯性大,滤波可以激进一点;房间温度控制要照顾人体舒适度,既不能波动太大,也不能反应太慢。

我一般给 HVAC 温度通道设 1 到 2 秒的软件平均,数据率放在带工频抑制的档位。如果发现温度跟随慢,不要急着降滤波深度,先确认是不是传感器护套或安装位置导致的热惯性,很多时候问题在安装环节而不是软件。薄护套、直接接触被测介质、避免阳光直射,这些安装细节对响应速度的影响比滤波参数大得多。

5.4 通用经验清单

最后整理几条通用经验:

  • 传感器线缆和电力线一定要分管敷设,共管敷设是各种莫名干扰的头号来源
  • 接地坚持单端原则,避免形成地环路
  • 电源入口加滤波磁珠和 TVS,ADC 电源质量直接决定测量质量
  • UART 线上加小电阻限流,配合隔离器件,防止接口损坏
  • 每块板子在出厂前做一次温度标定,记录序列号和标定系数,后期运维会感谢你

实话讲,ADS122U04 和 TM4C129 这套组合用了快一年,我最深的体会是"测准"这件事,七分靠架构和现场施工,三分靠算法和配置。先把信号链和地线处理好,再去调 ADC 参数,往往事半功倍。如果你也在做类似的工业或 HVAC 温度项目,希望这些踩过的坑能帮你少走几步弯路。后续我还在试着把多个节点做成自动地址分配,等跑稳了再来分享。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询