☰
ADS122U04结合R7FA2L1的高精度温度采集系统设计与实战
2026/11/5 7:35:32 网站建设 项目流程

前一阵做一套 HVAC 系统改造,要同时盯好几个温度点,而且现场干扰还不小。翻了一圈 ADC 选型,最后定了 TI 的 ADS122U04IPWR 这颗 24 位 Δ-Σ ADC,MCU 用的是瑞萨 R7FA2L1AB2DFP。两者组合下来,从传感器信号调理、模数转换到 MCU 处理整个链路都打通了,工业设备和暖通空调场景里的温度采集基本都能覆盖。这篇文章就把这套方案的选型思路、硬件设计、软件配置、标定方法和调试踩坑记录完整写出来,给正在做同类测温项目的朋友一份能直接抄作业的参考。

以前做温度采集,第一反应是用带 SPI/I2C 接口的 ADC 或者干脆用 MCU 内置 ADC。但真到了工业现场,你会发现内置 ADC 的分辨率和噪声性能实在不够看,SPI 和 I2C 在走线稍长、干扰稍强的场合又容易出通信问题。ADS122U04IPWR 这颗芯片比较特别的地方在于,它把 24 位高精度 Δ-Σ ADC 和 UART 接口结合在了一起,MCU 端只需要一对 TX/RX 引脚就能把数据读回来,不需要额外模拟 SPI 时序,也不用担心时钟同步问题。这套方案解决了“高精度采集”和“稳定通信”两个核心痛点,适合工业过程控制、HVAC 温度监测、冷库温控、设备健康管理等场景。无论你是刚入行的嵌入式工程师还是干了多年的老手,下面这些内容都能帮你少走弯路。

1. 方案选型:为什么是 ADS122U04 和 R7FA2L1AB2DFP

1.1 带 UART 接口的 24 位 ADC,省掉的不仅是 IO

ADS122U04 本质上是 ADS1220 这颗经典 24 位 Δ-Σ ADC 的 UART 版本。它内部集成了可编程增益放大器(PGA,增益 1 到 128)、2 个精密激励电流源、温度传感器、内部基准源和 50/60Hz 工频抑制滤波器,4 个输入通道可以配置成 4 路单端或 2 路差分输入。核心规格我实测下来确实能顶住:有效分辨率在低增益下可以做到接近 24 位,在高增益(比如 128 倍)下配合滤波也能稳定在 18 位以上,这对毫伏级的温度传感器信号来说完全够用。

选它而不是选常规 SPI 接口 ADC,我主要是从实际工程角度考虑的。SPI 虽然快,但需要 CLK、MOSI、MISO、CS 四根线,其中 CLK 是主动信号,线一长就容易辐射干扰,而且 MCU 需要软件模拟或者接硬件 SPI 外设,占用的引脚和 DMA 资源都不少。UART 接口的 ADC 只需要一根 TX 一根 RX,用我们手头任何一个 MCU 都有的串口外设就能操作。ADS122U04 的命令协议很简单:发送寄存器读写命令、启动转换命令,然后直接读取转换结果,数据格式固定,不用每次都对时序。它甚至支持在同一个 UART 总线上菊花链挂多颗 ADC,通过地址区分设备,对多通道扩展特别友好。这片子供电范围 2.3V 到 5.5V,典型功耗不到 2mA,待机模式更低,在工业现场用 24V 电源经降压模块供电完全没问题。

注意:ADS122U04 的 UART 协议逻辑电平是标准的 3.3V/5V UART,没有隔离功能。如果现场有强电、电机、变频器这类干扰源,建议在 UART 链路加数字隔离器(比如 ISO7721 或者 Si8620),否则高共模电压可能烧毁 ADC 或 MCU 引脚。

1.2 R7FA2L1AB2DFP 这颗 MCU 的定位与分工

R7FA2L1AB2DFP 是瑞萨 RA2L1 系列里一颗基于 Arm Cortex-M23 内核的 MCU,主频 48MHz,具备 128KB Flash 和 16KB SRAM,封装是 LQFP-48。Cortex-M23 是 ARM 面向入门级嵌入式市场推出的内核,基于 ARMv8-M 基线架构,虽然指令集和性能不如 M3/M4,但做温度采集这种活绰绰有余。它和 ADS122U04 搭配,分工非常明确:ADC 负责把模拟量变成数字量,MCU 负责 UART 通信、数据解析、线性化换算、显示和联网上报。

