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主频32MHz,32KB Flash,8KB 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的比率式测量非常关键。比率式测量简单说就是让同一个电流源同时流过参考电阻和PT100,ADC测量的是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或者STM32G0?F0系列便宜是便宜,但低功耗特性不如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.825V,PT100上的压降在0°C时是50mV,200°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上的压降可能超过这个限制。比如RREF=1.65kΩ,IDAC=1mA,RREF上就是1.65V,加上PT100的0.1V左右,总共1.75V,而AVDD=3.3V时compliance上限约2.4V,是安全的。但如果RREF=4.7kΩ,IDAC=1mA,RREF上就是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或者0xAA,ADS122U04检测到之后就会锁定当前波特率。
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位寄存器,但每个位都有讲究。
配置寄存器0(CONFIG0)控制多路复用器、增益和PGA旁路。测量PT100时,MUX[3:0]设为0000,即AIN0和AIN1作为差分输入。GAIN[2:0]根据信号幅度选,我一般用100(增益8)或者101(增益16)。PGA_BYPASS位设为0,启用PGA。
配置寄存器1(CONFIG1)控制数据速率、工作模式和转换模式。数据速率我一般选20SPS或者45SPS,对应DR[2:0]=000或001。工业温度测量不需要高速,20SPS下50/60Hz抑制最好。CM位设为0,即单次转换模式,配合duty-cycle模式降低功耗。TS位可以设为1启用内部温度传感器,用于冷端补偿或者板级温度监测。
配置寄存器2(CONFIG2)控制参考源选择、IDAC电流大小和IDAC路由。VREF[1:0]设为00,即使用外部参考REF0P/REF0N。IDAC[2:0]设为100(500μA)或101(1mA)。IDAC1_ROUTE和IDAC2_ROUTE分别配置两个电流源的输出引脚。
配置寄存器3(CONFIG3)控制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配置为115200bps,8位数据,无校验,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。比如Code=4194304(满量程一半),RREF=1650Ω,Gain=8,那么Rpt = 1650 * 0.5 / 8 = 103.125Ω。
从阻值到温度的换算,工业上一般用Callendar-Van Dusen方程。对于0°C以上的温度,公式是:R(t) = R0 * (1 + At + Bt²),其中R0=100Ω,A=3.9083e-3,B=-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,在Gain=8时等效到输入端是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μH,C用10μF+0.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换成ADS1220,SPI接口,价格便宜一些,但需要改PCB和固件。STM32L031C6换成STM32F030F4,价格更低,但功耗会高一些,适合对功耗不敏感的场景。RREF从箔电阻换成精密厚膜电阻,成本降很多,但温漂会大一些,需要做温度补偿。
PT100换成PT1000,灵敏度高10倍,对ADC的噪声要求低一些,但激励电流要相应减小,否则自热效应会明显。PT1000在1mA激励下的自热约0.1°C,在0.5mA下约0.025°C,工业上一般用0.5mA以下。
我个人在实际操作中的体会是,这套ADS122U04加STM32L031C6的方案,在精度、功耗、成本之间找到了一个很好的平衡点。硬件设计不复杂,固件开发量也不大,关键是理解了比率式测量和ΔΣ ADC的工作原理之后,很多问题都能迎刃而解。如果你正在做类似的项目,建议先从评估板开始,把寄存器配置和通信调通,再画自己的板子,这样能少走很多弯路。