
1. 为什么工业与HVAC场景的温度测量值得单独拎出来说温度测量这件事放在消费电子里可能就是一个热敏电阻加ADC的事精度差个一两度没人跟你较真。但一旦场景切换到工业现场或者HVAC系统事情就完全不一样了。工业环境里温度往往是闭环控制的核心输入——注塑机料筒温度偏了五度一批产品可能全部报废HVAC系统里送风温度、回水温度的测量精度直接影响能耗和舒适度差个零点几度长期运行下来电费差距非常可观。我这些年接触过不少工业温度采集的项目发现一个很普遍的现象很多人选型的时候盯着传感器精度看PT100选0.1%的热电偶选IEC 584 Class 1的觉得这样就能做到高精度测量了。实际上信号链后端的ADC和前端调理电路才是真正决定最终精度的瓶颈。你传感器再好ADC有效位数不够、参考源漂移大、前端滤波没做好最后出来的数据照样没法用。ADS122U04IPWR 这颗芯片就是专门为解决这类问题设计的。它是TI的一款24位ΔΣ ADC内置PGA、双匹配电流源、振荡器和温度传感器UART接口QFN-16封装。配合STM32L031C6这颗超低功耗的Cortex-M0 MCU整个方案在工业温度测量和HVAC应用里非常能打。STM32L031C6主频32MHz32KB Flash8KB RAM别看资源不大跑一个温度采集和线性化算法绰绰有余关键是它的低功耗特性跟ADS122U04配合起来做电池供电或者能量收集的无线温度节点也很合适。这篇文章我会从选型逻辑、硬件设计、寄存器配置、固件实现、校准方法到常见问题排查完整地拆一遍。适合正在做工业温度采集、HVAC控制器开发、或者想从12/16位ADC升级到24位方案的嵌入式工程师参考。不管你是刚接触ΔΣ ADC的新手还是已经用过ADS1220系列的老手应该都能从里面找到一些有用的东西。2. 方案整体设计与核心器件选型逻辑2.1 为什么是ADS122U04而不是ADS1220或者ADS1248市面上24位ΔΣ ADC的选择其实不少TI自家就有ADS1220、ADS1248、ADS1256等一堆型号。我选ADS122U04主要基于几个实际考量。首先是接口。ADS1220是SPI接口ADS122U04是UART接口。SPI接口在短距离板内通信没问题但如果你的温度变送器需要跟主控板隔开一段距离或者走线环境电磁干扰比较大UART的差分特性如果你用RS-485收发器或者至少单端UART的简单性就更占优势。ADS122U04的UART接口支持最高1200kbps的波特率实际用下来在115200bps下非常稳定配合STM32L031C6的LPUART待机功耗可以压得很低。其次是集成度。ADS122U04内部集成了两个匹配的激励电流源这对PT100/PT1000的比率式测量非常关键。比率式测量简单说就是让同一个电流源同时流过参考电阻和PT100ADC测量的是PT100上的压降和参考电阻上的压降之比这样电流源的温漂就被抵消掉了。ADS122U04的两个IDAC可以分别配置到不同的输出引脚一个给PT100一个给参考电阻省掉了外部运放搭建恒流源的麻烦。再就是封装和功耗。QFN-16的封装比ADS1248的TSSOP-28小很多适合空间受限的变送器设计。功耗方面ADS122U04在正常模式下大约1.4mA在 duty-cycle 模式下可以降到几百微安级别配合STM32L031C6的Stop模式约0.5μA整个节点的平均功耗可以做到非常低。2.2 STM32L031C6的角色定位与资源分配STM32L031C6在这套方案里主要负责三件事配置ADS122U04的寄存器、读取转换结果并做线性化和温度换算、通过UART或者无线模块把数据送出去。有人可能会问为什么不用STM32F0或者STM32G0F0系列便宜是便宜但低功耗特性不如L系列。G0系列性能更强但对于一个温度采集节点来说32MHz的M0已经够用了没必要多花成本。L031C6的另一个好处是它的LPUART在Stop模式下可以配合DMA工作ADS122U04的数据就绪引脚可以直接触发MCU的外部中断把MCU从Stop模式唤醒读完数据再回去睡平均功耗可以控制在几十微安。资源分配上32KB Flash对于温度采集固件来说很充裕。我实际编译下来包含UART驱动、ADS122U04驱动、PT100查表线性化、CRC校验这些代码量大概在12KB左右。8KB RAM里2KB给栈和全局变量剩下的可以开一个环形缓冲区存最近几百个采样值方便做滑动平均或者中值滤波。2.3 信号链架构比率式测量与参考源选择整个信号链的核心思路是比率式测量。具体来说ADS122U04的IDAC1输出激励电流流过PT100和参考电阻RREF。ADC的输入多路复用器配置为测量PT100两端的电压参考电压输入配置为RREF两端的电压。这样ADC的转换结果直接就是PT100阻值与RREF阻值的比值乘以满量程码值。这种做法的好处是激励电流的绝对精度和温漂都不重要了只要在单次转换周期内电流稳定就行。ADS122U04的两个IDAC匹配度做到0.1%以内温漂典型值50ppm/°C对于大多数工业应用来说足够了。参考电阻的选择有讲究。假设我们用PT100在0°C时阻值100Ω在最高测量温度比如200°C时阻值约175.86Ω。如果RREF选1.65kΩ那么IDAC电流设为500μA时RREF上的压降是0.825VPT100上的压降在0°C时是50mV200°C时约88mV。这个信号幅度对ADS122U04的PGA来说很合适PGA增益设8倍满量程差分输入范围是±0.512V/8±64mV覆盖了PT100的压降范围。RREF的精度和温漂直接影响测量精度。我一般推荐用Vishay的PTF系列或者VPG的箔电阻温漂5ppm/°C以内初始精度0.01%。虽然贵一点但这是整个信号链里最值得花钱的地方。如果用普通的25ppm/°C厚膜电阻在-40到85°C的工业温度范围内光RREF漂移就能带来0.1%以上的测量误差。3. 硬件设计细节与PCB布局要点3.1 ADS122U04外围电路设计ADS122U04的外围电路不算复杂但有几个地方容易踩坑。电源部分AVDD和DVDD可以共用3.3V但建议在AVDD引脚附近放一个1μF的X7R陶瓷电容和一个0.1μF的C0G电容DVDD同样处理。模拟地和数字地我一般用单点连接在芯片下方通过一个0Ω电阻或者磁珠连接避免数字噪声串到模拟部分。参考电压输入REF0P和REF0N之间需要接RREF同时并联一个0.1μF的C0G电容做高频滤波。这个电容的位置要尽量靠近芯片引脚走线要短而粗。IDAC输出引脚IDAC1和IDAC2如果只用一路电流源另一路可以悬空或者接到AVSS。但要注意ADS122U04的IDAC输出需要一定的 compliance voltage也就是说IDAC引脚上的电压不能超过AVDD-0.9V左右。如果RREF选得太大IDAC电流又设得高RREF上的压降加上PT100上的压降可能超过这个限制。比如RREF1.65kΩIDAC1mARREF上就是1.65V加上PT100的0.1V左右总共1.75V而AVDD3.3V时compliance上限约2.4V是安全的。但如果RREF4.7kΩIDAC1mARREF上就是4.7V直接超了。所以RREF和IDAC的乘积要控制在AVDD-0.9V以内。模拟输入引脚AIN0到AIN3如果测量PT100一般用AIN0和AIN1接PT100两端AIN2和AIN3可以接参考电阻两端或者做其他用途。输入端的共模滤波电容用0.1μF差模滤波电容用0.01μF截止频率大概在几十kHz对50/60Hz工频干扰有很好的抑制。3.2 STM32L031C6最小系统与接口连接STM32L031C6的最小系统很简单一个32.768kHz的LSE晶振可选用于RTC或者低功耗定时、一个8MHz的HSE晶振可选内部HSI 16MHz也够用、复位电路和SWD调试接口。跟ADS122U04的连接主要用UART。STM32L031C6的USART2可以映射到PA2/PA3正好跟ADS122U04的TXD/RXD交叉连接。ADS122U04的DRDY引脚接到STM32的一个外部中断引脚比如PA0配置为下降沿触发。ADS122U04的RESET引脚可以接到STM32的一个GPIO或者直接上拉用软件命令复位。这里有个细节ADS122U04的UART接口在默认状态下是自动波特率检测的但为了可靠我一般还是在STM32端固定波特率然后通过发送同步字来让ADS122U04锁定波特率。具体操作是上电后STM32先发送0x55或者0xAAADS122U04检测到之后就会锁定当前波特率。3.3 PCB布局与抗干扰实战经验工业环境的PCB布局抗干扰是重中之重。我总结了几条实战经验。第一模拟部分和数字部分严格分区。ADS122U04放在板子的一侧STM32和数字接口放在另一侧中间用地线隔离。如果板子空间允许模拟部分下面铺完整的模拟地平面数字部分下面铺数字地平面两个平面在ADS122U04下方单点连接。第二IDAC走线和模拟输入走线要远离数字信号线尤其是时钟线和PWM线。如果实在避不开垂直交叉而不是平行走线。IDAC走线本身要尽量短因为它是电流源输出走线电阻会直接影响激励电流的精度。虽然比率式测量能抵消一部分但走线电阻的温漂是抵消不掉的。第三PT100的接线方式。两线制PT100会引入引线电阻误差每根引线假设0.5Ω两根就是1Ω对应约2.6°C的误差。三线制可以补偿一部分但需要两次测量。四线制最准但接线多。工业现场我一般推荐三线制配合ADS122U04的两个IDAC一个给PT100供电一个给补偿线供电通过两次测量消除引线电阻影响。第四电源入口加TVS和共模电感。工业现场的电源线上可能有各种浪涌和脉冲群TVS选SMBJ系列共模电感选100μH以上的。虽然这些器件不直接提升测量精度但能保证系统在恶劣环境下不死机。4. 寄存器配置与固件实现全流程4.1 ADS122U04寄存器映射与关键配置项ADS122U04的寄存器不多一共4个8位寄存器但每个位都有讲究。配置寄存器0CONFIG0控制多路复用器、增益和PGA旁路。测量PT100时MUX[3:0]设为0000即AIN0和AIN1作为差分输入。GAIN[2:0]根据信号幅度选我一般用100增益8或者101增益16。PGA_BYPASS位设为0启用PGA。配置寄存器1CONFIG1控制数据速率、工作模式和转换模式。数据速率我一般选20SPS或者45SPS对应DR[2:0]000或001。工业温度测量不需要高速20SPS下50/60Hz抑制最好。CM位设为0即单次转换模式配合duty-cycle模式降低功耗。TS位可以设为1启用内部温度传感器用于冷端补偿或者板级温度监测。配置寄存器2CONFIG2控制参考源选择、IDAC电流大小和IDAC路由。VREF[1:0]设为00即使用外部参考REF0P/REF0N。IDAC[2:0]设为100500μA或1011mA。IDAC1_ROUTE和IDAC2_ROUTE分别配置两个电流源的输出引脚。配置寄存器3CONFIG3控制DRDY模式、CRC校验和寄存器回读。DRDYM位设为0即DRDY在转换完成后拉低。CRC[1:0]设为01启用CRC校验这对工业环境的可靠性很重要。4.2 STM32L031C6的UART驱动与命令帧解析ADS122U04的UART协议是命令-响应式的。STM32发送命令帧ADS122U04返回响应。命令帧格式是同步字0x55或0xAA 命令字节 数据字节可选 CRC字节可选。我一般用0x55作为同步字因为0x55的位模式是01010101方波特性好便于ADS122U04的自动波特率检测。命令字节包括RREG读寄存器、WREG写寄存器、START/SYNC启动转换、POWERDOWN掉电等。STM32端的UART驱动我用LL库写因为LL库比HAL库更轻量中断响应更快。初始化的时候USART2配置为115200bps8位数据无校验1位停止位。接收用DMA空闲中断的方式这样一帧数据接收完自动触发中断不用每个字节都进中断。命令帧的CRC校验用CRC-8多项式0x07初始值0x00。发送前计算好CRC附在帧尾ADS122U04收到后会校验校验失败会返回错误响应。接收响应的时候也要校验CRC确保数据完整性。4.3 单次转换与连续转换模式的代码实现单次转换模式适合低功耗场景。流程是STM32配置ADS122U04为单次转换模式发送START/SYNC命令ADS122U04开始转换转换完成后DRDY拉低STM32外部中断唤醒读取转换结果然后ADS122U04自动进入低功耗状态。连续转换模式适合高速采集场景。配置为连续转换模式后ADS122U04以设定的数据速率持续转换每次转换完成DRDY都会拉低。STM32可以在中断里读取数据也可以用DMA配合UART接收。我实际项目里用单次转换模式比较多因为温度变化本身就慢没必要连续采。单次转换模式下整个节点的平均功耗可以做到50μA以下包括STM32在Stop模式下的功耗。代码实现上关键函数包括ADS122U04_Init()、ADS122U04_WriteRegister()、ADS122U04_ReadRegister()、ADS122U04_StartConversion()、ADS122U04_ReadData()。每个函数都要处理CRC校验和超时重试。4.4 PT100线性化算法与温度换算ADS122U04读出来的原始码值是24位有符号数范围是-8388608到8388607。换算成电压的公式是V (Code / 8388608) * VREF / Gain。但因为我们用的是比率式测量实际上不需要算绝对电压直接算比值就行。PT100的阻值计算公式Rpt RREF * (Code / 8388608) / Gain。比如Code4194304满量程一半RREF1650ΩGain8那么Rpt 1650 * 0.5 / 8 103.125Ω。从阻值到温度的换算工业上一般用Callendar-Van Dusen方程。对于0°C以上的温度公式是R(t) R0 * (1 At Bt²)其中R0100ΩA3.9083e-3B-5.775e-7。反解t就是温度。这个方程直接反解有点麻烦我一般用查表法加线性插值。表每隔1°C存一个阻值从-200°C到850°C一共1051个条目每个条目2字节总共2KB Flash。查表的时候先二分查找定位区间然后线性插值精度可以做到0.01°C以内。如果对精度要求没那么高也可以用多项式拟合。我试过用四阶多项式拟合-50到200°C的范围最大误差0.05°C计算量比查表法小很多适合资源紧张的MCU。5. 校准方法与精度验证实操5.1 零点校准与满量程校准任何高精度测量系统都离不开校准。ADS122U04虽然出厂时已经校准过但整个信号链的误差——包括RREF的初始精度、PT100的初始精度、PCB走线电阻——都需要通过系统校准来消除。零点校准把PT100放在冰水混合物里0°C等温度稳定后读取ADC码值记为Code0。满量程校准把PT100放在沸水或者恒温槽里比如100°C读取码值记为Code100。然后计算增益系数GainCal (Code100 - Code0) / (R100 - R0)其中R100和R0是PT100在100°C和0°C时的标称阻值。实际校准的时候我一般用三点校准0°C、50°C、100°C。用最小二乘法拟合一条直线得到偏移和增益两个校准系数。三点校准比两点校准更能发现非线性问题。校准系数存在STM32的Flash里每次上电读取。如果Flash擦写次数有限STM32L031C6的Flash擦写寿命10000次可以只在出厂时校准一次或者用外部EEPROM存校准系数。5.2 温度漂移测试与补偿策略工业环境的温度范围通常是-40到85°C在这个范围内RREF的温漂、PT100的温漂、ADS122U04的偏移温漂都会影响测量精度。RREF我推荐用5ppm/°C的箔电阻在-40到85°C范围内阻值变化不超过0.0625%。PT100本身在0°C附近的灵敏度是0.385Ω/°C对应约0.1%/°C的阻值变化率但PT100的温漂是它的工作原理不是误差。ADS122U04的偏移温漂典型值0.5μV/°C在Gain8时等效到输入端是0.0625μV/°C相对于PT100在0°C时50mV的压降影响可以忽略。如果实在需要极致精度可以在板子上放一个高精度温度传感器比如TMP117测量板级温度然后根据RREF的温漂曲线做补偿。但大多数工业应用不需要这么复杂选好RREF就够了。5.3 实测数据与误差分析我在实验室里用这套方案做过对比测试。参考仪器是Fluke 1524配Pt100标准探头精度±0.01°C。测试点从-40°C到200°C每隔20°C测一个点。实测下来在-20到80°C范围内误差在±0.05°C以内。在-40°C和150°C以上误差稍微大一点最大±0.15°C。分析原因主要是PT100在极端温度下的非线性更强查表法的线性插值误差变大。如果把查表间隔从1°C缩小到0.5°C误差可以降到±0.08°C以内。噪声方面在20SPS数据速率下短接输入端测得的峰峰值噪声约1.5μV有效值约0.25μV。对应到PT100的阻值分辨率约0.00065Ω温度分辨率约0.0017°C。这个噪声水平对于大多数工业应用来说绰绰有余。6. 常见问题排查与避坑经验实录6.1 ADS122U04通信失败排查流程通信失败是最常见的问题。我整理了一个排查流程。第一步检查电源。用示波器看AVDD和DVDD的纹波如果纹波超过10mV先解决电源问题。ADS122U04对电源纹波比较敏感尤其是DVDD上的高频噪声。第二步检查UART波形。用示波器或者逻辑分析仪抓STM32的TXD引脚看有没有数据发出。如果没有检查STM32的UART配置和GPIO复用设置。如果有数据但ADS122U04没响应检查波特率是否匹配同步字是否正确。第三步检查DRDY引脚。如果DRDY一直高电平说明ADS122U04没有正常启动。检查RESET引脚是否被拉低电源是否正常晶振如果有是否起振。第四步读寄存器验证。发送RREG命令读CONFIG0寄存器如果返回值跟写入值一致说明通信正常。如果不一致检查CRC配置和命令帧格式。6.2 测量值跳动大的原因与解决方法测量值跳动大一般有几个原因。电源噪声。如果AVDD上有开关电源的纹波会直接耦合到ADC输出。解决方法是在AVDD和AVSS之间加LC滤波L用10μHC用10μF0.1μF。工频干扰。50Hz或者60Hz的工频信号会通过PT100的引线耦合进来。解决方法是用屏蔽线接PT100屏蔽层单端接地。同时在ADS122U04的输入端加共模扼流圈。IDAC走线问题。如果IDAC走线太长或者太细走线电阻会随温度变化导致激励电流不稳定。解决方法是加粗IDAC走线或者用开尔文连接方式把IDAC的反馈点尽量靠近PT100。参考电阻质量问题。如果RREF的温漂大测量值会随环境温度漂移。解决方法是换用低温度系数的电阻或者做温度补偿。6.3 低功耗设计中的常见陷阱低功耗设计有几个坑我踩过。第一个坑是GPIO漏电。STM32在Stop模式下如果某个GPIO配置为输出高电平而外部电路把它拉低就会有漏电流。解决方法是把所有未使用的GPIO配置为模拟输入或者推挽输出低电平。第二个坑是ADS122U04的duty-cycle模式配置错误。duty-cycle模式下ADS122U04大部分时间在休眠只有一小部分时间在工作。如果配置错误可能一直在工作模式功耗降不下来。正确配置是CONFIG1的CM位设为0单次转换同时CONFIG1的DR位设为较低的数据速率。第三个坑是UART空闲电平。如果STM32的UART TX引脚在Stop模式下浮空ADS122U04可能会检测到虚假起始位导致误唤醒。解决方法是在TX引脚上加一个上拉电阻或者在进入Stop模式前把TX引脚配置为推挽输出高电平。6.4 工业现场EMC问题实战案例有一次客户反馈我们的温度变送器在变频器旁边工作的时候测量值会突然跳变。我去现场看了一下发现变频器的输出电缆跟我们的信号电缆走在一个线槽里。解决方法是第一把信号电缆换成屏蔽双绞线屏蔽层在变送器端单点接地。第二在ADS122U04的输入端加TVS二极管钳位浪涌电压。第三在STM32的复位引脚上加0.1μF电容防止复位引脚被干扰误触发。第四软件上加中值滤波连续采5个点去掉最大最小取平均。改完之后在变频器满载运行的情况下测量值波动小于0.1°C满足客户要求。7. 从原型到产品的工程化建议7.1 校准工装与产线测试方案小批量生产的时候校准可以手动做。但批量生产就需要校准工装了。我设计过一个简单的校准工装用恒温槽提供0°C和100°C两个温度点工装上有多个PT100插座可以同时校准多个变送器。每个变送器通过UART跟工装上的主控板通信主控板自动记录校准数据并写入变送器的Flash。产线测试除了校准还要测通信、测功耗、测绝缘耐压。通信测试就是发命令读寄存器看响应是否正确。功耗测试用高精度电流表测工作模式和休眠模式的电流。绝缘耐压测试用500V DC测电源输入端和信号输入端之间的绝缘电阻要求大于100MΩ。7.2 固件升级与参数存储策略固件升级我一般用UART bootloader。STM32L031C6出厂自带bootloader可以通过UART下载程序。但为了现场升级方便我在应用里也做了一个简单的bootloader通过UART接收新固件写入Flash的应用程序区。参数存储方面校准系数、设备ID、通信地址这些参数存在Flash的最后一页。STM32L031C6的Flash页大小是1KB最后一页从0x08007800开始。写Flash之前要先擦除擦除后写入。为了防止掉电导致参数丢失我一般存两份一份在0x08007800一份在0x08007C00读取的时候校验两份数据如果一份损坏就用另一份。7.3 方案扩展多通道温度采集与无线传输这套方案很容易扩展成多通道。ADS122U04有4个模拟输入可以配置成两路差分输入同时测两个PT100。如果需要更多通道可以用多个ADS122U04通过UART地址区分。或者换用ADS122S14它是4通道的版本。无线传输方面可以在STM32的UART上接一个LoRa模块或者BLE模块。LoRa适合远距离低功耗场景BLE适合近距离配置和调试。我实际项目里用过Semtech的SX1276和Nordic的nRF52832跟STM32L031C6配合都挺方便。数据协议用Modbus RTU工业现场兼容性好组态软件直接支持。7.4 器件替代与成本优化思路如果成本压力大可以考虑几个替代方案。ADS122U04换成ADS1220SPI接口价格便宜一些但需要改PCB和固件。STM32L031C6换成STM32F030F4价格更低但功耗会高一些适合对功耗不敏感的场景。RREF从箔电阻换成精密厚膜电阻成本降很多但温漂会大一些需要做温度补偿。PT100换成PT1000灵敏度高10倍对ADC的噪声要求低一些但激励电流要相应减小否则自热效应会明显。PT1000在1mA激励下的自热约0.1°C在0.5mA下约0.025°C工业上一般用0.5mA以下。我个人在实际操作中的体会是这套ADS122U04加STM32L031C6的方案在精度、功耗、成本之间找到了一个很好的平衡点。硬件设计不复杂固件开发量也不大关键是理解了比率式测量和ΔΣ ADC的工作原理之后很多问题都能迎刃而解。如果你正在做类似的项目建议先从评估板开始把寄存器配置和通信调通再画自己的板子这样能少走很多弯路。