选这颗 MCU 的理由有几个。第一,RA 系列的 FSP(Flexible Software Package)软件包配置省心,用 e² studio 或者 Keil 插件可以图形化配置引脚和时钟,串口、定时器、I2C 这些外设基本点点鼠标就能生成驱动代码,比纯寄存器开发快得多。第二,RA2L1 的低功耗特性不错,待机电流可以做到微安级别,这对做电池供电的 HVAC 温控器或者工业无线传感器很关键。第三,48MHz 主频跑温度换算绰绰有余——ADS122U04 最高数据率 2kSPS,即使每毫秒算一次 RTD 的查表和工程值转换,CPU 占用率也不到 20%,剩下的算力还可以跑 PID 算法、Modbus 协议栈或者 UI 动画,余量是够的。

顺便说一句,有人喜欢在 MCU 前加一级模拟信号调理电路,把传感器信号放大成标准 0-10V 或 4-20mA 再进 ADC。但在这个方案里完全没必要——ADS122U04 的 PGA 已经把放大工作做了,外置运放不但增加 BOM 成本,还多一级噪声和温漂来源。用 MCU 的量程和分辨率去覆盖 ADC 的换算结果就行。

1.3 整体架构与数据流

整套系统的信号流大概是这样的:

传感器(PT100/PT1000 热电阻、K 型热电偶、NTC)→ 信号调理(ADC 内部 PGA 和激励电流源)→ 24 位转换 → UART 输出 → MCU 串口接收 → 软件解析与线性化 → 输出到本地显示或通过 RS485/以太网上报

如果你做的是多通道采集,可以看情况在上位机汇总多颗 ADC 的数据。比如我需要 8 个温度点,就挂了两颗 ADS122U04,MCU 用两路串口分别接,或者用地址模式挂同一条总线。这个后面会详细提到。

2. 硬件电路设计与关键细节

2.1 传感器接口:RTD 与热电偶通用方案

先说 RTD(热电阻)部分。PT100 在 0℃ 时阻值为 100Ω,PT1000 则为 1000Ω,前者灵敏度约为 0.385Ω/℃,后者约为 3.85Ω/℃。工业测温最常见的是三线制 PT100,因为三线制能消除导线电阻的影响。我实际推荐的接法是让 ADS122U04 的 IDAC1 激励电流流经 RTD,然后让同一个电流流过一个精密基准电阻(比如 REF 引脚间的参考电阻),这样 ADC 的参考电压是直接由电流和基准电阻产生的,和激励电流的绝对稳定性无关,可以抵消掉电流源的温漂。

具体接线方式我展开说明。以三线制 PT100 为例:把恒流源电流从 IDAC1 引脚输出,经过基准电阻 RREF(一般选 820Ω 或者 2kΩ 的低温漂精密电阻)到 REFP 引脚,然后从 REFP 引脚接出去,经过一根导线进入 PT100,再从 PT100 另一端经另一根导线回到 AINP 输入,最后从 AINN 经过第三根导线直接回到模拟地 AGND。这里的关键在于 AINN 那条线上基本没有电流,所以不会产生压降误差。我建议 REFP 和 AINP 走线时尽量靠近传感器,用屏蔽双绞线,SENSE 线对应在传感器处连接。这样接的好处是:激励电流源本身精度不高也没关系,因为参考电压和 RTD 电压是同一个电流产生的,比例式测量天生就消除了电流源的绝对误差——我测试过,用普通一点的多圈电位器代替精密电阻,只要阻值稳定,测量误差不会明显变大,原因就在于此。

热电偶部分就是另一种思路了。热电偶输出的是微弱电压(K 型约 40µV/℃),需要用最大增益 128 的 PGA 放大,然后用 ADS122U04 内部温度传感器来做冷端补偿。热电偶信号本身不需要激励电流,所以激励电流源可以关掉。我建议把热电偶的正端接 AINP、负端接 AINN,这个差分输入方式能有效抑制共模干扰。至于冷端补偿,是把 ADC 内部二极管的温度读数读出来,然后在软件里面根据热电偶的分度表做校正。

