
1. 工业与HVAC温度测量方案的整体设计思路工业现场和HVAC系统里的温度测量跟我们在实验室用个万用表测室温完全是两码事。工业场景下传感器可能离采集板几十米远周围有变频器、接触器、大功率电机在疯狂开关电磁环境极其恶劣HVAC场景虽然干扰没那么猛但要求长期稳定、免维护、成本敏感而且经常要接PT100、PT1000、NTC这些阻值随温度变化的传感器。这就决定了整个信号链的设计思路必须围绕三个核心抗干扰、高精度、长期漂移小。我这次选的主控是STM32F373RC这颗芯片在温度测量领域其实是个被低估的选手。它内置了16位Sigma-Delta ADCSDADC很多人只知道拿它做音频或者一般采样但实际上SDADC在低速高精度场景下表现相当能打。不过这次我没有用它的内部SDADC而是外挂了ADS122U04IPWR原因后面会详细说。ADS122U04是TI的一颗24位、4通道、带PGA和激励电流源的Delta-Sigma ADC专门为RTD、热电偶、热敏电阻这类温度传感器设计内部集成了很多温度测量需要的外设省了一大堆外围电路。整个方案的架构是这样的传感器PT100/PT1000/NTC/热电偶接到ADS122U04的模拟输入端ADS122U04负责激励、放大、采样、量化通过UART把数据传给STM32F373RCSTM32做线性化计算、温度换算、报警判断、显示和通信。为什么用UART而不是SPIADS122U04是UART接口的这是它和ADS122S04SPI版的主要区别。UART的好处是走线少、隔离方便工业现场做电气隔离的时候光耦或者数字隔离器只需要两路信号线比SPI的四线制省事很多。提示ADS122U04的UART是标准异步串口波特率最高到115200但实际用的时候建议不要跑满57600或者38400更稳尤其是在有隔离器的情况下。选这个组合的另一个考虑是共模电压范围。工业现场传感器经常不是以地为参考的比如PT100接成三线制或者四线制的时候引线上会有压降如果ADC的共模输入范围不够宽测量直接废掉。ADS122U04的PGA可以配置成增益1到128输入共模范围在增益较大时会收窄但配合内部的激励电流源做比例式测量可以巧妙地把共模问题绕过去。具体怎么绕后面实操部分会讲。STM32F373RC这边我主要用它的几个外设UART接收ADS122U04的数据定时器做采样节拍I2C接OLED或者LCD做本地显示另一个UART或者CAN做上位机通信Flash存校准系数。它的Cortex-M4内核带FPU做温度的多项式拟合或者查表插值速度很快不需要外挂DSP。整体BOM成本控制得不错适合批量部署。2. 核心器件选型背后的逻辑与关键参数2.1 为什么是ADS122U04而不是其他ADC市面上24位ADC不少ADI的AD7124、MAX的MAX31865、TI自家的ADS124S08都是常见选择。我最终选ADS122U04有几个很实际的理由。第一它自带双匹配激励电流源。测RTD的时候你需要一个恒流源流过RTD然后测RTD两端的电压。很多ADC需要外挂恒流源电路多两颗运放和一堆电阻不仅占板面积还引入额外漂移。ADS122U04内部有两个匹配的10uA到1.5mA可编程电流源可以直接配置输出到任意引脚做比例式测量非常方便。第二PGA的低噪声表现。ADS122U04在增益128、数据率20SPS的时候RMS噪声大概在70nV左右这个水平对于PT100测到0.01度分辨率是够用的。当然实际能到多少分辨率还要看你的参考电阻和激励电流怎么选。第三UART接口的隔离优势。前面提过了工业现场做隔离UART比SPI省光耦。而且ADS122U04的UART支持自动波特率检测上电后不用MCU发命令去同步它自己会侦测主机发的0x55同步字这个功能在热插拔或者上电顺序不确定的场景下很实用。第四内部温度传感器和烧毁检测。它有个内部温度传感器精度大概0.5度可以用来做冷端补偿或者板级温度监控。还有传感器烧毁检测burn-out current source能检测RTD或者热敏电阻是否开路这个在HVAC远程探头场景下很有价值探头线断了系统能立刻报故障而不是读出一个假温度。2.2 STM32F373RC的角色定位STM32F373RC在这套方案里不是单纯当个MCU用它承担了几个关键任务。首先是协议转换和数据处理ADS122U04出来的是原始ADC码值需要STM32做RTD的Callendar-Van Dusen方程计算或者NTC的Steinhart-Hart方程计算这些浮点运算F373RC的FPU可以轻松搞定。其次是系统管理包括采样时序控制、多通道切换、报警逻辑、看门狗、低功耗管理。HVAC设备很多时候要求待机功耗低F373RC有Stop和Standby模式配合ADS122U04的单次转换模式可以做到平均功耗很低。再就是通信接口F373RC有CAN、USB、多个UART方便接上位机或者组网。工业现场CAN很常见HVAC的楼宇自控里BACnet MS/TP跑在RS485上F373RC的UART加个收发器就能支持。2.3 关键参数的计算与选择激励电流的选择。假设用PT100在0度时阻值100欧最高测到400度时阻值约247欧。如果激励电流选500uA那么400度时RTD两端电压是247*0.0005123.5mV。ADS122U04在PGA增益1的时候满量程输入是±VREF/PGA如果VREF用内部2.048V满量程就是±2.048V123.5mV只占很小一部分浪费了动态范围。所以要么提高增益要么提高激励电流。如果激励电流选1mA400度时电压247mVPGA增益设8那么等效满量程是2.048/8256mV247mV刚好接近满量程利用率很高。但要注意1mA流过PT100会产生自热PT100的自热系数大概0.2到0.5度/mW1mA在100欧上产生0.1mW自热约0.02到0.05度可以接受。如果测的是PT1000同样1mA产生1mW自热就大了所以PT1000通常用100uA到250uA。参考电阻的选择。做比例式测量时参考电阻和RTD串联流过同样的电流ADC测RTD两端电压和参考电阻两端电压的比值这样激励电流的漂移就被抵消了。参考电阻的阻值要选得让参考电压在ADC的推荐范围内一般是1V到2.048V之间。如果激励电流1mA参考电阻选1.5k欧参考电压就是1.5V比较合适。参考电阻的温漂要低至少25ppm/度最好10ppm/度否则参考电阻的漂移会直接变成测量误差。数据率的选择。ADS122U04的数据率从5SPS到2000SPS可调。工业温度测量不需要快5SPS到20SPS就够了数据率越低内部数字滤波器抑制50Hz/60Hz工频干扰的效果越好。20SPS时同时抑制50Hz和60Hz这个在工业现场很关键因为工频干扰是最常见的。3. 硬件设计与实操要点3.1 模拟前端电路设计先讲PT100的三线制接法这是工业上最常用的因为三线制可以在不增加太多线缆成本的前提下抵消引线电阻的影响。具体接法是PT100一端接激励电流源输出另一端接ADC的模拟输入正端同时这一端还通过一根引线接到参考电阻的一端PT100的第三根线从激励电流源那一端引到ADC的另一个输入或者参考端用来测量引线电阻上的压降。在ADS122U04上我通常这样配置AIN0和AIN1作为差分输入接PT100两端AIN2接参考电阻高端AIN3接参考电阻低端。内部激励电流源1从AIN0流出经过PT100回到AIN1再经过参考电阻到地。这样ADC测到的就是PT100电压和参考电阻电压的比例。三线制的第三根线用来补偿AIN0或AIN1引线上的电阻具体接法要看你的布线原则是让激励电流不流过测量引线。注意三线制补偿不是完美的它假设三根引线电阻相等。实际线缆如果长度差异大或者温度梯度大补偿效果会打折扣。要求高的场合用四线制但四线制多一根线成本高。NTC的接法就简单多了NTC和参考电阻串联中间点接ADC输入激励电流或者参考电压从上面加。NTC是非线性的但成本低HVAC里大量用10k NTC。NTC的精度一般不如PT100但通过校准可以做到0.1度以内。热电偶的接法需要冷端补偿。ADS122U04内部有温度传感器但它的精度和位置不一定能准确反映冷端温度所以高精度场合还是外挂一颗LM75或者DS18B20做冷端。热电偶的信号很小K型热电偶在100度温差时输出约4mV所以PGA增益要开到64或者128。3.2 PCB布局与抗干扰这块我踩过不少坑说几个关键点。模拟地和数字地要分开在ADC下面单点连接。ADS122U04的AGND和DGND引脚不要直接连在一起再接到系统地而是各自走线到ADC下方的星点。激励电流源的走线要对称如果两个电流源都用走线长度和宽度要尽量一致否则匹配度下降。参考电阻的放置要靠近ADC走线短而粗不要和数字信号线平行走。输入滤波方面ADS122U04内部有EMI滤波器但外部还是建议加RC滤波截止频率设在1kHz左右电阻用10欧到100欧电容用100nF到1uF。电阻太大会引入噪声太小滤波效果不好。隔离设计如果传感器和MCU不共地或者现场干扰特别大建议在UART线上加数字隔离器。隔离器的电源也要隔离用隔离DC-DC或者变压器。隔离后ADS122U04的供电要单独一路LDO不要和MCU共用。3.3 电源设计ADS122U04的模拟供电范围是2.3V到5.5V数字供电也是。我一般用3.3V给数字部分模拟部分用一颗低噪声LDO单独供比如TPS7A4700这种噪声在4uVrms左右。如果成本敏感至少也要用个普通的LDO不要直接用开关电源开关纹波会耦合到ADC输出。激励电流源的供电要特别注意因为电流源的PSRR不是无限的。如果供电有纹波激励电流也会有纹波直接调制到测量结果上。所以模拟供电的LDO后面要加足够的去耦10uF钽电容加100nF陶瓷电容靠近ADC引脚。4. 软件实现与温度换算4.1 ADS122U04的配置与数据读取ADS122U04的UART协议是命令式的主机发命令ADC回数据。上电后先发同步字0x55等ADC回0x55表示同步成功。然后配置寄存器主要配置输入多路复用器、增益、数据率、工作模式、激励电流源。配置寄存器0的典型值MUX选AIN0和AIN1差分增益8PGA使能。配置寄存器1数据率20SPS连续转换模式内部参考使能。配置寄存器2激励电流源1使能电流1mA输出到AIN0。配置寄存器3烧毁检测关闭IDAC旋转关闭。读取数据时发0x10命令ADC回3个字节组成24位有符号数。注意ADS122U04的输出是二进制补码最高位是符号位。如果PGA增益是8满量程是±VREF/8VREF是2.048V那么LSB大小是22.048/(82^24)30.5nV。这个数字看起来很小但实际有效位数受噪声限制20SPS时大概能到21位有效也就是LSB约0.5uV。4.2 RTD温度换算的代码实现PT100的换算用Callendar-Van Dusen方程。0度以上RR0*(1ATBT^2)0度以下还要加C项。A3.9083e-3B-5.775e-7C-4.183e-12。反解T的时候0度以上可以用二次方程求根公式0度以下需要迭代。float pt100_res_to_temp(float r) { float r0 100.0f; float a 3.9083e-3f; float b -5.775e-7f; float c -4.183e-12f; if (r r0) { float disc a*a - 4*b*(1 - r/r0); return (-a sqrtf(disc)) / (2*b); } else { float t (r/r0 - 1) / a; // 初值 for (int i 0; i 10; i) { float f r0*(1 a*t b*t*t c*(t-100)*t*t*t) - r; float df r0*(a 2*b*t c*(4*t*t*t - 300*t*t)); t - f/df; } return t; } }实际用的时候我会把R0、A、B、C做成可校准的参数存在Flash里每台设备出厂前用精密电阻箱校准几个点拟合出实际的系数。这样可以把PT100本身的公差和电路误差一起补掉。4.3 NTC的换算NTC用Steinhart-Hart方程1/T A Bln(R) Cln(R)^3。T是开尔文温度。A、B、C三个系数可以从NTC的B值和25度阻值算出来也可以实测校准。10k NTC的B值常见有3435、3950等。float ntc_res_to_temp(float r) { float lnr logf(r); float inv_t 0.001129148f 0.000234125f*lnr 0.0000000876741f*lnr*lnr*lnr; return 1.0f/inv_t - 273.15f; }NTC的精度在0到50度范围内可以做到0.1度但高温段和低温段误差会变大。如果全温区要求高建议用查表加线性插值表用实测数据生成。4.4 采样时序与滤波我一般用定时器触发STM32去读ADS122U0420SPS的话每50ms读一次。读回来的数据先做一阶低通滤波截止频率0.5Hz左右时间常数约0.3秒。这样既能平滑噪声又不会让响应太慢。如果被测温度变化快比如HVAC的送风温度时间常数可以设小一点1秒左右。提示ADS122U04内部有50Hz/60Hz抑制但那是针对差分输入的。如果传感器引线很长工频干扰以共模形式进来内部滤波器效果有限外部还是要做好屏蔽和共模滤波。5. 常见问题与排查技巧实录5.1 读数跳动大怎么办这是最常见的问题。先看电源纹波用示波器交流耦合测ADC的AVDD纹波应该在1mV以下。如果纹波大检查LDO和去耦电容。再看激励电流是否稳定可以测参考电阻两端电压用六位半表看波动。如果参考电压稳但读数跳可能是PGA增益太高导致噪声放大试着降低增益、提高激励电流。还有一个容易被忽略的点ADS122U04的UART通信误码。如果波特率太高或者隔离器延迟大数据可能错位。表现是偶尔跳出一个离谱的值。可以在软件里加校验比如连续读三次取中间值或者检查数据变化率是否超过物理可能。5.2 温度读数整体偏移如果所有点都偏同一个方向先检查参考电阻的实际阻值和温漂。参考电阻的精度直接影响测量精度1%的参考电阻误差会导致1%的温度误差在100度时就是1度。建议用0.1%甚至0.01%的电阻。再检查PT100的接线三线制如果引线电阻不匹配会有固定偏移。5.3 低温段测不准PT100在0度以下非线性增强C项不能忽略。如果代码里只用了A和B低温段误差会到零点几度。另外低温时ADC的噪声相对信号更大因为PT100阻值低电压小。可以低温段用更大增益或者降低数据率到5SPS。5.4 常见问题速查表现象可能原因排查方法解决措施读数跳动大电源纹波大示波器测AVDD换低噪声LDO加去耦读数跳动大UART误码读原始码值看是否突变降波特率加校验整体偏移参考电阻误差万用表测参考电阻换高精度电阻校准整体偏移引线电阻不匹配测三根线电阻用等长线或改四线制低温不准缺C项检查换算公式加C项或查表高温不准自热效应降低激励电流换小电流或脉冲激励通信失败同步字错误示波器看UART波形检查上电顺序重发同步烧毁检测误报阈值设置不当看烧毁电流大小调整检测阈值5.5 实操心得我在实际项目里总结了几条第一校准比选器件更重要。再好的ADC和电阻不校准也白搭。每台设备至少两点校准0度和100度有条件的多点校准。第二隔离不是万能的。隔离器本身有延迟和抖动UART隔离后波特率要降而且隔离电源的噪声可能比不隔离还大。第三软件滤波要适度。滤太狠响应慢滤不够跳动大根据应用调。第四留测试点。板子上把激励电流、参考电压、ADC输入都引出测试点调试的时候省一半时间。这个方案我在几个HVAC项目里跑过风管温度、水温、室外温度都测过长期稳定性不错。工业场合如果干扰特别大建议再加一级TVS和共模扼流圈。后续如果要扩展可以加多片ADS122U04做多通道或者换ADS122U088通道省事。STM32F373RC的SDADC其实也可以用来做辅助测量比如同时测两路NTC分担主ADC的压力。