
做工业或HVAC测温最先要过的坎不是传感器选型而是把微伏级的传感器信号可靠地变成数字量。我之前在做一个风机盘管温控采集模块时最初图省事直接用STM32内置ADC结果在50Hz工频干扰、引线压降和电源纹波的叠加下测量重复性差到没法看。后来换成了“24位外置ADC 独立信号链”的方案整套系统的稳定度一下就拉开了。这篇就拿TI的ADS122U04IPWR和意法半导体的STM32F745ZG组合来拆解从传感器信号特征、硬件连接、寄存器配置、STM32固件状态机到比例测量与校准流程把一条完整的工业级温度采集链路讲清楚。适合正在做工业传感器采集模块、HVAC分布式测温节点、高精度温度变送器的同学参考也适合想弄明白“为什么测温系统不能只靠MCU内置ADC”的人。1. 为什么这套组合适合测温从传感器信号本质到ADC选型逻辑1.1 温度信号的真实形态为什么12位ADC根本不够用先看一组数据。K型热电偶的塞贝克系数大约是41µV/℃也就是说温度变化1℃输出只变化41微伏。如果你要求测量误差在±0.5℃以内意味着系统至少要能稳定分辨出20µV左右的电压变化。12位ADC在3.3V参考电压下的最低分辨率大约只有806µV连1℃的信号都分辨不出来更别提0.1℃了。这就是为什么测温系统里外置高精度ADC不是可选而是必选。PT100铂电阻信号比热电偶稍好一些它在0℃时的阻值是100Ω温度系数约0.385Ω/℃用1mA激励电流可以得到约0.385mV/℃的电压变化。信号大了十倍看似12位ADC勉强够用但工业现场还有另外两个麻烦一是传感器线缆可能长达几十米引线电阻本身就有几欧姆这直接叠加在测量结果上二是激励电流源的温漂会带来额外误差。这些误差和分辨率是不同层面的问题必须靠电路结构来解决也就是后面要说的比例测量。ADS122U04IPWR这颗芯片的核心参数正好切中这些痛点24位Δ-Σ ADC、内置可编程增益放大器PGA增益1到128、内部2.048V参考电压、两个可配置激励电流源还集成了内部温度传感器用于热电偶冷端补偿。四个单端/两组差分输入采集多路传感器时芯片资源也更灵活。封装是TSSOP-16后缀IPWR对应的就是这种封装和卷带包装形式做小尺寸采集模块很合适。1.2 选UART版本而不是SPI版本的实际考量ADS122U04这个型号和常见的SPI版本ADS1220并不是同一颗东西U04版本把SPI通信换成了UART串口通信但这种变化在实际系统里带来的好处非常明显。先说SPI的问题。SPI需要SCK、MOSI、MISO再加上片选信号最少四根线如果从控设备多每个设备还得单独挂一条CS。在工业环境里做隔离时每根线都要过一个数字隔离器通道隔离通道多意味着成本上升、PCB面积变大。而且SPI时钟翻转快高速信号在长距离走线上对寄生电容、串扰都很敏感线一长就出问题。UART只需要TXD、RXD两根线半双工场景甚至一根线加方向控制也能跑。做电气隔离时两个通道就够比如ISO7721这类双通道数字隔离器价格和面积都更友好。而且UART本身就是异步串口只要双方波特率一致就能通信对时序的要求比SPI宽松得多长线传输时抗干扰能力也更好。ADS122U04还支持通过地址配置实现多设备挂接多个ADC节点可以挂在同一条总线上轮询采集这个特性在HVAC系统这种“大量测温点、布线距离长”的场景里非常实用。1.3 ADC数据速率与工业HVAC需求的匹配很多人一看是24位ADC就担心速度慢实际上ADS122U04的数据速率覆盖范围非常宽常见的档位从20 SPS一直到1000 SPS、2000 SPS级别都可以配置。HVAC温度采集的典型场景是什么冷却水主管道温度、风管送风温度、回水温度这些量本身就是慢变的1秒采一次都嫌快20 SPS足够了。工业过程控制里如果需要跟踪变化稍快的温度可以选90 SPS或者175 SPS档同时打开内部数字滤波把50Hz工频干扰压下去。低速档还有一个额外好处Δ-Σ ADC内部有数字滤波器数据速率越低对带外噪声的抑制越强有效分辨率越高。在HVAC场景里使用20 SPS档位得到的有效位数往往比高速档位高不少这是白白赚到的精度。2. 硬件连接的关键细节电源、参考电压、传感器接口与通信电平2.1 电源与地Δ-Σ ADC对干净电源的要求ADS122U04的电源设计是整板最容易被低估的部分。很多人直接拿数字3.3V往AVDD引脚一接结果发现数据跳动非常大。原因在于Δ-Σ ADC内部的模拟调制器对电源噪声非常敏感尤其是电源上的高频毛刺会直接调制进输入信号。我习惯的做法是整个板子先由一个低噪声LDO比如TLV70033或LM1117-3.3输出3.3V然后经过磁珠隔离分成两路。一路直接给DVDD和STM32F745ZG供电另一路再经过一个RC滤波比如10Ω电阻加10µF电容进AVDD。模拟地和数字地在ADC芯片下方单点连接整个PCB使用完整的地平面。这样做的原理是让模拟电源路径的阻抗尽可能低、噪声尽可能小同时避免数字部分的开关噪声通过共同的电源路径耦合进模拟前端。参考电压方面ADS122U04有内部2.048V参考电压短距离、中等精度场景直接用内部参考没问题。但如果追求更好的温漂特性可以外接精密基准比如REF5025这类低温漂基准。不过要特别说一句在做PT100比例测量时参考电压根本不需要外部基准因为参考电压由外部精密电阻和激励电流共同产生这是后面专门讲的重点。2.2 PT100三线制与四线制接口设计PT100测温的经典接法有两种三线制和四线制。四线制的原理最干净每个RTD端子各接两条线一条承载激励电流一条用于电压采样。采样线几乎没有电流流过因此线缆电阻完全不产生测量误差。四线制适合需要最高精度的工业场景缺点是传感器探头需要四根引出线成本高一些。三线制的思路是让“测量线”无电流、只承担电压感知任务从而抵消一根回线的影响。具体接法上RREF和RTD串在同一路激励电流回路中ADC的参考电压取自RREF两端模拟输入则跨接在RTD两端。这里有个关键选型计算PT100在300℃时的阻值大约是212.02Ω400℃约247.04Ω。如果选择PGA增益为8、RREF为1.8kΩ则满量程输入电压对应“RREF/G”等于225Ω能覆盖到接近300℃。如果测温范围要到600℃以上就得把增益降到4此时理论满量程对应450Ω可以覆盖到850℃的PT100上限。这个计算关系要记住RREF必须大于等于“最大目标温度对应的RTD阻值与增益的乘积”否则ADC的输入范围会饱和。电流源的档位选择也需要注意。PT100激励电流推荐1mA再高一点的自热效应会明显增加测量误差。ADS122U04的激励电流输出打开后要给它留出稳定时间让参考电容和传感器回路的寄生电容充完电之后再启动转换这个细节后面踩坑部分会专门讲。2.3 热电偶接口与冷端补偿热电偶的信号是微伏级的所以PGA增益要设到64或128。K型热电偶在测量端和参考端之间产生热电势参考端通常是接线端子所处的环境温度因此必须在靠近热电偶接线端的位置测量环境温度然后用软件补偿。ADS122U04内部集成了一个温度传感器可以直接读取芯片附近的环境温度精度大约在±2℃级别配合出厂校准能做得更好。如果PCB上芯片位置和热电偶端子距离较远则应该在端子旁边放一颗高精度板级温度传感器比如TMP117冷端补偿的准确度会好很多。还有一个冷端补偿的工程细节因为热电偶输出的电压幅度很小任何接触热电势、PCB上不同金属连接处的温度梯度都可能产生干扰。不要小看这个问题我们实际测过如果在热电偶端子附近有功率器件在工作冷端误差很容易超过2℃。所以PCB布局时热电偶的接线端子要尽量远离发热器件并且接线端子两脚之间不要有大的温度梯度。2.4 UART电平匹配与隔离方案ADS122U04的UART接口电平以DVDD供电为准如果DVDD接的是3.3VUART逻辑电平就是3.3V可以直接和STM32F745ZG的USART引脚相连。但建议在通信线路上各串一个100Ω电阻靠近ADC引脚处加ESD保护管因为工业现场的电缆插拔很容易引入静电。到了真正需要长距离传输的工业现场我会在STM32和ADS122U04之间加数字隔离器。UART只有两路信号所以一颗双通道隔离器就够了。隔离后的UART波特率如果保持在9600或19200延时完全不影响吞吐量。需要注意隔离器和ADC之间是否跨了地平面如果隔离器两边分属不同的电源域ADC侧电源必须是干净的隔离电源比如用隔离DC-DC模块或者低功耗LDO从隔离后的电压取电。3. ADS122U04的寄存器配置与UART通信协议实现3.1 寄存器配置思路先把要做什么写在纸面上ADS122U04的寄存器配置并不复杂但如果不提前把测量需求列出来很容易配出几个互相矛盾的值。我每次做新板都先按下面的清单过一遍温度范围决定输入多路选择器、PGA增益和RREF取值传感器类型PT100用差分输入激励电流热电偶用单端输入高增益NTC用单端输入外部上拉到参考电压数据速率20 SPS适合HVAC175 SPS适合工业动态过程转换模式连续转换适合固定调度轮询单次转换适合按需采集配置时把PGA设为合适的增益把输入多路选择器选到对应的通道把激励电流源使能并配置输出引脚把参考电压源设置为外部RREF差分模式这些配置分布在四个寄存器里。寄存器0处理输入通道和增益寄存器1处理转换模式和数据速率寄存器2处理参考电压和滤波选项寄存器3处理激励电流参数。有个反面教材值得讲一下有人把PGA增益设成128又选了较大的激励电流结果输入信号在常温下就超出参考电压的范围ADC输出一直顶在满量程上。排查了半天最后用万用表测RREF压降才发现满量程输入电压远小于实际的RTD压降。所以配置完一定要自己动手算一遍最坏情况下的信号幅度不要想当然。3.2 UART命令帧结构从读写操作到CRC校验ADS122U04通过UART接收命令帧、返回响应帧。虽然具体帧格式要看TI最新datasheet但总体结构比较典型前导字节、命令字、寄存器地址、数据域和校验字段。比较关键的一点是UART模式下没有硬件DRDY引脚转换完成状态要么通过读状态寄存器、要么通过数据输出帧中的状态位来感知。在实际工程里我强烈建议不要跳过CRC校验。UART在工业环境下偶尔会被干扰拉低一条帧如果没有校验接收方会把坏数据当成正常测量结果温度显示瞬间跳变。有了CRC丢掉一帧数据比收进一个错误数据好得多。对20 SPS的采集速率来说偶发丢帧完全不影响整体表现。3.3 状态机与数据流单次转换还是连续转换单次转换模式的流程是写配置寄存器、发送启动转换命令、等待状态标志、读取转换结果。这种模式适合主从式查询架构每次采集由主控发起逻辑清晰功耗也更可控。但要注意每次启动转换后必须等够转换时间再读数据否则读到的是旧数据或者正在转换中的不稳定数据。连续转换模式则是配置完成后芯片自动按设定速率转换主控只需要定时从芯片拉取最新结果。HVAC多点采集场景我推荐连续转换模式配合UART的DMA接收主控CPU几乎没有负担只需周期性解析最新数据。对于STM32F745ZG这种主频216MHz的M7内核来说这个任务轻得像热身运动。3.4 推荐的PT100测量配置这里给一组经过实测的PT100连续测量配置做参考以寄存器域位定义实际赋值时请以你手中批次datasheet为准配置项参数值说明输入通道AIN0/1差分接PT100正端和负端PGA增益8配合RREF1.8kΩ覆盖300℃量程激励电流源IDAC11mA流入RREF和RTD回路参考电压外部RREF差分比例测量核心数据速率20 SPSHVAC场景足够转换模式连续转换配合DMA轮询这套配置在室温下的典型输出稳定度可以达到0.01℃级别的码值波动换算成温度便于理解20 SPS下码值抖动一般不超过几位对应温度跳动小于0.01℃。4. STM32F745ZG固件实现从状态机解析到温度换算4.1 工程结构和任务划分STM32F745ZG在这里的角色是主控和数据汇聚节点。很多工业采集板会把“和ADC通信”“解析数据”“温度换算”“显示或上报”全部塞进一个中断里结果一个中断里干了好几件耗时的事实时性一塌糊涂。我的做法是把任务分成三层底层驱动层只有USART收发和DMA缓冲不碰任何业务逻辑协议解析层负责从字节流里提取完整帧、校验CRC、识别有效载荷应用层拿到原始码值之后调用温度换算函数生成最终的物理温度值。用F745ZG的USART3配DMA接收数据到达后触发空闲中断在处理函数里解析帧。主循环只需要检查环形缓冲区里有没有新数据有就取出来换算。4.2 帧解析状态机从字节流到完整消息UART通信的本质是字节流没有硬件帧边界所以必须自己在软件层做帧同步。我使用的帧解析状态机包含以下几个状态等待前导字节、接收长度字段、接收数据载荷、接收校验字段、校验验证。每一步都检查超时防止一帧损坏导致解析器卡死。伪代码是这样的typedef enum { FRAME_IDLE, FRAME_SYNC, FRAME_LEN, FRAME_PAYLOAD, FRAME_CRC, FRAME_DONE } FrameState; void frame_parse(uint8_t byte) { switch (state) { case FRAME_IDLE: if (byte FRAME_SYNC_BYTE) state FRAME_SYNC; break; case FRAME_SYNC: if (byte HEADER_LEN) { frame_len byte; state FRAME_LEN; } else state FRAME_IDLE; break; // ... } }这个功能不复杂但一定要单独写成模块因为我见过很多人在主循环里直接写if-else处理接收一帧数据还没收完又被别的任务打断帧同步就乱了。状态机最大的好处是每个字节只做一次状态迁移绝不在中断里阻塞等待下一个字节。4.3 PT100比例测量的温度换算代码码值到电阻的换算公式是R_RTD Code × RREF / (PGA_Gain × 2^23)代码实现如下float rtd_resistance(int32_t raw_code, float rref, float pga_gain) { return ((float)raw_code * rref) / (pga_gain * 8388608.0f); }拿到电阻之后温度用查表或者分段线性化换算。PT100在0到100℃之间近似线性每摄氏度0.385Ω但全温区其实呈轻微非线性。工程中我推荐两个方案纯高精度需求用Callendar-Van Dusen公式HVAC这种窄范围场景直接查一个0到100℃的1℃间隔小表线性插值就够了。查表法的好处是快、可控、代码短而且校准偏移可以通过校准流程吸收掉。4.4 数字滤波与实时性取舍和ADC自身的数字滤波相比后面的软件滤波作用比很多人以为的要小。因为ADS122U04在20 SPS档位下已经做了很强的内部滤波外部再加一个移动平均只是为了进一步平滑偶发的尖峰。HVAC场景我建议用最简单的滑动平均取最近4到8次转换结果取平均配合丢点判断如果某一帧码值偏离中值超过设定阈值先丢弃再补采。不要用复杂度太高的FIR滤波器因为温度本身是慢变量不需要强烈的滤波反而要避免滤波引入的滞后延迟。对控制系统来说温度反馈滞后10秒可能就会让PID控制器出现振荡这是很多人在HVAC控制器上调了半天参数才发现的坑。5. 比例测量与校准流程误差预算拆解和HVAC简化方案5.1 比例测量为什么是RTD测温的正解这个部分我要重点展开因为它是整个系统设计的核心。PT100测量的本质是“测电阻”而电阻测量离不开电流激励和电压测量。如果使用芯片内部固定参考电压那激励电流的温漂会直接折算成误差激励电流变化0.1%测量结果就变化0.1%。对1mA电流来说0.1%漂移大约是1µA对应PT100上0.1mV级的电压变化换算成温度误差可能超过0.2℃。比例测量的做法是把参考电压也取自同一路激励电流。具体来说激励电流I先流过精密电阻RREF在RREF两端产生参考电压VREFI×RREF同一路电流继续流过RTD在RTD两端产生信号电压VinI×R_RTD。ADC输出码值Code (Vin × PGA) / VREF × 2^23 (I × R_RTD × PGA) / (I × RREF) × 2^23注意I从分子分母同时约掉了。这意味着激励电流的绝对值对测量结果没有任何影响电流漂移被完全抵消。RREF的精度才是误差来源。这就是为什么这套方案可以用普通精度的激励电流源却能达到高精度电阻测量的原因。我用生活化的类比说一下这就好比你先量了一把尺子的长度再用这把尺子去量桌子尺子本身热胀冷缩带来的误差就不重要了重要的是尺子刻度是否均匀。5.2 两点校准流程与系数存储即使有了比例测量系统的残余误差还来自ADC的偏移、PGA的增益误差以及RREF的绝对精度。把这些压下去最简单有效的方法是两点校准。工程上推荐用精密电阻箱替代真实温度源做校淮因为电阻箱的阻值可以精确设定且不必等温度稳定。校准步骤是第一步把输入短接记录零点偏移码值第二步接一个标准电阻比如100Ω记录增益码值第三步再换一个比如200Ω的标准电阻验证线性。然后计算斜率Slope (R_ref2 - R_ref1) / (Code2 - Code1)校准系数建议存到STM32F745ZG内部Flash的最后一页每次上电时读出来校验标志位合法才使用。还要注意每一路模拟输入通道都要单独校准因为多路选择器的导通电阻、PGA的偏移在每个通道上略有不同共用一套系数会引入通道间误差。5.3 误差预算拆解一套配置得当的比例测量系统误差主要由下面几项构成误差来源典型量级说明ADC量化/噪声0.01℃以下20 SPS下有效位数很高PGA增益误差±0.02%量级对应温度误差约0.05℃RREF温漂取决于电阻25ppm/℃对应约0.03℃/10℃温变ADC偏移校准后接近0两点校准吸收引线电阻0.1Ω约0.26℃四线制消除三线制需两线等阻如果使用0.1%精度、25ppm温漂的RREF做一次两点校准整套系统在-40到150℃范围内的总误差可以控制在±0.3℃以内。对于HVAC场景通常要求是±0.5℃而且温度范围只有0到50℃所以只需要出厂做一次两点校准后面长期运行完全不用管。工业场景如果探头的引线很长、环境温度变化大建议每半年做一次现场校准使用标准温度源验证漂移量。6. 实测调试中的七个坑从波形抓取到PCB布局6.1 UART帧边界误判空闲判定不能只用超时第一个坑来自UART帧解析。ADS122U04在连续转换模式下会持续输出帧帧与帧之间间隔很短。如果只用串口空闲中断作帧结束标志偶尔会碰到两个帧之间的间隔时间不稳定空闲中断提前触发结果把一帧数据切成了两半解析器就开始错乱。处理办法是在帧结构里显式包含长度字段解析器必须先收满长度字段声明的字节数再检查CRC只有CRC通过了才算完整帧。空闲中断只作为异常恢复机制不作为正常的帧结束判据。这条经验在做任何UART协议解析时都通用。6.2 刚上电时前几帧偏大激励电流回路的稳定时间现象很典型板子上电后连续模式输出前五六个数据点明显偏大之后才慢慢落到正常值。原因在于激励电流源刚使能时RREF两端的旁路电容和传感器线缆寄生电容需要充电到稳态。PT100上的电压一开始偏高随着电容充满电流全部流入RTD之后才回到正确的阻值。解决办法很粗暴但有效在驱动初始化里使能激励电流后强制延时至少100ms或者直接丢弃转换结果中的前16帧。对于20 SPS的数据速率16帧也就0.8秒HVAC系统完全没有感知。6.3 模拟地和数字地不要迷信分割地平面关于模拟地、数字地分割网上说法很多我在低速测温应用里的实际经验是不分割统一地平面把模拟器件尽量靠近放置数字信号线远离模拟输入引脚。分割地的本意是阻止数字噪声回流污染模拟区但如果两片地之间有信号线跨过回流路径被切断地弹反而更严重。温度采集板的信号带宽极低根本不会因为共用地平面导致性能问题。真正要注意的是ADC输入引脚的走线要短而粗远离板上开关电源的电感区域RTD的回流路径就近回到ADC下方的模拟地参考点不要把小信号线和PWM输出线平行走线。6.4 三线制也救不了线径不一致的引线三线制设计的前提是两根引线电阻近似相等。实际线缆如果一根是0.5mm²、一根是0.75mm²或者长时间使用后某段氧化导致接触电阻变化补偿就会失效。我在现场见过最极端的案例一根引线在端子处有锈蚀接触电阻跟温度变化一起漂数据怎么校准都偏。排查手段是先用万用表量各引线的环路电阻如果两线阻值差超过0.1Ω在PT100测温上对应的就是0.26℃误差这时候要么上四线制探头要么在软件里做线阻修正。6.5 板载电源纹波在低速ADC上的表现非常隐蔽有用示波器抓UART波形时看不到毛刺但ADC读数确定性跳动的案例。后来排查发现是LDO的输出端电容选小了负载瞬态导致电源在几十kHz频率上有振铃频率虽然远超ADC带宽但还是能通过参考输入引脚耦合。解决方法是AVDD引脚上加大容量钽电容并联小容量陶瓷电容并且用示波器探针直接夹在AVDD引脚上看纹波这个位置的波形才代表ADC的真实电源环境。6.6 冷端补偿的“隐藏温度源”效应做热电偶采集时如果PGA增益设成128芯片周围只要有一个发热元件产生1℃的局部温度梯度冷端补偿的温度误差就直接变成测量误差。测量板的布局必须把热电偶端子放在板边让端子区和主控、电源、驱动芯片之间拉开距离。实在拉不开的时候在端子下方铺一小块独立铜皮和主地平面之间形成一个小热岛可以有效降低主板上热源对冷端的影响。6.7 校准系数丢失后的安全行为最后提一个防呆设计校准系数存Flash时我用一个双字校验值先写备份区再写主区。上电时先读主区若校验失败再读备份区两个都失败就直接进入“出厂默认系数报错状态”。这样现场即使芯片Flash异常模块也不会输出一个偏差极大的温度值而是主动告警。工程上“安全失效”比“硬算一个错误值”重要得多特别是HVAC和工业设备里温度参与保护逻辑时一个离谱的温度值可能导致错误关停或错误启动。我自己做完这套系统后的最大体会是测温系统的精度百分之七十由信号链设计和校准流程决定固件反而是最轻松的部分。ADS122U04IPWR和STM32F745ZG这套组合的优势在于UART总线让硬件连接大幅简化而STM32F745ZG的USART DMA和M7主频又让协议解析的延迟影响几乎可忽略。如果后续要做分布式多点测温还可以利用ADS122U04的地址配置能力做一主多从结构把多个ADC节点串在一条总线上逐一巡检扩展成本非常可控。最后再分享一个小习惯每版硬件回来先不写业务代码只把ADC当普通24位采集器把所有寄存器过一遍确认码值和目标电阻量级对得上再往上搭协议和滤波这样排查问题的时候就能一层一层剥开不会被多数据源混在一起搞到头大。