
1. 工业与HVAC温度测量系统的整体设计思路工业和HVAC场景下的温度测量跟我们在实验室里用个开发板接个传感器读读数完全是两码事。工业现场电磁环境复杂变频器、接触器、大功率电机随时在制造干扰HVAC系统里测温点往往分布在风管、水管、换热器表面走线动辄十几米甚至几十米再加上PT100、PT1000、热电偶这些传感器本身的信号幅度很小PT100在0°C时也才100Ω满量程变化不过几十到一百多欧姆折算成电压就是毫伏甚至微伏级别。这种条件下如果直接用STM32F405ZG内部的12位ADC去采分辨率、噪声、共模抑制都很难满足工业级精度要求。所以这套方案的核心思路很明确用一颗专用的24位Δ-Σ ADCADS122U04IPWR做前端信号采集STM32F405ZG只负责配置、读取、换算和通信。ADS122U04IPWR是TI的一款24位、4通道、带PGA和IDAC电流源的Δ-Σ ADC内置2.048V基准支持UART接口注意是UART不是SPI/I2C这点后面会重点讲非常适合RTD和热电偶测温。STM32F405ZG则是ST的Cortex-M4F主力型号168MHz主频、1MB Flash、192KB SRAM带FPU做温度换算、滤波、Modbus/显示/控制逻辑绰绰有余。为什么选这个组合而不是MCU内部ADC运放我实际对比过内部ADC就算用 oversampling 也很难稳定做到16位有效位而ADS122U04在20SPS、PGA128时有效位能到21位以上噪声只有几十nV。对于要求0.1°C分辨率的工业测温这个差距是决定性的。另外ADS122U04自带激励电流源IDAC可以直接给PT100供流省掉外部恒流源电路BOM和调试成本都降下来了。这套架构适合谁做工业仪表、HVAC控制器、温控器、数据采集模块的嵌入式工程师尤其是那些被内部ADC精度不够、外部运放电路调不稳折磨过的朋友。下面我把从硬件到固件到标定的完整链路拆开讲都是我自己踩过坑之后总结的东西。2. ADS122U04IPWR关键特性与硬件设计要点2.1 为什么是UART接口以及它带来的坑ADS122U04IPWR最容易被忽略的一点它是UART接口的ADC不是SPI。很多人一看TI的ADS1220是SPI就默认U04也是SPI结果画完板子才发现引脚对不上。U04的通信是异步串口默认波特率、命令格式都跟SPI完全不同。它的UART是2线制TX/RX支持最高约2Mbps但实际用下来我建议跑在115200或更低工业环境长走线时更稳。这里有个实操细节U04的UART命令是命令字节数据字节的固定长度帧比如写寄存器是0x40|(reg2)后面跟一个数据字节读寄存器是0x20|(reg2)然后读回一个字节。它没有片选靠命令本身区分读写。所以STM32这边不能用硬件SPI得用USART而且要自己写命令收发函数。我一开始想用DMA空闲中断做不定长接收后来发现U04的响应长度是固定的直接阻塞式收发反而更简单可靠。注意U04的UART在CS引脚拉低时才使能通信很多人忘了接CS或者一直拉高结果怎么发命令都没响应。CS必须由MCU控制上电后拉低使能。2.2 模拟前端RTD和热电偶的接法差异ADS122U04IPWR有4个模拟输入通道可以配成2路差分。测RTD比如PT100时典型接法是三线制或四线制。四线制精度最高两根线供激励电流两根线做电压检测完全消除引线电阻。三线制省一根线但需要两次测量做补偿。我在HVAC项目里一般用三线制因为现场布线成本敏感而且三线制配合U04的IDAC双电流源补偿精度也能做到0.1°C以内。测热电偶就不同了热电偶输出是微伏级而且需要冷端补偿。U04的PGA可以放大到128倍但热电偶的共模电压要落在PGA的输入范围内。这时候通常要加偏置电阻把热电偶信号抬到合适共模点。冷端补偿我用的是U04内部的温度传感器或者外接一颗高精度数字温度芯片比如TMP117测接线端子温度软件里做补偿计算。传感器类型接法激励方式精度目标注意事项PT100三线制IDAC 500µA±0.1°C引线电阻匹配PT1000两线制IDAC 250µA±0.2°C引线电阻影响小K型热电偶差分偏置无±1°C必须冷端补偿NTC分压外部基准±0.5°C线性化查表2.3 基准与电源精度的一半在这里ADS122U04IPWR内置2.048V基准温漂典型5ppm/°C对于大多数工业测温够用。但如果你要追求0.05°C级别建议外接REF5025这类低漂移基准。电源方面U04的AVDD和DVDD要分开滤波模拟电源用LDO单独供数字电源可以和STM32共用但要做好去耦。我在一个HVAC控制器项目里最初AVDD和DVDD共用一颗DC-DC结果噪声大到读数跳几十个码后来换成LDOπ型滤波才压下去。PCB布局上模拟输入走线要远离时钟和数字线RTD的激励电流走线要等长对称三线制尤其重要基准电容和去耦电容尽量贴近芯片引脚。这些是老生常谈但真正画板时很容易为了布线方便妥协最后调试阶段花几倍时间返工。3. STM32F405ZG固件架构与温度换算实现3.1 通信层UART命令收发与状态机STM32F405ZG这边我用USART2接ADS122U04波特率1152008N1。通信层封装成几个函数ADS122_WriteReg()、ADS122_ReadReg()、ADS122_StartSync()、ADS122_ReadData()。U04的命令集不复杂但有几个时序要求命令之间要留足够间隔我留了至少50µs连续读数据时要等DRDY引脚变低。这里我踩过一个坑U04的DRDY是开漏输出STM32这边要配内部上拉或者外部上拉。我一开始忘了上拉DRDY一直是低程序以为数据一直就绪读回来全是0。后来加了4.7k上拉到3.3V才正常。固件里我用一个简单的状态机管理采集流程IDLE→配置寄存器→启动转换→等DRDY→读数据→换算→上报。这个状态机跑在1ms定时中断里保证采集节拍稳定。热词里提到的mcu 状态机和timer too close其实就是在说这种定时任务如果节拍太密或者中断嵌套太深会导致任务错过截止时间。我的经验是采集状态机不要放在高优先级中断里做重活读数据和换算放到主循环中断里只置标志。// ADS122U04 读寄存器示例简化 uint8_t ADS122_ReadReg(uint8_t reg) { uint8_t cmd 0x20 | (reg 2); uint8_t val; ADS122_CS_LOW(); HAL_UART_Transmit(huart2, cmd, 1, 10); HAL_UART_Receive(huart2, val, 1, 10); ADS122_CS_HIGH(); return val; }3.2 数据换算从24位码值到温度ADS122U04输出的是24位二进制补码。假设PGA1基准2.048V那么一个码值对应的电压是V (code / 2^23) × Vref / PGA对于PT100三线制激励电流I500µA那么RTD电阻 R V / I。得到R之后用Callendar-Van Dusen公式换算温度0°C以上R R0(1 A·T B·T²) 0°C以下R R0(1 A·T B·T² C·(T-100)·T³)其中R0100ΩA3.9083e-3B-5.775e-7C-4.183e-12。实际固件里我不会直接解这个三次方程而是用分段线性插值查表把-200~850°C分成若干段每段用线性近似精度足够且计算量小。STM32F405有FPU其实直接算也行但查表法在中断里更省时间。热电偶换算更麻烦因为要冷端补偿。我的做法是U04读热电偶电压→查K型分度表得到热端温度→加上冷端温度由TMP117测得→得到实际温度。分度表用NIST的系数做多项式拟合或者直接存一张表。3.3 滤波与抗干扰工业现场必须做的事工业现场50Hz工频干扰是头号敌人。ADS122U04的Δ-Σ架构本身有陷波特性但前提是输出数据率要跟工频同步。U04在20SPS时数字滤波器在50Hz和60Hz都有陷波这是它适合工业测量的关键。所以我在HVAC项目里固定用20SPS虽然慢但抗干扰能力最强。软件上再加一层滑动平均中值滤波。我一般取16个采样做中值再去掉最大最小各2个做平均。这样既抑制了脉冲干扰又平滑了随机噪声。实测下来PT100在变频器旁边不加滤波读数跳±0.5°C加了之后稳定在±0.05°C。提示如果现场干扰特别严重可以在RTD输入端加RC低通截止频率约1kHz但要注意电容漏电流会影响精度选NP0/C0G材质。4. 完整实操流程从零搭建一套测温节点4.1 硬件搭建步骤第一步画原理图。ADS122U04IPWR的外围其实不复杂AVDD/DVDD各加100nF10µF去耦REFP/REFN接基准电容模拟输入接RTDIDAC输出接RTD激励端CS/DRDY接STM32 GPIOTX/RX接USART。注意U04的TX要接STM32的RXRX接STM32的TX交叉接。第二步PCB布局。模拟区和数字区分开RTD走线尽量短且等长基准电容紧贴芯片。我一般把U04放在板子一角远离DC-DC和晶振。第三步上电测试。先不接传感器用万用表量AVDD、DVDD、基准电压是否正常。然后接STM32发命令读U04的寄存器确认通信正常。这一步如果读回来全是0xFF或0x00先查CS和波特率。4.2 固件配置流程初始化USART21152008N1。配置GPIOCS输出、DRDY输入上拉。复位U04发RESET命令0x06。写配置寄存器选择通道、PGA增益、数据率20SPS、IDAC电流500µA、基准内部。启动连续转换模式。在DRDY下降沿中断里读数据。主循环做换算、滤波、上报。配置寄存器0的值我常用0x00MUXAIN0/AIN1PGA1PGA旁路关寄存器1设0x0420SPS寄存器2设0x10IDAC 500µA走AIN2/AIN3。具体值要根据你的接法调建议对着数据手册的寄存器表逐位确认。4.3 标定与验证标定是精度落地的最后一公里。我一般用三点标定冰水混合物0°C、沸水100°C注意当地气压修正、再加一个室温参考点。把标准值和读数记下来做线性回归得到增益和偏移修正系数写进固件。验证时用高精度电阻箱模拟PT100扫-50~150°C记录误差曲线。如果发现某段误差大可能是查表分段不够细或者IDAC电流有温漂。我遇到过一次IDAC随温度漂移导致高温段偏差0.3°C后来改用外部精密电阻做比率测量才解决。5. 常见问题与排查技巧实录5.1 通信类问题问题发命令没响应读回全0xFF。排查顺序CS是否拉低→波特率是否匹配→TX/RX是否交叉→U04是否复位成功。我遇到过CS接在STM32的一个复用引脚上初始化时没配成GPIO输出结果一直高电平。问题DRDY一直不翻转。检查是否启动了转换配置寄存器是否写对。U04在连续转换模式下DRDY会周期性变低单次模式下只变一次。另外DRDY是开漏必须上拉。5.2 精度类问题问题读数跳动大。先看电源噪声用示波器量AVDD纹波。再看数据率是否设成20SPS。最后检查RTD走线是否靠近干扰源。我有个项目读数跳最后发现是RTD线跟电机线捆在一起走了三米。问题高温段偏差大。多半是IDAC温漂或RTD自热。降低激励电流比如从500µA降到250µA可以减少自热但会降低信噪比要权衡。现象可能原因解决方法读数全0CS未使能/波特率错检查CS和USART配置跳动±0.5°C工频干扰/数据率太高改20SPS软件滤波高温偏差IDAC温漂/自热降电流/比率测量低温偏差引线电阻未补偿三线制补偿/四线制通信偶发失败走线太长/无屏蔽加屏蔽/降波特率5.3 系统类问题热词里提到的failed to create module configuration和timer too close本质是固件架构问题。前者通常是初始化顺序不对比如UART还没初始化就去发命令后者是定时任务太密中断里做了太多事。我的原则是中断只置标志重活放主循环。采集状态机跑1ms节拍换算和滤波放主循环这样即使某次换算慢了也不会阻塞采集。注意STM32F405的FPU要记得在工程里使能否则浮点运算会走软件库慢几十倍。在Keil里勾选Use FPU在CubeMX里选好FPU模式。6. 我在实际项目中的几点体会这套ADS122U04STM32F405ZG的组合我在两个HVAC控制器和一个工业温度变送器上用过最深的体会是精度是设计出来的不是调出来的。前期硬件布局和基准电源做扎实后期软件标定就轻松前期偷懒后期怎么滤波都救不回来。另外U04的UART接口虽然不如SPI常见但用熟了反而觉得省心——不用管时钟极性和相位命令格式固定调试时用串口助手就能直接发命令看响应比SPI逻辑分析仪抓波形快多了。唯一要注意的是CS和DRDY这两个引脚别忘接、别忘上拉。最后分享一个小技巧调试阶段可以在U04的模拟输入端并一个高精度电阻比如100Ω 0.01%直接读码值反推电压验证整个信号链是否正常。这比接RTD再换算温度直观得多能快速定位是硬件问题还是软件换算问题。