ARTICLE DETAIL

资讯详情

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

ADS122U04与STM32的PT100/热电偶测温方案解析

ADS122U04与STM32的PT100/热电偶测温方案解析

搞过几年工业温度测量的人,对 PT100、热电偶这些东西既爱又恨。传感器本身便宜耐用,但信号链一旦处理不好,读数漂起来能让你在客户现场耗上一整天。最近用 TI 的 ADS122U04IPWR 配合意法半导体的 STM32F107VC 做了一套测温方案,同时覆盖工业和 HVAC 两类的应用场景,从硬件连接到软件换算整体走了一遍,这里把关键设计思路和踩过的坑记录下来,给正打算选型或调板子的朋友一个参考。

这套方案解决的问题很直接:把 PT100/PT1000、热电偶这些模拟传感器的微弱信号,稳定地转成数字量,再由 MCU 换算成真实温度。ADS122U04IPWR 是一片 24 位 delta-sigma ADC,自带 PGA、内部温漂很低的基准源和两路激励电流源,最关键的是它用 UART 接口和 MCU 通信。这在工业现场非常舒服——不需要额外的 SPI 引脚,线缆可以拉得相对长,调试时用串口助手就能直接看数据。STM32F107VC 是 Cortex-M3 内核的互联型 MCU,UART 资源丰富,两者配在一起,硬件上几乎没什么复杂逻辑。

下面按整个项目的实际推进顺序拆开讲,从器件选型思路到最后的现场调试经验,希望能帮你少走一些弯路。

1. 项目概述与方案选型思路

1.1 为什么选 ADS122U04IPWR 而不是普通 SPI ADC

如果只看标题“ADS122U04IPWR”,可能第一反应是它跟常见的 ADS1220 很像。两者确实同属 TI 的 delta-sigma ADC 家族,但有一个让嵌入式工程师很舒服的差异:ADS122U04 的通信接口是 UART,不需要外部 SPI 主控去模拟时序,数据线只有 TX、RX 两根,省掉了 SCK、CS 这些控制脚。对于 STM32F107VC 来说,UART 外设几乎是“开箱即用”,配置起来比 SPI 省心,尤其是在多节点板卡或需要隔离通信的场景,UART 转 RS485 也更简单。

温度测量本身是个低频过程,ADS122U04 的采样率对 HVAC 和大多数工业温控完全够用。我习惯把数据率配置在 20SPS 或 40SPS,片上自带的数字滤波器已经把大部分工频和随机噪声压得差不多。24 位分辨率在 2.048V 基准下,配合合适 PGA,理论分辨率远小于 0.01℃,实际有效分辨率也能轻松做到 0.05℃ 级别,应对 HVAC 回风温度、冷冻水温度这类常规需求绰绰有余。

1.2 系统架构与信号链路的整体设计

整套系统可以分成三段:传感器信号进来,在 ADS122U04 内部完成放大和模数转换,然后通过 UART 发给 STM32F107VC,由 MCU 完成线性化标定和温度换算。这种架构的好处是模拟部分与数字计算分离,ADC 做好自己的采样,MCU 专注算法和逻辑,互不干扰。

具体信号链是这样走的:温度传感器(PT100/PT1000/热电偶)接到 ADC 的模拟输入端,ADC 内部的 IDAC 提供激励电流(热电偶场景可能改用内部温度传感器做冷端补偿),PGA 把毫伏级信号放大到接近 ADC 满量程,再来做 delta-sigma 转换。转换结果以 24 位补码形式通过 UART 送出,STM32 收到后按比例换算成电压,最后套用温度线性化公式输出实际温度值。

这种设计的核心优势是模块化。后续如果要扩展多路测温,只需要增加 ADS122U04 的数量或者切换输入通道,MCU 端的处理逻辑不用大改。我在做 HVAC 多分区风管温度监测时就用了类似架构,一路 MCU 挂两块 ADS122U04,分别测送风、回风、混合段温度,结构非常清晰。

2. 硬件电路设计与传感器接线

2.1 电源、基准与去耦电路设计

ADS122U04 的模拟供电我用 3.3V 单电源,数字部分也直接用同一路经过 LC 滤波的 3.3V。单片机的数字地会和模拟地产生各种噪声,因此在 PCB 布线时把所有模拟地去耦电容的返回路径都引到 ADC 附近的模拟地平面,然后通过一个 0Ω 电阻或者磁珠单点连接到数字地。这是我在多块板子上反复验证过的做法,比单纯把一个地平面割得七零八落要有效得多。

