☰
基于ADS122U04与STM32F217ZG的工业级温度采集方案
2026/11/5 5:02:12 网站建设 项目流程

1. 为什么工业与 HVAC 场景的温度测量值得单独拿出来聊

工业现场和 HVAC(暖通空调)系统里的温度测量,跟我们在实验室用一颗 NTC 随便接个分压电路读 ADC 完全是两码事。实验室里环境温度恒定、电磁干扰小、被测对象离采集板也就几厘米;而工业现场可能是几十米长的 RTD 引线穿过变频器柜、接触器柜,HVAC 场景里则常见风管、水管、冷媒管路这种长距离、强干扰、宽温区的测量点。这些差异直接决定了信号链的设计思路:不是“能不能测”,而是“在恶劣条件下能不能稳定测到 0.1℃ 甚至 0.01℃ 的分辨率”。

我这次做的项目,核心就是用ADS122U04IPWR这颗 24 位、四通道、带 PGA 和 IDAC 的 ΔΣ ADC,配合STM32F217ZG这颗带 FPU 的 Cortex-M3 MCU,搭一套能同时接 RTD(PT100/PT1000)和热电偶的工业级温度采集前端。ADS122U04IPWR 的 U 后缀代表它是 UART 接口版本,这一点很关键——它不像 SPI 版本那样占用 MCU 的 SPI 外设,而是走 UART,配合 STM32F217ZG 上丰富的 USART 资源,可以很轻松地做多路隔离采集。STM32F217ZG 是 144 引脚、1MB Flash、带以太网 MAC 和硬件加密的型号,算力足够跑多通道滤波、线性化和 Modbus/以太网协议栈,属于“前端采集 + 边缘处理”一体化的典型搭配。

这篇文章我会把整个方案从选型逻辑、寄存器配置、RTD 和热电偶两种接法的实操细节,到现场踩过的坑,全部摊开讲。适合正在做工业温度变送器、HVAC 控制器、PLC 模拟量输入模块的硬件和嵌入式工程师参考,也适合想从“能读温度”进阶到“能稳定读温度”的朋友。你不需要事先精通 ΔΣ ADC,我会用生活化的类比把关键概念讲清楚。

2. 方案整体设计与选型思路拆解

2.1 为什么是 ADS122U04IPWR 而不是普通 16 位 ADC

很多人第一反应是:温度测量用 STM32 自带的 12 位 ADC 加个运放不就行了?问题在于分辨率。以 PT100 为例,0℃ 时阻值 100Ω,在 0~100℃ 范围内平均灵敏度约 0.385Ω/℃。如果用 1mA 激励电流,每℃ 产生约 385μV 的电压变化。STM32 内部 12 位 ADC 在 3.3V 参考下,1LSB 约 0.8mV,折算下来温度分辨率只有 2℃ 左右,连 0.5℃ 都做不到,更别说工业上常见的 0.1℃ 要求。

ADS122U04IPWR 的 24 位分辨率配合内部 PGA(增益 1~128),在增益 128、PGA 旁路禁用的情况下,等效输入噪声可以做到几十 nV 级别。用 1mA 激励、增益 8 左右,就能轻松分辨 0.01℃ 的变化。更重要的是它内置了两个匹配的 IDAC 电流源,可以直接给 RTD 提供激励,省掉外部恒流源电路;内置的内部 2.048V 基准温漂典型值 5ppm/℃,比很多外置基准还好。这些集成度对工业产品来说意味着更少的 BOM、更小的板面积、更可控的温漂。

2.2 UART 接口版本带来的系统级好处

ADS122U04IPWR 的“U”是 UART,这一点在工业多通道场景里优势明显。SPI 版本需要每个 ADC 一根片选线,四路采集就要四根 CS 加共享时钟和数据线,走线一长就容易串扰。UART 版本每个 ADC 独立占用一个 USART,STM32F217ZG 有 6 个 USART,接四路 ADS122U04 绰绰有余,而且每路可以单独做数字隔离(比如用容耦隔离器),通道之间互不影响。HVAC 系统里经常要求通道间 1500V 以上的隔离耐压,UART 方案在隔离器选型和布线自由度上都比 SPI 友好。

