工业现场的温度测量,最让人头疼的从来不是"能不能测",而是"测出来能不能信"。热电偶输出往往只有几十微伏每摄氏度,铂电阻在0℃时也才100Ω,这些信号扔进一个开关电源、继电器、变频器扎堆的HVAC控制柜里,随便一点共模干扰就能把读数搅得面目全非。我做过好几个冷库、锅炉房和数据中心精密空调的项目,早期用STM32自带的12位ADC直接采,结果温度跳变两三度是家常便饭,后来换成外置24位ΔΣ ADC才彻底解决。这篇就围绕ADS122U04IPWR配STM32F446ZE这套组合,把工业与HVAC温度测量从硬件选型、寄存器配置到软件滤波的完整链路拆开讲清楚,适合正在做温控板、数据采集模块或者HVAC控制器的嵌入式工程师参考,也适合想搞明白高精度ADC到底怎么用的人。
1. 为什么工业温度测量绕不开外置24位ADC
1.1 从信号幅度倒推分辨率需求
先算一笔账,这笔账决定了你选什么ADC。以最常见的K型热电偶为例,它的塞贝克系数大约41μV/℃。如果系统要求分辨0.1℃,那么需要分辨的电压就是4.1μV。再看铂电阻PT100,激励电流1mA时灵敏度约0.385Ω/℃,对应电压0.385mV/℃,要分辨0.01℃就是3.85μV。这两个数字都落在微伏级别。
STM32F446ZE内置的12位ADC,参考电压3.3V时LSB是3.3V/4096≈806μV。就算你加个100倍增益的运放把信号放大到806μV以上,运放自身的失调漂移、噪声、共模抑制比都会成为新的误差源,而且增益电阻的温漂会直接吃掉精度。更现实的问题是,工业现场温度范围可能从-50℃到+400℃,热电偶满量程输出也就十几毫伏,放大器的线性区间和零点漂移很难同时兼顾。
ADS122U04是24位ΔΣ架构,内置PGA增益最高128倍,还带激励电流源。它的有效分辨率在增益128、20SPS数据率下能到20位以上,折算到输入端噪声只有几十纳伏级别。这个量级才真正匹配微伏级信号的需求。所以选它不是"为了高精度而高精度",而是信号链的物理下限逼着你必须用这个级别的器件。
1.2 工业与HVAC场景的干扰特征
HVAC和工业环境的干扰有几个典型特征,理解这些才能理解后面为什么要那样配置。
第一是工频干扰。50Hz及其谐波无处不在,电机、变压器、接触器都是源头。ΔΣ ADC的sinc滤波器在20SPS时对50Hz和60Hz都有很好的抑制,这是它相比逐次逼近型ADC的天然优势。
第二是共模电压。热电偶的测量端可能和加热器、压缩机共地,地电位差能到几伏甚至更高。ADS122U04的共模输入范围是AVDD-0.1V到AVSS+0.1V,配合差分输入结构,只要把共模电压控制在供电轨内就能正常工作。
第三是长线引入的噪声。温度传感器往往离控制板几米甚至几十米,导线就是天线。这时候差分输入、屏蔽双绞线、RC滤波缺一不可。
第四是冷端补偿。热电偶测的是温差,必须知道接线端子的温度才能算出实际温度。ADS122U04有两个可编程激励电流源,可以顺便驱动一个PT100或者NTC做冷端补偿,省掉一颗单独的传感器芯片。
2. ADS122U04IPWR的关键特性与选型逻辑
2.1 内部结构决定了它能省掉哪些外围器件
ADS122U04IPWR是TSSOP-16封装,四通道差分输入,内部结构里有几个东西直接决定了外围电路的简化程度。
它内置了低噪声PGA,增益可选1到128。这意味着小信号可以直接进ADC,不需要外部仪表放大器。我早期方案用INA333加ADS1115,光运放和电阻就占了半张板子,现在一颗芯片搞定。
它有两个匹配的激励电流源,电流值从10μA到1.5mA可编程。这两个电流源可以同时驱动两路RTD,或者一路驱动RTD、一路做偏置。做热电偶冷端补偿时,用一路电流源驱动PT100,另一路空着或者做断线检测。
它内部有基准电压,但精度一般,工业场合建议用外部基准。不过对于HVAC这种±0.5℃精度就够用的场景,内部基准的温漂(典型5ppm/℃)其实也能接受,能省一颗REF5025。
它支持SPI接口,最高时钟可以到很多MHz,STM32F446ZE的SPI外设完全跟得上。注意ADS122U04是"U04"后缀,代表它是SPI版本,不是I2C版本,别买错了。
2.2 数据率与滤波的权衡
ADS122U04的数据率从5SPS到2000SPS可调。这个参数不是越高越好,它直接和噪声、工频抑制挂钩。
在20SPS时,芯片的sinc3滤波器对50Hz和60Hz的抑制都在100dB以上,同时噪声最低。代价是响应慢,一次转换50ms。对于温度这种慢变量,50ms完全不是问题,冷库温度变化的时间常数是分钟级的。
如果你要做多点轮询,比如8路热电偶,每路50ms就是400ms一轮,对于HVAC控制来说也够用。但如果要做快速断线检测或者需要更快的响应,可以切到45SPS或90SPS,这时候工频抑制会变差,需要靠软件滤波补。
我的经验是:温度测量默认用20SPS,除非有特殊响应要求。这个设置下你几乎不用操心工频干扰,省下的软件滤波工作量非常可观。
2.3 与STM32F446ZE的搭配优势
STM32F446ZE是F4系列里外设比较全的型号,180MHz主频,带FPU,做温度补偿算法和滤波绰绰有余。它的SPI接口有硬件NSS,DMA支持完善,配合ADS122U04的DRDY中断引脚,可以做到完全中断驱动,CPU占用极低。
F446ZE的定时器资源也丰富,可以用一个定时器做采样节拍,另一个做看门狗。它的浮点单元在做多项式拟合冷端补偿时很省事,不用像M0那样费劲做定点运算。
另外F446ZE的供电是3.3V,ADS122U04的DVDD也是3.3V,逻辑电平直接匹配,不需要电平转换。AVDD可以单独用5V或者3.3V,如果追求噪声性能,AVDD用干净的5V LDO供电,数字部分用3.3V,模拟数字分开走线。
3. 硬件设计里那些容易翻车的地方
3.1 模拟前端与输入滤波
热电偶输入端的滤波是必须的,但滤波电阻不能随便选。ADS122U04的输入阻抗在PGA增益大于1时会下降,增益128时差分输入阻抗大约几十kΩ。如果你在输入端串两个10kΩ的滤波电阻,就会形成分压,把信号衰减掉,还会引入电阻热噪声。
我的做法是:滤波电阻用100Ω到1kΩ,配合差分电容100nF和共模电容10nF。截止频率算一下,1kΩ加100nF的差分截止频率约1.6kHz,对50Hz几乎无衰减,但能滤掉高频噪声。共模电容要匹配,两个10nF的误差要小,否则共模转差模。
注意:滤波电容一定要用C0G或者薄膜电容,X7R的压电效应和温漂会直接变成测量误差。这个坑我踩过,用X7R时温度读数会随板子应力变化,换了C0G就稳了。
RTD输入端的处理不同。RTD是低阻信号源,滤波电阻可以大一些,但要注意激励电流在滤波电阻上的压降。如果激励电流1mA,滤波电阻1kΩ,那压降就是1V,直接吃掉动态范围。所以RTD的滤波电阻要小,或者用差分滤波结构让电流不流过滤波电阻。
3.2 基准电压与激励电流的布局
外部基准如果用REF5025,它的输出要加10μF钽电容加0.1μF陶瓷电容。基准的走线要远离SPI时钟线和电源开关节点,最好用地线包围。
激励电流源的走线是差分RTD测量的关键。ADS122U04的IDAC输出要走成对,尽量等长,远离数字信号。如果驱动远端RTD,导线电阻会串入测量,所以必须用三线制或四线制接法。三线制要求两根电流线电阻匹配,四线制则完全消除导线影响,但多一根线。
HVAC里通常用两线制PT100,因为布线简单。这时候导线电阻直接变成误差,每米铜线约0.02Ω,10米就是0.2Ω,对应0.5℃误差。如果精度要求高,必须用三线制,或者做导线电阻补偿。
3.3 电源与地平面处理
ADS122U04的AVDD和DVDD要分开供电。AVDD用低噪声LDO,比如TPS7A4700,输出5V或3.3V。DVDD可以用开关电源,但要在芯片附近加磁珠和电容隔离。
地平面处理是重点。模拟地和数字地单点连接,连接点选在ADC的AGND引脚附近。SPI信号线下面不要走模拟信号,如果必须交叉,走成垂直。
DRDY引脚是开漏输出,需要上拉电阻,通常10kΩ到DVDD。这个信号是中断源,走线要短,避免被干扰误触发。
4. 寄存器配置与SPI通信的实操细节
4.1 上电初始化顺序
ADS122U04上电后不能马上配置,要等内部基准稳定。数据手册建议上电后延迟至少50μs再发命令,实际我习惯延迟1ms,稳妥。
初始化顺序我一般这样走:
- 拉高CS,发RESET命令(0x06),等待1ms。
- 发WREG命令配置寄存器0到3。
- 配置寄存器0:MUX选择通道,GAIN设置增益,PGA_BYPASS根据信号幅度决定。
- 配置寄存器1:数据率20SPS,工作模式正常,转换模式连续。
- 配置寄存器2:基准选择,激励电流设置,断线检测使能。
- 配置寄存器3:IDAC电流值,DRDY模式。
- 发START/SYNC命令开始转换。
寄存器配置有个坑:WREG命令的第二个字节是寄存器起始地址和数量,格式是"00 rr nn",rr是起始寄存器,nn是数量减1。我见过有人写成数量本身,结果多写一个寄存器,把后面的配置覆盖了。
4.2 SPI时序与DRDY中断处理
ADS122U04的SPI模式是CPOL=0,CPHA=1,也就是模式1。STM32的SPI配置要对应。时钟频率不要超过芯片上限,虽然手册写可以到很多MHz,但实际布线长的时候降频更稳,我用4MHz。
DRDY是数据就绪信号,低电平有效。在连续转换模式下,每次转换完成DRDY会拉低,读完数据后自动拉高。用STM32的EXTI中断接DRDY,下降沿触发。中断里拉低CS,读3个字节,拉高CS。
读数据时要注意,ADS122U04输出是24位,MSB先出。如果配置成16位模式,会丢掉低8位。我建议始终读24位,然后在软件里做移位和符号扩展。
// DRDY中断服务函数示例 void EXTI15_10_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line10) != RESET) { uint8_t rx[3]; HAL_GPIO_WritePin(ADC_CS_GPIO_Port, ADC_CS_Pin, GPIO_PIN_RESET); HAL_SPI_Receive(&hspi1, rx, 3, 10); HAL_GPIO_WritePin(ADC_CS_GPIO_Port, ADC_CS_Pin, GPIO_PIN_SET); int32_t raw = (rx[0]<<16) | (rx[1]<<8) | rx[2]; if(raw & 0x800000) raw |= 0xFF000000; // 符号扩展 adc_buffer[adc_idx++] = raw; if(adc_idx >= BUF_SIZE) adc_idx = 0; EXTI_ClearITPendingBit(EXTI_Line10); } }4.3 常见通信故障排查
SPI通信不上,先查这几个地方:
CS信号有没有正确拉低。ADS122U04要求CS在整个命令期间保持低电平,如果CS提前拉高,命令会被截断。
时钟极性相位对不对。模式1是CPOL=0、CPHA=1,STM32的SPI_Init里CLKPolarity和CLKPhase要对应。
DRDY有没有反应。如果DRDY一直高,说明转换没启动,检查START命令有没有发,或者寄存器配置是不是把转换模式设成了单次。
读回来的数据全是0xFFFFFF或0x000000,通常是基准没起来或者输入短路。先测基准电压,再测输入差分电压。
5. 温度换算与冷端补偿的完整实现
5.1 热电偶的电压到温度换算
ADS122U04读回来的是ADC码值,要先转成电压。公式是:
V = (code / 2^23) * Vref / Gain
注意24位有符号数的满量程是2^23-1,不是2^24。如果用了内部基准2.048V,增益128,那么LSB就是2.048/(128*2^23)≈1.9nV。这个数字说明为什么它能分辨微伏信号。
转成电压后,热电偶的电压到温度不是线性的,要用多项式或者查表。K型热电偶在0到500℃范围内,用NIST的多项式拟合,误差可以做到0.1℃以内。我一般用分段线性插值加查表,代码简单,精度也够。
冷端补偿是重点。热电偶测的是热端和冷端的温差电压,实际温度 = 热端温度 + 冷端温度。冷端温度用PT100或者NTC测接线端子处的温度。
5.2 PT100冷端补偿的电路与算法
用ADS122U04的IDAC驱动PT100,接法用三线制。IDAC输出1mA,流过PT100产生电压,ADC测这个电压。PT100在0℃是100Ω,1mA就是100mV。ADC的增益设1或者2,基准用2.048V,这样满量程能测到2V左右,对应PT100约5000Ω,远超实际范围,所以增益可以设大一点提高分辨率。
PT100的电阻到温度换算,0到100℃可以用Callendar-Van Dusen公式简化:
R = R0 * (1 + AT + BT^2)
A=3.9083e-3,B=-5.775e-7。反解T可以用迭代或者查表。我一般用查表加线性插值,每10℃一个点,精度0.01℃。
冷端补偿的误差直接影响整体精度。PT100本身的精度、激励电流的精度、ADC的增益误差都会叠加。如果要求高,PT100要用A级,激励电流要校准,ADC增益误差要测出来补偿。
5.3 软件滤波策略
硬件配置好了,软件滤波是最后一道防线。温度信号慢,可以用很强的滤波。
我常用的是滑动平均加中值滤波。滑动平均窗口取16或者32,中值滤波取5点。中值滤波能干掉脉冲干扰,滑动平均平滑随机噪声。
如果要求更高,可以用一阶IIR低通:
y[n] = α*x[n] + (1-α)*y[n-1]
α取0.1到0.3,截止频率很低,对温度信号合适。
提示:滤波会引入滞后,做控制的时候要注意。如果温度用于闭环控制,滤波太强会导致超调。我的经验是滤波窗口不要超过控制周期的1/4。
还有一种情况是断线检测。ADS122U04有激励电流源,可以定期切换电流方向,如果测到的电压不变,说明传感器断线。这个功能在HVAC里很有用,能提前发现故障。
6. 实测数据与精度验证方法
6.1 用标准源做校准
精度验证最靠谱的方法是用标准信号源。热电偶可以用mV信号源模拟,PT100可以用电阻箱模拟。我一般取几个点:-50℃、0℃、25℃、100℃、200℃、400℃,分别记录ADC读数和标准值。
校准分两步:先做零点校准,输入0mV,记录ADC码值;再做增益校准,输入满量程附近的信号,记录码值。然后算斜率和截距,写进代码。
如果不用标准源,可以用冰水混合物做0℃参考,沸水做100℃参考(注意气压修正)。这个方法精度差一些,但现场够用。
6.2 长期稳定性与温漂测试
工业产品要测温漂。把板子放进温箱,从-20℃到70℃循环,记录同一输入下的读数变化。这个变化包括ADC的温漂、基准的温漂、外围电阻的温漂。
ADS122U04的失调漂移典型值是几十nV/℃,增益漂移是几个ppm/℃。外部基准REF5025是3ppm/℃。如果这些加起来超过你的精度预算,就要做温度补偿,用板上的温度传感器测环境温度,查表修正。
我做过一个项目,要求全温区±0.2℃,最后就是靠温箱标定加软件补偿做到的。标定数据存Flash,开机加载。
6.3 现场干扰下的表现
实验室测好了不代表现场能用。现场测试要关注几个点:
读数有没有周期性跳动,如果有,通常是工频干扰,检查滤波和屏蔽。
多点测量时通道间有没有串扰,切换通道后要等建立时间。ADS122U04切换通道后第一个转换数据要丢弃,因为PGA和滤波器需要建立。
长线测试,接100米屏蔽双绞线,看读数稳定性。如果跳动大,检查屏蔽层接地,通常单端接地。
7. 从原理图到量产的关键检查项
7.1 PCB布局的硬性规则
模拟部分和数字部分分区布局,ADS122U04放在模拟区中心。基准芯片紧靠ADC,走线短而粗。
SPI信号线远离模拟输入,如果必须交叉,垂直交叉。DRDY走线包地。
电源去耦电容紧靠引脚,0.1μF和1μF并联。AVDD的LDO输出电容按手册要求选,ESR要匹配。
晶振远离模拟区,STM32的晶振尤其要注意,它的谐波很丰富。
7.2 物料选型与替代
ADS122U04IPWR的"IPWR"后缀是TSSOP-16卷带包装,工业级温度范围-40到125℃。如果买不到,ADS122U04IPW是管装,电气性能一样。
基准芯片REF5025可以用ADR4525替代,性能接近,价格不同。注意封装和引脚要兼容。
PT100选A级,B级精度差一个档次。NTC选B值公差1%以内的。
滤波电容C0G,电阻用薄膜或者金属膜,温漂25ppm/℃以内。
7.3 生产测试与校准流程
量产时要设计测试工装。工装提供标准电阻和mV信号,通过继电器切换。每个板子测几个点,把校准系数写进Flash。
测试项包括:零点、满量程、断线检测、通道切换、通信。校准系数可以用两点法,也可以用多点拟合。
注意:校准系数要带CRC校验,Flash读取时验证,防止数据损坏导致测量错误。这个在工业现场很重要,我见过因为Flash位翻转导致温度读数漂移的案例。
8. 我在实际项目中踩过的坑与经验总结
第一个坑是PGA的建立时间。切换增益或者通道后,PGA需要时间稳定,如果马上读数据,会读到错误的码值。我的做法是切换后丢弃前两个转换结果,从第三个开始用。
第二个坑是IDAC的合规电压。IDAC输出电流时,输出端的电压不能超过AVDD-0.9V左右,否则电流源会失稳。驱动远端RTD时,导线电阻加上RTD压降可能超过这个限制,这时候要降低激励电流或者提高AVDD。
第三个坑是内部基准的温漂。早期为了省成本用内部基准,常温校准后,高温下漂了0.5℃。后来换外部基准,问题解决。如果精度要求不高,内部基准可以用,但要做温度补偿。
第四个坑是SPI的CS时序。STM32的硬件NSS有时候行为不符合预期,我后来都用软件控制CS,GPIO拉低拉高,时序完全可控。
第五个坑是DRDY中断的抖动。如果SPI时钟太快,DRDY可能在数据还没准备好时就触发。解决方法是降低SPI时钟,或者在中断里加小延迟再读。
这套方案我前后用了三年多,从冷库监控到数据中心精密空调,从锅炉温度到HVAC送回风温度,稳定性一直不错。核心经验就一条:模拟电路的钱不能省,该用外部基准就用,该用C0G就用,该做屏蔽就做。省下来的成本,最后都会变成现场调试的时间和客户的投诉。