
工业现场的温度测量最怕两件事一是小信号被噪声吃掉二是标定完装到现场就漂。我做过好几个 HVAC 和过程控制的板子PT100/PT1000 这类 RTD 的采集方案从分立运放一路换到专用 24 位 ADC最后稳定下来的组合就是 ADS122U04IPWR 配 STM32F303VE。这套搭配的好处很直接前端把激励、增益、滤波、断线检测全包了MCU 端只负责配置寄存器和读数据省下来的算力和引脚可以留给通信和控制逻辑。下面我把这套方案从选型理由到寄存器配置、再到现场踩过的坑完整拆一遍适合正在做温度采集板、或者被 RTD 精度问题折磨过的硬件和嵌入式工程师参考。1. 为什么 RTD 采集最终会落到 ADS122U04 这类器件上1.1 RTD 的信号到底有多小先算一笔账不然后面所有设计都是拍脑袋。以三线制 PT100 为例在 0 摄氏度时阻值 100 欧温度系数约 0.385 欧每摄氏度。如果激励电流取常见的 500 微安那么 0 摄氏度时 RTD 两端电压是 100 乘 500 微安等于 50 毫伏。温度每变化 1 摄氏度电压只变化 0.385 乘 500 微安约等于 0.19 毫伏也就是 190 微伏。这个量级意味着什么如果目标是 0.1 摄氏度的分辨率需要分辨 19 微伏的电压变化。而一个 12 位 ADC 在 3.3 伏参考下一个 LSB 就是 0.8 毫伏左右根本不够看。就算用 16 位一个 LSB 也有 50 微伏勉强够但余量很小。所以工业级 RTD 采集基本都要上到 18 位以上24 位是主流选择这就是 ADS122U04 这类器件的生存空间。1.2 分立方案为什么容易翻车很多人第一反应是用运放搭恒流源加仪表放大器再进 MCU 的 ADC。我早期也这么干过问题集中在几个地方。恒流源的温漂直接变成测量误差普通运放的失调漂移在几十微伏每摄氏度量级而我们要分辨的信号变化才 190 微伏每摄氏度等于误差和信号同数量级。仪表放大器的增益电阻精度、共模抑制比、以及后续 ADC 的参考电压稳定性每一环都在往误差里加料。更麻烦的是三线制 RTD 的引线电阻补偿。RTD 离板子可能几米远每根线几十到几百毫欧直接串进测量回路。分立方案要做补偿得再加一路测量或者用匹配电流源电路复杂度直线上升。ADS122U04 内部集成了双匹配电流源专门为三线制 RTD 的引线补偿设计这是它相比通用 ADC 的核心优势之一。1.3 ADS122U04 把哪些环节收进了芯片把关键特性列一下方便对照自己的需求特性参数对 RTD 采集的意义分辨率24 位轻松分辨微伏级变化内置 PGA增益 1 到 128小信号直接放大省外部仪表放大器激励电流源双路可编程10 微安到 1.5 毫安直接驱动 RTD支持三线制补偿参考输入支持外部参考可用精密参考或比例式测量数据速率最高 2000 SPS兼顾速度与工频抑制接口SPI与 STM32 对接简单断线检测内置传感器开路能报出来比例式测量是这里最值得说的一点。如果用同一路激励电流流过 RTD 和参考电阻那么电流的绝对精度和温漂会被约掉测量结果只跟两个电阻的比值有关。ADS122U04 的双电流源配合外部参考电阻正好能实现这种比例式结构这是精度能做上去的关键。2. STM32F303VE 在这套方案里扮演什么角色2.1 为什么选 F303 而不是更常见的 F103F303VE 是 Cortex-M4 内核带浮点单元主频 72 兆。选它有几个实际理由。第一温度采集之后通常要做线性化或者查表PT100 的非线性用 Callendar-Van Dusen 公式算带 FPU 的 M4 跑起来很轻松F103 的 M3 没 FPU浮点要靠软件模拟代码量和耗时都上去了。第二F303 的定时器和通信外设更丰富HVAC 场景经常要同时跑 Modbus、本地显示、继电器输出资源要留够。第三它的 ADC 和运放资源好如果以后要扩展其他模拟量采集不用换平台。2.2 硬件连接上的几个关键点ADS122U04 和 STM32 之间是 SPI接线本身不复杂但有几个细节决定成败。CS 一定要用 GPIO 单独控制不要图省事接硬件 NSS因为 ADS122U04 的时序对 CS 的建立和保持有要求软件控制更可控。DRDY 引脚必须接到 STM32 的外部中断或者定时器输入捕获用它来触发读取比轮询效率高得多也能保证数据不被覆盖。电源部分要特别注意。ADS122U04 的模拟电源和数字电源建议分开走线模拟电源用低噪声 LDO数字电源可以共用。参考电阻要靠近芯片的 REF 引脚放置走线尽量短且对称因为参考上的任何噪声都会直接进入测量结果。我见过一个板子把参考电阻放在离芯片三厘米远的地方结果噪声大了将近一倍。2.3 时钟与数据速率的取舍ADS122U04 内部有振荡器也可以外接时钟。多数应用用内部时钟就够了省一个晶振。数据速率的选择要结合工频抑制来定。如果现场有 50 赫兹工频干扰把数据速率设成 20 SPS 时芯片内部的数字滤波器在 50 赫兹和 60 赫兹处有陷波能有效压制工频。如果追求速度设到 1000 SPS 以上工频抑制就弱了这时候要么靠硬件滤波要么在软件里做平均。我的经验是温度本身变化慢没必要追求高采样率。设成 20 SPS配合内部工频陷波再在 MCU 里做 8 到 16 点的滑动平均出来的数据又稳又干净。响应时间对 HVAC 来说完全够用因为温度本身的时间常数就是秒级甚至分钟级。3. 三线制 RTD 的硬件设计细节3.1 三线制补偿到底怎么工作的三线制 RTD 有三根引线假设每根线电阻为 RL。其中两根线分别接在 RTD 两端第三根线从 RTD 的一端再引出一根。ADS122U04 用两路匹配电流源一路电流流过 RTD 加一根引线另一路流过第三根引线。通过合理的通道配置让两次测量中的引线电阻贡献相互抵消最终结果里只剩 RTD 本身的阻值。具体配置上通常把第一路电流源接到 RTD 的一端第二路电流源接到第三根引线ADC 测量 RTD 两端的差分电压。由于两路电流源匹配度很高且流过相同长度的引线引线压降在差分测量中被抵消。这就是为什么必须用匹配电流源普通两路独立电流源匹配度不够补偿效果会打折。3.2 激励电流怎么选激励电流不是越大越好。电流大RTD 上的电压大信噪比好但自热效应会带来误差。PT100 的自热系数通常在 0.2 到 0.5 毫瓦每摄氏度之间意思是功耗每增加 1 毫瓦读数会偏高零点几度。所以要在信噪比和自热之间找平衡。以 PT100 为例500 微安激励下100 欧上的功耗是 500 微安平方乘 100 欧等于 25 微瓦自热误差可以忽略。如果换成 1 毫安功耗变成 100 微瓦还是可以接受但如果是小封装的贴片 RTD散热差就要谨慎。我的建议是 500 微安起步如果噪声压不下去再考虑加大同时观察读数是否随电流变化而系统性偏移那多半是自热。3.3 参考电阻的选择比例式测量里参考电阻的精度和温漂直接决定测量精度。选低温度系数的精密电阻比如 5 ppm 每摄氏度或者更好的。阻值的选择要让参考电压落在合适的范围。假设激励电流 500 微安参考电阻取 3.3 千欧参考电压就是 1.65 伏正好是电源的一半比较理想。如果参考电压太接近电源轨PGA 的输入范围会受限。参考电阻的功率也要算。500 微安平方乘 3.3 千欧约等于 0.8 微瓦功率很小但要注意电阻的电压系数有些电阻在大电压下阻值会变选型时看数据手册。4. 寄存器配置与驱动实现4.1 上电初始化的顺序ADS122U04 上电后不能马上配置要等内部电源稳定。我的做法是上电后延时至少 50 毫秒然后发复位命令再延时之后才开始写配置寄存器。复位命令是 0x06发完之后芯片回到默认状态所有寄存器清零。初始化流程大致是这样// 假设 SPI 底层读写已经封装好 void ads122u04_init(void) { HAL_Delay(50); // 等待电源稳定 ads122u04_reset(); // 发送复位命令 0x06 HAL_Delay(10); // 等待复位完成 ads122u04_write_reg(0x00, 0x01); // 配置寄存器0 ads122u04_write_reg(0x01, 0x00); // 配置寄存器1 ads122u04_write_reg(0x02, 0x00); // 配置寄存器2 ads122u04_write_reg(0x03, 0x00); // 配置寄存器3 }4.2 关键寄存器的位定义配置寄存器 0 控制多路复用器和增益。对于三线制 RTD要选对应的输入通道组合增益根据信号大小定。信号只有几十毫伏增益可以设到 8 或者 16让信号接近满量程充分利用 ADC 的动态范围。配置寄存器 1 控制数据速率、工作模式和转换模式。数据速率设 20 SPS 获得工频抑制工作模式选正常模式转换模式选连续转换这样 DRDY 会周期性拉低。配置寄存器 2 控制参考选择、激励电流方向和断线检测。参考选外部参考激励电流源使能断线检测使能。配置寄存器 3 控制 IDAC 的电流大小。设成 500 微安对应的编码。具体位定义要对着数据手册来我这里给的是思路。写寄存器的时候注意ADS122U04 的寄存器写操作是两字节第一个字节是命令第二个字节是数据命令的高四位是 0100低四位是寄存器地址。4.3 读取转换结果的时序DRDY 拉低表示有新数据。读取时先拉低 CS发送读取命令 0x10然后读三个字节组成 24 位有符号数。注意 24 位数据的符号扩展最高字节的最高位是符号位要正确扩展到 32 位。int32_t ads122u04_read_data(void) { uint8_t buf[3]; int32_t raw; ADS_CS_LOW(); spi_transfer(0x10); // 读取命令 buf[0] spi_transfer(0xFF); buf[1] spi_transfer(0xFF); buf[2] spi_transfer(0xFF); ADS_CS_HIGH(); raw ((int32_t)buf[0] 16) | ((int32_t)buf[1] 8) | buf[2]; if (raw 0x00800000) { // 符号扩展 raw | 0xFF000000; } return raw; }4.4 从原始码到温度值的换算拿到原始码之后先算 RTD 阻值。比例式测量下RTD 阻值等于原始码除以满量程码再乘以参考电阻再乘以一个跟 PGA 增益相关的系数。满量程码是 2 的 23 次方减一因为 24 位里有一位是符号位。算出阻值后用 Callendar-Van Dusen 公式反推温度。对于 0 摄氏度以上的范围公式是 R 等于 R0 乘以 1 加 A 乘 T 加 B 乘 T 平方。A 和 B 是常数PT100 的 A 约等于 3.9083e-3B 约等于 -5.775e-7。反解 T 可以用求根公式或者用查表加插值。我一般用查表把负温度到正温度按一度间隔做成表然后线性插值速度快且精度够。5. 实测中那些数据手册不会告诉你的坑5.1 断线检测的误报ADS122U04 的断线检测原理是注入一个小电流检测输入是否浮空。但在三线制接法下如果引线电容较大或者现场有干扰断线标志会误触发。我遇到过一次传感器线缆有十几米断线检测一直报错但实际连接是好的。后来把断线检测的判定加了个延时确认连续几次都报才认为是真断线问题解决。5.2 工频抑制不是万能的把数据速率设成 20 SPS 确实能在 50 赫兹处形成陷波但前提是 ADC 的采样时钟和工频严格同步。如果现场工频有偏移或者芯片用的是内部振荡器有偏差陷波点会偏离抑制效果下降。我的做法是硬件上在输入端加共模扼流圈和差分滤波电容先把高频干扰挡掉一部分软件上再做平均双保险。5.3 冷端和引线的影响虽然三线制补偿了引线电阻但引线之间的温差会产生热电势。如果线缆经过温度变化大的区域铜和连接器材料的热电偶效应会引入微伏级误差。这个在精密测量里不能忽略。解决办法是尽量让三根引线走同一路径保持温度一致连接器用同种金属。5.4 电源噪声的隐蔽影响有一次板子测出来数据总在跳查了半天发现是数字电源的开关噪声通过参考引脚耦合进来了。ADS122U04 的参考输入对噪声很敏感后来在参考引脚加了 RC 滤波问题消失。教训是参考走线要远离数字信号滤波电容要靠近引脚。6. 标定与长期稳定性6.1 单点标定还是多点标定如果只测一个温度点附近单点标定够用。但 HVAC 场景温度范围可能从零下到一百多度非线性明显必须多点标定。我的做法是取至少三个点比如 0 度、50 度、100 度用精密电阻箱模拟 RTD 阻值记录原始码然后拟合出修正系数。这样能把系统误差压到 0.1 度以内。6.2 长期漂移怎么处理精密电阻和 RTD 本身都会随时间漂移。工业产品一般要求一年或者更长的稳定性。选低漂移的电阻RTD 选薄膜铂电阻比绕线式的稳定性好。另外板子上的应力也会影响电阻值布局时让参考电阻远离安装孔和板边减少机械应力。6.3 自校准的可行性ADS122U04 内部有偏移和增益校准功能可以定期执行。但要注意内部校准只校准芯片本身不校准外部电路。外部参考电阻和 RTD 的漂移还是要靠外部标定。我的建议是上电时做一次内部校准然后靠外部精密电阻做系统标定两者结合。7. 这套方案适合什么场景不适合什么场景ADS122U04 加 STM32F303VE 的组合最适合的是多路 RTD 采集、要求精度在 0.1 度量级、现场有工频干扰、需要断线检测的工业温度测量。HVAC 里的冷冻水供回水温度、过程控制里的反应釜温度、能源管理里的热量表都是典型应用。不适合的场景也要说清楚。如果只是测个大概温度精度要求一度以上用 NTC 加普通 ADC 就够了上这套方案是浪费。如果需要极高速采集比如动态温度测量ADS122U04 的 2000 SPS 可能不够要考虑更快的 ADC。如果通道数特别多比如几十路单颗 ADS122U04 只有几个差分通道需要多颗或者用多路复用器扩展成本和板面积都要重新评估。我在实际项目里一块板子放两颗 ADS122U04配合多路模拟开关做到八路 RTD 采集STM32F303VE 的资源还剩不少跑 Modbus 和本地 LCD 都很轻松。这套架构复用过好几次稳定性经得起现场考验。唯一要提醒的是模拟部分的布局和电源处理值得多花时间这部分偷懒后面调试会加倍还回来。