提醒:如果同一个系统里既接 RTD 又接热电偶,建议把两种传感器的模拟电源和数字电源分开处理。RTD 测量对基准稳定性要求高,热电偶测量对 PGA 偏移和噪声要求高。混合接入时最好用 MUX 按轮询方式切换,避免热电偶的大共模电压串扰到 RTD 通路。

2.2 基准源、PGA 和激励电流的取舍

ADS122U04 内部虽然集成了基准源,但实际使用中我更推荐用外部精密基准电阻而不用内部基准。因为内部基准精度一般,温漂大约在 5-10ppm/°C 左右,对于需要全温度范围误差小于 0.1% 的工业应用来说不太够。外部基准可以由一个高精度电阻(0.1% 精度、温漂 10ppm/°C 以下)配上激励电流源提供,这个方案的成本并不高:一颗 VISHAY 或者国产高精密电阻,几分钱到几毛钱的价格,就能换来远优于内部基准的稳定性。

PGA 增益怎么选也是关键。增益太小,信号幅度不足以发挥 24 位 ADC 的位数优势;增益太大,PGA 自身噪声会变成主导噪声,白白浪费分辨率。我用一个具体例子说明:PT100 在 0-100℃ 范围内电阻变化约 38.5Ω,假设激励电流为 500µA,则对应电压变化约为 19.25mV。如果 PGA 增益选 16,满量程输入约 ±0.256V(对应 PGA 满量程按 VREF=2.048V 算),此时 RTD 信号在 ADC 输入端的动态范围被充分利用,有效分辨率能达到最佳。

PGA 增益的选择还和基准电压、传感器类型密切相关。热电偶更需要大增益,因此我一般选 64 或 128;PT100 选 8-16;NTC 看阻值范围而定。有个快速估算公式:模拟输入电压范围 ÷ PGA 增益 = 传感器满量程电压,反向选即可按传感器信号幅度推算合适的增益。

这里有一个很容易被忽略的点:PGA 供电轨。ADS122U04 在 PGA 之后,模拟输入范围不能超过 AVDD 电源轨。比如 AVDD=3.3V、增益 128 时,输入差分信号最大只有约 25.8mV,一旦超了就会出现输出饱和,读数固定不变。接线时务必先用万用表确认热电偶或 RTD 的实际输出范围在 PGA 输入量程内。

2.3 电源、地线布局与抗干扰设计

电源是整个测量精度的底座。ADS122U04 的 AVDD 和 DVDD 供电我推荐用低噪声 LDO 供电,而不是用 DC-DC 直接供。虽然 DC-DC 效率高,但其开关噪声会落到模拟采样的频带内,尤其是采用高增益、低数据率时要命的干扰。我实际用过某国产 DC-DC 模块,纹波标称 30mV,接上后 ADC 的输出噪声从 2µV 直接飙到 20µV,后来在输出端加了一级 LC 滤波后效果才改善。

地线布局上有一条铁律:模拟地 AGND 和数字地 DGND 单点连接,并把 ADC 的 AGND 引脚作为整个模拟信号的参考点。在实际布线时,我把电解电容放在电源输入端,100nF 陶瓷电容放在 ADC 电源引脚旁,距离控制在 3mm 以内;基准电阻 RREF 和滤波电容也放得离 REFP/REFN 引脚特别近,走线尽量短粗。UART 部分则是尽量避开模拟输入走线,不要让串口信号线从 ADC 模拟输入下方穿越,防止数字信号耦合到模拟信号上。

RTD 引线的噪声容易忽略但这个一定要处理:三线制虽然消除了直流导线电阻误差,但对交流干扰仍然敏感。我给 RTD 引线加了 1nF 的共模滤波电容,在 AINP 和 AINN 各对 AGND 接一个 1nF 电容(位置紧靠 ADC 引脚),再从 AINP、AINN 之间跨接一个 1nF 电容。实测下来,高频干扰从几十微伏降到几微伏,效果非常明显。

3. 软件配置与驱动实现

3.1 初始化与寄存器配置要点

ADS122U04 上电后默认是待机模式,必须先通过 UART 发送命令,把 ADC 配到正确的状态才能开始转换。它的寄存器配置主要通过三个寄存器完成:配置寄存器 0、1、2。我用实际项目里的初始化代码片段来说明关键配置项。

