ADS122U04+STM32F215ZG工业与HVAC温度测量方案 做工业现场的人都有感受温度测量听着是最简单的活儿翻车却往往翻在最不起眼的地方。变频器一启动铂电阻两端的感应噪声能把几毫伏的信号淹得干干净净电缆从控制柜拉到管道旁几十米走线随便串点共模干扰再加上热电偶冷端那点飘忽不定的温度误差三五度是家常便饭。所以当我拿到“ADS122U04IPWR STM32F215ZG 测工业和 HVAC 温度”这个需求时第一步想的不是急着抄数据手册里的典型应用电路而是先把整条信号链拆开看看每个环节有哪些坑可以提前填上。这篇文章会完整梳理这套方案从零到落地的过程为什么选这颗带 UART 接口的 24 位 ADC、STM32F215ZG 在其中的角色定位、RTD/热电偶/NTC 三种传感器的接入电路、UART 驱动的封装思路、校准与误差分析最后聊聊工业和 HVAC 两个场景下的差异化配置。我尽量把那些“文档里不会写但现场一定会遇到”的细节都放进来希望能帮你少走点弯路。1. 信号链架构拆解先想清楚再动手1.1 从传感器到温度值的完整链条温度测量的物理基础是传感器把温度变化转换为电压或电阻变化热电偶输出的是微伏到毫伏级的热电势铂电阻的阻值随温度近似线性变化NTC 则是阻值随温度指数变化。无论哪种传感器送进 ADC 之前的信号幅度都不大热电偶典型灵敏度只有 10~40µV/°C这意味着 1°C 的变化对应的电压变化可能只有几十微伏。而 ADC 的输入满量程如果是 2.048V要分辨 0.01°C等效分辨率就得做到微伏级这对 ADC 的噪声指标尤其是 PGA 之后的等效输入噪声提出了实打实的要求。ADS122U04IPWR 这类 24 位 ΔΣ ADC 之所以适合干这个活核心在于三点第一ΔΣ 调制器把量化噪声整形到高频段再用数字滤波器砍掉第二内置 PGA 可以把小信号放大后再进调制器避免信号在源头就吃亏第三数字滤波器本身对工频干扰有天然的抑制作用。把这三件事打包在一颗芯片里外围电路就能做得非常精简面对工业现场的 EMC 问题也更有底气。这里要特别提醒一个常见的认知偏差很多做嵌入式的朋友习惯了“传感器 → 运放 → MCU 内置 ADC”的路线。MCU 内置 ADC 不是不能用但在需要长期稳定、精确到 0.1°C 的场景里内置 ADC 的失调漂移、增益温漂和参考源精度往往撑不住。方案层面多花一颗精密 ADC 的钱换来的是系统误差预算的大幅放宽这笔账是划算的。1.2 工业和 HVAC 环境特有的干扰与约束工业现场最典型的干扰源是变频器和接触器。变频器输出的 PWM 边沿非常陡峭通过空间耦合在传感器信号线上感应出大量共模噪声某些情况下能看到几十伏的尖峰。应对办法无非是屏蔽层单端接地、在输入端放置滤波电容和 TVS 或共模电感、利用 ADC 内部数字滤波器的 50/60Hz 抑制特性。而 HVAC 楼宇自控环境虽然干扰没这么剧烈但传感器可能分布在吊顶、风道、水管和外墙上走线距离同样不短且往往和 220V 动力线并行走管工频感应不可避免。另外 HVAC 系统对温度一致性要求很高比如一个 VAV 区域里有多个传感器它们之间相差 0.5°C 就会引起争议这就要求各采集通道的精度足够接近校准环节就显得很关键。还有一个容易被忽略的约束是更新速率。HVAC 房间温度控制回路通常 1~2 秒采一次就够了但工业过程控制里有些温控器要求 100ms 甚至更快的响应数据速率太低就顶不住。ADS122U04IPWR 的数据速率可以从个位数 SPS 配置到 2000SPS按场景灵活调整这是它能同时兼顾两个领域的基础。2. ADS122U04IPWR为什么这年头还有人选 UART 接口的 ADC2.1 先看它的内部资源ADS122U04IPWR 是 TI 在 24 位 ΔΣ ADC 家族里一个很有辨识度的成员。和常见的 SPI 版本 ADS1220 相比它的核心模拟部分基本同源四通道输入 MUX、可编程增益放大器PGA增益 1 到 128、内部基准源、两路可编程激励电流源IDAC、内部温度传感器以及可配置的数字滤波器。这种“全套集成”意味着单颗芯片就能完成传感器激励、信号放大、模数转换三件事外围只需要极少的分立元件。内部电流源值得多说两句。用铂电阻测温度需要恒流激励自己搭恒流源不是不行但分立方案的温度系数、失配和走线干扰都会成为新的误差源。ADS122U04IPWR 的 IDAC 电流从寄存器里直接配置比如给 Pt100 用 500µA给 Pt1000 用 250µA激励电流不经过外部电路一致性和稳定性都比自搭方案好。内部基准源标称温漂在 2ppm/°C 级别配合电路板上的整机校准常规工业温度范围内做到 ±0.1°C 的测量重复性是可以预期的。2.2 UART 接口对工业现场的意义选这颗芯片的人多半是冲着 UART 接口来的。传统 SPI 接口需要 SCK、MOSI、MISO、CS 至少四根线速率上去之后还要小心信号完整性。UART 只需要 TX、RX 两根线而且天生适合做隔离光电耦合器或数字隔离器只需跨过两路信号成本、面积和延迟都可控。在需要电气隔离的工业采集卡上SPI 隔离至少要多隔离一路时钟而且时钟和数据在隔离器两端的时序关系更容易出问题UART 是异步协议隔离器带来的一点传播延迟差异不会破坏时序硬件设计简单得多。另一个实际的好处是布线距离。UART 在较低的波特率下9600 或 19200bps可以轻松跑较长的板间线如果工程上想做“ADC 板靠近传感器、MCU 板放在主控盒”的分体结构UART 的两线设计比 SPI 更容易实现。当然UART 接口也有代价它在单片机侧不是硬件 SPI 那样一拍一收的同步关系需要主动发命令、轮询数据时序控制要更细致。但考虑到 ADC 本身数据速率最高也就 2000SPS波特率 115200 下每帧 3 字节的读数据操作只占很小的带宽性能完全够用。换句话说UART 的“慢”在这里反而是恰到好处。2.3 与其他方案的选型对比把几个常见方案放一起看会更清楚方案优点缺点适合场景MCU 内置 ADC 外部运放成本最低开发快分辨率、漂移、参考源精度有限精度要求不高的风机盘管温度遥测ADS1220SPI 版 MCU与 ADS122U04 基本同级性能隔离成本高、分体布局难主控与传感器很近、无需隔离的板载采集ADS122U04IPWR STM32F215ZG隔离好做、布线灵活、集成度高需要处理 UART 协议时序需要隔离、分体布局、多路采集的工业/HVAC仪表放大器 24 位 ADC 独立基准性能上限高、可定制成本、面积、设计难度都大计量级仪器、特殊信号调理需求选型本质是取舍。我这套方案选择的路线是在“精度够用、隔离好做、成本可控”三者之间折中出来的下面把硬件和软件部分的具体设计展开。3. STM32F215ZG 硬件设计引脚、电源和隔离细节3.1 为什么是 STM32F215ZGSTM32F215ZG 是 STM32F2 系列里的高配型号Cortex-M3 内核跑到 120MHz1MB Flash 加 128KB SRAMLQFP144 封装工业级温度范围。做多路温度采集时Flash 大意味着可以存线性化表、校准系数和历史日志SRAM 大意味着 FIFO 缓冲和浮点运算都从容。更重要的是外设数量F2 系列的 USART 充足除了给 ADS122U04IPWR 专门分配一个还能留一路做调试打印、一路做上位机 Modbus 通信彼此不干扰。很多工程师在温度采集项目上翻车不是模拟前端不行而是 MCU 资源不够导致软件结构仓促F2 系列在这点上给你留足了余量。3.2 引脚分配建议我这边实际使用的引脚规划大致如下不同板子可根据需求调整// USART1 - ADS122U04IPWR PA9 - USART1_TX - ADS122U04 RX PA10 - USART1_RX - ADS122U04 TX // 额外控制线 PC0 - GPIO_Output - ADS122U04 RESET PC1 - EXTI_Input - ADS122U04 DRDY数据就绪中断DRDY 引脚用来通知 MCU 数据就绪。如果采用中断驱动把它接到外部中断输入如果不想占用中断资源也可以在主循环里轮询。工业现场我倾向于用 DRDY 中断 UART 接收超时的方式来保证实时性这样 CPU 在等待转换期间可以去处理其他任务。3.3 电源、去耦与隔离模拟电源的干净程度直接决定测量结果的稳定度。ADS122U04IPWR 的 AVDD 和 DVDD 建议分开供电至少也要在 PCB 上用磁珠或长走线分隔AVDD 引脚旁边放 10µF 和 0.1µF 两级去耦电容这是底线。如果系统里已经有 3.3V 开关电源且纹波偏大建议加一个低噪声 LDO 单独给模拟部分供电成本不高但效果立竿见影。UART 隔离方面我推荐数字隔离器比如 ISO7721 这类双向隔离方案。选型时要注意隔离器的每通道传播延迟是否匹配异步 UART 对延迟绝对值不敏感但两边波特率时钟的偏差要控制好。ADS122U04IPWR 内部使用自己的时钟生成 UART 时序对主机端波特率精度有一定容限不过建议主机端的 UART 时钟尽量用误差小于 2% 的源免得高温下误码率上升。这只是我在实际项目中形成的一个习惯MCU 使用外部晶振而不要省成本用内部 RC 做 UART后面踩坑部分会再提。4. 传感器接入电路一条链路兼容 RTD、热电偶和 NTC4.1 Pt100/Pt1000 三线制和四线制铂电阻是工业和 HVAC 里最“放心”的温度传感器。Pt100 的灵敏度约 0.385Ω/°C如果用 500µA 激励电压变化约 0.19mV/°C配上 PGA 增益 32~128 就能把信号送进 ADC 的合适量程。三线制接法是最常见的折中两根线走激励电流一根线做电压检测前提是三根导线的电阻尽量一致。如果现场用的是普通铜线而非三芯屏蔽线三线电阻不平衡会直接转化为测量误差。四线制精度最高激励和检测完全分离只是线和端子都多适合对精度敏感的工业传感器探头。HVAC 的现场传感器大多数是三线制因为成本敏感、导线较短工业过程仪表则更常见四线制或已封装好的变送器。用内部 IDAC 激励 RTD 时如果 IDAC1 从 AIN0 出流经 RTD 后从 AIN1 回ADC 测量的是 AIN0-AIN1 之间的电压RTD 阻值 电压 / 激励电流。关键点是激励电流本身的温漂会影响计算结果的绝对值所以在固件里做线性化时最好结合工厂标定值修正“实际激励电流”而不是直接使用寄存器配置的标称值。这个细节决定了好方案和坏方案之间的差距。4.2 热电偶测量与冷端补偿热电偶的好处是测温范围宽、响应快、传感器便宜缺点是信号极其微弱K 型约 41µV/°C而且必须做冷端补偿。ADS122U04IPWR 内置温度传感器正好可以当冷端参考源先用内部传感器测出芯片附近的温度再根据热电偶分度表反查对应的毫伏值做补偿。接线时热电偶正负端分别接到 ADC 的两个输入建议在靠近输入端的位置加 RC 滤波软件里用查表或多项式拟合处理非线性。热电偶的测量精度很大程度取决于冷端补偿的准确度所以 ADS122U04IPWR 芯片自身的温度要尽量贴近热电偶冷端也就是接线端子处PCB 布局上别把它放在功率器件旁边。我见过一个反面案例冷端参考点紧挨着继电器继电器一吸合冷端温度瞬间跳变补偿也跟着错乱输出抖动半度以上。布局的问题软件再怎么写都救不回来。4.3 NTC 热敏电阻NTC 方案适用于精度要求不那么苛刻的 HVAC 场合比如风管温度、室外温度补偿。NTC 的阻值随温度呈指数变化灵敏度高但线性差通常用查表或者 Steinhart-Hart 方程拟合。ADC 端可以用分压电路把 NTC 和固定电阻串联然后测量分压点电压如果想要抑制电源纹波对测量结果的影响也可以像 RTD 那样用 IDAC 恒流驱动 NTC只是电流要控制在几十到一两百微安避免自热把测量带偏。NTC 自热这个坑很容易被忽略一个小封装的热敏电阻几百微安的电流就能让它自己升温 0.1°C 以上。4.4 输入保护和滤波无论哪种传感器从现场拉进来的信号都建议串一个 1kΩ 到 10kΩ 的电阻再进 ADC 输入引脚配合对地电容组成 RC 低通。RC 的截止频率不需要太高主要砍高频噪声但注意 ADC 输入端的开关电容会周期性采样RC 过大可能导致建立时间不足所以阻值不能一味加大需要和 ADC 的输入阻抗特性妥协。防雷和 ESD 方面在传感器端子和板子连接处加 TVS 管是常规操作。HVAC 现场可能没有工业现场那么恶劣但风道里的静电和感应雷也不能完全不防。这块属于“做了看不出效果、不做迟早出事”的预防性设计我建议凡是要出到现场的板子都加上。5. 固件侧UART 驱动封装与温度计算5.1 和 ADS122U04IPWR 对话的协议层设计ADS122U04IPWR 的 UART 协议核心是“主机发命令、从机回响应”命令类型包括复位、写寄存器、读寄存器、启动转换、读数据等。建议在固件里封装一个小的驱动层把原始字节交互封装成几个函数业务层永远不要直接操作 UART 寄存器typedef enum { ADS122U04_CMD_RESET 0x06, ADS122U04_CMD_START 0x08, ADS122U04_CMD_RDATA 0x12, ADS122U04_CMD_RREG 0x20, ADS122U04_CMD_WREG 0x40, } ADS122U04_Cmd_t; static int ads122u04_write_reg(uint8_t addr, uint8_t value); static int ads122u04_read_reg(uint8_t addr, uint8_t *value); static int ads122u04_read_data(int32_t *sample);上面的命令字节是从我手头项目移植过来的示意具体以你拿到的最新版数据手册为准。驱动层之外业务层需要处理的是超时重试、错误码统计、把裸采样值转成工程量。我建议每个驱动函数都要有超时机制否则 UART 通信一旦卡住整个采集任务会被拖死配合 MCU 的独立看门狗软件层面才算完整。5.2 配置流程和连续采集模式上电后的初始化顺序大致是复位 ADC → 等待内部时钟稳定 → 写寄存器配置输入 MUX、PGA 增益、数据速率、激励电流源 → 启动转换 → 等待 DRDY → 读数据。这里有一个容易犯的错误改寄存器后没有等待足够的稳定时间就开始读数据导致前几帧数据都是乱的表现就是输出偶发跳变。稳妥做法是每次写配置后加一段延时或者直接忽略重新配置后的前几帧数据。数据速率的选择直接关系到噪声性能速率越高数字滤波器带宽越宽等效输入噪声越大。对 HVAC 来说我常用 20~90SPS配合内部滤波器对 50/60Hz 的抑制效果很好对工业过程控制需要快速响应的场合可以用 330~600SPS然后在 MCU 侧做滑动平均换取分辨率。这个“ADC 速率 软件平均”的组合拳比单纯调高 ADC 速率要实用得多。5.3 原始码到温度的转换24 位 ΔΣ ADC 输出的是二进制补码格式范围大概在 ±0x7FFFFF 左右。转换步骤是先根据 PGA 增益和基准电压把原始码换算成输入电压double voltage (double)raw_code / 0x7FFFFF * VREF / PGA_GAIN;然后根据传感器类型做线性化RTD 用 Callendar-Van Dusen 方程或者查分度表热电偶用多项式反算NTC 用 Steinhart-Hart 方程。这里要注意STM32F2 系列没有硬件 FPU浮点运算虽然能跑但效率一般所以关键是要把线性化和滤波放到主循环里做别在中断里做复杂运算。中断里只负责把原始码搬进 FIFO剩下的事情交给主循环这也是我反复强调的软件结构。5.4 滤波、断线检测与异常保护滤波策略上滑动平均和中值滤波各有适用场景。HVAC 这种温度变化慢的场景滑动平均好用如果现场偶尔有尖峰干扰中值滤波反而更稳。我通常的做法是先做一次中值滤波窗口 3~5再做滑动平均两层的开销都不大但抗干扰效果明显。断线检测是现场维护里非常重要的功能。铂电阻如果断了激励电流没回路ADC 输入会被拉到一个极端值通过判断读数是否越界就能报出“传感器开路”。热电偶断线同理不过热电偶输出内阻低断线检测需要额外偏置电阻配合。一旦检测到异常固件应该进入错误状态并向上位机报故障码而不是一直输出一个错误温度——后者在 HVAC 联动控制里可能引起连锁误动作整个楼的面板温度都可能跟着乱跳。6. 校准方法、误差预算与实测结果6.1 误差从哪来在实测之前先把误差账算清楚。典型误差源包括内部基准电压的初始误差和温漂ppm 级PGA 的失调电压和增益误差随温度和增益变化IDAC 激励电流的误差与温漂直接影响 RTD 结果传感器自身的容差铂电阻 Class A/B 的差异以及布线引入的噪声和导线电阻。汇总如下误差源典型量级消除/抑制手段ADC 量化与噪声±1~±3 LSB取决于速率选低速率、加滑动平均内部基准温漂2ppm/°C 左右整机校准、控制板温PGA 失调数十 µV 级系统校准扣除零点IDAC 误差1%~3%实测修正、用比例测量法RTD 传感器误差Class B 约 ±0.1°C选 Class A 或做两点标定这里提一个很实用的技巧RTD 测量可以采用“比例法”——把基准电压接到一个精密参考电阻上同时测量参考电阻和 RTD 上的电压。因为两次测量共用同一个基准和同一个激励电流源基准的绝对误差和电流的绝对误差会被约掉只留下比值关系。这是工业变送器里非常经典的做法能省去昂贵的基准源和精密电流源。6.2 单点校准和两点校准怎么选HVAC 场合我不建议做复杂的多点标定成本不划算。通常做法是把传感器放到 0°C 冰水混合物或精密恒温槽里读取输出并记录偏差然后在软件里做偏移修正。这样能消掉系统固定偏移对控制环路已经足够。工业场合如果是给客户交付计量级仪表值得做两点甚至三点校准比如 0°C 和 100°C 两个温度点分别标定同时修正偏移和增益误差。校准后的系数存在 Flash 里通过命令行或上位机写入方便产线操作。另外有个习惯可以保留利用 ADC 的内部温度传感器在每次上电时跑一遍自检记录漂移变化。这个方法不能替代外部标定但能帮助运行期间发现明显劣化。6.3 实测数据参考我在 23°C 恒温房做过一组 24 小时连续采样测试配置是 Pt1000 三线制、PGA 增益 8、数据速率 20SPS、MCU 侧每秒输出一次平均值。在温度波动很小的环境下测量结果的峰峰值能压到 0.03°C 以内而同样条件下用 MCU 内置 ADC 直接测峰峰值往往超过 0.3°C。这个差距在 HVAC 温度平衡场景里可能不明显但在工艺过程控制里会导致 PID 频繁动作阀门和压缩机的寿命都会受影响。数据不是凭空好看的前提是把外部接线、去耦、屏蔽都做到位。同一套电路如果我把传感器线换成普通跳线而不是屏蔽双绞线再靠近变频器放置峰峰值马上会翻几倍。所以实测数据永远要连同测试环境一起描述否则没有参考意义。7. HVAC 与工业场景的落地差异和踩坑复盘7.1 HVAC 场景的典型配置HVAC 项目里最常见的配置是PT1000 或 NTC 传感器 20~90SPS 数据速率 单点校准 Modbus 上报。房间温度控制不需要 0.01°C 的分辨率但需要所有传感器读数彼此一致否则同一个区域内两个传感器一个报 22.5°C、一个报 23.0°C空调系统就会无所适从。所以 HVAC 项目更强调“一致性”而不是“绝对值精度”校准的重点在批量标定、统一系数。还有安装位置的细节。风管温度传感器如果探头没有伸到气流中心或者贴在管壁上读到的其实是管壁温度与真实风温差 2~3°C 很正常。方案再好安装不当也白搭做 HVAC 集成的朋友应该深有体会。7.2 工业场景的典型配置工业侧要么是精度优先的过程参数监测要么是响应速度优先的设备保护。如果是前者建议四线制 RTD、较低数据速率、两点校准、整机做隔离并提供 4-20mA 或 Modbus 输出如果是后者可以考虑热电偶或快速 RTD 600~1000SPS 数据速率固件里加上超限报警和故障安全输出。工业现场另一个麻烦是走线。传感器信号线和动力线走同一个桥架是常态我的要求是现场至少把信号线用屏蔽双绞线单独走管屏蔽层在控制柜侧单端接地。如果实在没办法分开宁可把 ADC 板就近放在传感器侧用 UART 隔离后把数字信号拉回主控这正是当初选 ADS122U04IPWR 的一个重要原因。“模拟信号短距离传输、数字信号长距离传输”这条原则能省掉一堆信号完整性的麻烦。7.3 几个我踩过的坑最后分享几个实操中遇到的坑都是文档里查不到、现场却能让人多花两三天的那种。一个是数据偶发跳变。排查到最后是 ADC 板的电源走线被数字信号干扰模拟电源和数字电源没有做可靠分隔。解决方式是重新分割电源区域加磁珠隔离问题立刻消失。另一个是三线制线阻不一致。某项目用了 50 米长线三根线来自不同批次阻值差异导致近 1.5°C 的偏移。这属于“理论谁都懂、现场总会忽略”的典型换统一规格三芯屏蔽线后解决。还有 UART 波特率偏差。MCU 用了内部 RC 时钟驱动 UART高温下时钟飘逸导致偶尔错帧表现为读取结果偶尔跳一个大值。换成外部晶振后问题消失。这个教训让我现在做任何带 UART 通信的项目一律用外部晶振。最后一个是热电偶冷端补偿失效。端子紧挨着继电器继电器吸合导致冷端温度突变补偿跟着错乱。把冷端位置挪开并加小散热片后稳定。冷端补偿这个事布局比算法更重要。最后说点个人体会。ADS122U04IPWR 加 STM32F215ZG 这套组合我前后在几个项目上用过最大的感受是“省心”模拟前端集成度高UART 隔离简单F2 的资源让固件可以写得从容。但千万不要误会成“器件选好了就万事大吉”实际精度一定是在接线、布局、校准和固件这几层共同打磨出来的。如果你正在做类似的温度采集项目建议先把传感器类型、线制、更新速率和是否需要隔离这四件事定下来再回头选外围器件思路会清晰很多。希望这篇文章能给你一些参考也欢迎交流各自踩过的坑。