2026/11/5 6:26:35

工业温度测量:ADS122U04IPWR与STM32F723ZE高精度采集方案

工业温度测量:ADS122U04IPWR与STM32F723ZE高精度采集方案 工业现场的温度测量最让人头疼的从来不是能不能测而是测出来能不能用。热电偶输出几十微伏每摄氏度铂电阻满量程也就几百欧姆的变化这些信号扔进一个开关电源、变频器、继电器扎堆的柜子里随便一点共模干扰就能把有效信号淹掉。我做过好几个HVAC机组的温度采集板早期用STM32自带的12位ADC直接采数据跳得没法看后来换成外置24位ΔΣ ADC才把精度稳住。这篇就围绕ADS122U04IPWR配STM32F723ZE这套组合把工业与HVAC温度测量从选型、硬件设计、寄存器配置到实测校准的完整链路讲透适合正在做温度采集板、冷机控制器、锅炉房监控或者楼宇自控终端的硬件和嵌入式工程师参考。1. 为什么工业温度测量绕不开外置24位ADC1.1 从信号幅度看MCU内置ADC的天花板先算一笔账。K型热电偶在常温附近的塞贝克系数大约是41μV/℃冷端补偿之后如果我们要分辨0.1℃的变化需要能识别大约4μV的电压差。STM32F723ZE内置的12位ADC参考电压按3.3V算一个LSB就是3.3V/4096≈806μV。也就是说内置ADC的一个最小刻度相当于热电偶20℃的变化量。这个分辨率下谈0.1℃精度完全是奢望。再看铂电阻PT100。0℃时100Ω温度系数约0.385Ω/℃。要分辨0.1℃需要识别0.0385Ω的变化。如果用1mA激励电流对应电压变化38.5μV同样远低于内置ADC的LSB。就算用PT1000把信号放大10倍也只是勉强够到内置ADC的噪声底。所以结论很直接工业级温度测量尤其是要覆盖热电偶和铂电阻这两大类传感器外置高分辨率ΔΣ ADC几乎是必选项。ADS122U04IPWR提供24位分辨率、最高2000SPS的采样率内置PGA和激励电流源正好卡在这个需求点上。1.2 ADS122U04IPWR的关键能力拆解这颗芯片我用了大概两年几个特性值得单独拎出来说24位ΔΣ架构有效位数在PGA1、20SPS时能到21位以上换算到PT100上就是亚毫摄氏度级别的分辨能力实际精度受限于传感器和基准而非ADC本身。内置PGA增益1到128热电偶的毫伏级信号可以直接进PGA放大省掉外部仪表放大器减少一级噪声和失调来源。双匹配激励电流源10μA到1.5mA可编程专门为RTD比例测量设计两路电流匹配度高能有效抵消引线电阻影响。UART接口注意ADS122U04是UART接口版本不是SPI。这一点在选型和布线上非常关键后面会专门讲。内部2.048V基准温漂典型值5ppm/℃对大多数工业场景够用要求更高可以外接基准。对比同系列的ADS122C04I2C接口和ADS122S04SPI接口U04的UART接口在长距离板间通信和光耦隔离上有天然优势这也是它在工业设备里常见的原因。1.3 STM32F723ZE在这套方案里的角色定位STM32F723ZE是F7系列里带高速USB和丰富外设的型号216MHz主频、512KB Flash、256KB RAM用来做温度采集有点大材小用但它的价值在于系统集成度。一个典型的HVAC控制器需要同时处理温度采集、风机控制、通信协议栈、人机界面F723ZE的算力和外设资源能把这些都吃下来。具体到温度测量任务F723ZE负责通过UART读取ADS122U04的转换结果、管理多路传感器的通道切换、执行冷端补偿和线性化运算、跑Modbus或BACnet协议栈、驱动显示和报警输出。ADC本身只负责把模拟量变成数字量剩下的活全在MCU这边。2. 硬件链路设计从传感器到MCU的每一个细节2.1 传感器接口的两种典型接法工业温度测量主要面对两类传感器接法完全不同。热电偶接法热电偶输出差分毫伏信号直接接到ADS122U04的AIN0/AIN1。关键点是冷端补偿。热电偶测量的是热端和冷端的温差冷端温度必须单独测出来加上去。常见做法是在接线端子附近放一颗高精度数字温度传感器比如TMP117或LM75B或者用ADS122U04的另一路通道接PT100测冷端。我一般用后者因为同一颗ADC测出来的冷端和热端数据在时间上同步补偿计算更干净。铂电阻接法PT100/PT1000推荐用三线制或四线制比例测量。以三线制为例ADS122U04的两路激励电流分别流过RTD和一条引线通过测量两个电压再相减把引线电阻抵消掉。四线制精度更高但多一根线HVAC现场布线通常三线制是性价比最优解。2.2 模拟前端滤波与保护工业现场的干扰不是实验室能模拟的。我在一个冷机房项目里遇到过变频器启动瞬间温度读数跳变5℃的情况后来加了RC滤波和TVS才压住。模拟输入端的处理建议差分RC滤波在AINP和AINN之间加100nF电容每个输入端对地加10nF截止频率按信号带宽算。热电偶信号带宽很低截止频率设在10Hz左右足够。共模滤波两个输入端各串一个1kΩ电阻再进ADC配合对地电容构成共模滤波同时限制输入电流。TVS保护工业现场接线错误和浪涌很常见在输入端加双向TVS管钳位电压选在ADC绝对最大额定值以内。基准去耦ADS122U04的REFP/REFN引脚必须就近放1μF加100nF基准噪声直接决定转换结果的噪声。注意ADS122U04的模拟输入绝对最大额定值是AVDD0.3V工业现场如果传感器线缆走长距离感应电压很容易超限TVS和限流电阻不是可选项。2.3 UART接口的隔离与电平匹配这是ADS122U04方案里最容易出问题的地方。UART是异步接口没有时钟线长距离传输时对时序和噪声更敏感。几个实操要点波特率选择ADS122U04支持最高2Mbps但工业环境建议降到115200或更低。我一般用115200配合20SPS的采样率数据吞吐绰绰有余。光耦隔离如果ADC和MCU不在同一块板上或者现场有强共模干扰UART的TX/RX必须光耦隔离。选高速光耦如6N137普通PC817的传输延迟会导致高波特率下误码。电平匹配ADS122U04的IO电压范围是2.3V到5.5VSTM32F723ZE是3.3V直接对接没问题。但如果中间加了隔离隔离后的电平要重新确认。上拉电阻UART空闲时TX线要保持高电平如果走线较长加一个10kΩ上拉到IO电压。2.4 电源与地平面处理ADS122U04的AVDD和DVDD可以分开供电也可以共用。工业设计里我倾向于分开AVDD用低噪声LDO单独供DVDD和MCU共用3.3V。地平面处理的核心原则是模拟地和数字地单点连接。ADS122U04的AGND和DGND引脚在芯片下方汇合然后通过一个0Ω电阻或磁珠连到系统地。这个连接点要靠近芯片避免数字回流经过模拟区域。去耦电容的布局AVDD引脚放1μF加100nFDVDD同样越近越好。ΔΣ ADC对电源噪声很敏感去耦不到位有效位数直接掉几位。3. ADS122U04IPWR寄存器配置与UART通信实操3.1 寄存器映射与关键配置项ADS122U04有四个配置寄存器0x00到0x03通过UART命令读写。配置的核心是通道选择、增益、数据速率和工作模式。寄存器关键位作用典型配置Config0MUX[3:0]输入通道选择0x00选AIN0/AIN1Config0GAIN[2:0]PGA增益0x04对应增益16Config1DR[2:0]数据速率0x04对应20SPSConfig1MODE[1:0]转换模式0x00连续转换Config2VREF[1:0]基准选择0x00内部2.048VConfig3IDAC[2:0]激励电流0x04对应500μA配置顺序很重要先停止连续转换再改配置最后重新启动。在线改配置而不停止转换会出现一两笔异常数据。3.2 UART命令帧格式与读写时序ADS122U04的UART协议是命令加数据的结构。常用命令RREG0x20 | 寄存器地址读寄存器后面跟要读的字节数减一。WREG0x40 | 寄存器地址写寄存器后面跟要写的字节数减一再跟数据。START/SYNC0x08启动转换。POWERDOWN0x02进入低功耗。RDATA0x10读取转换结果。一个完整的配置流程用代码表示// 假设UART已初始化波特率115200 void ADS122U04_WriteReg(uint8_t reg, uint8_t value) { uint8_t cmd[3]; cmd[0] 0x40 | (reg 2); // WREG命令 cmd[1] 0x00; // 写1个字节 cmd[2] value; HAL_UART_Transmit(huart2, cmd, 3, 100); } void ADS122U04_Init(void) { // 停止连续转换 uint8_t stop 0x0A; // 假设STOP命令 HAL_UART_Transmit(huart2, stop, 1, 100); HAL_Delay(1); // Config0: AIN0/AIN1, 增益16 ADS122U04_WriteReg(0x00, 0x04); // Config1: 20SPS, 连续转换 ADS122U04_WriteReg(0x01, 0x04); // Config2: 内部基准 ADS122U04_WriteReg(0x02, 0x00); // Config3: 500uA激励电流 ADS122U04_WriteReg(0x03, 0x04); // 启动转换 uint8_t start 0x08; HAL_UART_Transmit(huart2, start, 1, 100); }注意WREG命令的寄存器地址要左移2位这是UART版本特有的格式和SPI版本不同。我第一次用的时候按SPI的格式发死活写不进去查了半天手册才发现。3.3 转换结果读取与数据格式处理ADS122U04输出24位二进制补码。连续转换模式下DRDY引脚会在新数据准备好时拉低MCU可以用外部中断或者轮询的方式读取。读取流程等待DRDY下降沿或轮询DRDY引脚状态。发送RDATA命令0x10。读取3个字节组合成24位有符号数。转换为电压值V (code / 2^23) × VREF / PGA。代码示例int32_t ADS122U04_ReadData(void) { uint8_t cmd 0x10; uint8_t rx[3]; HAL_UART_Transmit(huart2, cmd, 1, 100); HAL_UART_Receive(huart2, rx, 3, 100); int32_t code ((int32_t)rx[0] 16) | ((int32_t)rx[1] 8) | rx[2]; // 符号扩展 if (code 0x800000) { code | 0xFF000000; } return code; } float ADS122U04_CodeToVoltage(int32_t code, uint8_t gain) { float vref 2.048f; return ((float)code / 8388608.0f) * vref / gain; }这里有个细节24位数据的符号扩展必须做对否则负温度会变成巨大的正数。我见过有工程师在这栽跟头零下温度显示成几千度。3.4 采样率与滤波的权衡ADS122U04的数据速率从5SPS到2000SPS可调。速率越高内部数字滤波器带宽越宽噪声越大。实测数据PGA16内部基准数据速率有效位数适用场景20SPS21.5位高精度温度测量100SPS19.8位多通道轮询1000SPS16.2位快速响应场合温度测量是慢变量20SPS完全够用而且50Hz/60Hz工频抑制在20SPS时最好。我一般默认用20SPS需要多通道快速切换时才提到100SPS。4. 温度换算从ADC码值到真实温度4.1 热电偶的冷端补偿与线性化热电偶的电压-温度关系是非线性的而且输出的是热端和冷端的温差电压。完整计算分三步第一步测冷端温度。用ADS122U04的另一路通道接PT100或者用独立的数字温度传感器。冷端温度T_cj要精确到0.1℃以内。第二步冷端补偿。把冷端温度对应的热电偶热电势加到实测电压上V_total V_measured V_thermocouple(T_cj)。注意V_thermocouple(T_cj)是用热电偶分度表反查冷端温度对应的毫伏值不是简单加个温度。第三步线性化。用多项式拟合或查表法把V_total转换成热端温度。K型热电偶在0到1000℃范围内用NIST提供的多项式系数能到0.1℃精度。// K型热电偶冷端补偿简化示例 float ThermocoupleK_Compensate(float v_measured, float t_cold) { // 冷端温度对应的热电势简化线性近似实际应用查表 float v_cold t_cold * 0.041f; // mV float v_total v_measured v_cold; // 线性化这里用简化系数实际用NIST多项式 float t_hot v_total / 0.041f; return t_hot; }实际项目里我不会用这种简化而是把NIST的系数表存进Flash用分段多项式计算。K型在-200到1372℃全范围分段拟合能控制在0.05℃以内。4.2 PT100/PT1000的Callendar-Van Dusen方程铂电阻的线性度比热电偶好但高精度场合还是要用Callendar-Van Dusen方程T ≥ 0℃R(T) R0 × (1 A×T B×T²)T 0℃R(T) R0 × (1 A×T B×T² C×(T-100)×T³)其中A3.9083e-3B-5.775e-7C-4.183e-12。反解温度用迭代或查表。比例测量法下ADC读到的码值直接对应R_RTD/R_REF的比值省去了激励电流精度的要求R_RTD R_REF × (code_rtd / code_ref)这种方法对激励电流的温漂和长期漂移免疫是工业RTD测量的标准做法。4.3 实际精度验证与校准理论算完必须实测验证。我的做法是用高精度电阻箱模拟PT100在0℃、25℃、50℃、100℃几个点对比读数记录误差。一个实测案例PT100三线制500μA激励PGA1620SPS设定温度电阻箱阻值实测温度误差0℃100.00Ω0.03℃0.03℃25℃109.73Ω25.08℃0.08℃50℃119.40Ω50.11℃0.11℃100℃138.51Ω100.15℃0.15℃误差随温度增大主要是PT100本身的非线性没完全补偿。加一段线性校正后全范围能压到±0.05℃以内。校准的实操建议至少取三个点低、中、高用最小二乘法拟合增益和偏移。单点校准只能修偏移修不了增益误差。5. 工业与HVAC现场的干扰对抗经验5.1 变频器与继电器干扰的实测表现HVAC现场最大的干扰源是变频器和接触器。我在一个空调机组项目里做过对比测试变频器不启动时温度读数波动±0.02℃变频器启动后波动跳到±0.5℃偶尔还有尖峰。干扰的传播路径有三条传导通过电源和地、辐射通过空间、耦合通过信号线。温度信号线如果和动力线走同一个线槽耦合干扰最严重。应对措施按优先级排物理隔离信号线和动力线分开走间距至少20cm交叉时垂直交叉。屏蔽接地传感器线缆用屏蔽双绞线屏蔽层单端接地接在ADC侧。滤波模拟输入端RC滤波数字端软件做中值滤波或滑动平均。隔离UART光耦隔离切断地环路。5.2 软件滤波策略的选择硬件滤波之后软件再补一层。温度是慢变量软件滤波的空间很大。常用的几种滑动平均简单但对突变响应慢。窗口取8到16个点。中值滤波抗脉冲干扰强适合有尖峰的场合。取5点或7点中值。一阶低通计算量小等效于RC滤波。系数根据响应要求调。组合滤波先中值去尖峰再滑动平均平滑。我一般用这个组合。#define FILTER_SIZE 8 float temp_buffer[FILTER_SIZE]; uint8_t buf_index 0; float Filter_Temperature(float new_temp) { temp_buffer[buf_index] new_temp; buf_index (buf_index 1) % FILTER_SIZE; // 简单滑动平均 float sum 0; for (int i 0; i FILTER_SIZE; i) { sum temp_buffer[i]; } return sum / FILTER_SIZE; }注意滤波窗口不是越大越好。HVAC系统里温度变化虽然慢但报警响应不能太迟钝。8点平均在20SPS下是0.4秒延迟可以接受如果采样率降到5SPS8点就是1.6秒报警就太慢了。5.3 断线与短路的检测逻辑工业现场传感器断线是常见故障系统必须能检测出来并报警而不是显示一个错误的温度值。ADS122U04本身有开路检测功能通过激励电流源可以实现。但更通用的做法是用软件判断断线ADC读数接近满量程或负满量程取决于偏置电阻配置。短路ADC读数接近零。超范围读数超出传感器量程对应的合理范围。我在固件里设了三层判断先看ADC码值是否在物理可能范围内再看换算后的温度是否在量程内最后看变化率是否异常比如一秒跳10℃肯定是故障。6. 从裸机驱动到系统集成的工程化考量6.1 多通道温度采集的调度一个HVAC控制器通常要测8到16路温度。ADS122U04是单通道ADC内部MUX可切换但同一时刻只测一路多路采集需要外部多路复用器或者多颗ADC。两种方案对比方案优点缺点适用场景外部MUX单ADC成本低占用MCU资源少切换需要稳定时间通道间串扰通道数多、采样率要求低多颗ADC无切换延迟可并行采样成本高布线复杂通道数少、要求同步采样我一般用外部MUX方案CD4051或ADG708这类。切换通道后要等RC滤波稳定通常延时10到20ms再启动转换。6.2 与Modbus/BACnet协议栈的对接温度数据最终要传给上位机或楼宇自控系统。HVAC领域主流协议是Modbus RTU和BACnet MS/TP。Modbus对接相对简单把温度值乘以10或100变成整数放进保持寄存器。注意字节序Modbus是大端STM32是小端转换别搞反。BACnet复杂一些需要实现对象模型。模拟输入对象Analog Input的几个关键属性Present_Value放温度值Units选degreesCelsiusReliability根据断线检测结果设置。协议栈跑起来之后温度采集任务建议放在独立的定时器中断或RTOS任务里和通信任务解耦。我见过把采集和通信塞在一个循环里的代码通信一忙温度就丢点。6.3 低功耗与长期稳定性有些HVAC设备是电池供电或者对功耗有要求。ADS122U04支持单次转换模式测完就进POWERDOWN平均功耗能降到微安级。长期稳定性方面两个点要注意基准温漂内部基准5ppm/℃一年下来漂移对应温度误差很小但如果环境温度变化大还是要考虑外部基准。PCB应力ADC周围的PCB如果受机械应力焊点微裂会导致读数漂移。安装时避免板子受力变形。我在一个户外机柜项目里遇到过夏天中午温度读数偏高0.3℃的情况排查发现是机柜内温度升高导致ADC基准漂移后来加了温度补偿系数才解决。7. 几个我踩过的坑和对应的解法7.1 UART命令格式和SPI搞混第一次用ADS122U04我照着ADS122S04SPI版的手册写驱动WREG命令的格式完全不对。SPI版是命令字节直接跟寄存器地址UART版要把地址左移2位。结果就是配置写不进去ADC一直用默认配置跑读数完全不对。查了两天才发现是接口版本搞错了。选型时一定要看清后缀U04是UARTC04是I2CS04是SPI。7.2 DRDY中断丢失导致数据错位连续转换模式下如果MCU没及时响应DRDY新数据会覆盖旧数据。我早期用轮询方式读DRDY主循环一忙就漏掉导致读到的数据时间戳错乱。后来改成外部中断触发在中断里置标志位主循环处理问题解决。如果中断资源紧张至少要用定时器以高于数据速率的频率去查DRDY。7.3 激励电流配置错误导致自热PT100测量时激励电流太大会导致传感器自热。500μA在PT100上产生I²R0.5mA²×100Ω25μW自热误差很小。但如果误配成1.5mA自热功率到225μW在静止空气中能让PT100升温0.1℃以上。我一般用500μA或250μA兼顾信噪比和自热。7.4 冷端补偿位置放错热电偶的冷端补偿传感器必须放在接线端子处不能放在PCB上远离端子的地方。我见过把冷端传感器放在MCU旁边的设计结果端子到MCU之间有温度梯度补偿完全不准。冷端传感器要尽量靠近热电偶线的接入点并且用导热胶或者覆铜和端子热耦合。7.5 地环路引起的共模干扰ADC和MCU分板设计时如果两块板各自接地地电位差会形成地环路共模干扰直接串进信号。解法是UART隔离或者整个系统单点接地。我现在的做法是模拟部分和数字部分在ADC处单点连接UART加光耦彻底切断地环路。8. 写在最后的一点个人体会这套ADS122U04IPWR加STM32F723ZE的组合我从原型到量产跑了大概一年半最大的感受是24位ADC给了你精度的可能性但最终能不能达到取决于硬件设计、寄存器配置、滤波策略和校准流程的每一个环节。任何一个环节偷懒精度就掉一个数量级。如果让我给正在做类似项目的朋友一条建议那就是先把模拟前端和电源做扎实再去调软件。我见过太多人软件调了半天最后发现是去耦电容没放对位置。硬件是地基软件是装修地基不稳装修再漂亮也白搭。另外工业现场的环境比实验室恶劣得多设计时留足余量。滤波窗口、保护电路、隔离措施宁可多花点成本也别在现场出问题。现场跑一趟的成本够你买好几年的元器件了。