
上个月我给自己做了一块四路温度采集板核心是 TI 的 ADS122U04IPWR 和 ST 的 STM32F765ZI。ADS122U04 是一颗带 UART 接口的 24 位 Δ-Σ ADC内置四通道模拟输入、可编程增益放大器、两个恒流源和内部温度传感器专门为 RTD、热电偶这类传感器测量设计STM32F765ZI 则是 Cortex-M7 内核的 MCU2MB Flash 加 512KB RAM算力非常充裕。这套组合做工业过程监控和 HVAC 暖通系统的温度采集属于很少走弯路的方案因为模拟前端、数字接口、数据处理和通信扩展都正好对得上。这篇文章把整个项目的关键点捋一遍从选型思路、硬件电路、软件流程到校准和排错都会给出可以直接抄作业的配置和参数。不管你是刚接触 ADC 测温还是已经在做同类产品想优化精度应该都能从这里找到有用的东西。1. 方案选型这套组合到底解决什么问题1.1 先把需求放在台面上我最初的项目需求其实很朴素做一块能稳定测量温度、能放进工业控制柜和 HVAC 机组里的采集板基本要求如下。至少 4 路温度输入兼容 PT100、PT1000 和 K 型热电偶。HVAC 场景精度要求不低出水/回水温度通常要 ±0.2℃ 到 ±0.5℃工业场景范围更宽-50℃ 到 400℃ 也常遇到精度 ±1℃ 上下。传感器可能离采集板几米到几十米远现场还有变频器、接触器这类强干扰源。数据要能传给上层控制器所以 MCU 最好能直接出 Modbus 或者以太网。这些需求放到一起选型思路就清晰了前端需要一个高分辨率、低噪声、自带激励源的 ADC因为温度和电阻变化的关系是线性的但信号很微弱后端需要一个有足够算力、接口丰富的 MCU因为要跑滤波、线性化、PID 和通信协议。1.2 为什么锁定 ADS122U04IPWR先解释一下型号后缀。ADS122U04 是芯片本身的系列名IPW 代表 TSSOP-24 封装R 表示卷带包装ADS122U04IPWR 就是完整订货型号。TSSOP-24 在这类板子上很合适手工焊接不难打样和小批量都方便。这颗 ADC 最大的特点是自带 UART 接口。常见的高精度 ADC 大多是 SPI 输出SPI 在板内没问题拉到几米开外就容易受干扰而且每一片 ADC 都得占一个片选引脚。ADS122U04 走 UART只需要 TX 和 RX 两根线还能通过地址引脚在一条总线上挂多个设备这对工业现场的长线传输和简化布线非常友好。再看核心指标。24 位 Δ-Σ 架构内置 PGA 最大 128 倍增益内置两个 IDAC 恒流源内置低温漂参考电压还带内部温度传感器和烧断检测。这些功能基本就是为 RTD 和热电偶准备的。RTD 需要恒流源激励和比例测量热电偶需要高增益和小信号处理内部温度传感器可以做冷端补偿都不用额外加芯片。1.3 为什么配 STM32F765ZISTM32F765ZI 在这个项目里主要干三件事。第一是算力。Cortex-M7 单核跑到 216MHz带 FPU 和 DSP 指令处理 24 位码值转换、PT100 的 Callendar-Van Dusen 方程、热电偶查表插值都很快。一套四通道温度计算加滤波CPU 占用率基本可以忽略余量可以跑 PID 控制算法。第二是接口丰富。F7 系列有多路 USART/UART可以同时挂多片 ADS122U04它本身还有 FDCAN、以太网 MAC后续要上 Modbus RTU 或者 EtherNet/IP 都不需要换主控。第三是资源和封装。2MB Flash 放协议栈加应用代码绰绰有余512KB RAM 够开多个 DMA 缓冲LQFP144 封装手工焊接也没压力。其实用 F103 也不是不行但要同时处理多路高精度温度计算、PID 和通信F1 的资源会显得紧F765ZI 属于一次到位。2. 硬件电路设计要点2.1 RTD 比例测量原理与电路RTD 测温的本质是测电阻。PT100 在 0℃ 时是 100Ω到 100℃ 大约变成 138.5ΩPT1000 在 0℃ 是 1000Ω到 100℃ 约 1385Ω。要把电阻变化转成 ADC 能读的电压需要一个恒流源激励然后在电阻两端取压差。ADS122U04 的 IDAC 恒流源就是干这个的。但恒流源本身有温漂如果直接用内部 2.048V 参考电压电流漂移会直接变成测量误差。所以这题的标准做法是比例测量让同一个 IDAC 电流同时流过 RTD 和一颗精密基准电阻 RREF用 RREF 上的压降作为 ADC 的参考电压。这样推导很简单。假设激励电流是 IRTD 两端电压是 I×R_RTDRREF 两端电压是 I×R_REFADC 输出码值近似等于两个电压之比。如果满量程对应 2^23则R_RTD (ADC_CODE / 2^23) × R_REF公式里的 I 被约掉了恒流源的漂移和噪声都不会进入最终结果只有 ADC 本身的线性误差和 RREF 的温漂会影响测量。这是 RTD 测量精度能做得高的关键。RREF 的选择非常重要。我用的是一颗 0.1% 精度、温漂 25ppm/℃ 的精密金属膜电阻阻值按满量程走。PT100 在 850℃ 时约 390Ω如果激励电流取 1mA390mV 需要 PGA 增益 8 倍才能填满内部 2.048V 参考的量程。RREF 一般取 1.5kΩ 到 2kΩ 比较合适保证 RTD 最大压降不超过参考电压。三线制的接法也要说清楚。工业现场 RTD 导线往往很长导线电阻不可忽略两线制会直接把导线电阻算进传感器电阻里。三线制的思路是让两条线分别走激励电流回路和电压采样回路。用 ADS122U04 的两个 IDAC一路进入 RTD另一路用来补偿导线电阻ADC 差分输入采样的是 RTD 两端真正的压差从而抵消导线电阻的影响。如果追求最高精度比如实验室或计量场景就用四线制直接在 RTD 本体两端单独引出采样线导线电阻完全被隔离在测量回路之外。2.2 热电偶测量与冷端布局热电偶的特点是测温范围宽、成本低但输出信号极弱。K 型热电偶的灵敏度大约是 41µV/℃也就是说 1℃ 的变化只有 41 微伏。这时候 PGA 增益要拉到 128 倍并且要非常小心输入偏置和噪声。冷端补偿是热电偶绕不开的环节。热电偶测的是热端和冷端的温差冷端也就是接线端子处的温度必须知道才能反推出真实温度。这里可以直接用 ADS122U04 的内部温度传感器把所有通道轮流切到内部温度传感器上读一次就能得到芯片结温近似作为冷端温度。也可以在端子排附近放一颗高精度热敏电阻或数字温度传感器然后把冷端温度通过程序叠加到热电偶的测量结果里。需要注意的是冷端温度传感器一定要尽量贴近热电偶的接线端子而且最好用导热材料把两者耦合起来不要让冷端暴露在气流里。我之前见过不少案例热电偶本身精度没问题就是冷端温度测不准导致整体误差两三度这属于典型的布局问题。2.3 供电、隔离与保护工业现场最怕的其实是地电位差。传感器一端在现场采集板一端在控制柜两地之间可能有几伏甚至几十伏的地电位差直接共地必出问题。所以我把模拟部分和数字部分做了严格隔离。ADS122U04 的模拟电源 AVDD 和 DVDD 分开各用一颗低噪声 LDOAVDD 建议用 3.3V 或 5V电源纹波控制在 10mV 以内。数字侧与 STM32 之间加了一颗 ISO7721 数字隔离器隔离 ADC 的 UART 信号这样模拟前端可以和传感器共地MCU 侧和自己的系统共地两边互不干扰。输入保护方面每一路模拟输入都加了共模和差模滤波电容再串入 RC 限流电阻对抗高频干扰和 ESD。RTD 和热电偶端子附近加 TVS 管防止现场静电或意外碰触到高压。2.4 PCB 布局与走线这部分容易被忽视但实测下来影响非常大。我的做法是模拟区域和数字区域完全分区AGND 和 DGND 在板子某一点单点连接避免地环路。ADS122U04 的模拟输入走线短而直REF 引脚附近格外小心RREF 基准电阻尽量靠近 REFP 和 REFN 引脚走线尽量等长减少耦合噪声。RTD 的激励和采样线如果从端子排过来用一对双绞线引到 ADC中间不要穿过数字走线。电容摆放上AVDD 和 DVDD 的退耦电容要紧贴电源引脚0.1µF 加 10µF 组合模拟输入端的滤波电容也要尽量靠近引脚。之前有一版我偷懒把 REF 电阻走远了读数噪声直接从几十 LSB 涨到几百 LSB后来把元件挪近才压下去。3. 软件实现全流程3.1 STM32 串口初始化与通信帧ADS122U04 的串口参数按我用的批次是 19200bps、8 数据位、无校验、1 停止位。STM32 这边用 HAL 库初始化 USART3配置为同样的参数即可。需要注意19200 波特率下 1 个字节大约 520µs读完整数据帧 4 个字节约 2ms如果你的控制周期要求高于这个速度就得评估一下是否够用。通信帧格式方面ADS122U04 支持写寄存器、读寄存器、读数据等命令。以读数据为例主机发送 RDATA 命令ADC 返回 3 字节的 24 位转换结果如果开启了 CRC还会再返回一个校验字节。实际发送时我习惯先发命令再等响应用中断接收缓存收到完整帧再解析。为了保证帧同步可以在命令前后加一点延时避免上一次通信的残余字节干扰下一次。3.2 寄存器配置实例我直接给一版实际项目中用的寄存器配置PT100 三线制PGA 增益 8 倍激励电流 500µA外部基准电阻 1.5kΩ。寄存器 0REG0输入通道选择为通道对 AIN1/AIN2PGA 使能增益 8 倍。寄存器 1REG1数据速率选择 640SPS正常工作模式连续转换模式。寄存器 2REG2IDAC1 电流设为 500µAIDAC1 输出接到 AIN1 方向IDAC2 电流同为 500µA用于三线制补偿。寄存器 3REG3参考电压选择外部 REFP/REFN内部温度传感器禁用烧断检测关闭。这些值不是死的。如果你用 PT1000激励电流可以降到 250µA避免自热效应太明显如果你用热电偶PGA 直接拉满 128 倍参考源可以切回内部 2.048V因为热电偶不需要比例测量。3.3 连续模式与命令式采集的选择ADS122U04 支持两种数据输出方式一个是连续转换模式ADC 自己按数据速率出数把结果不断推给主机一个是命令式模式主机发一次命令ADC 转换一次返回一个结果。我的建议是默认用连续模式。它的好处是时序简单对 MCU 这边就是开个 DMA 接收ADC 自动推数据主机永远能拿到最新值适合做实时控制或者数据记录。命令式模式适合低功耗场景主机不请求就不转换省电但实时性差一些。在连续模式下我开了 UART 空闲中断加 DMA 接收每次收到固定帧长数据就触发回调把数据从 DMA 缓冲拷出来解析。这里有个小技巧CRC 开启之后帧长度是固定的可以用帧尾 CRC 判断一帧是否完整避免 DMA 半唤醒的粘连问题。3.4 码值换算和线性化ADS122U04 输出的是 24 位有符号码值最高位是符号位。双极性模式下满量程正输入对应 0x7FFFFF满量程负输入对应 0x800000中间零点是多少取决于配置。把码值换算成电阻用之前比例测量的公式R_RTD (ADC_CODE / 8388608) × R_REF注意这里 8388608 是 2^23不是 2^24。因为 24 位有符号数正半轴只有 2^23 - 1 个码。这个细节我刚开始就栽过换算出来的电阻整体偏大一倍。得到电阻之后求温度用 Callendar-Van Dusen 方程。0℃ 以上用简化形式R R0 × (1 A×t B×t²)其中 A 3.9083×10⁻³B -5.775×10⁻⁷。从 R 反推 t可以用求根公式也可以二分法。STM32F765ZI 跑 FPU二分法 20 次迭代大概几微秒精度远超传感器本身。0℃ 以下要用完整方程多一项 C×(t - 100)×t³C -4.183×10⁻¹²。如果你只做 HVAC温度范围基本在 -10℃ 到 60℃简化方程就够了工业场景如果测低温就得用完整形式。热电偶这边最实用的是查表加线性插值。把 NIST 的热电偶温度-电势表按 10℃ 一个点存成数组在 STM32 里查表找相邻两点插值计算温度。10℃ 间隔的线性插值误差非常小完全满足 ±1℃ 的要求比直接跑高阶多项式省事得多。3.5 多通道扩展与管理ADS122U04 本身是四输入 ADC但模拟输入的切换在内部通过 MUX 完成每次只有一对输入被采样。所以物理上它是一颗四选一 ADC不是同步采样四路。如果你要同时跟踪四个点的温度变化轮流扫描就行800SPS 的速率下四路每路也有 200SPS对温度场完全够用。如果需要更多路数比如 8 路、16 路有两种扩展思路。最简单的是 STM32F765ZI 有多路 UART每个 UART 挂一片 ADS122U04天然独立互不干扰更省引脚的做法是让多片 ADC 挂在同一条 UART 总线上通过 ADDR 引脚配置不同地址主机按地址访问。我实际使用的是每片独立 UART 的方案因为软件最简单一个串口对应一个 ADC收到数据就知道是哪一路不需要地址解析。如果做便携式低功耗设备可以考虑地址总线方案少占用 MCU 的 UART 资源。4. 校准与误差控制4.1 校准流程硬件再准也不可能零误差。ADC 自身有增益误差和偏置误差RREF 有初始精度误差这些都要通过校准来修正。最标准的做法是用一个精密的电阻箱做校准。把电阻箱接到 RTD 输入通道设置几个标准阻值比如 100Ω、138.5Ω、175.8Ω对应 0℃、100℃、200℃。每个点记录 ADC 读数和实际阻值的偏差做线性拟合得到增益修正系数 K 和偏置修正量 B。之后每路输入都套用R_corrected K × R_raw B实测一套下来PT100 在 0℃ 到 200℃ 范围内能把误差压到 ±0.1℃ 以内前提是校准源本身要准。恒温油浴加标准铂电阻是最高级的方案但平时调机用精密电阻箱也够用。校准数据建议直接存在 STM32F765ZI 内部的 Flash 或者外部 EEPROM开机时加载不用每次重新校准。4.2 误差来源分析几个误差源按影响大小排个序。第一位是参考电阻 RREF 的温漂。比例测量把恒流源漂移消掉了但 RREF 漂移会直接变成测量漂移。所以 RREF 一定选低温漂最好是金属箔电阻或者高精度薄膜电阻温漂 5ppm/℃ 比 25ppm/℃ 贵不少但精度要求高的工业场景值得。第二位是 ADC 自身的输入噪声。Δ-Σ ADC 的噪声和采样率直接相关采样率越高噪声越大。720SPS 下有效分辨率可能只有 18 位上下20SPS 下可以做到 21 位以上。HVAC 这种温度变化慢的场景完全可以把采样率压到 20SPS 或 40SPS换回极低噪声。第三位是 RTD 的自热效应。激励电流流过 RTD 会产生热量导致 RTD 本身温度升高。PT100 在空气中散热较差500µA 的激励电流足以产生零点几摄氏度的自热会让读数偏高。PT1000 阻值大同样电流下发热差很多所以 HVAC 里我更喜欢用 PT1000 加 250µA 激励。还有一些容易被忽略的误差比如连接器接触电阻、端子排温漂、ADC 参考输入端的走线寄生电阻。这些有时候不会在大范围看数据时体现但温度变化后就会慢慢漂。4.3 不同场景的参数配置我把典型的配置整理成表格方便你直接参考。场景传感器激励电流PGA 增益采样率参考源HVAC 水温PT1000250µA840SPS外部 RREF工业管道PT100 三线500µA8160SPS外部 RREF高温工业PT100 四线1mA16160SPS外部 RREF宽范围K 型热电偶无12820SPS内部 2.048V5. 常见问题与排查5.1 UART 数据错位和乱码症状是读到的一帧数据忽大忽小或者 CRC 校验老不通过。优先检查波特率是否一致。ADS122U04 的 UART 波特率由内部时钟决定如果它是 19200STM32 配成 19200两边相差不能超过百分之几。如果 STM32 用的外部晶振精度不够可以考虑把串口改成自动波特率检测或者换更高精度的晶振。其次是地电位问题。ADC 和 MCU 距离远时UART 线如果直接相连两边地电位差会导致信号畸变。解决方案就是前面说的加数字隔离器一条总线上隔离器放靠近 MCU 一侧。最后是帧同步问题。连续模式下如果 MCU 在帧中途开始接收就会拿到的不是帧头。最简单的处理是用 CRC 过滤或者先发送一个同步命令把 ADC 的输出流复位到帧边界。5.2 读数漂移和跳动排除接线问题后跳码多半来自噪声漂移多半来自参考电阻。如果是跳码先看是不是采样率配太高了。把采样率从 640SPS 降到 40SPS有效分辨率会明显提升跳动幅度可以降一个数量级。然后是滤波电容在模拟输入端加 100nF 到 1µF 的电容配合 RC 滤波能压掉很大一部分工频和谐波干扰。漂移就重点查 RREF 和传感器端子。RREF 是不是靠近散热源比如电源模块或者大电流走线传感器本身有没有自热激励电流是不是可以降一档。现场还有一种常见情况是接线端子氧化接触电阻随温度变化数据就会跟着环境温度漂。5.3 冷端补偿错误热电偶读数的整体偏移往往出在冷端。排查方法是把热电偶拔下来用一个短接线短接输入端此时理论读数应该是 0℃。如果显示偏离说明冷端补偿或者零点偏置有问题。然后测一下 ADC 的内部温度传感器读数和现场实际环境温度对比偏差应该在 ±1℃ 以内。如果内部温度传感器偏了可以做一次单点校准把偏差值存在 Flash 里补偿掉。冷端不稳定的另一个原因是热电偶端子排附近有热源比如电源模块或者继电器。冷端温度传感器一定要贴在端子上而不是贴在 PCB 的空白区域。5.4 多设备通信冲突多片 ADC 挂同一条 UART 总线时最容易出现地址冲突和上电时序问题。ADS122U04 的地址引脚配置要确保每片 ADC 的地址都不一样否则两片同时响应命令总线上就打架了。上电时最好让 MCU 先复位所有 ADC等 ADC 内部上电稳定后再逐片发送访问命令。我之前踩过一次坑ADC 上电没稳定MCU 发命令没人响应程序就卡死了后来加了一个上电延时才解决。5.5 排查速查表问题现象最可能原因处理办法数据乱码波特率不匹配/地电位差核对波特率、加隔离器读数跳动大采样率过高或滤波不足降采样率、加输入滤波读数整体偏移RREF 精度差或冷端未补偿换高精度 RREF、校准冷端温度随时间漂自热或接触电阻变化降低激励电流、检查端子多片通信冲突地址重复或上电时序检查地址、加复位延时CRC 老不通过帧同步丢失发同步命令、开启 CRC 过滤我自己在实际部署中发现ADS122U04 加 STM32F765ZI 这套组合最大的价值是把模拟设计、数据处理和系统通信串在了一条非常顺的线上。ADC 做好传感器信号到码值的转换MCU 专注于计算和控制中间只用一根 UART 线对话调试的时候拿个逻辑分析仪就能看到全部通信过程非常透明。如果你接下来想在这个基础上做更多路数比如 16 路温度采集我建议先把 UART 总线的时分访问机制定好保证多片 ADC 不会互相抢时间如果想走无线或者接到云平台F765ZI 前面留的算力和 RAM 足够你再挂一个 TCP/IP 协议栈。硬件上的那几条原则——参考电阻选好的、地别乱接、输入滤波别省——只要踩过一次坑你就会明白它们有多值钱。