基于ADS122U04与STM32F765ZI的四路温度采集板设计

发布时间:2026/11/5 7:35:03
基于ADS122U04与STM32F765ZI的四路温度采集板设计

上个月我给自己做了一块四路温度采集板,核心是 TI 的 ADS122U04IPWR 和 ST 的 STM32F765ZI。ADS122U04 是一颗带 UART 接口的 24 位 Δ-Σ ADC,内置四通道模拟输入、可编程增益放大器、两个恒流源和内部温度传感器,专门为 RTD、热电偶这类传感器测量设计;STM32F765ZI 则是 Cortex-M7 内核的 MCU,2MB Flash 加 512KB RAM,算力非常充裕。这套组合做工业过程监控和 HVAC 暖通系统的温度采集,属于很少走弯路的方案,因为模拟前端、数字接口、数据处理和通信扩展都正好对得上。

这篇文章把整个项目的关键点捋一遍,从选型思路、硬件电路、软件流程到校准和排错,都会给出可以直接抄作业的配置和参数。不管你是刚接触 ADC 测温,还是已经在做同类产品想优化精度,应该都能从这里找到有用的东西。

1. 方案选型:这套组合到底解决什么问题

1.1 先把需求放在台面上

我最初的项目需求其实很朴素:做一块能稳定测量温度、能放进工业控制柜和 HVAC 机组里的采集板,基本要求如下。

  • 至少 4 路温度输入,兼容 PT100、PT1000 和 K 型热电偶。
  • HVAC 场景精度要求不低,出水/回水温度通常要 ±0.2℃ 到 ±0.5℃;工业场景范围更宽,-50℃ 到 400℃ 也常遇到,精度 ±1℃ 上下。
  • 传感器可能离采集板几米到几十米远,现场还有变频器、接触器这类强干扰源。
  • 数据要能传给上层控制器,所以 MCU 最好能直接出 Modbus 或者以太网。

这些需求放到一起,选型思路就清晰了:前端需要一个高分辨率、低噪声、自带激励源的 ADC,因为温度和电阻变化的关系是线性的,但信号很微弱;后端需要一个有足够算力、接口丰富的 MCU,因为要跑滤波、线性化、PID 和通信协议。

1.2 为什么锁定 ADS122U04IPWR

先解释一下型号后缀。ADS122U04 是芯片本身的系列名,IPW 代表 TSSOP-24 封装,R 表示卷带包装,ADS122U04IPWR 就是完整订货型号。TSSOP-24 在这类板子上很合适,手工焊接不难,打样和小批量都方便。

这颗 ADC 最大的特点是自带 UART 接口。常见的高精度 ADC 大多是 SPI 输出,SPI 在板内没问题,拉到几米开外就容易受干扰,而且每一片 ADC 都得占一个片选引脚。ADS122U04 走 UART,只需要 TX 和 RX 两根线,还能通过地址引脚在一条总线上挂多个设备,这对工业现场的长线传输和简化布线非常友好。

再看核心指标。24 位 Δ-Σ 架构,内置 PGA 最大 128 倍增益,内置两个 IDAC 恒流源,内置低温漂参考电压,还带内部温度传感器和烧断检测。这些功能基本就是为 RTD 和热电偶准备的。RTD 需要恒流源激励和比例测量,热电偶需要高增益和小信号处理,内部温度传感器可以做冷端补偿,都不用额外加芯片。

1.3 为什么配 STM32F765ZI

STM32F765ZI 在这个项目里主要干三件事。

第一是算力。Cortex-M7 单核跑到 216MHz,带 FPU 和 DSP 指令,处理 24 位码值转换、PT100 的 Callendar-Van Dusen 方程、热电偶查表插值都很快。一套四通道温度计算加滤波,CPU 占用率基本可以忽略,余量可以跑 PID 控制算法。

第二是接口丰富。F7 系列有多路 USART/UART,可以同时挂多片 ADS122U04;它本身还有 FDCAN、以太网 MAC,后续要上 Modbus RTU 或者 EtherNet/IP 都不需要换主控。

第三是资源和封装。2MB Flash 放协议栈加应用代码绰绰有余,512KB RAM 够开多个 DMA 缓冲,LQFP144 封装手工焊接也没压力。其实用 F103 也不是不行,但要同时处理多路高精度温度计算、PID 和通信,F1 的资源会显得紧,F765ZI 属于一次到位。