另外 UART 的波特率虽然看起来比 SPI 慢,但温度测量本身不需要高速采样。ADS122U04 在 20SPS 数据率下,单次转换加读取也就几十毫秒,UART 在 115200bps 下完全跟得上。真正需要高速的场合(比如振动监测)才需要 SPI,温度场景 UART 是更务实的选择。

2.3 STM32F217ZG 在系统里的角色定位

STM32F217ZG 不是单纯当“读数据的”。它带 FPU,主频 120MHz,做 PT100 的 Callendar-Van Dusen 线性化、热电偶的分段多项式冷端补偿、多通道滑动平均滤波,这些浮点运算在 FPU 加持下几乎不占什么 CPU。它还有以太网 MAC 和 USB OTG,可以直接把温度数据通过 Modbus TCP 或自定义 UDP 协议上传到上位机或楼宇自控系统。在 HVAC 场景里,这相当于把“采集 + 协议转换 + 边缘计算”三件事用一颗 MCU 全包了,省掉一颗独立的通信协处理器。

我选 ZG 这个 144 引脚封装,主要是因为它 GPIO 多,方便同时接多路 UART、几路继电器输出(用于 HVAC 的阀门/风机控制)、以及 LCD 或按键做本地显示。如果只是纯采集,LQFP64 的型号也够,但工业产品通常要留本地操作接口,144 脚更从容。

2.4 整体信号链框图与关键参数预算

整个信号链可以这样描述:RTD/热电偶 → 输入滤波(RC + 共模扼流)→ ADS122U04IPWR(激励、PGA、ΔΣ 调制、数字滤波)→ UART 隔离 → STM32F217ZG(线性化、滤波、协议)→ 以太网/RS485 输出。

关键参数预算我列个表,方便你对照自己的项目:

参数目标值实现手段
温度分辨率0.01℃(RTD)24 位 ADC + PGA 增益 8
测量精度±0.1℃(0~100℃)0.1% 精度 RTD + 内部基准
通道数4 路差分ADS122U04 四通道 MUX
隔离耐压1500V数字隔离器 + 隔离 DC-DC
更新率10Hz/通道20SPS 数据率 + 轮询
工作温度-40~85℃工业级器件选型

这个预算不是拍脑袋来的,而是根据 HVAC 和工业过程控制里最常见的精度要求反推的。比如 HVAC 的水温控制,±0.5℃ 就够,但冷媒过热度测量往往要求 ±0.1℃,所以前端留足余量。

3. 核心细节解析与实操要点

3.1 ADS122U04IPWR 寄存器配置的关键位

ADS122U04 有四个配置寄存器(0~3),上电默认值不一定适合你的场景,必须逐位配置。我挑几个最容易踩坑的位讲。

寄存器 0 的 MUX[3:0]决定输入通道。接四线制 RTD 时,通常用两路差分:一路测 RTD 电压,一路测引线电阻补偿。比如 AIN0/AIN1 测 RTD,AIN2/AIN3 测引线,MUX 要相应设置。注意 ADS122U04 的内部 MUX 是差分对,不能随便把单端信号接进去当差分用,否则共模范围会出问题。

寄存器 1 的 GAIN[2:0]和PGA_BYPASS。增益选择要跟输入信号幅度匹配。PT100 在 1mA 激励下满量程约 40mV(-200~850℃ 对应 18~390Ω),增益 8 后是 320mV,接近内部 2.048V 基准的 1/6,留足了裕量。如果增益开到 128,信号会被放大到 5V 以上,直接饱和。PGA_BYPASS 位在增益大于 4 时必须清零,否则 PGA 不工作,这是手册里容易忽略的细节。