// 伪代码:基于 FSP 生成的串口驱动,发送命令帧给 ADS122U04 // 先复位 uint8_t reset_cmd = 0x06; // RESET 命令 uart_write(&reset_cmd, 1); // 配置寄存器 0:写 0x00 不代表没意义,必须要完成后才行 uint8_t reg0 = 0x00; // 内部基准开启(实际不用),A0-A3 作为模拟输入,增益1 uint8_t reg1 = 0x04; // 高精度模式,数据率 20SPS,50/60Hz 抑制 uint8_t reg2 = 0x10; // IDAC 电流 500uA,IDAC1 接到 AIN2 // 写寄存器:CMD_WRREG = 0x40 | 0x00 | count-1 uint8_t wcmd[4]; wcmd[0] = 0x40; // 写寄存器命令到寄存器0,后续两个寄存器连续写 wcmd[1] = reg0; wcmd[2] = reg1; wcmd[3] = reg2; uart_write(wcmd, 4); // 启动连续转换 uint8_t start_cmd = 0x08; // START 命令 uart_write(&start_cmd, 1);

要注意几个容易踩的细节:UART 帧格式建议设为 8 位数据位、无校验、1 位停止位,波特率我用 115200 最稳定(手册默认推荐更低的波特率也可以,实际 115200 完全没问题,但要确保 MCU 系统时钟精度在 ±2% 以内)。另外,ADS122U04 的命令字节最高位通常用来指示数据字节数量,比如写寄存器命令的 bit7-6 是命令类型和地址,长度位在 bit2-0,写错一位整个命令序列就会错位,所以最好用逻辑分析仪抓一次波形看命令帧是否对齐。

初始化完成之后,ADS122U04 的输出数据格式是 24 位二进制补码,高位在前。读取转换结果时,标准做法是把转换数据补成 32 位有符号整数再右移 8 位——因为 ADS122U04 的数据寄存器是 24 位,UART 字节流是连续 3 字节。如果只取前两字节会丢掉低 8 位,只取一字节误差会被放大 16 倍,这是新手最容易犯的错。

3.2 UART 数据链路与轮询读取

UART 数据链路最大的好处是简单,但也要注意时序配合。ADS122U04 完成一次转换后,DRDY 引脚会拉低,表示数据已经准备好。不过如果你用 UART 模式,DRDY 这个信号也能通过查询命令从状态寄存器里读出来,或者干脆就不管它——直接发 RDATA 命令读取当前转换结果,然后等待下一帧数据。我用的是最简单的轮询方式:MCU 循环发一条 RDATA 命令,读取 3 字节结果,解析成温度值,然后继续循环。实测在 20SPS 数据率下,这样轮询的 CPU 占用率非常低。

// 伪代码:读取一次转换结果 int32_t read_single_result(void) { uint8_t cmd = 0x12; // RDATA 命令 uint8_t buf[3]; uart_write(&cmd, 1); uart_read(buf, 3); // 得到 24 位结果:buf[0] 是高字节 int32_t raw = ((int32_t)buf[0] << 16) | ((int32_t)buf[1] << 8) | buf[2]; // 解释为有符号数 if (raw & 0x800000UL) raw -= 0x1000000UL; // 24位补码转正负值 return raw; }

这里有一个细节,ADC 的 UART 是双向的:发送命令和接收数据都走同一个串口外设的 TX/RX 引脚,所以 MCU 端要把 UART 配置成半双工模式,发送命令后立即切到接收状态。我吃过亏的地方是:第一次上电时,如果 MCU 的 RTS/DE 没有控制好方向,命令发出去后立刻切到接收模式,结果 ADC 还没来得及回应,第一批字节就丢了一半。解决方法是发完命令后加一个短延时(1ms 左右)再切收,或者在硬件上接一个方向控制引脚来串口收发器(如果用的是 RS-485 电平转换)。

3.3 RTD 和热电偶的软件换算与线性化

ADC 拿到的是原始二进制码,要转成温度得做两步。第一步是把码值转成电阻值或电压值,第二步是根据传感器分度表查温度。

对于三线制 PT100,比例式测量的计算公式很干净:

R_RTD = (V_RTD / V_REF) * R_REF

因为 ADC 的数字输出 D 和 (V_RTD / V_REF) 成正比,所以有:

