做工业温度采集这些年,我越来越觉得“传感器选型”和“ADC 前端”才是系统精度的分水岭。最近一个 HVAC 项目里,我用 ADS122U04IPWR 这颗 24 位 ADC 配合 STM32F373RC,把风管温度、冷却水温和设备表面温度统一做进了一块板子,PT100 通道的重复精度稳定在 ±0.1°C 以内,K 型热电偶通道加上冷端补偿后整体误差也控制在 ±0.5°C。这篇内容就把这套方案从选型逻辑、硬件接法、固件链路到工程化落地完整拆开讲一遍,适合正在做温控仪表、楼宇自控、工业数据采集,或者单纯想把模拟前端做扎实的朋友参考。
1. ADS122U04 + STM32F373RC:这个组合到底解决了温度测量的哪些痛点
1.1 HVAC 和工业现场的温度信号,从来都不是“量个电压”那么简单
我在 HVAC 项目里最常见的三种传感器:PT100/PT1000 铂电阻、K 型热电偶、还有便宜的 NTC 热敏电阻。它们都有各自的“坑”:
- PT100 的电阻温度系数大约只有 0.385 Ω/°C,如果激励电流是 1mA,那么温度每变化 1°C 只产生 0.385mV 的电压变化。信号小,线阻影响却很大,普通两线制接法在导线上随便压掉几个欧姆,对应的温度误差就是十几度。
- 热电偶输出更小,K 型也只有约 41μV/°C,而且测量结果强依赖冷端温度,不做冷端补偿的话,夏天和冬天的读数能差出十几度。
- NTC 本身灵敏度高,但阻值和温度的关系是非线性的,一致性也一般,只能在要求不高的场合用。
以前不少老方案是运放放大后进 MCU 内置 ADC,再靠软件校准去“找补”。这种做法的天花板很明显:仪表放大器的失调和温漂、MCU ADC 的参考电压精度、布线引入的干扰,每一项都很难控。尤其 HVAC 项目里传感器线往往要走三五米甚至十几米,模拟小信号长距离传输就是一场灾难。
1.2 ADS122U04 的关键能力正好打在痛点上
ADS122U04IPWR 是 TI 一颗 24 位 Δ-Σ ADC,内部集成了可编程增益放大器(PGA,最大 128 倍)、2.048V 基准、内部温度传感器、两个用于 RTD 激励的可配置恒流源 IDAC,还有 4 路模拟输入,可以配成双通道差分或四通道单端。最特别的是它带一个 UART 接口,而不是常见的 SPI。
这颗 ADC 的几个设计非常适合温度测量场景:
第一,24 位分辨率加 PGA,K 型热电偶那 41μV/°C 的信号,用 128 倍增益放大后依然能保持足够的分辨率,短接输入时测到的噪声非常低。
第二,内置 IDAC 恒流源可以直接驱动 PT100/PT1000,配合外部精密电阻做比率测量,能把激励电流的温漂和 ADC 基准的误差同时抵消掉。
第三,内部温度传感器可以做热电偶的冷端补偿参考,省掉一路额外的模拟采集。
第四,UART 接口只要两根数字线就能通信,做数字隔离比 SPI 容易得多。对于工业现场,ADC 放在传感器端、主控在另一端,中间加数字隔离器,共模干扰和浪涌就很难闯进 MCU。
1.3 STM32F373RC 在这里不只是“发命令读数据”
STM32F373RC 属于 STM32F3 系列,Cortex-M4F 内核,主频 72MHz,带硬件浮点单元。选它不是因为算力有多猛,而是因为温度换算其实是一堆浮点运算:PT100 的 Callendar-Van Dusen 反解、热电偶的 NIST 多项式查表、冷端补偿计算,有 FPU 会让代码写起来很舒服,不需要手工定点化,也不担心主循环被数学运算卡住。
F373 内部还集成了不错的模拟外设,后续如果想在同一块板上扩展其他信号采集,不用额外加芯片。在这套方案里,MCU 承担的角色很清晰:
- 通过 USART 与 ADS122U04 通信,发送配置命令、读取转换结果;
- 用 GPIO 外部中断监听 DRDY 数据就绪信号;
- 完成 raw code 到电压、电阻、温度的换算;
- 把结果通过 Modbus、CAN 或者 4-20mA 输出给上位机。
选型逻辑总结下来就是:ADC 管信号质量,MCU 管计算和通信,两者各司其职。
2. 硬件连接:三种常用温度传感器的接法差异
2.1 RTD 三线制接法与比率测量
PT100 的测量精度,很大程度取决于接线方式。两线制最省线,但导线电阻直接串进测量回路;四线制最准,却要多拉一根线,成本和施工量都上去了。工业项目里最常用的是三线制,而 ADS122U04 的双 IDAC 结构正好就是为三线制设计的。
我这里用一个实际项目里的接法来说明:
- IDAC1 输出恒流,电流流经第一根引线进入 RTD;
- RTD 另一端经第二根引线接到 ADC 的一个差分输入;
- 第三根引线从 RTD 端部引回 ADC 的另一路输入,用来感知远端真实电压;
- 精密参考电阻 RREF 串在 IDAC 回路中,ADC 的外部基准输入直接并联在 RREF 两端,实现比率测量。
比率测量的意义很多人没意识到:当激励电流和基准电压来自同一个 IDAC 时,电流的任何漂移都会同时影响输入信号和基准电压,最终转换结果几乎不变。换句话说,IDAC 的绝对精度、温漂、电源波动都被自动抵消了,系统精度只取决于 RREF 的精度。所以 RREF 要选低温度系数的精密电阻,我习惯用 0.1% 精度、10ppm/°C 以下的金属箔电阻。
关于 IDAC 电流大小的选择,PT100 常用 500μA 到 1mA,PT1000 则建议 250μA 到 500μA。电流越大信噪比越高,但自热效应也越明显。传感器埋在导热良好的金属探头里时影响不大,如果是细长探针或者空气温度测量,电流宁小勿大。
2.2 热电偶输入:差分对、偏置路径和冷端补偿
热电偶接法比 RTD 看起来简单,就是两根线接到 ADC 的差分输入,但有两个细节容易翻车。
一是输入偏置路径。热电偶本质上是一个直流电压源,但它的输出阻抗低,如果没有明确的直流偏置回路,ADC 输入端的共模电压会不稳定,读数很容易乱飘。我通常会在 AIN0 和 AIN1 上各接一个 1MΩ 电阻到 GND,给输入提供一个确定的偏置路径。也可以在热电偶两端并联一个几十 nF 的电容,配合输入端的 RC 构成低通滤波。
二是冷端补偿。K 型热电偶测到的是热端和冷端的温差电势,必须知道冷端温度才能算出热端真实温度。ADS122U04 内部集成温度传感器,可以直接读芯片附近的温度作为冷端参考。需要注意的是,这个温度是 PCB 上芯片的温度,不是热电偶接线端子的温度。如果接线端子和芯片之间隔了太久,或者板上有 LDO 等发热源,冷端补偿就会出现偏差。我通常会在热电偶端子附近额外贴一颗 NTC,或者用 PCB 走线做等温块,让端子区和 ADC 芯片尽量处在同一温度场。
PGA 增益方面,K 型热电偶在常温范围输出电压只有几毫伏,我习惯用 64 或 128 倍增益,这样能充分发挥 24 位 ADC 的分辨率。信号进入 ADC 之前最好加一级简单的 RC 低通,比如 100Ω 串联电阻加 10nF 差分电容,把高频干扰先滤掉一截。
2.3 NTC、电源和隔离布局
如果项目里还有 NTC 通道,处理起来比 RTD 简单得多。NTC 阻值随温度变化很大,可以直接用 IDAC 作为激励,或者用外部电阻分压后送 ADC。但 NTC 的一致性太差,不同批次之间阻值能差不少,只能靠每通道校准。所以这套方案里我通常把 NTC 用在风管温度这类对精度要求不高的辅助测量上,核心控制点还是交给 PT100 或热电偶。
电源和布局有两个经验:
第一,ADS122U04 的 AVDD 和 DVDD 都要就近放 0.1μF 陶瓷电容,再加一个 10μF 电解电容做低频储能。电源走线不要和模拟输入走线平行,不然开关噪声会耦合进去。
第二,如果做隔离方案,ADC 侧单独供电,用数字隔离器连接 UART 的 TX/RX 和 DRDY。隔离器选双通道以上的型号,比如 ISO7721 或者光耦。需要特别注意的是 DRDY 信号也要一起隔离,否则 MCU 无法可靠判断数据就绪时刻。电源隔离可以用隔离 DC-DC,但要留意输出纹波,纹波太大的话会影响 ADC 的基准和 PGA 性能。
传感器连接器端口我会加 TVS 管和串联电阻,防止现场静电放电和浪涌直接打坏 ADC。这个成本很低,但对工业现场的可靠性提升非常明显。
3. 固件实现:从 UART 命令到温度数值的完整链路
3.1 STM32 侧初始化与 DRDY 中断
ADS122U04 的 UART 接口是标准 8N1,波特率按数据手册配置,我这里用的 115200。STM32 侧初始化 USART 时要注意两点:第一,ADC 的 UART 引脚电平是 3.3V,和 STM32 匹配,不需要额外电平转换;第二,DRDY 引脚配置为下降沿触发的外部中断,转换完成时它会从高电平拉低,通知 MCU 读取数据。
一个完整的数据读取流程应该是:
- 配置 USART 波特率、GPIO 复用;
- 初始化 DRDY 外部中断;
- 向 ADS122U04 写配置寄存器;
- 发送 START 命令启动转换;
- 等待 DRDY 中断标志;
- 发送 RDATA 命令读取 3 字节转换结果;
- 清除标志,进行温度换算。
我见过不少人在第三步和第四步之间出问题:配置寄存器刚写完就立刻发 START,ADC 还没来得及完成内部初始化,导致启动失败。我习惯在写寄存器之后加一个 1ms 左右的延时,稳定可靠得多。
3.2 ADS122U04 的寄存器配置与命令流程
ADS122U04 的寄存器配置本质上和 ADS1220 系列类似,有四个核心寄存器,功能可以这样归类:
| 寄存器 | 主要配置项 | 说明 |
|---|---|---|
| 配置寄存器 0 | 输入多路复用选择、PGA 增益 | 决定哪两个引脚作为差分输入,增益多少倍 |
| 配置寄存器 1 | 转换模式、数据速率、滤波器模式 | 单次/连续转换,20SPS 到 2000SPS 可选 |
| 配置寄存器 2 | 基准选择、温度传感器开关、IDAC 电流 | 内部基准还是外部 RREF,是否启用内部温度传感器 |
| 配置寄存器 3 | IDAC 路由、激励电流大小 | 决定 IDAC 从哪个引脚输出,电流量程 |
命令方面,常用命令包括 RESET(复位)、RREG/WREG(读/写寄存器)、RDATA(读转换结果)、START/SYNC(启动转换)等。不同版本对命令字节的定义稍有差异,强烈建议以你手里的最新数据手册为准,不要凭记忆写死。
下面是我项目里的一段参考代码框架:
void ADS122U_Init(void) { // 复位 ADC ADS122U_SendCommand(ADS122U_CMD_RESET); delay_ms(1); // 配置寄存器0:通道选择 + PGA增益 ADS122U_WriteRegister(0, 0x00); // 具体位值按数据手册配置 // 配置寄存器1:单次转换模式 + 数据速率 ADS122U_WriteRegister(1, 0x00); // 配置寄存器2:外部基准 / 内部温度传感器 / IDAC ADS122U_WriteRegister(2, 0x00); // 配置寄存器3:IDAC路由 + 电流大小 ADS122U_WriteRegister(3, 0x00); }命令发送的函数可以封装成统一的底层接口,比如 write_reg 函数内部实现为:发送 WREG 命令字节、寄存器地址字节、数据字节。读数据时 RDATA 命令发出后连续读回三个字节,按 24 位有符号数拼接。
这里有个工程上的细节:ADS122U04 的 UART 是命令-响应模式,MCU 每发一个命令,ADC 才会响应。不要在忙等 DRDY 的同时用阻塞方式读串口,否则可能把响应数据读丢。我都是先发命令,再进中断等待标志,最后用带超时的串口读取。
3.3 从原始码到电压、电阻、温度
拿到 24 位原始码之后,第一步是换算成电压。数据手册会给出码值和输入电压的关系,我这里以双极性模式为例:
电压 = (原始码 / 8388608) × (参考电压 / PGA)
比如外部参考电压为 2.048V,PGA 为 128,原始码为正值 10000,那么电压大约为 10000 / 8388608 × 2.048 / 128 ≈ 18.7μV。
对 RTD 通道,因为有比率测量,更简单的方法是直接用码值比上满量程码值,再乘以 RREF:
R_RTD = RREF × (原始码 / 满量程码值)
得到电阻后,PT100 转温度可以用 Callendar-Van Dusen 公式。0°C 以上:
R(t) = R0 × (1 + A·t + B·t²)
其中 R0 = 100Ω,A = 3.9083×10⁻³,B = -5.775×10⁻⁷。0°C 以下还要加上 C 项。反向求解时,0°C 以上直接用一元二次方程求根公式,几行代码就能搞定:
float PT100_ResToTemp(float resistance) { float t; // 先按0°C以上公式求根 float a = R0 * B; float b = R0 * A; float c = R0 - resistance; t = (-b + sqrtf(b * b - 4 * a * c)) / (2 * a); return t; }对热电偶通道,换算分两步:先用电压查热电偶分度表,得到初步温度;再用内部温度传感器读到的冷端温度,查表得到冷端对应的热电势,加到测量电压上,然后重新查表得到热端温度。NIST 多项式系数表可以直接以数组形式固化在 Flash 里,STM32F373RC 的 Flash 完全放得下。
3.4 状态机设计和异常复位机制
固件框架我习惯用一个简单的状态机管理 ADC 采集流程:
状态包括 IDLE(空闲)、CONFIG(配置)、START(启动)、WAIT_DRDY(等待数据就绪)、READ(读取数据)、CONVERT(温度换算)。主循环里按状态切换,中断只负责置标志。
这套框架看起来简单,但在现场稳定性上有几个必须处理的问题:
- DRDY 中断长时间不来怎么办?我加了超时机制,比如 100ms 内没等到数据就绪,就主动复位 ADC 并重新配置;
- UART 通信偶发错误怎么办?读取结果后回读一遍寄存器,确认链路还活着;
- 连续转换模式下,数据更新很快,要保证主循环读数速度跟得上,否则 DRDY 中断会堆积,导致数据错位。我一般用单次转换模式,每次需要采样时再启动一次,逻辑更清晰。
4. 实测校准与噪声排查:这套组合的真实表现
4.1 出厂校准流程怎么做
无论 ADC 多好,温度传感器本身的误差也需要校准。我的标准流程分三步:
第一步,零点校准。把 RTD 探头放进冰水混合物(0°C),或者用精密电阻箱模拟 100Ω,记录 ADC 读数偏移,保存为零点校准系数。
第二步,量程校准。用精密电阻箱分别设置 1000Ω(约 260°C)等标准电阻,记录读数,计算增益误差。
第三步,线性度抽检。在量程内均匀取几个点,看偏差是否在允许范围内。如果偏差曲线不是线性的,说明传感器本身问题更大,换个批次再测。
热电偶通道的校准重点是冷端补偿。把热电偶探头插入冰水混合物,如果读数是 0°C 附近,说明 CJC 和线性化基本正确。这个测试必须在整机工作状态下做,因为电路板的发热会影响冷端温度。
4.2 噪声表现和误差预算分析
实际测试中,把 PT100 通道的输入端接到一个精密电阻上,设置 PGA 增益为 1、数据速率 20SPS 时,原始码跳动非常小;在增益 128、热电偶短接输入的条件下,折算成温度的波动大约在 0.01°C 量级。这个噪声水平对 HVAC 控制完全够用,对工业过程控制也基本够用。
不过要提醒一句:ADC 底噪低不等于系统精度高。整个测量链路的误差源包括传感器本身精度、IDAC 电流长期稳定性、RREF 温漂、冷端补偿误差、线性化算法误差。我用一个表格列出典型预算:
| 误差源 | 典型量级 | 影响通道 |
|---|---|---|
| PT100 A 级精度 | ±0.15°C @ 0°C | RTD |
| RREF 温漂 10ppm | ±0.02°C 级别 | RTD |
| ADC 噪声和量化 | ±0.01°C 级别 | RTD/热电偶 |
| CJC 误差 | ±0.2°C ~ ±0.5°C | 热电偶 |
| 线性化误差 | ±0.02°C 级别 | 全部 |
从表格能看出,热电偶通道最大的误差来源其实是冷端补偿,而不是 ADC。想提升热电偶精度,重点应该放在冷端温度测量上,比如在端子上放 NTC 并做校准,往往比换更好的 ADC 效果更明显。
4.3 几个常见问题的完整排查链路
我在调试中遇到最多的问题和排查思路整理在这里:
问题一:读数一直是满量程或接近零。先看配置寄存器是否被正确写入,尤其 PGA 增益和基准选择。外部基准没接好或者内部基准选择错误,都会导致读数异常。
问题二:读数漂移,越测越偏。优先怀疑自热效应。把激励电流降一档,等几分钟看读数是否稳定。如果恢复,说明电流太大。
问题三:UART 偶发通信失败,偶尔读出 0xFFFFFF。检查波特率误差、接线长度、DRDY 时序。我遇到过 ADC 侧电容太大导致 UART 信号边沿变缓,降低通信速率或减小电容后解决。
问题四:热电偶读数比实际温度低一大截。几乎都是冷端补偿失效。用万用表量一下 ADC 芯片附近温度和实际冷端温度,如果差很多,就要重新安排 PCB 布局。
问题五:工频干扰明显。用 20SPS 或 60SPS 的数据率,内置数字滤波器就能压住 50/60Hz 干扰,不要盲目提高采样率。
5. 面向 HVAC 和工业现场的工程化落地细节
5.1 数字隔离方案是 UART 接口最大的红利
这个项目里最让我省心的一点,就是 UART 接口做隔离几乎零成本。SPI 需要四条信号线,隔离器要四通道,成本和面积都翻倍。UART 只要 TX、RX 再加 DRDY,三通道隔离器就够。
传感器端和 MCU 端隔离之后,很多现场问题自动消失:地环路被切断,共模干扰无法进入 MCU,雷击浪涌也少一条传播路径。ADC 侧电源我用了隔离 DC-DC 加低噪声 LDO,实测对 ADC 噪声几乎没有明显影响。
5.2 采样率和响应时间的取舍
HVAC 项目常见的需求是控制环路,比如 PID 控温。ADS122U04 最高 2000SPS,但高采样率下噪声也大。我的经验是:
- 需要稳定读取环境温度时,用 20SPS,内置滤波器直接抑制工频干扰;
- 需要快速响应时,用 200SPS 左右,软件里再加滑动平均;
- 不要直接怼着 2000SPS 跑,除非传感器信号很强,否则噪声会吃掉分辨率优势。
软件滤波方面,滑动平均窗口我一般取 8 到 16 点,既能平滑噪声,又不至于让响应慢到影响控制。
5.3 校准参数管理和固件稳定性
产品化之后,每台设备的校准系数必须持久化存储。我一般把校准系数存到 STM32 的 Flash 独立扇区,写入时加上 CRC 校验,每次上电读取时做一次校验。如果校验失败,就启用默认系数,并在状态寄存器里置标志,方便产线排查。
固件稳定性方面,我会加一个定期“健康检查”:每十分钟读一次 ADC 的寄存器值,确认链路正常。如果连续三次异常,直接复位 ADC 并重新配置,避免设备在现场运行几个月后莫名其妙地失效。
5.4 成本和方案边界
最后说点实际的。ADS122U04 + STM32F373RC 这套组合不是最便宜的方案,但它把精度、隔离、扩展性都照顾到了。如果你只是做家用温湿度计,MCU 内置 ADC 加 NTC 就够了;如果要同时测多路 PT100 和热电偶,还要走几十米的通信线,那么外部高精度 ADC 加 UART 隔离的方案反而更省总成本。
从我个人的体会来说,温度测量的核心从来不是把 ADC 换得更高端,而是把传感器接线方式、基准设计、冷端补偿和校准流程这些基础环节做扎实。ADS122U04 的优势在于把这些环节的元器件需求降到了最低,而 STM32F373RC 负责把最后一步“算出温度”这件事做得足够顺手。这套组合我已经跑过两个项目,稳定性完全经得起现场环境的考验。