2. 硬件电路设计要点

2.1 RTD 比例测量原理与电路

RTD 测温的本质是测电阻。PT100 在 0℃ 时是 100Ω,到 100℃ 大约变成 138.5Ω;PT1000 在 0℃ 是 1000Ω,到 100℃ 约 1385Ω。要把电阻变化转成 ADC 能读的电压,需要一个恒流源激励,然后在电阻两端取压差。

ADS122U04 的 IDAC 恒流源就是干这个的。但恒流源本身有温漂,如果直接用内部 2.048V 参考电压,电流漂移会直接变成测量误差。所以这题的标准做法是比例测量:让同一个 IDAC 电流同时流过 RTD 和一颗精密基准电阻 RREF,用 RREF 上的压降作为 ADC 的参考电压。

这样推导很简单。假设激励电流是 I,RTD 两端电压是 I×R_RTD,RREF 两端电压是 I×R_REF,ADC 输出码值近似等于两个电压之比。如果满量程对应 2^23,则:

R_RTD = (ADC_CODE / 2^23) × R_REF

公式里的 I 被约掉了,恒流源的漂移和噪声都不会进入最终结果,只有 ADC 本身的线性误差和 RREF 的温漂会影响测量。这是 RTD 测量精度能做得高的关键。

RREF 的选择非常重要。我用的是一颗 0.1% 精度、温漂 25ppm/℃ 的精密金属膜电阻,阻值按满量程走。PT100 在 850℃ 时约 390Ω,如果激励电流取 1mA,390mV 需要 PGA 增益 8 倍才能填满内部 2.048V 参考的量程。RREF 一般取 1.5kΩ 到 2kΩ 比较合适,保证 RTD 最大压降不超过参考电压。

三线制的接法也要说清楚。工业现场 RTD 导线往往很长,导线电阻不可忽略,两线制会直接把导线电阻算进传感器电阻里。三线制的思路是让两条线分别走激励电流回路和电压采样回路。用 ADS122U04 的两个 IDAC,一路进入 RTD,另一路用来补偿导线电阻,ADC 差分输入采样的是 RTD 两端真正的压差,从而抵消导线电阻的影响。如果追求最高精度,比如实验室或计量场景,就用四线制,直接在 RTD 本体两端单独引出采样线,导线电阻完全被隔离在测量回路之外。

2.2 热电偶测量与冷端布局

热电偶的特点是测温范围宽、成本低,但输出信号极弱。K 型热电偶的灵敏度大约是 41µV/℃,也就是说 1℃ 的变化只有 41 微伏。这时候 PGA 增益要拉到 128 倍,并且要非常小心输入偏置和噪声。

冷端补偿是热电偶绕不开的环节。热电偶测的是热端和冷端的温差,冷端也就是接线端子处的温度必须知道,才能反推出真实温度。这里可以直接用 ADS122U04 的内部温度传感器,把所有通道轮流切到内部温度传感器上读一次,就能得到芯片结温,近似作为冷端温度。也可以在端子排附近放一颗高精度热敏电阻或数字温度传感器,然后把冷端温度通过程序叠加到热电偶的测量结果里。

需要注意的是,冷端温度传感器一定要尽量贴近热电偶的接线端子,而且最好用导热材料把两者耦合起来,不要让冷端暴露在气流里。我之前见过不少案例,热电偶本身精度没问题,就是冷端温度测不准,导致整体误差两三度,这属于典型的布局问题。

2.3 供电、隔离与保护

工业现场最怕的其实是地电位差。传感器一端在现场,采集板一端在控制柜,两地之间可能有几伏甚至几十伏的地电位差,直接共地必出问题。

所以我把模拟部分和数字部分做了严格隔离。ADS122U04 的模拟电源 AVDD 和 DVDD 分开,各用一颗低噪声 LDO,AVDD 建议用 3.3V 或 5V,电源纹波控制在 10mV 以内。数字侧与 STM32 之间加了一颗 ISO7721 数字隔离器,隔离 ADC 的 UART 信号,这样模拟前端可以和传感器共地,MCU 侧和自己的系统共地,两边互不干扰。

输入保护方面,每一路模拟输入都加了共模和差模滤波电容,再串入 RC 限流电阻,对抗高频干扰和 ESD。RTD 和热电偶端子附近加 TVS 管,防止现场静电或意外碰触到高压。