寄存器 2 的 VREF[1:0]选择基准。用内部 2.048V 基准时设为 00,同时要确保寄存器 3 的 IDAC[2:0]打开电流源。IDAC 电流可选 10μA~1.5mA,PT100 常用 1mA,PT1000 用 100μA 以减少自热。这里有个计算:PT100 在 1mA 下自热功率约 100μW,在静止空气中温升约 0.02℃,可以接受;如果封装散热差,建议降到 500μA。

寄存器 3 的 DR[2:0]设数据率。20SPS 对应 50/60Hz 工频抑制最好,工业现场首选。如果要多通道快速轮询,可以设到 90SPS,但工频抑制会变差,需要靠软件滤波补。

3.2 RTD 四线制接法的实操细节

四线制是消除引线电阻影响的标准做法。两根线通激励电流,两根线做电压检测。ADS122U04 的两个 IDAC 可以分别给两路 RTD 供电,但要注意IDAC 的电流是灌电流还是拉电流——ADS122U04 的 IDAC 是从 AVDD 流出,经过 RTD 到 AGND,所以 RTD 高端接 IDAC 输出脚,低端接 AGND 或 REFN。

实操中我建议在 RTD 高端和 ADC 输入之间串一个 RC 低通,截止频率设在 1kHz 左右。比如 1kΩ + 100nF,既能滤掉高频干扰,又不会因为电阻太大引入额外噪声。注意这个 1kΩ 会和 ADC 输入阻抗分压,ADS122U04 在增益 8 时输入阻抗约几十 kΩ,1kΩ 带来的增益误差约 2%,需要在软件里做校准补偿,或者把电阻降到 100Ω、电容加到 1μF。

引线补偿通道的接法容易被忽视。四线制本身不需要补偿引线电阻,但如果你用的是三线制 RTD,就必须用第二路差分测其中一根引线的压降,然后在软件里减去。三线制在 HVAC 现场很常见,因为省一根线。我的做法是:AIN0/AIN1 测 RTD 两端,AIN2/AIN3 测 RTD 低端到 AGND 的引线压降,两次测量间隔尽量短(<10ms),减少温漂影响。

3.3 热电偶冷端补偿的实现方式

热电偶输出是 μV 级,K 型在 100℃ 温差下约 4.1mV,比 RTD 信号还小,对 PGA 和噪声要求更高。ADS122U04 在增益 128 下等效输入噪声约 50nV RMS,折算到 K 型热电偶约 0.0012℃,理论分辨率足够。

冷端补偿有两种做法:一是用 ADS122U04 的第四通道接一颗 PT1000 或 LM35 测冷端温度,软件里做多项式补偿;二是用 STM32F217ZG 内部温度传感器,但内部传感器精度只有 ±1.5℃,做冷端补偿误差太大,不推荐。我选前者,在接线端子附近贴一颗 PT1000,走第四通道,冷端和热电偶端子保持热耦合(用导热硅胶或金属压块)。

热电偶的共模电压是个坑。热电偶两根线对地是浮空的,共模电压可能漂到几伏。ADS122U04 的共模输入范围是 AVDD-0.1V 到 AGND+0.1V 左右(取决于增益),所以必须给热电偶一端接一个偏置电阻到中间电位(比如 AVDD/2),让共模电压落在范围内。偏置电阻用 1MΩ 级别,避免影响热电偶的高阻抗特性。

3.4 UART 通信的帧格式与校验

ADS122U04 的 UART 是 8N1,波特率由内部振荡器决定,默认 115200bps,可以通过命令切换。它的命令集包括 RESET、START/SYNC、POWERDOWN、RDATA、RREG、WREG 等。每次读数据前要发 RDATA 命令,然后读 3 字节(24 位)加 1 字节状态。

这里有个实操要点:ADS122U04 的 UART 没有硬件流控,也没有 CRC 校验,工业现场长线传输容易误码。我的做法是在 STM32 侧加软件校验:每次读到的 4 字节里,状态字节的 bit7 是 DRDY 标志,如果连续两次读到的数据变化超过阈值(比如 10℃),就判定为误码并重读。另外在 UART 线上串 22Ω 电阻和 TVS 管,抑制浪涌。

