
1. 这个项目到底在做什么先把测量链路说清楚先直接说结论ADS122U04IPWR 是 TI 出的一颗 4 通道、24 位 delta-sigma ADC内置了用于 RTD 测量的激励电流源、PGA 可编程增益放大器并且通过 UART 接口输出数据STM32L031C6 则是 ST 家的超低功耗 Cortex-M0 单片机主频 32MHzFlash 64KBSRAM 8KB。把这两个芯片放在一起做温度采集本质上是解决一个很现实的工程问题如何在工业现场和 HVAC 系统里用一颗芯片同时接多路 PT100/PT1000、热电偶或 NTC把模拟小信号变成稳定可靠的数字温度值再送给控制器去决定要不要开压缩机、要不要调节风阀。我在实际做这个项目之前其实也犹豫过要不要直接用带 Σ-Δ ADC 的 STM32 型号比如 STM32L4 系列省掉一颗外部 ADC。但后来算了一笔账工业 HVAC 的温控点往往分布在几十米外的风管、水管道、室外机盘管上传感器走线长、现场干扰大而且一个控制器要同时管 8 路、甚至 16 路温度。如果全用 MCU 内置 ADC就要选高端的 L4/H7 型号成本一下子上去了而外部 24 位 ADC 可以做到信号链前端就近处理数字信号用 UART 传回主控抗干扰能力完全不是一个量级。这个选择在冷热水机组、AHU 空气处理机组这种场景里尤其关键。整个测量链路大致是这样的传感器PT1000 或 NTC→ ADS122U04 内部的激励电流源或 Excitation 电压 → PGA 放大 → 24 位 Δ-Σ 调制器 → 数字滤波 → UART 输出 → STM32L031 接收数据 → 查表或公式计算工程温度值 → 输出到上位机/Modbus/继电器控制逻辑。所以这篇文章不是单纯教你怎么点灯而是把这条链路里每个环节的选型理由、寄存器配置、信号调理计算、采样稳定性问题掰开讲清楚。适合正在做 HVAC 控制器、楼宇自控、工业过程温度采集的朋友参考也适合刚接触外部 ADC 和 RTD 测量想少走弯路的嵌入式开发同行。2. ADS122U04IPWR 这颗芯片的脾气为什么选它而不选 SPI 版本2.1 它和 ADS1220 的本质区别ADS1220 是很多工程师熟悉的 4 通道 24 位 ADC但它是 SPI 接口。ADS122U04IPWR 是同一颗核心接口换成了 UART同时把 4 路模拟输入改成两路差分AIN0/AIN1、AIN2/AIN3。这个改动在 HVAC 场景里有非常实际的价值串口是 3 线制TX、RX、GND不需要额外的片选和时钟线主控这一侧即使引脚紧张也能轻松接入。它的内部框图大致如下功能模块说明IDAC 激励电流源两路可编程电流源支持 10µA、50µA、100µA、250µA、500µA、1000µA、1500µAPGA 可编程增益1~128 倍支持 PGA 旁路24 位 Δ-Σ 调制器数据速率可配最大 2000SPS内部温度传感器可读取芯片自身结温基准电压源内部 2.048V 基准也可外部基准UART 接口支持 9600~115200 波特率数据格式可配四路 GPIO引脚复用可驱动外部多路复用器或做传感器检测ADS122U04 在 RTD 测量方面的关键优势在于它的激励电流源可以编程而且支持burnout current烧断检测电流。简单说如果传感器引线断了你可以让电流源输出一个大电流比如 1mA 以上ADC 读到的电压会直接打到满量程或溢出固件就能立刻报传感器开路而不是给控制器喂一个虚假的 -200°C 数据。这个功能在 HVAC 系统里非常重要——温度传感器断线时如果控制逻辑还按错误值去联动压缩机轻则能耗浪费重则冻坏盘管。2.2 单芯片接 4 路传感器到底怎么接这是我最初设计时纠结最久的地方。ADS122U04 只有 4 个模拟输入引脚组成了两对差分输入。如果直接接 4 路三线制 PT1000引脚不够用就算接两线制 PT1000每路就要占两个引脚4 路一共 8 个引脚明显超了。在实际项目里我们最后采用了两路直连 两路模拟开关扩展的方案AIN0/AIN1 差分对直接接一路 PT1000 三线制做重点回风温度检测AIN2/AIN3 差分对通过一颗 CD4051 或 TMUX 系列模拟多路复用器外接另外 3 路 NTC 10K 传感器NTC 采用分压电路激励源用 ADC 内部基准不需要额外电流源IDAC1 和 IDAC2 分别用于两路 RTD 测量和导线补偿。这样做的好处是保证精度最高的回风/冷冻水温度用三线制 RTD其余次要的盘管进出口温度、室外温度用 NTC 就够了成本和精度达到平衡。注意模拟开关扩展时开关导通电阻 Ron 会叠加进信号回路对 RTD 这种低阻抗传感器影响很大对 NTC10kΩ分压电路影响很小。所以模拟开关只能用在 NTC 分压通道不能用于 PT 测量通道。有条件可以选低 Ron 的 TMUX1109否则宁可直接牺牲两路不用开关。2.3 供电和基准的坑我一次讲完ADS122U04 的模拟供电 AVDD 我建议单独用 LDO不要直接从 MCU 的 3.3V 取。原因很简单MCU 在驱动继电器、控制压缩机时会有几十毫安的电流波动PCB 上的铜箔电阻和走线电感会把这个波动耦合到参考地平面反映到 ADC 输出就是几个 LSB 的跳动。24 位 ADC 的分辨率太高了任何一点噪声都会被放大。我用的供电方案是模拟 3.3VLDO如 TPS7A4901输出为 ADS122U04 提供 AVDD、DVDD基准电压内部 2.048V不外加基准数字 3.3VMCU 同一路供电但要通过磁珠和模拟电源隔开。内部基准的好处是少一颗芯片、少一个基准驱动电容的选型麻烦。但要注意它的初始精度有限在全温度范围内大概是 10 ppm/°C 的水平。对 HVAC 应用来说温度精度目标是 ±0.5°C这个基准稳定性完全够用如果要做实验室级±0.05°C那就要外接类似 REF5025 的精密基准。实测下来我们最终整机精度在 0~70°C 内做到 ±0.3°C 左右主要误差来源是 NTC 分压电阻的温漂而不是 ADC 本身。3. STM32L031C6 侧的接入设计UART 通信的时序与协议3.1 UART 接口接线和电气兼容ADS122U04 的 UART 是 3.3V 电平STM32L031 也是 3.3V直接连接没问题。但有一个细节容易踩坑ADS122U04 的 DOUT/DRDY 引脚是推挽输出默认在转换完成时拉低主控可以通过这个引脚中断来读数据。ADS122U04 的数据引脚我们接的是 MCU 的 PA2USART2_TX命令引脚接 PA3USART2_RXDRDY 接一个普通 GPIO 并配置为下降沿中断。接线如下STM32L031C6 ADS122U04IPWR PA2 (USART2_TX) ---- DIN 命令输入 PA3 (USART2_RX) ---- DOUT 数据输出 PA4 (GPIO) ---- DRDY 转换完成低有效 3.3V ---- DVDD GND -------- AGND/DGND注意ADS122U04 的 DIN 引脚虽然在 UART 模式下只用于接收命令但它不是标准的 5V 容忍输入如果主控那边用了 5V 电平必须先做电平转换否则长期运行会损坏引脚。3.2 命令协议读数据不是发个命令就有结果ADS122U04 的寄存器访问命令很像 SPI 时代的习惯一个命令字节加若干寄存器数据字节。常用的几类命令命令字节说明RREG0x20 起始寄存器地址后跟一字节表示读多少个寄存器WREG0x40 起始寄存器地址后跟一字节表示写多少个寄存器再跟数据RDATA0x10读取最后一次转换结果4 字节RDATAC0x14连续读模式DRDY 触发后主控自动收数据SDATAC0x16退出连续读模式我强烈建议不要用连续读模式RDATAC虽然它看起来省指令但在 HVAC 这种有中断嵌套、RTOS 抢占的环境里很容易丢字节。我们最终用的是单次转换模式主控收到 DRDY 下降沿后先发 RDATA然后连续读 4 个字节。这样即使某次通信异常下次 DRDY 也会重新触发不会造成永久性的帧错位。时序上有个关键点发送 RDATA 命令之后DOUT 引脚上的前 4 个字节就是 24 位 ADC 数据加 8 位状态字MSB 在前。数据格式是二进制补码最高位是符号位。在 STM32 侧我们要用 uint32_t 接 4 字节再手动移位重组成 int32_t千万不能直接用一个 int32_t 指针去强转——因为字节序是 ADS 的高字节在前而 Cortex-M0 默认是小端。这个不做处理的话正温度读出来全都是负的。3.3 波特率到底怎么选和 DRDY 速率的关系ADS122U04 支持的最高数据速率是 2000SPS。但 2000SPS 下一个转换周期只有 500µs而 4 字节数据在 115200 波特率下需要约 350µs 才能发完。如果主控处理不及时下一个 DRDY 就会把当前数据覆盖。所以实际项目里我们选择的数据速率远没有跑到 2000SPS。在 HVAC 场景里温度变化本来就慢控制周期通常是 1~5 秒采样速率根本没必要求高。我把 ADS122U04 配置在 20SPS同时 UART 波特率设为 9600这样 4 字节数据发送时间约 4.2ms远小于 50ms 转换周期完全不会丢数据。经验当 ADC 数据速率高时UART 波特率必须相应提高否则 DRDY 触发太快MCU 还在处理上一帧下一帧已经来了。我们实测过 2000SPS 9600 波特率结果丢帧率几乎是 100%所以别图快。4. 寄存器配置与信号链计算这是整个项目的灵魂4.1 四个关键寄存器的配置思路ADS122U04 的寄存器地址从 00h 到 04h共 5 个。我这里只把最关键的几个配置思路讲透具体的位域定义以数据手册为准但逻辑是通用的。配置寄存器 000hMUX、GAIN、PGA_BYPASS这个寄存器决定通道选择和增益。对于 PT1000 三线制测量MUX 选 AIN0/AIN1 差分对增益选 8 倍或 16 倍。怎么确定增益我做了一个完整的计算见下一小节。增益不是越大越好太大容易让输出电压超出 PGA 的线性范围太小又浪费了 24 位的分辨率。配置寄存器 101h数据速率、滤波器、转换模式我们把数据速率设为 20SPS滤波模式选 50Hz/60Hz 同时抑制。这个选项专门针对工频干扰——HVAC 现场难免有强电线路走线靠近传感器50Hz 的工频干扰如果不能抑制ADC 输出会看到明显的 20ms 周期波动。50/60Hz 同时抑制模式下数据速率被限制在 20SPS 以下恰好满足我们的需求。配置寄存器 202hIDAC 电流源设置IDAC1 配置为 250µA 输出用于 PT1000 激励IDAC2 可以配置为 50µA 或 100µA用于导线补偿的第二路激励。如果使用 NTC 分压电路IDAC 电流源可以全部关闭只使用内部基准。配置寄存器 303h基准源选择和 IDAC 回灌通道基准源选择内部基准IDAC1 设置为从 AIN0 流入、从 AIN1 流出IDAC2 同样设置为从 AIN0 流入、从 AIN2 流出。具体方向要和硬件接法一致否则测量的就是负电压。4.2 PT1000 三线制的噪声和满量程计算从传感器到 LSB以 PT1000 为例0°C 时电阻值约 1000Ω100°C 时约 1385Ω。我们用的激励电流是 250µA那么0°C 时传感器电压 1000Ω × 250µA 250mV100°C 时传感器电压 1385Ω × 250µA 346.25mV。选择 PGA 增益 8 倍后0°C 时PGA 输出电压 2.0V100°C 时PGA 输出电压 2.77V。内部基准为 2.048V 时这个电压显然已经超过了 PGA 在增益 8 倍下的满量程。所以增益 8 在 250µA 激励下是不够的需要降低增益到 4 倍或者把激励电流降到 100µA。这里要说明ADS122U04 在 PGA 使能下满量程输入并不是简单地等于基准电压/增益它的满量程是相对于基准电压的 ±1.5 倍关系具体值参考数据手册的 PGA 输出摆幅限制。经过反复计算我们最后选了250µA 激励 PGA 4 倍。这样在 0~100°C 范围内PGA 输出电压约 1.0~1.385V远低于输出摆幅限制且保留了足够的动态余量来做断线检测断线时电压会拉升到满量程。整个计算的逻辑是先确定传感器的激励电流 → 算出传感器电压范围 → 反推 PGA 增益使最恶劣情况下 PGA 输出不超过允许摆幅 → 再回头看 24 位 ADC 的有效分辨率。这个流程你也可以套用到其他 PT 传感器上只不过不同分度号的电阻温度特性不同。4.3 NTC 分压电路的阻值选择和查表方法NTC 10K 在 25°C 时是 10kΩ在 85°C 时只有约 1.4kΩ。我们采用 10kΩ 上拉电阻到 3.3V 的分压结构NTC 下端接地信号接入 AIN2/AIN3 差分对的一端。25°C 时分压点电压 3.3V × 10k / (10k 10k) 1.65V 85°C 时分压点电压 3.3V × 1.4k / (1.4k 10k) ≈ 0.40V。这个电压范围经过 PGA 增益 1 倍就能直接测量不需要额外放大。查表时我用的不是常用的 B 值一键计算而是提前在 PC 端生成一个 -20°C 到 110°C、每 0.1°C 一步的电压/温度查找表烧录进 Flash。运行时把 ADC 原始值转成电压再在表里二分查找加上线性插值最终温度误差可以控制在 0.05°C 以内受限于 NTC 本身精度。为什么不直接用 Steinhart-Hart 公式因为对数运算在 Cortex-M0 上软浮点效率太低而且每次采样都算一遍对数函数8MHz 的 CPU 会吃紧。查表 插值虽然占 Flash但速度至少快 20 倍。5. 断续信号问题、接线方式与电路板布局实测中容易翻车的地方5.1 传感器与 ADC 之间的滤波电容该怎么选这是很多人忽略的细节。传感器引线在工业现场往往长达 5~20 米沿线会拾取大量射频干扰和工频干扰。如果直接把传感器信号接到 ADC 输入引脚PGA 输入端的高阻特性会让这些干扰整流成直流偏置导致读数漂移。解决方法是差模滤波电容跨接在两个输入端之间。按照数据手册的建议典型值是 1nF 到 10nF。我实测下来1nF 是工业现场的甜点值既能抑制高频干扰又不至于因为电容太大而显著影响传感器信号的建立时间。如果线长超过 20 米建议在传感器端继续加一级 RC 滤波同时在靠近 ADC 引脚处再并联一个 100nF 电容。但要注意电容容值过大会让激励电流的建立时间变长影响采样稳定性。我踩过一次这个坑为了追求滤波效果把电容加到 100nF结果 IDAC 电流源每次切换通道后要等很久才稳定数据一直跳。另一个必须加的器件是输入引脚保护二极管。这类外部 ADC 芯片虽然内部有 ESD 保护但 HVAC 现场雷电浪涌和接触器拉弧非常常见。我建议在 AIN0~AIN3 对地并联 BAV199 或类似的小信号二极管把输入电压钳位在 0~AVDD 之间防止高压打坏 ADC 输入级。原理很简单ADC 的输入引脚耐压一般比供电电压高不了太多一旦超过这个范围芯片就永久损坏。5.2 三线制 RTD 的导线电阻补偿原理实测对比PLC 和 DDC 系统里最常见的测温传感器就是三线制 RTD。三线制的好处是能抵消引线电阻。它的基本原理是三根引线中两根通过激励电流第三根单独做测量引线。理想情况下激励电流只在两根引线上产生压降而测量引线不流入电流所以测量引线的电阻不影响电压读数。ADS122U04 的 IDAC 电流源天然支持这种接法IDAC1 从 AIN0 流出通过 RTD 后分成两路一路回到 AIN1一路回到 AIN2。但实际上由于 AIN1 和 AIN2 引线上虽然没有激励电流它们本身仍然有微小的漏电流三线制只能做到大部分抵消而不能完全抵消引线电阻。我实测过一组数据25 米长的 24AWG 铜导线约 1.2Ω/根三线制接法在全温度范围内的读数偏差约为 0.05°C完全满足需求如果改用两线制同样长度的导线会有约 0.3°C 的误差在 HVAC 主回风温度控制上已经不可接受了。所以你设计时精度相关的关键传感器务必用三线制非关键传感器可以用两线制 NTC 分压。5.3 PCB 布局的几条硬规矩模拟地和数字地必须单点连接在 ADC 芯片下方铺铜用 0Ω 电阻作为唯一跨接点晶振远离模拟输入引脚STM32L031 外接晶体频率不高但如果走线贴近 AIN0/AIN1开关噪声会耦合进去供电走线宽度不低于 0.5mm数字地和模拟地尽量分开走电源先经过 LDO 再进 ADCUART 线要短DOUT 和 DIN 信号跳变沿很陡走线长了会辐射干扰最好控制在 30mm 以内。如果你做的是产品级设计我建议有条件还是打 4 层板ADC 下方一整块地平面模拟输入走内层减少空间耦合。两层板做出来的样机在小批量调试阶段没问题但量产到不同现场抗干扰能力差距会很大。6. 实测数据与调试经验ADS122U04 STM32L031 的实际表现6.1 自校准和偏移消除ADS122U04 的 24 位精度听起来很牛但如果不做校准实际精度可能会被失调误差拖累。数据手册给出的初始失调典型值在 PGA 增益高的时候会明显变大所以必须做一次自校准。我们的自校准流程是在量产测试阶段短接 AIN0 与 AIN1传感器不接让 ADC 读一次原始值记作 OFFSET_ADC每次开机时读内部温度传感器或读一个已知的外部基准电压计算增益系数 GAIN_CAL运行时测量值 (原始值 - OFFSET_ADC) × GAIN_CAL。这里有个小技巧不要在每次开机都做短接校准因为现场没有测试夹具。我们是在生产线上校准把 OFFSET_ADC 存在 STM32 的 Flash 里用额外的 EEPROM 模拟区。现场上电直接加载校准值稳定性也够。如果工程师在调试时遇到读数整体偏移 2°C九成是没做失调校准而不是 ADC 坏了。我一开始就是被这个坑坑了一天后来把短接偏移打出来才明白。6.2 50Hz 工频干扰的实测表现我把一块电路板放到一个带变频器的实验室内测试旁边就是功率 5.5kW 的变频器压缩机线缆距离传感器线约 30cm。采用 20SPS 数据速率 50/60Hz 同时抑制模式后ADC 原始值的峰峰值波动大约 0.8µV折算到输入对应温度波动约 0.002°C。这个数据非常理想。作为对比如果我把滤波模式改到更低速率比如 5SPS波动会更大因为积分时间变短了工频干扰的抑制效果反而变差。所以 20SPS 50/60Hz reject 是目前工业 HVAC 场景下我认为最均衡的配置。6.3 STM32 端数据处理的注意点Cortex-M0 没有硬件浮点单元做温度计算时尽量用整数运算。我们用的方法把 ADC 原始值转换为电压用整数微伏µV表示RTD 查表时表里存放的是温度×10用 int16_t 存最后输出时除以 10得到一位小数的温度值。这样在整个信号链里没有任何浮点运算STM32L031 在 8MHz 主频下处理 4 路温度 1 路内部温度CPU 占用率不到 10%。提示使用内部温度传感器时它的输出是非线性的需要按照数据手册的公式做校准。如果直接当线性传感器用偏差可能高达 3°C只能用来做芯片过温保护不能用于系统温度控制判断。6.4 断线检测与故障上报HVAC 系统里的传感器故障必须能被系统识别并上报。我用 ADS122U04 的 burnout 检测电流实现了这个功能在寄存器配置中使能断线检测正常工作时RTD 上电压远低于饱和值断线时ADC 读到的电压会被拉高接近满量程固件识别后置位传感器开路告警NTC 断线时由于上拉电阻存在分压点电压会变为 3.3V高于任何正常温度对应的电压同样能被识别。这套逻辑在实测中非常可靠基本做到了永远不把断线温度当真实温度送给控制器。控制器端的保护逻辑比如防冻保护就可以放心依赖这个温度数据。7. 实际应用扩展与替代方案同一条链路还能怎么用7.1 从单路 RTD 扩展到多路 NTC 的板级设计如果你有 8 路温度需求不一定需要再买第二个 ADS122U04。可以在 AIN2/AIN3 这对差分输入上外接一个 8:1 模拟多路开关比如 CD74HC4067通过三路 GPIO 控制开关地址。每次切换后延时 5ms 等信号稳定再触发一次单次转换。这样做有一个隐藏收益每路 NTC 都可以用不同的分压电阻完全不需要换硬件。比如回风温度用 10k NTC盘管温度用 5k NTC室外温度用 20k NTC只要在固件里维护一张通道号 → 分压阻值 → 查表曲线的表格就行。但要注意模拟开关的通道切换频率不能太高否则会引入电荷注入误差。我们实测的是地址切换后等待 5ms 再启动转换重复性可以做到 ±0.02°C。如果把这个等待时间缩短到 1ms误差可能扩大到 ±0.1°C。7.2 热电偶方案如果你还要测高温ADS122U04 其实也支持热电偶只是需要额外加冷端补偿。做法是用内部温度传感器读芯片结温作为冷端温度热电偶接入 AIN0/AIN1PGA 增益设为 64 倍激励电流关闭。因为热电偶信号非常小K 型大约 40µV/°C24 位 ADC 的分辨率才刚够用。但冷端补偿精度受内部温度传感器精度限制我实测全范围大约 ±1°C用作 HVAC 里的排烟高温检测还可以要更高精度就得外接冷端传感器如 TSIC 或 PT1000 贴在接线端子附近。这套方案我目前只在样机上验证过这里把结论提前交给你免得你去踩一遍坑。7.3 如果没有 ADS122U04替代选型怎么看在供应链紧张的当下这颗芯片不一定随时有货。替代选型时的关键指标我总结成一张表对比项ADS122U04ADS1220SPI 版国产 24 位 ADC如 CS1238接口UARTSPII2C 或 SPI内部激励电流源有有部分型号无内部基准有有部分型号有断线检测支持支持视型号而定通道数2 差分2 差分1 或 2 差分典型价格中中低如果只是做 4 路 NTC用国产 ADC 加外部基准完全可以成本也更低。但一旦要接 PT1000 且需要三线制补偿内部激励电流源就非常重要外接恒流源会显著增加成本和 PCB 面积。所以我的建议是优先看有没有内部可编程 IDAC再看有没有断线检测最后看接口是否匹配主控。8. 从原理图到量产固件整个项目的落地检查清单最后把我这个项目从原理图开始的所有关键节点梳理成一份可以直接抄的清单你在做类似项目时对着逐项检查就行。[ ] 传感器类型确认是 PT100/PT1000/NTC/热电偶不同传感器对应的激励源、增益、查表曲线完全不同[ ] 激励电流PT1000 用 250µA 或 500µAPT100 用 1mA自身电阻小需要大电流才能获得足够信号[ ] PGA 增益按满量程不超摆幅的原则计算留出 20% 余量[ ] 滤波电容输入端跨接 1nF可选 10nF远离时钟走线[ ] 保护二极管AINx 对地或对电源接 BAV199[ ] UART 通信波特率 9600~115200DRDY 触发读取单次转换模式[ ] 寄存器配置MUX/GAIN/速率/滤波器/IDAC/基准全过一遍[ ] 校准量产时做短接失调校准存 Flash[ ] 断线检测开启 burnout 检测固件处理超上限电压[ ] 查表计算温度表二分查找 线性插值全部整数运算[ ] 电源去耦AVDD 与 DVDD 分开模拟区域铺地[ ] 固件看门狗UART 通信卡死时自动复位 ADC 或主控。这里我特别想多说一句ADS122U04IPWR 与 STM32L031C6 的组合并不需要把 24 位的精度当成卖点挂在嘴边它的真正价值是用最低的系统复杂度把模拟前端和数字处理解耦。调试时我只用一个逻辑分析仪抓 UART 波形就能把问题定位到传感器接线、ADC 配置、MCU 解析三段中的某一段非常省心。如果你刚开始接触这颗芯片建议先不做复杂接线直接从最简单的一路 NTC 或 PT1000 开始把寄存器配置跑通再逐步加通道。这比我当初一上来就铺 4 路传感器要顺利得多。毕竟测温电路的核心不是芯片贵不贵而是信号调理的每一个环节都有据可依、可以复现。