
1. 为什么工业温度测量值得单独拎出来聊工业现场和商用 HVAC 系统里温度几乎是最基础也最要命的参数。锅炉出水温度偏了两度可能整栋楼的舒适度就崩了冷库蒸发器温度没盯住一库货就报废。这类场景对测温的要求跟消费级产品完全不是一个量级量程要宽-200°C 到 600°C 都算常见、精度要高±0.1°C 甚至更严、长期稳定性要好装上去三五年不能漂、还得抗干扰变频器、接触器、长线缆全在旁边嗡嗡响。能同时满足这些条件的传感器RTD铂电阻是首选尤其是 PT100 和 PT1000。它线性度好、漂移小、可互换性强缺点是阻值变化小PT100 在 0°C 时只有 100Ω每摄氏度才变化约 0.385Ω想测到 0.01°C 分辨率就得能分辨出不到 4mΩ 的阻值变化。这个信号太微弱了普通 MCU 自带的 12 位 ADC 根本不够看必须上高精度、低噪声、带激励电流源的专用 ADC 前端。ADS122U04IPWR 就是干这个的。它是 TI 的一款 24 位 ΔΣ ADC内置 PGA、双匹配电流源、温度传感器和 UART 接口专门为 RTD、热电偶、热敏电阻这类小信号传感器设计。STM32F415RG 则是 ST 的 Cortex-M4 主力带 FPU、1MB Flash、192KB SRAM跑个温度采集、线性化、通信协议绰绰有余。这两个搭在一起就是一套典型的工业级温度测量方案。这篇文章我会从选型逻辑、硬件设计、寄存器配置、固件实现、标定校准到现场排错完整走一遍。适合正在做工业采集板、HVAC 控制器、或者单纯想搞懂高精度 RTD 测温的嵌入式工程师。看完你至少能拿到一套可以直接抄的硬件参数和固件框架。2. 方案整体设计与选型逻辑拆解2.1 为什么是 ADS122U04 而不是分立方案测温前端常见三条路分立运放加 MCU 内部 ADC、专用 AFE 芯片、独立高精度 ADC。分立方案便宜但要做仪表放大器、激励源、基准、滤波噪声和漂移很难压住尤其是 24 位有效精度基本别想。专用 AFE 比如 MAX31865 这类集成度高、上手快但通道数少、灵活性差量程和滤波都得按它的来。ADS122U04 走的是第三条路但把很多 AFE 的功能塞进来了。它有几个关键特性直接决定了它适合这个场景24 位无失码分辨率PGA 增益 1 到 128 可配PT100 的小信号可以直接放大到满量程附近充分利用 ADC 的动态范围。双匹配电流源可以输出 10µA 到 1.5mA 的激励电流两路匹配度典型 0.1%做比例式测量时能抵消激励源的温漂。内置基准和温度传感器省掉外部基准芯片PCB 面积和 BOM 都省。UART 接口注意是 UART 不是 SPI这点后面会专门讲接线和时序跟 SPI 完全不一样。选它的核心理由是在 24 位这个精度档位上它的集成度、灵活性和成本平衡得最好而且 UART 接口在工业长线传输和隔离场景下反而比 SPI 有优势。2.2 STM32F415RG 在这里扮演什么角色有人会问既然 ADS122U04 已经把模拟前端做完了MCU 随便选个便宜的 F0 不就行了理论上可以但实际项目里 F415RG 有几个不可替代的点。第一是算力。RTD 的线性化如果用查表加插值F0 也能跑但如果你想上 Callendar-Van Dusen 方程直接算或者做多点标定后的多项式拟合再叠加数字滤波比如滑动平均加 IIRF4 的 FPU 和 168MHz 主频会让整个采集周期轻松很多。第二是通信外设。工业设备通常要同时挂 RS485、CAN、以太网F415RG 的外设资源足够全开。第三是SRAM 容量。做数据缓冲、协议栈、历史记录192KB 比 F0 的几 KB 宽裕太多。所以这套组合的定位很清晰ADS122U04 负责把模拟信号干净地数字化STM32F415RG 负责把数字信号变成有意义的温度值并送出去。分工明确各干各擅长的。2.3 比例式测量还是绝对式测量这是 RTD 测温里第一个要做的架构决策直接影响精度。绝对式测量就是给 RTD 一个已知的恒定电流测 RTD 两端电压再除以电流算阻值。问题在于激励电流的温漂会直接变成测量误差。假设你用 1mA 激励电流源温漂 50ppm/°C环境温度变化 20°C电流就变了 0.1%对应温度误差约 0.25°C这还没算基准的漂移。比例式测量则是把激励电流同时流过 RTD 和一个高精度参考电阻测两者的电压比。因为电流同时流过两个电阻电流的任何漂移在比值里被约掉了。ADS122U04 的双匹配电流源就是为这个设计的一路电流走 RTD另一路走参考电阻ADC 用参考电阻上的压降作为基准去测 RTD 上的压降结果直接就是阻值比。提示比例式测量是工业 RTD 采集的默认选择除非你的参考电阻精度和温漂比激励源还差否则没有理由用绝对式。参考电阻的选型很关键。假设用 PT100量程 -200°C 到 600°C对应阻值约 18.5Ω 到 313.7Ω。激励电流选 500µA参考电阻上的压降要落在 ADC 基准输入范围内。ADS122U04 的基准输入范围是 0.75V 到 AVDD取 1.65V 左右比较舒服那参考电阻就是 1.65V / 500µA 3.3kΩ。这个阻值要选低温漂的精密电阻比如 0.1% 精度、10ppm/°C 的薄膜电阻封装至少 0805 以上避免自热。2.4 三线制还是四线制RTD 接线方式直接决定能不能消除引线电阻误差。两线制最简单但引线电阻直接串进测量回路假设引线 1Ω对应约 2.6°C 误差工业现场几十米线缆这个误差不能忍。三线制用一根补偿线抵消引线电阻是工业标配。四线制精度最高但多一根线成本高一般实验室或高精度场合用。ADS122U04 支持两线和三线制。三线制接法下两路匹配电流源分别流过 RTD 和补偿线ADC 测的是 RTD 压降减去补偿线压降引线电阻被抵消。这里有个细节两路电流源的匹配度决定了补偿效果0.1% 的匹配度对应引线电阻误差被压到千分之一已经足够。3. 硬件设计细节与关键参数计算3.1 模拟前端电路怎么搭先看 RTD 接口部分。以三线制 PT100 为例RTD 一端接 AIN0另一端接 AIN1补偿线接 AIN2。电流源 IDAC1 从 AIN0 流出经过 RTD 到 AIN1再经过引线到地IDAC2 从 AIN2 流出经过补偿线到地。ADC 测量 AIN0 和 AIN1 之间的差分电压同时 AIN2 上的电压用于补偿。参考电阻接在 REFP0 和 REFN0 之间IDAC1 的电流也流过它。这样 ADC 的基准就是参考电阻上的压降测量结果就是 RTD 阻值与参考电阻阻值的比例。输入滤波不能省。RTD 线缆在工业现场就是天线变频器、电机、继电器全在耦合噪声。每个输入脚对地加 100nF 到 1µF 的 C0G 电容差分之间加 100nF再串 1kΩ 左右的电阻做限流。截止频率算一下1kΩ 加 100nFfc 1/(2π×1000×100e-9) ≈ 1.6kHz对 50Hz 工频和它的谐波有不错的抑制。注意电容要用 C0G 或 NP0X7R 的压电效应会引入噪声。注意ADS122U04 的输入是差分但共模电压有范围限制。PGA 增益越高共模范围越窄。增益 8 时共模要在 AVDD/2 附近设计时用电阻分压把共模抬到中间电位。3.2 电源和地去耦怎么做ADS122U04 的 AVDD 和 DVDD 都是 2.3V 到 5.5V可以单电源 3.3V 供电跟 STM32 共用。但模拟电源必须干净。我的做法是 AVDD 用独立的 LDO 或者从 3.3V 经 LC 滤波过来DVDD 直接数字 3.3V。去耦电容按数据手册来AVDD 对地 1µF 加 100nFDVDD 对地 100nF越靠近芯片引脚越好。基准部分如果不用内部基准外部参考电阻的走线要短且对称两边到 ADC 的路径等长避免引入不对称的寄生电阻。地平面要完整模拟地和数字地单点连接连接点选在 ADC 的 AGND 引脚附近。STM32F415RG 这边VDDA 和 VSSA 也要单独滤波ADC 不用但模拟部分还是要干净。晶振选 8MHz 无源晶振加负载电容或者直接上 25MHz 有源晶振看你的时钟树设计。3.3 UART 接口的隔离与保护ADS122U04 是 UART 接口这跟常见的 SPI ADC 很不一样。UART 是全双工异步接线是 TXD、RXD、加上可能的 CTS、RTS。好处是长线传输方便坏处是波特率要匹配而且没有片选多片 ADC 挂同一总线需要地址或者分开的 UART。工业现场强烈建议加数字隔离。用 ADuM1201 或者类似的磁隔离芯片把 ADC 的 UART 和 STM32 的 UART 隔开。隔离后两边地分开ADC 侧的地跟模拟地一起MCU 侧跟数字地一起。隔离芯片的电源也要隔离用 B0505S 这类小功率隔离电源模块。保护方面UART 线如果出板子加 TVS 管和限流电阻。TVS 选低电容的避免影响信号边沿。限流电阻 22Ω 到 100Ω看波特率115200 以下 100Ω 没问题。3.4 关键参数计算实例假设设计目标PT100 三线制量程 -50°C 到 200°C分辨率 0.01°C精度 ±0.1°C。先算阻值范围。PT100 在 -50°C 约 80.31Ω200°C 约 175.86Ω。阻值变化 95.55Ω。激励电流选 500µA。RTD 上最大压降 175.86Ω × 500µA 87.9mV。这个信号太小PGA 要放大。ADS122U04 的满量程输入是 ±VREF/PGA。假设 VREF 用参考电阻压降参考电阻 3.3kΩVREF 3.3kΩ × 500µA 1.65V。PGA 增益选 16满量程就是 ±1.65V/16 ±103mV。87.9mV 落在范围内且留了余量。分辨率方面24 位 ADC 在 PGA16 时有效位数会降假设有效 20 位满量程 206mV 对应 20 位LSB 206mV / 2^20 ≈ 0.196µV。对应 RTD 阻值变化 0.196µV / 500µA 0.39mΩ对应温度约 0.001°C。理论分辨率远超 0.01°C实际受噪声限制但余量足够。参考电阻选 3.3kΩ0.1% 精度10ppm/°C。自热计算500µA 流过 3.3kΩ功耗 I²R (500e-6)² × 3300 ≈ 0.825mW。0805 封装的热阻约 200°C/W温升 0.165°C可接受。如果用 0603热阻更高温升可能到 0.3°C会引入漂移所以封装别太小。4. 固件实现与寄存器配置实操4.1 ADS122U04 的 UART 通信协议ADS122U04 的 UART 不是标准异步串口那么简单它有一套命令集。上电后默认波特率是 96008 位数据无校验1 位停止。你可以发命令改波特率最高到 115200 还是 1M 我记不太清了手册上写的是最高 1Mbps但实际用 115200 最稳。命令分几类读寄存器、写寄存器、开始转换、读数据、复位。每条命令有固定的字节格式。比如写寄存器是 0x40 加寄存器地址后面跟数据。读寄存器是 0x20 加地址。开始转换是 0x08读数据是 0x10。这里有个坑UART 是异步的命令和响应之间有时序要求。发完命令要等 ADC 处理完才能发下一条手册里叫 command timeout。实测下来每条命令之间至少隔 50µs保险起见隔 100µs。如果你用 STM32 的 HAL 库HAL_UART_Transmit 之后加个微秒延时别连着发。4.2 STM32 端 UART 驱动怎么写STM32F415RG 有多个 USART选一个挂 ADS122U04。配置成 1152008N1开接收中断或者 DMA。因为 ADC 的数据是连续输出的用 DMA 接收最省 CPU。初始化代码大概这样huart2.Instance USART2; huart2.Init.BaudRate 115200; huart2.Init.WordLength UART_WORDLENGTH_8B; huart2.Init.StopBits UART_STOPBITS_1; huart2.Init.Parity UART_PARITY_NONE; huart2.Init.Mode UART_MODE_TX_RX; huart2.Init.HwFlowCtl UART_HWCONTROL_NONE; huart2.Init.OverSampling UART_OVERSAMPLING_16; HAL_UART_Init(huart2);发送命令封装成函数void ADS122_WriteReg(uint8_t addr, uint8_t data) { uint8_t cmd[2]; cmd[0] 0x40 | (addr 2); cmd[1] data; HAL_UART_Transmit(huart2, cmd, 2, 100); delay_us(100); }读数据用 DMA配置一个缓冲区ADC 转换完成后 DRDY 引脚会拉低STM32 检测到下降沿就启动 DMA 接收 3 个字节24 位数据。4.3 寄存器配置详解ADS122U04 有 4 个配置寄存器0 到 3。上电默认值不一定适合你的场景必须手动配。寄存器 0 管输入多路复用器和增益。MUX 位选输入通道比如 AIN0 和 AIN1 差分就是 0x00。GAIN 位选 PGA 增益000 是 1001 是 2010 是 4011 是 8100 是 16101 是 32110 是 64111 是 128。我们选 16就是 100。寄存器 1 管数据速率、工作模式和转换模式。数据速率从 5SPS 到 2000SPS工业测温用 20SPS 或 50SPS 就够速率越低噪声越小。转换模式选单次或连续连续模式适合实时监控。寄存器 2 管基准选择、激励电流大小和方向、温度传感器。基准选外部参考电阻激励电流选 500µA电流方向选两路都开。寄存器 3 管 IDAC 路由和 DRDY 模式。IDAC1 走 AIN0IDAC2 走 AIN2对应三线制。配置顺序很重要先复位再写寄存器最后启动转换。复位命令是 0x06发完等 50µs。4.4 数据读取与温度换算ADC 输出是 24 位二进制补码范围 -8388608 到 8388607。读回来先转成有符号 32 位int32_t raw (data[0] 16) | (data[1] 8) | data[2]; if (raw 0x800000) raw | 0xFF000000;然后算 RTD 阻值。比例式测量下RTD 阻值 参考电阻 × (ADC 码值 / 满量程码值)。满量程码值是 2^23 - 1 8388607。所以float rtd RREF * ((float)raw / 8388607.0f);得到阻值后换算温度。PT100 用 Callendar-Van Dusen 方程T 0°C: R R0 × (1 A×T B×T²)T 0°C: R R0 × (1 A×T B×T² C×(T-100)×T³)其中 R0 100ΩA 3.9083e-3B -5.775e-7C -4.183e-12。反解 T 比较麻烦工程上常用查表加线性插值或者用分段多项式拟合。我一般用查表1°C 一个点表存在 Flash 里插值算出来的精度足够 0.01°C。提示如果 MCU 算力够直接用牛顿迭代法解 CVD 方程也行F415RG 的 FPU 跑这个毫无压力迭代 3 次就能收敛到 0.001°C。5. 标定校准与精度验证5.1 为什么必须做系统标定理论上算出来的温度应该准但实际有太多误差源参考电阻的初始精度、ADC 的增益误差和偏移误差、PGA 的非线性、PCB 走线的不对称、RTD 本身的公差。这些误差叠加起来不标定的话 ±1°C 都算好的。标定分两步零点标定和增益标定。零点用冰水混合物0°C稳定后记录 ADC 码值。增益用沸水或者高精度恒温槽100°C 或者你量程内的某个点记录码值。然后用两点法算斜率和截距。更严谨的做法是多点标定比如 -50、0、50、100、150、200°C 各测一遍用最小二乘法拟合多项式。这样能补偿非线性。5.2 标定实操步骤准备一个高精度恒温槽稳定性 ±0.01°C 那种。把标准铂电阻和你的 RTD 一起放进去等热平衡至少 15 分钟。记录标准值和你的 ADC 码值。每个温度点重复测 10 次取平均去掉噪声。标定系数存在 STM32 的 Flash 里上电加载。如果做多点拟合存多项式系数如果两点存斜率和截距。注意标定时激励电流要跟你实际工作的一致因为自热效应跟电流平方成正比。如果你标定用 1mA工作用 500µA自热误差就不一样了。5.3 精度验证方法标定完要验证。用第三个温度点比如 25°C 室温看测量值和标准值的偏差。如果偏差在 ±0.1°C 以内说明标定有效。如果偏差大检查是不是标定点选得不好或者有非线性。长期稳定性验证把板子放在恒温箱里设定 50°C连续跑 72 小时看读数漂移。如果漂移超过 0.05°C可能是参考电阻或者 RTD 本身的问题。6. 常见问题与排查技巧实录6.1 读数跳动大怎么办这是最常见的抱怨。先看噪声来源。如果是 50Hz 工频干扰把 ADC 的数据速率设成 20SPS因为 20SPS 的转换周期正好是 50ms对 50Hz 有陷波效果。如果还跳检查输入滤波电容是不是焊了地平面是不是完整。另一个可能是激励电流太小信号淹没在噪声里。试试把电流加到 1mA但注意自热。或者把 PGA 增益调高让信号更接近满量程。6.2 温度值整体偏移如果所有读数都偏同一个方向大概率是参考电阻的初始精度问题。用万用表测一下参考电阻的实际阻值把标定系数改过来。或者干脆重新标定。还有一种可能是 RTD 的引线电阻没补偿掉。三线制下如果补偿线和 RTD 线的材质、长度不一致补偿效果会打折。检查接线确保三根线同规格。6.3 UART 通信失败先确认波特率。ADS122U04 上电默认 9600如果你 STM32 配的 115200肯定收不到。要么先发命令改波特率要么 STM32 也用 9600。再看接线。ADS122U04 的 TXD 接 STM32 的 RXRXD 接 STM32 的 TX别接反了。如果加了隔离芯片注意隔离芯片的方向。还有电源。ADS122U04 的 DVDD 如果没上电UART 引脚是浮空的STM32 收不到任何东西。用示波器量一下 DVDD 和 TXD 引脚。6.4 常见问题速查表现象可能原因排查方法解决措施读数跳动大工频干扰示波器看输入波形数据速率设 20SPS加输入滤波读数跳动大激励电流小测 RTD 压降加大电流到 1mA整体偏移参考电阻精度万用表测阻值重新标定或换电阻整体偏移引线未补偿检查三线接线确保三线同规格UART 无响应波特率不匹配示波器看波形统一波特率UART 无响应接线反了检查 TX/RX交叉接线UART 无响应电源未上测 DVDD检查供电温度非线性PGA 非线性多点标定用多项式拟合自热误差激励电流大算功耗减小电流或换大封装电阻6.5 几个容易踩的坑第一个坑是忘了配 IDAC 路由。ADS122U04 的电流源默认是关的你不配寄存器 2 和 3RTD 上根本没电流读出来全是零。第二个坑是参考电阻的走线。如果参考电阻离 ADC 太远走线电阻会串进基准回路引入误差。参考电阻必须紧挨着 ADC 的 REFP0 和 REFN0 引脚。第三个坑是地平面分割。模拟地和数字地如果分割不当回流路径被切断噪声会耦合进来。我的做法是整板一个地平面模拟部分和数字部分分区布局但地不分割靠布局隔离。第四个坑是 DRDY 引脚的处理。ADS122U04 的 DRDY 是开漏输出需要上拉电阻。如果你忘了上拉STM32 永远检测不到下降沿。第五个坑是温度换算的符号处理。24 位补码转 32 位的时候如果忘了符号扩展负温度会算成很大的正数。这个 bug 我见过好几次调试半天才发现。7. 现场部署与长期运行建议板子做出来只是第一步装到现场能稳定跑几年才是真本事。工业环境的电磁干扰、温度循环、湿度、振动都会慢慢暴露设计缺陷。先说布线。RTD 的线缆必须用屏蔽双绞线屏蔽层单端接地接在控制柜的地排上。线缆尽量远离变频器输出线和接触器线圈如果必须交叉走 90 度交叉别平行走。再说防护。控制柜里如果有大功率设备PCB 最好喷三防漆防潮防尘。接插件用带锁的防止振动松脱。如果现场有腐蚀性气体接插件镀金。软件上加看门狗和通信超时重试。ADS122U04 偶尔会因为干扰死机检测到连续几次读不到数据就复位它。STM32 的 IWDG 也要开防止程序跑飞。长期运行还要考虑漂移。建议每半年用标准器校验一次记录偏差。如果偏差超过阈值重新标定。数据可以存在 Flash 里方便追溯。最后说成本。这套方案的核心器件 ADS122U04 和 STM32F415RG 都不便宜但比起用分立方案反复调试的人力成本其实更划算。批量生产的话BOM 成本能压到可接受范围。如果量程和精度要求没那么高可以考虑降级到 ADS122C04 或者 STM32F103但 24 位精度和 UART 隔离的优势就没了。我个人在实际项目里的体会是RTD 测温的难点从来不在 ADC 本身而在整个信号链的每一个细节参考电阻的温漂、走线的对称性、滤波的截止频率、标定的严谨程度。任何一个环节偷懒最后都会在精度上体现出来。把每个细节都做到位这套方案跑出 ±0.05°C 的稳定性是完全可行的。