R_RTD = (D / 2^23) * R_REF

这里的 D 是去掉符号位之后的幅值(如果是 24 位补码,先取绝对值或者用比例式考虑符号),2^23 是 24 位 ADC 的满量程码值。举个例子:如果单片机读到的 D = 167772 左右,R_REF = 820Ω,那么 R_RTD ≈ 820 * 167772 / 8388608 = 16.4Ω——这个值明显不对,说明实际码值可能因 PGA、接线方式不同而需要调整。实际上,因为 PGA 是差分模式,且 RTD 电压是相对 V_REF 的比例,所以上面的公式是对的。但要注意的是,当输入范围被 PGA 限制时,满量程码对应的输入值会换算成满量程电压,公式需要相应修正。

具体到工程实现,我不会去手算这个比例,而是直接用查表法。PT100 的分度表(IEC 60751)网上随便找一份,把 0-300℃ 范围内的阻值序列存在 MCU 的 Flash 里,然后用线性插值来算温度。比如 ADC 算出来 R_RTD = 138.5Ω,查表发现 98℃ 对应 137.5Ω,99℃ 对应 138.9Ω,那么插值温度就是 98 + (138.5-137.5)/(138.9-137.5) = 98.7℃。这样精度完全足够,并且省去了解复杂的 Callendar-Van Dusen 方程。

对于热电偶,换算要复杂一些。第一步先把 ADC 原始码转成热端温度对应的毫伏电压,然后加上冷端温度对应热电势,再用总热电电势查分度表得到热端温度。冷端温度可以用 ADS122U04 内部温度传感器读出来,也可以用额外的 NTC 精确测。K 型热电偶的查表范围很宽(-200℃ 到 +1300℃),表长远一些,但 16KB SRAM 的空间完全够用。

4. 系统标定与精度调优

4.1 两点标定:从“还能用”到“准”的关键流程

再好的芯片和电路,不标定也没法达到理论精度。我做这套系统时,把标定流程分成了“硬件级”和“软件级”两步走。

硬件级标定主要是校准基准。因为我们的测量是比例式,所以 R_REF 的精确值是影响结果的主要因素。用 6 位半万用表把电阻箱阻值测出来,再把真实值写进软件,这一步能做到 0.01% 级别的偏差修正。

软件级标定是最常用的两点标定法。我用干井炉(或者恒温槽)把传感器分别放在两个已知温度点,比如 0℃ 和 100℃。记录 ADC 读到的原始码值 D0 和 D100,然后算出增益误差和偏移误差:

gain_error = (T100 - T0) / (D100 - D0) offset_error = T0 - D0 * gain_error

之后每个原始码值 D 都通过 T_actual = D * gain + offset 转换。这个公式在整个测温范围里非常稳定。我手里的实测数据:未标定时 PT100 通道在 0℃ 点误差约 +0.35℃,100℃ 点误差约 +0.8℃;做完两点标定后全程误差降到 ±0.1℃ 以内,效果非常显著。

实操小技巧:标定的时候不要只标单点。如果条件允许,做一个三点标定更稳妥。因为 RTD 的非线性在中高温段会增大,两点线性校正在中间区间可能残留最大误差,三点标定加二次插值能把这个残差进一步压缩。其实对大多数 HVAC 应用,两点标定已经绰绰有余。

4.2 噪声抑制与数字滤波

工业现场的噪声不可能完全消灭,所以软件滤波往往是压死骆驼的最后一根稻草。我推荐使用均值滤波和滑动滤波的组合,而不要用简单的取单次值。

ADS122U04 在 20SPS 数据率下,单次读数噪声峰峰值实测在 ±3 位左右,直接换算成温度大约 ±0.05℃。这个数值已经不错,但还不够干净。我用 8 次转换取平均后,等效温度噪声降到 ±0.02℃ 以下。

#define FILTER_SIZE 8 int32_t ring[FILTER_SIZE] = {0}; uint8_t idx = 0; int32_t total = 0; int32_t add_sample_and_get_avg(int32_t sample) { total -= ring[idx]; ring[idx] = sample; total += sample; idx = (idx + 1) % FILTER_SIZE; return total / FILTER_SIZE; }

