ADS122U04+STM32L4A6RG精密温度采集方案:PT100与热电偶设计详解 ADS122U04IPWR STM32L4A6RG 这个组合第一次看到的人多半会问一颗 24 位 Δ-Σ ADC 配一颗超低功耗 Cortex-M4只用来测温度是不是有点大材小用但如果你在工业现场或者暖通HVAC项目里折腾过温度采集就会明白“测温度”这三个字分量不轻。变频器一启动电机一启停传感器引线拉个十几米读数要是还能稳在 0.1°C 以内靠单片机内置 ADC 基本是做梦。这篇文章就把这套方案完整拆给你看为什么选 ADS122U04IPWR 而不是常见的 SPI 版本 ADS1220为什么是 STM32L4A6RG三线制 PT100、热电偶分别怎么接、寄存器怎么配、温度怎么算、现场调试有哪些坑。内容按一个真实产品的开发顺序来写适合正在做精密温度采集、工业变送器、HVAC 控制器或者准备把传感器数据往 RS485/Modbus 总线上送的工程师参考。1. 方案选型为什么是 ADS122U04IPWR STM32L4A6RG1.1 先说结论这套组合解决了什么问题工业温度测量最典型的两种传感器是铂电阻PT100/PT1000和热电偶K 型、J 型。前者线性好、精度高但信号幅度小、引线电阻会带来误差后者量程宽、耐高温但输出只有几十微伏每摄氏度而且必须做冷端补偿。APS122U04IPWR 干的活就是把这两类信号在靠近传感器的地方先“洗干净”内部有多路输入 MUX、可编程增益放大器PGA1 到 128 倍、两个可编程激励电流源IDAC、低漂移的 2.048V 基准源还内置了温度传感器用于热电偶冷端补偿。它直接输出数字结果MCU 这边不用跟模拟信号死磕。STM32L4A6RG 在这里的角色我更愿意叫它“协议中枢 算力担当”。它不负责直接采模拟量而是通过 UART 把 ADC 结果接进来做滤波、温度换算、校准补偿然后整理成 Modbus 帧或者私有协议上报。为什么选它而不是更便宜的 M0因为热电偶的非线性多项式、PT100 的分段拟合加上现场的滤波和校准算法浮点运算有 FPU 会轻松很多而且它 1MB Flash、320KB SRAM、一堆低功耗模式后续要加记录、加液晶、加无线模块都不至于推倒重来。1.2 和外置 ADC 方案、内置 ADC 方案的对比先回答一个很多人会问的问题STM32L4 系列本身就有 12 位 ADC硬件过采样之后可以到 16 位分辨率为什么还要外挂一颗 24 位 ADC分辨率不代表精度。STM32L4 的内置 ADC 在 12 位模式下能做到不错的 ENOB但温漂、增益误差、参考电压稳定性比外置专用 ADC 差一个量级。想长期稳定测到 0.1°C内置 ADC 基本到不了。抗干扰能力。工业现场最怕的不是噪声本身而是变频器、接触器产生的共模干扰和地弹。△-Σ ADC 本身对工频和射频干扰的抑制能力很强ADS122U04 数据手册里给出的滤波特性在 20SPS 模式下对 50Hz/60Hz 工频有很强的抑制这是内置 ADC 做不到的。通道隔离和布线灵活性。ADS122U04 是 UART 接口不是 SPI。这点在分布式采集里特别吃香。SPI 需要 SCK、MOSI、MISO、片选四根线而且片选要 GPIO 控制走线稍微远一点就受限于时钟边沿和地弹UART 只有 TX、RX 两根线天然适合做长距离隔离光耦一夹、RS485 一转几十米外再挂三四个 ADC 模块也没问题。1.3 数据链路从传感器到上位机整套系统一条链路大概长这样传感器端PT100 三线制或 K 型热电偶接进板上的 ESD/TVS 保护、RC 滤波网络采集端ADS122U04IPWR 完成激励、放大、模数转换通过 UART 主动把 24 位结果推给 MCU运算端STM32L4A6RG 的 UART 中断或 DMA 接收数据校验 CRC执行滤波算法和查表/多项式换算输出端L4A6 的另一个串口搭配 RS485 收发器输出 Modbus RTU 或者其他协议送到 PLC、DDC 控制器或者组态屏。这条链路里 ADC 和 MCU 之间只有 TX、RX、DRDY、ADDR 四根线信号隔离也容易做。ADS122U04 本身支持最多 4 个器件级联也就是说一片 STM32L4 上面接 4 片 ADC每个 ADC 采集 4 个通道硬件上就能做到 16 路温度同时测量中间不用加任何模拟开关因为每一路入口都有独立 PGA 和 MUX。2. 硬件设计核心要点2.1 三线制 PT100 和热电偶的标准接法三线制 PT100 接法三线制是为了消掉导线电阻误差。原理不复杂PT100 两根引线的电阻会串进测量回路第三根线用来做补偿。ADS122U04 的两个 IDAC 在这里就是关键工具。TI 在 ADS1220 和 ADS122U04 数据手册里给了标准的 RTD 测量电路我直接说工程上怎么配把 IDAC1 和 IDAC2 都设为同一个电流值比如 1mAIDAC1 从 REFP 引脚流出经过基准电阻 RREF、再到 RTD然后经过引线电阻回到 AIN0 输入IDAC2 从另一个激励引脚流出经过另一条引线目的是把导线上的压降抵消掉基准电压取 RREF 上的压降作为 ADC 的 REFP/REFN。这样做的好处是即使 IDAC 电流随温度有轻微漂移由于信号电压和基准电压都来自同一个电流源比例关系不会变测量结果几乎不受电流源绝对精度影响。这里有个我吃过亏的细节RREF 的精度直接决定 RTD 的绝对精度。工程上必须用低温漂的精密电阻至少是 0.1% 精度、25ppm/°C 以下的金属膜或箔电阻。别为了省几毛钱用普通厚膜电阻否则你前面花大价钱买的 24 位 ADC 全白费。热电偶接法热电偶输出是毫伏级微伏级别的差分信号比 RTD 更讲究。以 K 型热电偶为例灵敏度大约 41µV/°C热端 100°C 时输出也就 4.096mV。所以PGA 直接设成 128 倍保证信号被充分放大热电偶的正负极接到 AIN0 和 AIN1做差分输入冷端补偿用 ADS122U04 内置温度传感器来完成读出的内部温度代表板端即冷端温度为了防止热电偶断线后系统误判需要打开烧毁检测功能或者利用 IDAC 的断路检测一旦热电偶断了读数会明显超出合理区间程序直接报故障而不是报一个离谱的温度。如果项目只需要测 RTD 不用热电偶可以把内部基准关掉用比例式测量如果混用那就要在软件里区分通道配置不能所有通道一把梭。2.2 IDAC、基准电压与比例式测量的工程实现ADS122U04 的 IDAC 可配范围从 10µA 到 1.5mA。选多大电流是个平衡电流越大RTD 上的信号电压越大抗噪声越好但自热效应越明显电流太小信号被埋在噪声里。我对 PT100 的推荐配置是 1mA 或者 0.5mA1mA 时0°C 的 PT100 上有 100mV经过 PGA 32 倍放大就是 3.2V 满量程噪声性能很好但对一些探头体积小、散热条件差的场合1mA 可能产生明显自热这时候降到 0.5mA用 PGA 64 或 128 补回来PT1000 因为本身电阻大建议 0.1mA 到 0.5mA1000Ω 上 0.5mA 就有 500mV足够用了。关键参数匹配参数推荐值说明RREF3.24kΩ/1.62kΩ精度 0.1%温漂 25ppm/°C 以下IDAC1/IDAC2250µA~1mA根据 RTD 类型和自热要求选择PGARTD 用 16/32热电偶用 128保证信号不超量程数字滤波器20SPS50/60Hz 共模抑制最好基准RREF 压降比例式消除 IDAC 温漂影响比例式测量是我特别想强调的一点。传统绝对电压测量需要高精度、低温漂的基准 IC比如 REF5025 之类成本高不说还有随温度慢漂的问题。而 ADS122U04 完全可以用 RREF 压降当基准把“测电压”变成“测电阻比例”。只要两个 IDAC 是匹配的同一颗芯片上匹配性很好RREF 的温漂成了唯一需要控制的因素所以 RREF 必须舍得花钱。2.3 UART 接口、供电与 PCB 布线要注意的细节ADS122U04 的 UART 和普通 MCU 的 UART 不太一样它没有 SPI 那种主机主动拉数据的机制而是数据准备好之后主动向主机推数据。这对 MCU 的接收逻辑有影响后面软件部分会说。硬件上注意几点ADS122U04 工作在 2.3V~5.5V但和 3.3V 的 STM32L4A6RG 相连时电平逻辑要确认一致。如果 ADC 用 3.3V、MCU 用 3.3V直连没问题如果 ADC 用 5V就需要分压电阻或电平转换芯片别硬接。DRDY 引脚一定要接 MCU 的 EXTI 或者一个输入捕获引脚。UART 数据是异步推上来的你不看 DRDY 就不知道哪一帧数据是新的。我习惯把 DRDY 接 EXTI 下降沿触发在中断里置一个标志位主循环轮询这个标志再去取 UART 数据。TSSOP-20 封装的散热焊盘要好好接地不只为了散热更为了给模拟地一个低阻抗回流路径。模拟输入部分和数字部分要分地至少不能把 RTD 输入的地直接连到 MCU 的电源地中间用磁珠或者 0Ω 单点连接。这个在实验室里可能看不出区别到了现场变频器一开就懂了。布线方面RTD/热电偶输入走线尽量短而粗远离时钟线和 PWM 线输入端加 RC 滤波比如 4.7kΩ 电阻加 0.1µF 电容构成低通滤波有助于减轻高频干扰。RC 的截止频率不需要精确计算得很激进因为还有数字滤波器兜底关键是把射频干扰挡在模拟前端之外。3. 软件驱动与温度计算3.1 UART 通信初始化与读取流程ADS122U04 的通信协议比 SPI 简单但有几个坑。我给出的固件框架大致分四步第一步UART 外设初始化STM32L4A6RG 的串口初始化没什么特别的建议用 DMA 空闲中断接收因为 ADC 会主动推数据你不知道它什么时候来只知道 DRDY 信号到来之后数据马上就要到了。如果用轮询接收主循环稍微被别的任务卡一下就丢帧。波特率建议 115200也试过 9600 和 57600ADS122U04 手册给的误差容限足够。115200 的好处是单个 24 位数据帧传输不到 1ms配合 20SPS 的采样率绰绰有余。第二步ADC 复位和同步上电后别急着配寄存器先发复位命令通过 UART 发送 RST 命令或者按手册给出的 SYNC 序列。ADS122U04 有个特性它的 UART 从机需要先收到主机地址才能判断命令是不是给自己的。复位做完之后等待至少两个 MCLK 周期再发配置。第三步寄存器配置ADS122U04 的寄存器按偏移地址访问配置要点如下配置寄存器 0选通道 MUX、PGA 增益。RTD 通道 PGA32热电偶通道 PGA128配置寄存器 1选数据速率。建议默认 20SPS此时数字滤波器对 50Hz 和 60Hz 都有最强抑制配置寄存器 2选基准源。RTD 用外部基准RREF 压降热电偶可以用内部 2.048V 基准顺便在这里打开内部温度传感器IDAC 电流大小也在这里配配置寄存器 3IDAC 输出引脚路由、是否开 CRC、UART 地址。提示寄存器 3 里的 UART 地址必须和硬件 ADDR 引脚的上下拉状态一致。ADC 推数据时会把地址放在帧头MCU 如果同时挂多片 ADC就靠这个地址区分。第四步进入测量循环配置完成发 START 命令。之后每完成一次转换DRDY 引脚会拉低同时 UART 自动发一帧数据。MCU 接收到数据后先解析帧头、校验 CRC再按比例关系换算成温度。这里分享一个我踩过的坑ADS122U04 的数据帧可能因为主机上电时序问题产生“半帧”错位。最省事的做法是接收端用状态机找帧头而不是假定每一帧都对齐。一旦发现连续几帧 CRC 都错就对 UART 做一次重新同步别傻等现场共地不稳的时候很容易出现这种问题。3.2 RTD 与热电偶的温度换算PT100 的换算比例式测量下MCU 拿到的 24 位 ADC 码值直接就是电压和基准的比例Ratio ADC_Code / FullScale_Code R_pt Ratio × RREF这里的 FullScale_Code 不是 2^24因为 ADS122U04 是双极性输出格式24 位时数字满码是 0x7FFFFF约 83886070x800000 表示负满量程。具体换算成电压时要看 PGA 增益和基准电压。拿到 R_pt 之后用 IEC 60751 标准的公式算温度。工程上最实用的分段做法0°C 以上用 Callendar-Van Dusen 展开 R(t) R0 × (1 A·t B·t²) 其中 A 3.9083×10⁻³B -5.775×10⁻⁷0°C 以下加一个三次项 C·(t-100)·t³C -4.183×10⁻¹²。直接用浮点算这几个多项式STM32L4A6RG 的 FPU 没有任何压力。我实测过一次反算由电阻反解温度大约几十微秒完全不影响主循环跑其他任务。如果觉得反解麻烦也可以直接查表加线性插值但查表的分辨率做不到 0.01°C我是直接用迭代法两三步收敛。热电偶的换算热电偶换算麻烦在冷端补偿。网上很多教程只说“加上冷端温度”但实际上热量不能直接加要先把冷端温度换算成对应热电势再和测量出的热电势相加最后用总电势反查热端温度。流程如下从 ADS122U04 内置温度传感器读出冷端温度 T_cj用 NIST ITS-90 多项式把 T_cj 换算成冷端对应的热电势 E_cjADC 测得的电压就是热端与冷端的电势差 E_meas总电势 E_total E_meas E_cj再用反函数从 E_total 查回热端温度 T_hot。以 K 型热电偶为例它的多项式有 10 几个系数手写太容易出错。我的建议是直接用 TI 提供的库里那套多项式常数网上流传的很多版本在低温区 OK、高温区偏差明显。别偷懒热电偶测温跑工业现场冷端温度跳几度测量结果就直接偏几度这块不能省。3.3 降低噪声与工频干扰的软件手段硬件滤完还有数字层软件滤波不是可选项而是标配。我的实践是两级第一级ADC 本身的数字滤波器。20SPS 数据速率下ADS122U04 内部的 Sinc 滤波器已经把 50Hz 和 60Hz 压制得很干净。但要注意这个滤波器对随机白噪声的抑制有限所以第二级还是要加均值或移动平均。第二级MCU 侧软件滤波。我对比过滑动平均和中值滤波的实际效果对 RTD 这种缓慢变化、偶有尖刺的信号先做一次滑动窗口滤波窗口 4~8 个点再用中值把异常点剔除效果最好。工业现场偶尔会有接触器打火导致的尖峰单纯均值滤波会把尖峰“平均”进结果里数据很难看。在 STM32L4 上滑动平均用环形缓冲区实现每次新数据进来自动算一次均值复杂度很低中值滤波可以只在窗口里取最大值和最小值做裁剪。实测下来读数在最后一位上下轻微跳动的现象能被压掉人眼看到的就是一条平稳的曲线。4. 调试、校准与现场问题排查4.1 常见问题速查表这套系统我在实验室和现场都踩过不少坑整理成速查表照着排查能省很多时间现象可能原因排查方法读数始终为 0 或满量程IDAC 没配好、输入接反先用万用表量 IDAC 电流再查 MUX 配置读数漂移大、噪声明显传感器引线过长、共地不良检查屏蔽层接地输入端加 RC 滤波热电偶读数差几度冷端补偿没做/做错读内置温度传感器对比实际板温UART 数据偶发错帧供电波动、地址/CRC 配置不对检查 CRC 开关用状态机重新同步温度非线性偏离RREF 温漂大或 PGA 增益配置有误用标准电阻箱校准增益IDAC 电流源没有输出引脚路由和 IDAC 选择不匹配寄存器 3 重新配置确认引脚未复用现场有 ENOS/ESD 打坏 ADC输入保护不足输入端加 TVS、限流电阻、防雷电路4.2 两点校准与“先用固定电阻再上传感器”的调试顺序第一次上电调试我强烈建议别直接把传感器接上去。先准备两个精密电阻一个代表量程下限比如 100Ω 对应 0°C另一个代表量程上限比如 138.5Ω 对应 100°C用电阻箱或者精密电阻直接接到模拟输入端跑通数据链路之后再换真实传感器。这个流程的意义在于把“系统问题”和“传感器问题”分开。如果接电阻时读数都对唯独接上 PT100 不准那问题多半出在传感器探头或者接线端子如果接电阻都不对那就是 ADC 配置、基准或布线的锅跟传感器无关。校准做两点就够零位校准把输入短接记录 ADC 读数作为偏移量软件里减掉增益校准接标准电阻 R_std实测 Ratio_std算出实际增益系数 Gain_corr R_std / Ratio_measured / RREF。之后每次测量都用这个系数修正能把 ADC 本身的初始增益误差、基准电阻的绝对误差一次性校准掉。现场量产时如果每个板子基准电阻有微小差异就靠这一步拉齐精度。4.3 针对 HVAC 现场环境的最后提醒HVAC 和一般工业现场还不完全一样。它不是重工业那种强电磁环境但有自己的麻烦24V 交流供电常见、变频风机多、传感器分布在吊顶和风道里、走线往往和强电线共用桥架。我在现场遇到最典型的两个问题一个是 24V AC 供电的整流纹波串进模拟电源导致 ADC 读数周期性爬坡。解决办法是在 ADC 的 AVDD 引脚附近放一颗 10Ω 电阻加 10µF 电容做二级滤波必要时用低噪声 LDO 单独给模拟部分供电。 另一个是电动机启停瞬间的尖峰干扰不是持续的但偶尔会把读数打偏几十个 LSB。除了输入端 TVS 保护建议在 MCU 侧对连续突变值做一次阈值判断变化速率超过正常物理极限比如温度每秒跳 5°C 以上就认为是干扰直接丢弃而不是计入均值。这套方案在 HVAC 场景里其实还可以往下扩展STM32L4A6RG 的 LPUART 可以在低功耗模式下监听上位机唤醒命令单片机休眠时耗电可以压到微安级板子上如果配电池做成无线温度采集节点也没问题。ADS122U04 的 4 个通道也可以扩展出湿度传感器或者 4-20mA 变送器输入只要输入范围匹配、PGA 配置合理一个板子同时测温度、湿度、压力不是不行。我在实际调试过程中最大的体会是这种精密模拟前端的项目70% 的问题出在硬件细节30% 出在软件容错上。硬件细节决定你能量到什么程度软件容错决定你在现场能不能活得下去。如果你正在照这套方案做板子建议先把固定电阻调试法跑通再上真传感器能省出整整一个调试周的精力。