
1. 工业与HVAC温度测量方案的整体设计思路1.1 为什么这个组合值得单独拿出来讲工业现场和HVAC暖通空调系统里的温度测量跟实验室里拿个万用表测室温完全是两码事。前者面对的是长线缆、强电磁干扰、宽温区、多通道轮询、还要长期稳定不漂移。我做过好几个HVAC控制板和工业变送器的项目踩过的坑基本都集中在信号链前端——传感器选型、激励方式、ADC配置、滤波策略这几块。ADS122U04IPWR加STM32L021K4这个组合是我在低功耗、小体积、中等精度场景下反复验证过的一套方案成本可控开发周期短特别适合做风管温度、水温、冷媒温度这类测量点。先说清楚这两个器件各自扮演什么角色。ADS122U04IPWR是TI的一款24位ΔΣ模数转换器内置PGA、双匹配电流源、振荡器和参考电压四通道差分输入带UART接口。注意它名字里的U就是UART的意思不是SPI。STM32L021K4是ST的Cortex-M0低功耗MCU16KB Flash、2KB RAM资源不大但跑一个温度采集加简单控制逻辑绰绰有余。两者通过UART通信MCU负责配置ADC、读取转换结果、做线性化和温度换算、再通过其他接口上报或驱动执行器。这套方案解决的核心问题是在保证0.1℃级别分辨率的前提下把模拟前端做小、做稳、做便宜。RTD铂电阻测量最怕的是激励电流漂移和引线电阻误差ADS122U04IPWR的双电流源和差分输入正好针对这两个痛点。而STM32L021K4的低功耗特性让整个测量节点可以做成电池供电或者两线制回路供电这在工业变送器和无线温度节点里非常实用。适合谁来参考如果你正在做HVAC控制器、工业温度变送器、冷链监测节点或者单纯想学RTD高精度测量怎么做这篇内容都能直接拿去用。我会把原理、配置、计算、踩坑经验全部摊开讲不藏私。1.2 方案选型的几个关键取舍选ADS122U04IPWR而不是ADS1220SPI版或者ADS1248主要考虑三点。第一UART接口在长线传输和隔离设计上比SPI省心SPI要额外处理片选和时钟线的隔离UART两根线搞定光耦或数字隔离器成本更低。第二ADS122U04IPWR内置的电流源匹配度做到0.1%以内这对三线制RTD的引线补偿至关重要外部分立电流源很难做到这个匹配度。第三它自带2.048V参考电压温漂典型值5ppm/℃省掉一个外部基准芯片。选STM32L021K4而不是更常见的STM32F103是因为这个场景不需要那么强的算力但需要低功耗和低成本。L0系列在Stop模式下功耗不到1μARTC走时加定时唤醒采集平均电流可以压到几十μA。2KB RAM看着少但温度采集只需要几个缓冲区完全够用。16KB Flash跑配置加线性化查表也绰绰有余。如果你后续要加LCD显示或者无线模块那就得换L051或L071但纯温度节点L021K4是最经济的选择。传感器侧我默认用PT100或PT1000铂电阻。PT100在0℃时100Ω灵敏度约0.385Ω/℃PT1000是1000Ω灵敏度3.85Ω/℃。HVAC里PT1000更常见因为引线电阻影响相对小激励电流也可以小一点降低自热。工业场景PT100更多精度要求高的时候用。下面我会以PT1000三线制为主讲PT100的差异点单独说明。2. 核心细节解析与实操要点2.1 RTD测量原理与ADS122U04IPWR内部资源怎么用RTD测温的本质是测电阻。铂电阻的阻值随温度变化我们给它一个已知的激励电流测它两端的电压欧姆定律反推电阻再查表或公式换算温度。听起来简单但误差来源一大堆激励电流的绝对精度和温漂、引线电阻、自热效应、ADC的增益误差和失调、参考电压漂移、噪声。ADS122U04IPWR的内部资源正好逐个对付这些问题。它有两个匹配的电流源IDAC1和IDAC2可以分别输出10μA、50μA、100μA、250μA、500μA、1000μA、1500μA。三线制RTD接法是这样的IDAC1从RTD的一端注入IDAC2从RTD的另一端注入两条引线的电阻各流过一路电流第三根引线sense线接ADC的负输入端。因为两路电流源匹配度高两条引线上的压降基本相等在差分测量时相互抵消引线电阻误差就被消掉了。这是三线制补偿的核心原理比软件补偿靠谱得多。PGA的作用是把RTD上的小电压放大到ADC的最佳输入范围。PT1000在0℃时1000Ω用500μA激励压降是500mV。如果测-50到150℃电阻范围约800Ω到1573Ω压降范围400mV到786mV。ADS122U04IPWR的PGA可以设1、2、4、8、16、32、64、128倍。用内部2.048V参考单端输入范围是±2.048V/PGA。差分输入时满量程是±2.048V/PGA。500mV信号用PGA4满量程±512mV信号占满量程约97%利用率很高。但要注意PGA有输入共模电压限制具体看数据手册的绝对最大额定值和共模范围表。参考电压的选择也关键。ADS122U04IPWR可以用内部2.048V、外部参考、或者模拟电源作为参考。内部参考温漂5ppm/℃典型值在-40到125℃范围内变化约0.04%对应PT1000约0.1℃误差。如果要求更高可以外接REF5025这类低漂移基准但成本上去了。HVAC场景内部参考够用。2.2 三线制与两线制、四线制的选择逻辑两线制最简单但引线电阻直接叠加在RTD电阻上。假设引线电阻0.5ΩPT1000对应约0.13℃误差PT100对应约1.3℃误差。短距离、PT1000、精度要求不高可以用。四线制最准两根激励线两根sense线完全消除引线影响但接线多工业现场布线成本高。三线制是折中用两路匹配电流源补偿精度接近四线制接线只多一根。我实测下来三线制在引线电阻0到5Ω范围内补偿后残余误差小于0.02Ω对应PT1000约0.005℃完全可以忽略。前提是两路IDAC的匹配度要好ADS122U04IPWR的匹配度规格是0.1%500μA下差0.5μA在5Ω引线上产生2.5μV误差相对500mV信号是5ppm对应0.0013℃非常小。接线时有个细节IDAC1和IDAC2的电流必须都流过各自的引线电阻然后汇合到RTD。具体接法是IDAC1接RTD的A端引线IDAC2接RTD的B端引线ADC的正输入接A端引线的RTD侧负输入接B端引线的RTD侧第三根线从RTD的B端直接接到ADC的负输入或者参考电阻。不同接法补偿效果有差异建议参考TI的RTD测量应用笔记里面画得很清楚。2.3 激励电流的选择与自热效应权衡激励电流越大信号越大信噪比越好但自热也越严重。RTD自热功率PI²R。PT1000在500μA下1000Ω时功耗0.25mW。铂电阻的热阻取决于封装空气中裸电阻可能几百℃/W封装好的探头可能几十℃/W。0.25mW在50℃/W热阻下产生0.0125℃温升可以接受。如果用1mA功耗1mW温升0.05℃开始有影响。如果用PT1001mA下功耗0.1mW温升更小所以PT100可以用更大电流。我的经验是PT1000用250μA到500μAPT100用500μA到1mA。HVAC风管温度响应慢自热影响小可以用大一点电流换信噪比。工业精密测量用250μA配合PGA8或16噪声和自热平衡最好。还有一个坑激励电流的建立时间。ADS122U04IPWR的IDAC开启后需要稳定时间数据手册给的是典型值但实际跟外部电容和布线有关。我一般配置成连续转换模式IDAC常开避免每次测量重新建立。如果做低功耗间歇测量每次开启IDAC后要延时至少1ms再启动转换否则第一笔数据会偏低。3. 实操过程与核心环节实现3.1 硬件连接与关键元件参数计算先列一个最小系统的物料清单和连接关系。ADS122U04IPWR的引脚AVDD和DVDD都接3.3V注意AVDD要加0.1μF和1μF去耦DVDD同样。REFP和REFN之间接0.1μF如果用内部参考就悬空或接电容。AIN0到AIN3是模拟输入IDAC1和IDAC2是电流源输出。UART的TXD和RXD接MCU注意ADS122U04IPWR的UART是TTL电平直接接STM32的UART引脚但要注意方向ADS122U04IPWR的TXD是输出接MCU的RXRXD是输入接MCU的TX。CS引脚在UART模式下要接高或按数据手册处理具体看模式配置。RTD接线PT1000三线制红线A端接IDAC1和AIN0白线B端接IDAC2和AIN1第三根线通常也是白或黑从RTD的B端接AIN2或直接接REFN。具体接法取决于你用哪个通道做测量。我一般用AIN0和AIN1做差分输入AIN2接第三线做引线补偿监测。配置寄存器里要设置IDAC1和IDAC2的路由让它们分别从AIN0和AIN1输出。参考电阻如果用比例法测量可以在IDAC回路里串一个精密参考电阻用它的压降做参考。这样激励电流的漂移被抵消。比如串一个1.65kΩ 0.1%的电阻500μA下压降825mV作为外部参考。但ADS122U04IPWR的内部参考已经够好我一般直接用内部2.048V省一个高精度电阻。滤波RTD输入端加RC低通截止频率按需要设。HVAC温度变化慢截止频率1Hz到10Hz足够。R用1kΩC用10μF截止频率约1.6Hz。注意RC会引入建立时间连续转换模式下没问题。共模和差模电容都要加差模0.1μF共模两个0.01μF到地。电源3.3V单电源。如果现场有24V回路需要LDO降到3.3V。STM32L021K4和ADS122U04IPWR的总电流在连续转换下约1mALDO选低静态电流的比如TPS7A02静态电流1μA。3.2 STM32L021K4的UART配置与ADS122U04IPWR寄存器操作ADS122U04IPWR的UART接口比较特殊它不是标准异步串口而是命令-响应式的。MCU发命令字节ADC回数据。命令包括RESET、START/SYNC、POWERDOWN、RDATA、RREG、WREG等。每个命令有固定格式比如读寄存器是0x20|(addr2)后面跟一个字节的寄存器值。写寄存器是0x40|(addr2)后面跟要写的值。STM32L021K4的UART配置波特率默认是ADS122U04IPWR上电后的默认值具体看数据手册通常是115200或9600。我一般用1152008位数据1位停止无校验。注意ADS122U04IPWR的UART是半双工还是全双工它是全双工TXD和RXD独立。但命令响应模式下MCU发完命令要等ADC回复不能连续发。初始化流程上电后先发RESET命令0x06延时至少1ms等内部复位完成。然后写配置寄存器。ADS122U04IPWR有4个配置寄存器寄存器0控制多路复用器、增益、数据速率寄存器1控制数据速率、模式、转换模式、温度传感器、 burnout电流源、参考选择寄存器2控制IDAC电流大小、IDAC路由、DRDY模式寄存器3控制IDAC路由细节、CRC、状态位等。具体配置示例我要用AIN0和AIN1差分PGA4数据速率20SPS连续转换内部参考IDAC1和IDAC2都开500μAIDAC1从AIN0出IDAC2从AIN1出。寄存器0的值MUX[3:0]0000AIN0正AIN1负GAIN[2:0]010PGA4PGA_BYPASS0保留位。寄存器1DR[2:0]00020SPSMODE[1:0]00正常模式CM0连续转换TS0关温度传感器BCS0关burnoutVREF[1:0]00内部参考。寄存器2IDAC[2:0]100500μAIDAC_ROUTE[1:0]看具体路由DRDYM0。寄存器3I1MUX[2:0]和I2MUX[2:0]设置IDAC从哪个引脚出。写寄存器的代码用HAL库大概这样uint8_t cmd[2]; cmd[0] 0x40 | (0 2); // 写寄存器0 cmd[1] 0x00; // 配置值 HAL_UART_Transmit(huart1, cmd, 2, 100); HAL_Delay(1);读数据发RDATA命令0x10然后读3个字节第一个是状态或MSB后两个是数据。24位数据是二进制补码需要拼装并做符号扩展。uint8_t rdata_cmd 0x10; uint8_t rx[3]; HAL_UART_Transmit(huart1, rdata_cmd, 1, 100); HAL_UART_Receive(huart1, rx, 3, 100); int32_t adc_code ((int32_t)rx[0] 16) | ((int32_t)rx[1] 8) | rx[2]; if (adc_code 0x800000) adc_code | 0xFF000000; // 符号扩展3.3 温度换算的数学过程与代码实现ADC码值到电压V (adc_code / 2^23) * Vref / PGA。注意ADS122U04IPWR是24位满量程是2^23-1还是2^23差分输入时正满量程对应0x7FFFFF负满量程对应0x800000。所以V adc_code * Vref / (PGA * 2^23)。电压到电阻RTD电阻Rrtd V / Iidac。但三线制有引线补偿实际Rrtd (Vain0 - Vain1) / Iidac其中Vain0和Vain1是ADC测到的两个节点电压。更准确地说ADC测的是AIN0和AIN1之间的差分电压这个电压等于Iidac * Rrtd因为两路电流在引线上的压降抵消了。所以Rrtd Vdiff / Iidac。电阻到温度PT1000用Callendar-Van Dusen方程。0℃以上R(t) R0 * (1 At Bt²)。0℃以下加C项R(t) R0 * (1 At Bt² C*(t-100)*t³)。PT1000的系数A3.9083e-3B-5.775e-7C-4.183e-12。R01000Ω。反解温度用迭代或查表。我一般用查表加线性插值1℃间隔的表插值后精度0.01℃。表存在Flash里16KB够存。代码实现float adc_to_resistance(int32_t adc_code, float vref, float pga, float idac) { float voltage (float)adc_code * vref / (pga * 8388608.0f); return voltage / idac; } float resistance_to_temp_pt1000(float r) { // 简化版0-150℃范围用二次方程反解 float t (r / 1000.0f - 1.0f) / 3.9083e-3f; // 迭代修正 for (int i 0; i 3; i) { float r_calc 1000.0f * (1.0f 3.9083e-3f * t - 5.775e-7f * t * t); t (r - r_calc) / (1000.0f * (3.9083e-3f - 2.0f * 5.775e-7f * t)); } return t; }实测这个迭代三次后误差小于0.001℃。如果嫌麻烦直接用查表256个点的表覆盖-50到150℃每点间隔0.78℃线性插值误差小于0.01℃。3.4 低功耗间歇测量模式的实现HVAC温度节点很多是电池供电或者两线制回路供电功耗要抠。STM32L021K4的Stop模式电流0.4μA典型RTC走时1μA左右。ADS122U04IPWR在单次转换模式下转换完自动进低功耗电流约1μA。整个节点平均电流可以做到10μA以下用一节锂亚电池跑几年。实现逻辑RTC定时唤醒比如每10秒测一次。唤醒后先给ADS122U04IPWR上电或发START命令延时1ms等IDAC稳定然后启动单次转换等DRDY引脚变低或轮询状态读数据算温度存起来或通过无线发出去然后发POWERDOWN命令MCU进Stop模式。注意ADS122U04IPWR的IDAC在单次转换模式下每次转换前要重新开启建立时间要留够。我实测500μA下建立时间约200μs但保守起见延时1ms。另外如果两次测量间隔很长RTD和ADC的温度可能变化内部参考的温漂会引入误差。如果精度要求高可以定期测内部温度传感器做补偿但L021K4没有内部温度传感器ADS122U04IPWR有可以读。DRDY引脚的使用配置成DRDY模式转换完成引脚拉低。MCU可以用外部中断唤醒比轮询省电。但L021K4的外部中断引脚有限我一般用轮询加超时简单可靠。4. 常见问题与排查技巧实录4.1 读数跳动大、噪声高的排查思路这是最常见的抱怨。先分清楚是50Hz工频干扰还是白噪声。如果是50Hz及其谐波看数据速率设置。ADS122U04IPWR的20SPS模式有内置的50Hz和60Hz陷波同时抑制。如果设成90SPS或更高陷波就没了工频干扰直接进来。HVAC现场工频干扰很强我强烈建议用20SPS虽然慢但稳。如果是白噪声检查PGA设置和激励电流。PGA越大噪声越小但信号不能超量程。500mV信号用PGA4满量程512mV刚好。如果PGA1满量程2.048V信号只占24%有效位数浪费了。另外激励电流越大信号越大信噪比越好。但自热限制。折中下来PT1000用500μA加PGA4噪声等效温度约0.005℃ RMS够用了。还有布线问题。RTD引线要绞合远离电源线和继电器。模拟地和数字地单点连接。ADS122U04IPWR的AGND和DGND在芯片下方连一起再接到系统地。去耦电容要靠近引脚0.1μF和1μF并联。4.2 温度读数偏差大、线性度差的可能原因如果读数整体偏高或偏低先查参考电压。内部参考是2.048V但实际值有初始误差典型±0.1%。如果没校准0.1%对应PT1000约0.25℃误差。可以用精密万用表测REFP引脚电压把实际值代入计算。或者用外部基准。如果线性度差查RTD的接线。三线制接错成两线制引线电阻没补偿低温段和高温段误差不一样。用万用表测三根线的电阻应该两两之间差不多如果差很多说明有一根线接触不良。还有自热效应。如果温度读数比实际高而且电流越大偏高越多就是自热。换小电流或换封装热阻小的RTD。4.3 UART通信失败与寄存器读写异常ADS122U04IPWR的UART不是标准串口时序要求严格。如果MCU发完命令立刻读可能读到旧数据。正确做法是发完命令等至少50μs再读或者用DRDY引脚判断。我一般发完RDATA命令后延时100μs再读3个字节。如果完全没响应查CS引脚。UART模式下CS要接高或按数据手册处理有些批次默认SPI模式需要上电时特定引脚拉高才能进UART模式。具体看数据手册的Mode Selection章节。寄存器写不进去查写保护。有些寄存器有锁定位要先解锁。另外写寄存器后要延时再读回验证我一般写完后读一遍确认。4.4 常见问题速查表现象可能原因排查方法解决措施读数跳动大工频干扰看数据速率是否20SPS设为20SPS加RC滤波读数跳动大PGA太小检查PGA设置增大PGA到信号占满量程80%以上读数整体偏高自热减小激励电流看是否改善换小电流或低热阻封装读数整体偏低参考电压偏低测REFP实际电压校准或换外部基准线性度差接线错误测三线电阻改三线制正确接法UART无响应模式不对查CS引脚电平按数据手册设UART模式寄存器写不进写保护读回验证先解锁再写低温段误差大没加C项检查换算公式0℃以下加C项或查表4.5 几个我踩过的坑和独家技巧第一个坑ADS122U04IPWR的IDAC路由寄存器配置错了电流从错误的引脚输出导致测量值完全不对。一定要对照数据手册的IDAC路由表确认I1MUX和I2MUX的值。我一般用AIN0和AIN1做IDAC输出对应I1MUX000I2MUX001。第二个坑STM32L021K4的UART引脚和SWD引脚复用。PA14是SWCLKPA13是SWDIO如果UART也用这两个引脚调试时冲突。我一般用PA9和PA10做UART避开SWD。第三个坑电源上电顺序。ADS122U04IPWR的AVDD和DVDD要同时上电或AVDD先上否则可能闩锁。加一个电源监控芯片或者用LDO的PG引脚控制。独家技巧用ADS122U04IPWR的内部温度传感器做冷端补偿或者环境温度监测。它测的是芯片结温跟环境温度差几度但做趋势监测够用。读内部温度传感器时配置寄存器1的TS位设为1MUX设为111然后读数据换算公式在数据手册里。另一个技巧如果现场有多个RTD可以用ADS122U04IPWR的四个通道轮流测配合外部多路复用器可以扩到更多。但注意多路复用器的导通电阻会影响精度要选低导通电阻的或者用四线制接法消除。最后校准。批量生产时每块板子至少做一次零点校准和满量程校准。零点用100Ω或1000Ω精密电阻代替RTD满量程用对应高温的精密电阻。校准系数存Flash测量时应用。这样可以把初始误差从0.5℃降到0.05℃以内。我在实际项目里发现HVAC风管温度测量最容易被忽视的是热传导误差。RTD探头如果没插到风管中心或者探头和管壁之间有热桥测到的温度会偏向管壁温度。安装时用导热硅脂加保温套探头插入深度至少是管径的1/3。这个不是电路能解决的但比电路问题更常见。