基准源方面,ADS122U04 内部基准的温漂指标本来就做得不错,对于工业级 -40℃ 到 85℃ 范围足够,因此我这里直接用内部基准。如果要更高精度的计量场景,可以在 REF 引脚外接一个 2.048V 基准芯片,并用 0.1µF 陶瓷电容紧贴引脚去耦。内部基准的好处是省外围,缺点是不能像外部基准那样方便地做比例测量,但因为 RTD 测温通常不需要绝对电压基准精度,更多依赖的是 IDAC 电流和电阻比例关系,所以内部基准完全够用。

2.2 PT100/PT1000 二线、三线、四线接法对比

RTD 测温最经典的坑是导线电阻。以 PT100 为例,0℃ 时标称阻值 100Ω,温度每升高 1℃ 阻值大约增加 0.385Ω。如果设备放在工业现场,传感器到主板的线缆动辄十几米,按 0.5Ω 的回路电阻估算,那就能引入近 1.3℃ 的误差,这在 HVAC 控温里往往不可接受。

针对这个误差,ADS122U04 内部有两个匹配的 IDAC 电流源,非常适合做三线和四线 RTD 接法。四线接法最准:两根线走激励电流,另外两根线只采样电压,不承载电流,所以导线压降完全不影响测量结果。三线接法稍微取巧,它利用两个相同的 IDAC 电流源分别激励两端的引线电阻,从而在差分输入里把导线压降抵消掉一部分,电路连接简单,精度也够大多数场景用。二线接法我只在实验板上验证通信时用,真实项目基本不选,因为导线电阻误差太明显了。

我用三线 PT100 时是这样配置的:一个 IDAC 设置为 500µA,接到 RTD 的一根引线上;另一个 IDAC 接到另一侧引线,然后差分输入分别测量 RTD 两端。这里有个关键细节:两个 IDAC 的电流要比一路电流更稳定,一定要把 PGA 输入引脚和 IDAC 输出引脚留出足够的电压裕量,防止电流源进入饱和。实践经验是 3.3V 供电、500µA 激励、PGA 增益 16 时,系统有足够动态范围,又不会发生输入电压超出器件允许范围的问题。

2.3 热电偶接入与冷端补偿的简化处理

热电偶测的是热端和冷端的温差,输出电压非常小,K 型热电偶典型灵敏度大约 41µV/℃,所以 PGA 增益必须拉高,否则 24 位 ADC 的优势也发挥不出来。我用 PGA=64 或者 128 档位,把信号尽量推到接近满量程附近,同时冷端必须做补偿。

ADS122U04 内置的温度传感器正好可以派上用场。把冷端(即热电偶接入端子附近)的温度用内部 ADC 通道读出来,然后换算成热电势,按热电偶分度表反向补偿到测量结果里。这个方法不需要额外的一颗温度传感器芯片,调试时省事不少。不过要注意的是,内部温度传感器反映的是芯片本身的温度,所以热电偶端子要和 ADC 芯片尽量靠近且热耦合良好,否则冷端补偿会存在系统性偏差。

2.4 STM32F107VC 与 ADS122U04 的 UART 连接细节

ADS122U04 的 UART 接口和 STM32F107VC 连接非常简单:ADC 的 TX 接 MCU 的 RX,ADC 的 RX 接 MCU 的 TX,两边共地。电平都是 3.3V,无需额外转换。我用的是 STM32F107VC 的 USART2,配置成 9600bps、8 数据位、1 停止位、无校验,这个配置在抗干扰方面比较稳,现场线缆 2 米内实测误码率极低。

有一点要特别提醒:很多工程师习惯把 MCU 的调试串口和数据采集串口复用。这在一开始写驱动时方便,但到了现场联调时会被日志数据和 ADC 指令互相干扰,非常难受。建议把这两个口独立开,哪怕只是板子上预留两个接口。

3. 软件驱动与温度换算实现

3.1 ADS122U04 寄存器初始化流程

ADS122U04 的初始化无非是配置几个关键寄存器:输入多路复用、PGA 增益、IDAC 电流大小、数据率、工作模式。代码逻辑很直接,核心是要按数据手册把每个 bit 的含义搞清楚,不要凭感觉猜测。