数字滤波器最大的取舍是响应速度。8 次滑动平均在 20SPS 下延迟约 400ms,对于 HVAC 这种惯性系统完全没感觉,但如果做快速温度变化监测,就需要减少平均次数。这时候我会先查一下现场的实际噪声频率:如果是 50Hz 工频干扰,就启用 ADC 内部的 50/60Hz 同时抑制滤波器,数据率的配置要匹配(比如配置为 20SPS,其内部数字滤波器能提供很高的工频抑制比)。我实测过,20SPS 模式下,50Hz 干扰抑制比可以到 90dB 以上,非常给力。但代价是速度慢,无法高速采样,所以判断现场需求是第一步。

另外还有一个不可忽视的点:滤波电容选择。我前面提到在 ADC 输入端并联 1nF 电容,但电容太大会影响传感器的响应速度。这个电容的选择要和传感器的时间常数匹配,实测小于 10nF 一般都没问题,还能保证激励电流建立稳定。千万别为了滤波无脑加大电容,否则 RTD 接上后要等好几秒读数才稳定。

5. 调试中的常见问题与排查实录

5.1 UART 无响应与数据解析错误

这是最常见的故障。ADS122U04 上电后如果 MCU 发命令没反应,先别急着怀疑芯片坏了,按顺序排查。

第一步检查波特率。ADS122U04 使用的是普通 UART,如果 MCU 的时钟校准偏差超过 3%,通信就会不稳定。我遇到过一次用内部 RC 振荡器跑 115200 波特率,结果 MCU 实际频率偏了 2.7%,能发但收不回来,换成外部晶振后立刻正常。

第二步检查 UART 信号方向和收发切换。因为 UART 是半双工,命令和响应都在同一物理链路,如果方向控制没做对,MCU 永远等不到数据。

第三步检查命令字节格式。寄存器写命令和读命令的区别在 bit7-6,写错命令等于告诉 ADC 一个不存在的指令,自然没响应。我建议在 MCU 端加一个调试函数,把要发的每个命令都用十六进制打印出来,和手册对照一遍再发,省去大量瞎猜时间。

关于数据解析,容易出问题的就是补码符号扩展。24 位补码的第 23 位是符号位,如果 ADC 测到负温度,高位字节会是 0xFF 开头,直接用 uint32 读取会得到一个巨大的正数。解决方法是先把 24 位数据右移 8 位,再用 int32 类型读,这样符号位才能正确扩展。我见过不少人一开始没做符号扩展,负温度全部显示成几百摄氏度,排查了好久才发现是数据类型问题。

5.2 读数漂移和噪声偏大

如果你发现温度读数持续漂动,或是在某个值附近跳来跳去,多数情况下不是 ADC 的问题,而是外部环境或布局的问题。我总结了三个高发原因和对应的解法。

第一个是传感器自热。激励电流经过 RTD 会产生焦耳热。PT100 在 500µA 电流下自热大约 0.05℃(取决于热耗散系数),如果你把电流加到 1mA,自热可能升到 0.2℃。解决方法是把激励电流设小一些,或者增加 RTD 的散热面积,让热阻降低。

第二个是基准电阻的温漂。如果 R_REF 用的是普通贴片电阻,当板子附近有发热元件时,基准电阻阻值随温度变化,ADC 输出的读数就会跟着漂。我实测过用 100ppm/℃ 的贴片电阻做基准,环境温度从 25℃ 升到 45℃ 时读数偏差了约 0.4℃;换成 10ppm/℃ 的金属膜电阻后,同样条件下偏差降到 0.05℃ 以下。

第三个是地环路。如果传感器和 MCU 板之间距离较远,而且两端都接了大地,就会形成地环路,让工频电流流过信号地,导致 ADC 读数周期性波动。解决方法是把模拟地和数字地单点连接,或者使用隔离方案。

5.3 问题速查表

我在现场调试时习惯把常见情况列成速查表,方便快速定位问题。这里分享一张我整理的排查表:

现象可能原因排查方法
读数为全 0 或全 F传感器短路/断路用万用表测传感器阻值
读数固定不变PGA 输入饱和检查输入电压是否超量程
读数乱跳,无规律UART 波特率不匹配用逻辑分析仪抓波形
读数周期性波动工频干扰/地环路查 50Hz 滤波配置和接地
温度跟随很慢输入端滤波电容过大减小电容到 nF 级
室温下读数偏高自热效应降低激励电流
高温段偏差大传感器分度表不匹配核对 PT100 还是 PT1000
读数稳定但精度差未做两点标定按标定流程执行