2.4 PCB 布局与走线

这部分容易被忽视,但实测下来影响非常大。

我的做法是模拟区域和数字区域完全分区,AGND 和 DGND 在板子某一点单点连接,避免地环路。ADS122U04 的模拟输入走线短而直,REF 引脚附近格外小心,RREF 基准电阻尽量靠近 REFP 和 REFN 引脚,走线尽量等长,减少耦合噪声。RTD 的激励和采样线如果从端子排过来,用一对双绞线引到 ADC,中间不要穿过数字走线。

电容摆放上,AVDD 和 DVDD 的退耦电容要紧贴电源引脚,0.1µF 加 10µF 组合,模拟输入端的滤波电容也要尽量靠近引脚。之前有一版我偷懒把 REF 电阻走远了,读数噪声直接从几十 LSB 涨到几百 LSB,后来把元件挪近才压下去。

3. 软件实现全流程

3.1 STM32 串口初始化与通信帧

ADS122U04 的串口参数按我用的批次是 19200bps、8 数据位、无校验、1 停止位。STM32 这边用 HAL 库初始化 USART3,配置为同样的参数即可。需要注意,19200 波特率下 1 个字节大约 520µs,读完整数据帧 4 个字节约 2ms,如果你的控制周期要求高于这个速度,就得评估一下是否够用。

通信帧格式方面,ADS122U04 支持写寄存器、读寄存器、读数据等命令。以读数据为例,主机发送 RDATA 命令,ADC 返回 3 字节的 24 位转换结果,如果开启了 CRC,还会再返回一个校验字节。实际发送时我习惯先发命令再等响应,用中断接收缓存,收到完整帧再解析。为了保证帧同步,可以在命令前后加一点延时,避免上一次通信的残余字节干扰下一次。

3.2 寄存器配置实例

我直接给一版实际项目中用的寄存器配置,PT100 三线制,PGA 增益 8 倍,激励电流 500µA,外部基准电阻 1.5kΩ。

寄存器 0(REG0):输入通道选择为通道对 AIN1/AIN2,PGA 使能,增益 8 倍。

寄存器 1(REG1):数据速率选择 640SPS,正常工作模式,连续转换模式。

寄存器 2(REG2):IDAC1 电流设为 500µA,IDAC1 输出接到 AIN1 方向;IDAC2 电流同为 500µA,用于三线制补偿。

寄存器 3(REG3):参考电压选择外部 REFP/REFN,内部温度传感器禁用,烧断检测关闭。

这些值不是死的。如果你用 PT1000,激励电流可以降到 250µA,避免自热效应太明显;如果你用热电偶,PGA 直接拉满 128 倍,参考源可以切回内部 2.048V,因为热电偶不需要比例测量。

3.3 连续模式与命令式采集的选择

ADS122U04 支持两种数据输出方式,一个是连续转换模式,ADC 自己按数据速率出数,把结果不断推给主机;一个是命令式模式,主机发一次命令,ADC 转换一次,返回一个结果。

我的建议是默认用连续模式。它的好处是时序简单,对 MCU 这边就是开个 DMA 接收,ADC 自动推数据,主机永远能拿到最新值,适合做实时控制或者数据记录。命令式模式适合低功耗场景,主机不请求就不转换,省电,但实时性差一些。

在连续模式下,我开了 UART 空闲中断加 DMA 接收,每次收到固定帧长数据就触发回调,把数据从 DMA 缓冲拷出来解析。这里有个小技巧:CRC 开启之后,帧长度是固定的,可以用帧尾 CRC 判断一帧是否完整,避免 DMA 半唤醒的粘连问题。

3.4 码值换算和线性化

ADS122U04 输出的是 24 位有符号码值,最高位是符号位。双极性模式下,满量程正输入对应 0x7FFFFF,满量程负输入对应 0x800000,中间零点是多少取决于配置。

把码值换算成电阻,用之前比例测量的公式:

R_RTD = (ADC_CODE / 8388608) × R_REF

注意这里 8388608 是 2^23,不是 2^24。因为 24 位有符号数,正半轴只有 2^23 - 1 个码。这个细节我刚开始就栽过,换算出来的电阻整体偏大一倍。

得到电阻之后,求温度用 Callendar-Van Dusen 方程。0℃ 以上用简化形式:

R = R0 × (1 + A×t + B×t²)