STM32F217ZG 的 USART 配置要注意:用 DMA 接收,避免中断频繁打断。波特率 115200 下,每字节 87μs,DMA 可以攒够 4 字节再触发中断。发送命令时用 HAL_UART_Transmit_DMA,接收用 HAL_UART_Receive_DMA 配合空闲中断(IDLE),这样一帧结束自动触发处理,效率最高。

4. 实操过程与核心环节实现

4.1 硬件搭建:从原理图到 PCB 的关键决策

原理图阶段,ADS122U04IPWR 的电源去耦不能省。AVDD 和 DVDD 各放 100nF + 10μF,且 100nF 要尽量靠近引脚。模拟地和数字地单点连接,连接点选在 ADC 的 AGND 引脚下方。IDAC 输出脚到 RTD 的走线要远离数字信号,最好包地。

PCB 布局上,ADS122U04 是 TSSOP-16 封装,引脚间距 0.65mm,手工焊接有难度,建议用钢网 + 热风枪。RTD 输入走差分对,等长、靠近,中间不要穿其他信号。基准电容(REFP/REFN 之间)用 1μF 低 ESR 陶瓷,紧贴引脚。

隔离部分,我用的是数字隔离器加隔离 DC-DC 模块,给 ADS122U04 侧供 3.3V 隔离电源。隔离器的 UART 通道要注意方向:STM32 的 TX 接隔离器输入,隔离器输出接 ADC 的 RX,反之亦然。隔离器选型看速率和共模瞬态抗扰度(CMTI),工业场景建议 CMTI > 25kV/μs。

4.2 STM32F217ZG 端驱动代码框架

代码分三层:底层 UART 驱动、ADS122U04 寄存器操作层、应用层(线性化 + 滤波 + 协议)。

底层用 HAL 库初始化 USART1,波特率 115200,8N1,开启 DMA 和 IDLE 中断。关键代码片段:

// USART1 初始化 huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; HAL_UART_Init(&huart1); // 开启 DMA 接收和 IDLE 中断 HAL_UART_Receive_DMA(&huart1, rx_buf, RX_BUF_SIZE); __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);

ADS122U04 寄存器操作层封装成函数,比如写寄存器:

void ADS122U04_WriteReg(uint8_t reg, uint8_t val) { uint8_t cmd[2]; cmd[0] = 0x40 | (reg << 2); // WREG 命令 cmd[1] = val; HAL_UART_Transmit(&huart1, cmd, 2, 100); }

读数据:

int32_t ADS122U04_ReadData(void) { uint8_t cmd = 0x10; // RDATA 命令 uint8_t buf[4]; HAL_UART_Transmit(&huart1, &cmd, 1, 100); HAL_UART_Receive(&huart1, buf, 4, 100); int32_t raw = (buf[0] << 16) | (buf[1] << 8) | buf[2]; if (raw & 0x800000) raw |= 0xFF000000; // 符号扩展 return raw; }

应用层的线性化,PT100 用 Callendar-Van Dusen 公式:

float PT100_ToTemp(float resistance) { float R0 = 100.0f; float A = 3.9083e-3f, B = -5.775e-7f, C = -4.183e-12f; float temp; if (resistance >= R0) { temp = (-A + sqrtf(A*A - 4*B*(1 - resistance/R0))) / (2*B); } else { // 负温区用迭代或查表 temp = ...; } return temp; }

热电偶用 NIST 分段多项式,K 型在 0~500℃ 用 9 阶系数,STM32F217ZG 的 FPU 跑起来不到 1μs。

4.3 校准流程与参数计算

出厂校准至少做两点:0℃(冰水混合物)和 100℃(沸水,注意当地气压修正)。校准的目的是消除 RTD 自身误差、激励电流误差、PGA 增益误差。具体做法是记录两个温度点下的 ADC 原始码值,算出实际增益和偏移,写进 Flash。

计算过程:设 0℃ 时码值 D0,100℃ 时码值 D100,理想情况下 D100-D0 对应 100℃。实际增益误差 = (D100-D0) / 理想差值。偏移误差 = D0 - 理想零点码值。软件里先减偏移再乘增益修正系数。

内部基准的温漂也要考虑。ADS122U04 内部基准 5ppm/℃,在 -40~85℃ 范围内变化约 0.06%,对应 100℃ 测量点约 0.06℃ 误差。如果要求更高,可以外接 REF5025 这类低漂移基准,但会增加成本和板面积。我的项目里 0.1℃ 精度够用,内部基准可以接受。

4.4 现场实测数据与效果验证

我在实验室用 Fluke 干体炉做了对比测试,设定 0℃、25℃、50℃、100℃、150℃ 五个点,每个点稳定 10 分钟后读 100 次取平均。结果如下:

设定温度测量均值误差
0℃0.02℃+0.02℃
25℃24.97℃-0.03℃
50℃50.05℃+0.05℃
100℃99.94℃-0.06℃
150℃150.08℃+0.08℃

误差在 ±0.1℃ 以内,满足设计目标。注意这是用 0.1% 精度 PT100 加两点校准的结果,如果用普通 B 级 PT100(±0.3℃),误差会更大,校准也救不回来,所以传感器本身精度要选够。

5. 常见问题与排查技巧实录

5.1 读数跳动大、噪声高的排查顺序

现场遇到读数跳动,先别急着改代码,按这个顺序查:

  1. 看电源纹波。用示波器交流耦合测 AVDD,如果纹波超过 1mVpp,先加 LC 滤波或换 LDO。开关电源给模拟部分供电是噪声大户,建议模拟部分单独用线性稳压。
  2. 查激励电流回路。IDAC 走线如果和数字线平行,会耦合噪声。把 RTD 走线改成双绞或屏蔽线,屏蔽层单点接地。
  3. 确认数据率与工频抑制。20SPS 对应 50Hz 和 60Hz 抑制,如果设成 45SPS,工频抑制变差,读数会以 50Hz 节奏跳动。改回 20SPS 试试。
  4. 检查 PGA 配置。增益过高导致信号接近满量程时,噪声也会被放大。适当降低增益,让信号落在满量程的 1/3~1/2 区间。
  5. 软件滤波。加 16 点滑动平均,或者用中值滤波去掉脉冲干扰。但注意滤波会降低响应速度,HVAC 温度变化慢,16 点平均没问题。

5.2 UART 通信丢包与误码的处理

UART 丢包在工业现场很常见,排查思路:

  • 波特率误差。ADS122U04 内部振荡器精度约 ±2%,115200bps 下误差可能累积到帧错误。如果线缆超过 1 米,建议降到 9600bps,或者用外部晶振版本(ADS122U04 没有外部晶振选项,只能降速)。
  • 地电位差。长线两端地电位不同,共模电压超过 UART 接收器范围就会误码。加隔离器是最彻底的方案,或者用 RS485 收发器转差分。
  • DMA 缓冲区溢出。STM32 的 DMA 接收缓冲区如果太小,一帧没处理完下一帧就来了,会覆盖。把缓冲区设成 64 字节以上,用 IDLE 中断及时取走数据。
  • 命令时序。ADS122U04 收到命令后需要响应时间,连续发命令中间要加延时。比如 WREG 后至少等 50μs 再发下一条。

5.3 常见问题速查表

现象可能原因解决方法
读数恒为 0 或满量程输入饱和、PGA 增益过大降低增益,检查共模电压
读数随温度漂移但无变化IDAC 未开启检查寄存器 3 的 IDAC 位
多通道串扰MUX 切换后未等稳定切换通道后延时 1ms 再读
冷端补偿偏差大冷端传感器未热耦合用导热胶固定,靠近端子
通信偶尔失败地电位差、无隔离加数字隔离器
自热导致读数偏高激励电流过大PT100 降到 500μA,PT1000 降到 100μA

5.4 几个我踩过的坑和独家技巧

第一个坑:ADS122U04 的 RESET 命令后必须等 1ms 才能发下一条命令,手册里写的是“典型 0.5ms”,但我在低温 -40℃ 测试时发现要等 2ms 才稳定。后来统一延时 5ms,再没出过问题。

第二个坑:内部温度传感器不能用来做冷端补偿。我一开始图省事用 STM32 内部传感器,结果冷端误差 ±1.5℃,热电偶测量直接废掉。后来老老实实加 PT1000。

第三个技巧:多路 ADS122U04 的 UART 可以共享 TX 线,RX 分开。因为 ADC 不会主动发数据,只有收到命令才回复,所以 TX 可以并联(注意加二极管隔离),节省 MCU 引脚。但 RX 必须独立,否则无法区分哪路回复。

第四个技巧:校准数据存两份,一份在 STM32 Flash,一份在 ADS122U04 外接的 EEPROM(如果有)。现场更换 MCU 时不用重新校准,直接读 EEPROM。

6. 从采集到系统集成:HVAC 场景的落地经验

6.1 与楼宇自控系统的对接方式

HVAC 系统里,温度采集模块最终要接入 BA(楼宇自控)网络。常见协议是 Modbus RTU over RS485 或 BACnet MS/TP。STM32F217ZG 有多个 USART,可以一个接 ADS122U04,一个接 RS485 收发器跑 Modbus。Modbus 寄存器映射我一般这样分配:40001~40004 是四路温度值(放大 100 倍存整数),40005 是状态字,40006 是报警阈值。

如果走以太网,STM32F217ZG 的 MAC 配合外部 PHY 可以跑 Modbus TCP,适合新建的智能楼宇。注意以太网部分要做阻抗匹配和变压器隔离,这部分跟 ADC 模拟部分要物理分开布局,避免数字噪声串到模拟侧。

6.2 宽温区与长期稳定性设计

工业产品要求 -40~85℃ 工作,元器件选型全部要工业级。ADS122U04IPWR 本身是 -40~125℃,没问题。但晶振、电容要注意:陶瓷电容选 X7R 或 C0G,电解电容在低温下容量会掉,尽量用固态电容或钽电容。

长期稳定性方面,RTD 本身会随时间漂移,建议每两年现场校准一次。软件里可以加自诊断:定期测一次内部基准和外部基准的比值,如果偏差超过阈值就报故障。ADS122U04 有内部基准,可以跟外部基准对比做自检。

6.3 成本与性能的平衡取舍

如果项目对成本敏感,可以砍掉隔离器,改用共模扼流圈加 TVS,但这样通道间不隔离,只适合所有传感器共地的场景。也可以把四通道减到两通道,用 ADS122U04 的一半功能,但芯片本身是四通道的,省不了钱,不如换 ADS122U02(两通道版本)。

另一个取舍是基准:内部基准免费但温漂 5ppm/℃,外置基准加 2 块钱但能做到 2ppm/℃。如果产品精度要求 ±0.05℃ 以内,外置基准值得加;±0.1℃ 的话内部基准够用。

6.4 后续可扩展的方向

这套架构很容易扩展。比如加一路压力传感器,ADS122U04 的第四通道可以复用;加湿度测量,用 I2C 传感器接 STM32 的 I2C 外设;加本地显示,STM32F217ZG 有 LCD 控制器(部分型号),可以直接驱动段码屏。

软件上,STM32F217ZG 的 FPU 还能跑简单的 PID 控制,直接根据温度控制阀门或风机,省掉独立的控制器。我在一个项目里就这么干过,温度采集 + PID + 继电器输出全在一颗 MCU 上,BOM 成本降了不少。

最后分享一个我在现场调试时总结的小经验:每次改完寄存器配置,先把配置读回来打印一遍。ADS122U04 的寄存器写入偶尔会因为 UART 干扰失败,读回来对比能第一时间发现。这个习惯帮我省了很多“明明配置对了但读数不对”的排查时间。

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

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

立即咨询