我这里以三线 PT100 为例,初始化时的寄存器配置关键点如下:

  • 输入 MUX:选择差分输入,正端接 PT100 的采样引脚,负端接另一侧采样引脚。
  • PGA 增益:设置为 16,配合 500µA IDAC 激励,确保 0℃ 到 100℃ 范围的信号电压都不会超过 ADC 满量程。
  • IDAC 电流:配置为 500µA,开启两个电流源,分别输出到两个激励引脚。
  • 数据率:选择 20SPS,内置滤波器能较好抑制 50Hz 工频干扰。
  • 内部温度传感器:在热电偶测温场景才切换,RTD 场景可以关掉。

每个寄存器写完以后,我习惯回读一次做校验,防止 UART 线路干扰导致误写入。这是个很小的习惯,但能在现场省下大量排查时间。下面是写入寄存器的代码模板:

static uint8_t adc_regs[5]; void ADS122U04_WriteConfig(void) { uint8_t cmd[2]; // 先发送 WREG 命令,后面跟上要写入的寄存器数量-1 cmd[0] = 0x40 | (0 << 2); // 从寄存器0开始写,写成伪代码示意,请严格参考手册 cmd[1] = 4; // 写5个寄存器,因此数量字段为4 HAL_UART_Transmit(&huart2, cmd, 2, 10); HAL_UART_Transmit(&huart2, adc_regs, 5, 10); HAL_Delay(5); }

强调一下,具体命令码和字段偏移要以最新数据手册为准,不同批次器件可能存在细微差异。我工程里的代码也是先把手册中命令对照表打印出来贴在显示器上,写寄存器时逐位核对,这个钱不能省。

3.2 读取 ADC 数据并进行符号扩展

读取转换结果时,需要先发送读取命令,再接收 3 个字节。这 3 个字节拼成一个 24 位补码,最高位是符号位,所以拼完以后要手动做符号扩展,否则负数温度会算成一个很大的正值,一看到这种“温度突然飙到 1000℃”的现象,十有八九就是这里出了问题。

uint8_t rbuf[3]; uint8_t cmd = 0x10; // 示例读取命令,具体值按手册确定 HAL_UART_Transmit(&huart2, &cmd, 1, 10); HAL_UART_Receive(&huart2, rbuf, 3, 10); uint32_t raw = ((uint32_t)rbuf[0] << 16) | ((uint32_t)rbuf[1] << 8) | (uint32_t)rbuf[2]; int32_t code; if (raw & 0x800000UL) { code = (int32_t)(raw | 0xFF000000UL); // 符号扩展 } else { code = (int32_t)raw; }

拿到 code 以后,先换算成实际电压。如果 PGA 增益是 16,基准是 2.048V,那么电压为:

double voltage = (double)code * 2.048 / 8388608.0 / 16.0;

这里 8388608 是 2^23,正好对应 24 位补码的半点。做完这一步,后面就是纯数学计算了。

3.3 从电压到温度的换算

如果是 PT100,电压换算成电阻很直观:用 IDAC 电流值反推,R = V / I。由于 IDAC 的实际电流会有偏差,所以我不直接信任芯片的标称值,而是在软件里做一个斜率校正系数,用标准电阻标定后写入参数表。这样即使芯片之间电流源有微小差异,也能通过软件拉齐。

得到 RTD 电阻后,用 Callendar-Van Dusen 公式近似反解温度。这个公式是 PT100 线性化的标准做法,我通常只取前两项:R = R0 * (1 + AT + BT^2),其中 A≈3.9083e-3,B≈-5.775e-7。反解出来的是一个带小数点的温度值,分辨率远高于 HVAC 控制的需求。如果追求更高精度的整百度标定,也可以用查表加线性插值的方法,但在 STM32F107VC 上,公式计算的占用开销很低,直接用公式更省 Flash。

热电偶的换算相对麻烦一些,因为热电势和温度是非线性的。好在业内标准做法是先查分度表得到冷端温度对应的热电势,加上 ADC 测量得到的热电势增量,然后再反查总电势对应的温度。我没有在 MCU 里存整张分度表,而是用分段三次多项式逼近,温度误差控制在 ±0.3℃ 内,对 HVAC 应用足够了。

4. PCB 布局与抗干扰设计心得

4.1 模拟区域与数字区域的板级隔离

别看测温系统看似简单,PCB 布局稍不注意,24 位 ADC 会直接退化成 16 位。我的做法是,把 ADS122U04 及其模拟输入、基准去耦、IDAC 电阻全部放在一个明确的模拟区域,STM32 和 UART 走线放在另一个方向,模拟区域和数字区域之间用一条连续的地线铺铜连接,所有数字信号走线都远离 ADC 的模拟输入引脚,不要在 ADC 下方穿数字线。

另外,ADS122U04 的模拟输入端加了一组 RC 低通滤波器:串联电阻 1kΩ,并联电容 0.1µF,截止频率大约 1.6kHz。这个滤波器对高频干扰非常有效,因为 delta-sigma ADC 虽然对噪有一定抵抗力,但过强的射频干扰还是会影响转换结果。RTD 的激励电流很微弱,串联电阻 1kΩ 不会影响测量精度,因为 ADC 输入阻抗极高,几乎不抽取电流。

4.2 电源去耦与 TVS 保护

板级电源入口我放了一个 10µF 电解电容加一个 0.1µF 陶瓷电容并联到地,ADS122U04 的每个电源引脚再单独放一个 0.1µF 电容,尽量贴近引脚放置。MCU 的电源入口也一样。这能有效抑制数字翻转时产生的电源毛刺,避免这些毛刺耦合到 ADC 基准端。

工业现场还可能出现浪涌和静电。这个项目里我在 ADC 的模拟输入引脚加了一组低压 TVS 管,方向对地,选型的钳位电压在城市温度传感信号范围内仍能保持不导通。TVS 管会引入微小的漏电流,但以 MOSFET 漏电流的量级,对测量结果影响可以忽略。做一次雷击浪涌测试,发现保护效果比单纯加电阻好太多,算是花小钱保平安。

4.3 屏蔽线缆的正确接地方法

现场传感器线缆一般用屏蔽双绞线。屏蔽层应该单端接地,通常接在控制器侧的地,而不是传感器侧。两端的屏蔽层都接地反而会形成地环路,在差模瞬态噪声下容易出现奇怪读数。我在 HVAC 项目的风管温度传感器就是这么处理的,屏蔽层一头在接线盒里悬空,另一头在主板地接入点就近接地,运行半年没有出现一次读数异常跳变。

5. 实测标定与数据验证

5.1 零点与满量程标定

每块板子焊接完成后,先不急着接传感器,用高精度标准电阻接到 ADC 输入,做一个整机标定。我手里备了一组 0.01% 精度的电阻箱,分别模拟 100Ω、1000Ω 和几个中间阻值,对应 PT100 的 0℃、100℃ 附近,记录 ADC 输出的原始 code。

标定的目标是算出 ADC 的斜率和偏置。公式很简单:T_corrected = (raw_code - offset) * k。Offset 和 k 存进 STM32 的 Flash 参数区里,批量生产时每块板子单独标定,能消除芯片个体差异。不要指望每颗 ADC 和电阻都是理想器件,实测下来同一批板子的原始码值差异能达到几十个 LSB,不标定直接换算温度的话,误差可能到 0.5℃ 以上。

5.2 温度循环测试与环境适应性验证

标定完成以后,我拿三块板子做了高低温循环测试:从 -20℃ 放到恒温箱,逐步升到 85℃,全程采集 ADC 输出。重点关注的是零点漂移和增益漂移。这个过程能暴露很多硬件隐患,比如某个电容在低温下容值变化过大导致环路不稳定,又比如某颗电阻温漂超出预期。

实测结果,ADS122U04 内部基准温漂对这类型应用影响确实不大,三块板子的温度读数在全程范围内最差偏差在 0.3℃ 以内。这个表现用于 HVAC 控制绰绰有余,工业高温炉电流监测(不直接接触火焰)也是够用的。真正影响长期稳定性的反而是传感器本身的老化和线缆端子氧化,这不在电路板能控制的范围内。

5.3 常见读数异常排查思路

在现场如果遇到读数不对,先别急着改软件。我一般按下面这个顺序排查:

  • 读数固定为全 0 或全 1:多半是差分输入悬空、接线断路或者 PGA 配置不对。
  • 读数随机跳变:先看电源纹波,用示波器测 AVDD 和 DVDD;再看 UART 波形是否干净,尤其有没有地环路。
  • 读数缓慢漂移:检查传感器线缆是否有进水、端子是否氧化、IDAC 电流源是否因为负载电压过高进入了非线性区。
  • 温度值明显偏高:大概率是导线电阻没有被补偿,先确认用的是几线制接法,再检查 IDAC 是否按预期输出。

这四条排查顺序看起来简单,但实际能解决 80% 的现场问题。剩下的 20% 大多出在外部环境因素,比如传感器安装位置辐射热太强、探头没有完全插入测温孔等。

6. 工业与 HVAC 场景落地经验

6.1 HVAC 中的典型应用点位与安装注意

HVAC 系统里温度测点非常多,但常见的就是送风温度、回风温度、混合段温度、冷冻水供回水温度、冷却塔出水和回水温度。这些点位的特点是温度范围窄、变化缓慢,对响应速度要求不高,但很在意长期稳定性和维护便利性。

我在这套系统里做了几路 PT1000 测风管温度,因为 PT1000 在同样激励电流下产生的信号电压更高,对连接器氧化和轻微污染的抗性比 PT100 好一些。安装时探头要伸到气流中间位置,不要贴着风管壁,否则测出来的是管壁温度而不是空气温度。这个看似常识的细节,我在现场却见过好几次因安装位置不对导致控制环路震荡的情况。

6.2 工业现场的接地环路与浪涌问题

工业现场比 HVAC 严苛很多,变频器、电机、电焊机都会在接地系统里制造大量噪声。温度传感器线缆一旦和设备外壳形成地环路,ADC 输入端的共模噪声就会猛增。这时候光靠 ADS122U04 的差分输入本身抗共模能力还不够,我会在 ADC 前面增加一个射频共模扼流圈,或者在靠近输入端的位置做 Y 电容滤波,效果都还不错。

还有就是 UART 通信线本身。如果 MCU 和 ADC 之间通过长线连接,建议把波特率降下来,并且加一个终端电阻。我实测过,9600bps 下 2 米长的普通杜邦线通信已经很稳,但 115200bps 时波形畸变明显,偶尔出现误码。所以工业级布线时,宁愿牺牲一点速率也要保证通信可靠性。

6.3 软件层面的滤波与保护策略

软件滤波是温度测量的最后一道防线。我在 STM32F107VC 上实现了两层处理:第一层是 ADC 数据滑动平均滤波,窗口取 8 次采样,能有效抑制随机噪声;第二层是对换算后的温度做变化率限制,比如每秒钟温度变化超过一个给定阈值就认为是异常跳变,直接丢弃并计时报警。这个保护逻辑在传感器断线或者端子进水时非常有用,不至于让上位机收到一个毫无物理意义的 200℃ 然后误动作。

另外,我还在软件里用到 ADS122U04 的开路检测功能。设置合适的阈值,利用 IDAC 流过传感器电阻产生的电压来判断传感器是否存在。一旦检测到开路,直接把输出温度设为无效值并置错误标志位,后续控制逻辑可以选择继续沿用上次有效值或者进入安全状态。这套机制在工业现场非常依赖,因为传感器是外部器件,接线端子氧化和人为误拔是常态。

经验小结与调试技巧

这套 ADS122U04 + STM32F107VC 的测温方案我已经在多个项目上复用,整体稳定性超出预期。如果让我只总结一条最重要的经验,那就是“先把硬件信号链的底噪测清楚,再开始写软件”。我见过很多同行一上来就调算法、滤波、PID,折腾半天发现模拟前端一个去耦电容没放对,这是最费时间的弯路。

调试阶段有一个不起眼但非常实用的技巧:利用 ADS122U04 的 UART 接口,先用串口助手手动发送寄存器配置命令,代替 MCU 程序一步一步跑。这样能最快确认硬件连接是不是正常,也能快速验证某一寄存器的配置效果。等硬件通路完全没问题,再回到 MCU 端把整个驱动流程跑起来。对比直接编译下载调试,这个方法的定位时间能缩短一半。

最后再说一下选型心得。ADS122U04IPWR 适合项目中对模拟前端集成度要求高、又不想在 SPI 通信上花太多精力的场景。STM32F107VC 的 UART 资源足够,性能也完全能跑得起温度换算算法。如果未来要做更多通道或更高采样率,可以考虑把 MCU 升级到主频更高的系列,但 ADC 前端和软件算法基本可以无缝迁移,前期投资不会浪费。

返回列表