其中 A = 3.9083×10⁻³,B = -5.775×10⁻⁷。从 R 反推 t,可以用求根公式,也可以二分法。STM32F765ZI 跑 FPU,二分法 20 次迭代大概几微秒,精度远超传感器本身。

0℃ 以下要用完整方程,多一项 C×(t - 100)×t³,C = -4.183×10⁻¹²。如果你只做 HVAC,温度范围基本在 -10℃ 到 60℃,简化方程就够了;工业场景如果测低温,就得用完整形式。

热电偶这边,最实用的是查表加线性插值。把 NIST 的热电偶温度-电势表按 10℃ 一个点存成数组,在 STM32 里查表找相邻两点,插值计算温度。10℃ 间隔的线性插值误差非常小,完全满足 ±1℃ 的要求,比直接跑高阶多项式省事得多。

3.5 多通道扩展与管理

ADS122U04 本身是四输入 ADC,但模拟输入的切换在内部通过 MUX 完成,每次只有一对输入被采样。所以物理上它是一颗四选一 ADC,不是同步采样四路。如果你要同时跟踪四个点的温度变化,轮流扫描就行,800SPS 的速率下,四路每路也有 200SPS,对温度场完全够用。

如果需要更多路数,比如 8 路、16 路,有两种扩展思路。最简单的是 STM32F765ZI 有多路 UART,每个 UART 挂一片 ADS122U04,天然独立,互不干扰;更省引脚的做法是让多片 ADC 挂在同一条 UART 总线上,通过 ADDR 引脚配置不同地址,主机按地址访问。

我实际使用的是每片独立 UART 的方案,因为软件最简单,一个串口对应一个 ADC,收到数据就知道是哪一路,不需要地址解析。如果做便携式低功耗设备,可以考虑地址总线方案,少占用 MCU 的 UART 资源。

4. 校准与误差控制

4.1 校准流程

硬件再准,也不可能零误差。ADC 自身有增益误差和偏置误差,RREF 有初始精度误差,这些都要通过校准来修正。

最标准的做法是用一个精密的电阻箱做校准。把电阻箱接到 RTD 输入通道,设置几个标准阻值,比如 100Ω、138.5Ω、175.8Ω,对应 0℃、100℃、200℃。每个点记录 ADC 读数和实际阻值的偏差,做线性拟合,得到增益修正系数 K 和偏置修正量 B。之后每路输入都套用:

R_corrected = K × R_raw + B

实测一套下来,PT100 在 0℃ 到 200℃ 范围内能把误差压到 ±0.1℃ 以内,前提是校准源本身要准。恒温油浴加标准铂电阻是最高级的方案,但平时调机用精密电阻箱也够用。

校准数据建议直接存在 STM32F765ZI 内部的 Flash 或者外部 EEPROM,开机时加载,不用每次重新校准。

4.2 误差来源分析

几个误差源按影响大小排个序。

第一位是参考电阻 RREF 的温漂。比例测量把恒流源漂移消掉了,但 RREF 漂移会直接变成测量漂移。所以 RREF 一定选低温漂,最好是金属箔电阻或者高精度薄膜电阻,温漂 5ppm/℃ 比 25ppm/℃ 贵不少,但精度要求高的工业场景值得。

第二位是 ADC 自身的输入噪声。Δ-Σ ADC 的噪声和采样率直接相关,采样率越高,噪声越大。720SPS 下有效分辨率可能只有 18 位上下,20SPS 下可以做到 21 位以上。HVAC 这种温度变化慢的场景,完全可以把采样率压到 20SPS 或 40SPS,换回极低噪声。

第三位是 RTD 的自热效应。激励电流流过 RTD 会产生热量,导致 RTD 本身温度升高。PT100 在空气中散热较差,500µA 的激励电流足以产生零点几摄氏度的自热,会让读数偏高。PT1000 阻值大,同样电流下发热差很多,所以 HVAC 里我更喜欢用 PT1000 加 250µA 激励。

还有一些容易被忽略的误差,比如连接器接触电阻、端子排温漂、ADC 参考输入端的走线寄生电阻。这些有时候不会在大范围看数据时体现,但温度变化后就会慢慢漂。

4.3 不同场景的参数配置

我把典型的配置整理成表格,方便你直接参考。