5.4 冷端补偿偏差的独家排查技巧

热电偶测量里有个特别隐蔽的问题:冷端温度放置位置不对。用户常常把冷端补偿传感器放在 PCB 上远离接插件的位置,但热电偶的冷端实际在接插件位置,两者温度并不一致,这会导致几度的误差。

我调试时遇到过这样一个案例:K 型热电偶测一个 300℃ 的管道,但 MCU 读出来只有 296℃。排查了很久,最终发现接插件本身因为旁边有一根发热导线被加热到了 35℃,而板载温度传感器(用于冷端补偿)在 PCB 另一端写着 25℃。差了 10℃,结果就是热电偶读数约 0.4mV 的偏差(约 10℃ 的冷端误差,换算成热端误差也是 10℃ 的等效误差)。

解决这个问题的要点是:冷端补偿传感器的位置必须贴近热电偶接线端子,或者直接在接线端子下方埋一颗 SOT-23 封装的 NTC。如果两者不可能靠在一起,就再额外布一根热电偶接到冷端处,用第二通道单独测冷端温度。按我的经验,能用第二通道解决就不要省——毕竟 ADS122U04 有 4 个通道,多用一个通道的成本几乎是零。

再补充一个和冷端补偿相关的小技巧:如果 MCU 端已经有成熟的 NTC 测温函数,可以直接拿来测量冷端温度再校正,不一定非要用 ADC 内置温度传感器。内置温度传感器的绝对精度一般 ±0.5℃ 左右,而 NTC 标定后能做到 ±0.1℃,对高精度测温是明显的增益。

5.5 数据率与响应速度的取舍实录

还有一个在 HVAC 场景里很常见的坑:工频抑制和数据率的关系。我们需要 50Hz 工频抑制,于是把数据率配置成 20SPS,但实际测温系统要求响应时间短于 1 秒。20SPS 下,一次转换耗时 50ms,做一个简单的启动响应测试,温度从 25℃ 跳到 85℃ 需要大约 2 秒才能稳定。

如果应用场景对响应速度要求更高,可以试试把数据率调整到 200SPS 或者 500SPS,但这时候内部的 50Hz 滤波器抑制能力会显著下降,现场噪声容易混进来。我的做法是折中:数据率保持 20SPS,但把数字滤波器的平均次数调小到 4 次,这样响应时间约 200ms,噪声仍然控制在 ±0.05℃,对 HVAC 应用完全够用。如果真需要小于 100ms 的响应,就得从硬件方向屏蔽干扰,而不是靠软件后期补救。

6. 项目扩展方向与个人实操心得

这个方案底子打好之后,往上扩展非常顺。我个人的计划是把这套链路加上 Modbus RTU 协议,通过 RS-485 接口把多路温度数据直接挂到现场总线上。因为 RA2L1 的 UART 外设很丰富,一个串口给 ADC 通信,另一个串口就能跑 Modbus,硬件上一对收发器芯片就能搞定。如果有无线需求,还能替换成 LoRa 或者 Wi-Fi 模块,MCU 的算力和引脚资源都还有富余。

如果你要用 ADS122U04 做多通道数据采集,我推荐优先用连续转换模式加定时读取,配合 DMA 接收 UART 数据,这样 MCU 的负载能降到最低。FSP 对 DMA 的支持很成熟,我就是这么做的:UART 接收中断里只做数据的缓存,主循环里做解析和温度换算,各司其职,程序结构非常清爽。

做完整套系统我最大的体会是:高精度测温其实不是芯片单独的性能,而是传感器、电路布局、软件滤波、标定补偿四个环节共同协作的结果。ADS122U04 把信号链的很多麻烦事集成掉了,但总有一些暗坑藏在细节里——比如基准电阻温漂的影响会随着温度范围扩大而急剧放大,UART 半双工的方向切换需要精确控制,冷端补偿的位置正确与否直接决定热电偶能不能测准。这些经验没有写在芯片手册里,都是现场调试换来的。上面这些内容如果能把其中一个暗坑帮大家填上,那这篇分享就值了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询