场景传感器激励电流PGA 增益采样率参考源
HVAC 水温PT1000250µA840SPS外部 RREF
工业管道PT100 三线500µA8160SPS外部 RREF
高温工业PT100 四线1mA16160SPS外部 RREF
宽范围K 型热电偶无12820SPS内部 2.048V

5. 常见问题与排查

5.1 UART 数据错位和乱码

症状是读到的一帧数据忽大忽小,或者 CRC 校验老不通过。

优先检查波特率是否一致。ADS122U04 的 UART 波特率由内部时钟决定,如果它是 19200,STM32 配成 19200,两边相差不能超过百分之几。如果 STM32 用的外部晶振精度不够,可以考虑把串口改成自动波特率检测,或者换更高精度的晶振。

其次是地电位问题。ADC 和 MCU 距离远时,UART 线如果直接相连,两边地电位差会导致信号畸变。解决方案就是前面说的加数字隔离器,一条总线上隔离器放靠近 MCU 一侧。

最后是帧同步问题。连续模式下,如果 MCU 在帧中途开始接收,就会拿到的不是帧头。最简单的处理是用 CRC 过滤,或者先发送一个同步命令,把 ADC 的输出流复位到帧边界。

5.2 读数漂移和跳动

排除接线问题后,跳码多半来自噪声,漂移多半来自参考电阻。

如果是跳码,先看是不是采样率配太高了。把采样率从 640SPS 降到 40SPS,有效分辨率会明显提升,跳动幅度可以降一个数量级。然后是滤波电容,在模拟输入端加 100nF 到 1µF 的电容,配合 RC 滤波,能压掉很大一部分工频和谐波干扰。

漂移就重点查 RREF 和传感器端子。RREF 是不是靠近散热源,比如电源模块或者大电流走线;传感器本身有没有自热,激励电流是不是可以降一档。现场还有一种常见情况是接线端子氧化,接触电阻随温度变化,数据就会跟着环境温度漂。

5.3 冷端补偿错误

热电偶读数的整体偏移往往出在冷端。

排查方法是把热电偶拔下来,用一个短接线短接输入端,此时理论读数应该是 0℃。如果显示偏离,说明冷端补偿或者零点偏置有问题。然后测一下 ADC 的内部温度传感器读数,和现场实际环境温度对比,偏差应该在 ±1℃ 以内。如果内部温度传感器偏了,可以做一次单点校准,把偏差值存在 Flash 里补偿掉。

冷端不稳定的另一个原因是热电偶端子排附近有热源,比如电源模块或者继电器。冷端温度传感器一定要贴在端子上,而不是贴在 PCB 的空白区域。

5.4 多设备通信冲突

多片 ADC 挂同一条 UART 总线时,最容易出现地址冲突和上电时序问题。

ADS122U04 的地址引脚配置要确保每片 ADC 的地址都不一样,否则两片同时响应命令,总线上就打架了。上电时最好让 MCU 先复位所有 ADC,等 ADC 内部上电稳定后再逐片发送访问命令。我之前踩过一次坑,ADC 上电没稳定,MCU 发命令没人响应,程序就卡死了,后来加了一个上电延时才解决。

5.5 排查速查表

问题现象最可能原因处理办法
数据乱码波特率不匹配/地电位差核对波特率、加隔离器
读数跳动大采样率过高或滤波不足降采样率、加输入滤波
读数整体偏移RREF 精度差或冷端未补偿换高精度 RREF、校准冷端
温度随时间漂自热或接触电阻变化降低激励电流、检查端子
多片通信冲突地址重复或上电时序检查地址、加复位延时
CRC 老不通过帧同步丢失发同步命令、开启 CRC 过滤

我自己在实际部署中发现,ADS122U04 加 STM32F765ZI 这套组合最大的价值,是把模拟设计、数据处理和系统通信串在了一条非常顺的线上。ADC 做好传感器信号到码值的转换,MCU 专注于计算和控制,中间只用一根 UART 线对话,调试的时候拿个逻辑分析仪就能看到全部通信过程,非常透明。

如果你接下来想在这个基础上做更多路数,比如 16 路温度采集,我建议先把 UART 总线的时分访问机制定好,保证多片 ADC 不会互相抢时间;如果想走无线或者接到云平台,F765ZI 前面留的算力和 RAM 足够你再挂一个 TCP/IP 协议栈。硬件上的那几条原则——参考电阻选好的、地别乱接、输入滤波别省——只要踩过一次坑,你就会明白它们有多值钱。