做温度采集的工程师,看到题图里这两个料号,第一反应往往是:R7FA2A2AD3CFP 这颗瑞萨 RA2A2 系列 MCU,最大卖点之一就是自带 24 位 ΔΣ ADC,你嫌精度不够,还要外挂一颗同样是 24 位的 ADS122U04IPWR,这不是重复建设吗?老实说,我在 HVAC 冷源改造项目里第一次看到这个组合时也有同样的疑问。等到真正把传感器前端、长线走线、电气隔离这摊子事捋清楚,才发现这种“冗余”背后其实是分工:MCU 负责管人(通信、算法、控制逻辑),ADC 负责干细活(微弱信号放大、激励电流、比例式测量)。这篇文章就把这套 ADS122U04IPWR + R7FA2A2AD3CFP 的温度测量方案从头到尾拆一遍,包括为什么这么选型、硬件怎么接、固件怎么写、现场怎么校准,以及我在工业项目和暖通项目里踩过的坑。
1. 选型逻辑:自带24位ADC的MCU旁边,为什么还要挂一颗24位ADC
1.1 RA2A2 自带的ΔΣ ADC其实很强,但“好用”和“够用”是两回事
先给 R7FA2A2AD3CFP 一个公道评价:这颗片子本身不弱,Cortex-M23 内核,48MHz 主频,256KB Flash 配 40KB SRAM,关键是集成了精密模拟前端,做一般的仪表类产品完全够用。它的优势在于芯片级集成——你不用额外采购 ADC、不用处理 SPI 时序、BOM 更简洁,这对消费级、低成本场合非常友好。
但到了工业和 HVAC 现场,情况就不一样了。温度传感器并不是直接怼到 MCU 引脚上的,传感器可能要拉出去十几米,经过端子排、穿线管,甚至和动力线走同一个桥架。此时 MCU 内置 ADC 的第一个短板就暴露了:模拟输入引脚非常敏感,PCB 上只要走线稍长、地平面处理不好,工频噪声和开关电源的纹波就会叠加进去,24 位 ADC 直接变成 12 位精度。
第二个短板是激励能力。测 PT100/PT1000 这种热电阻,不能干测,必须给它一个恒定电流激励,把电阻变化转换成电压变化。RA2A2 内置 ADC 没有配套的可编程电流源,你得外部搭恒流源电路,或者否则只能用电桥加分压,成本和温漂风险都上去了。ADS122U04 则自带两个 IDAC 电流源,激励、基准、测量一条龙,这是专为电阻型温度传感器设计的。
第三个短板是通道数和拓扑。工业温度变送器经常要接 4~8 路传感器,虽然 RA2A2 内置 ADC 可以通过模拟多路开关扩展,但每一路进来都得经过同样的抗混叠滤波、ESD 保护、增益匹配,PCB 面积和调试工作量成倍增加。与其这样,不如让每个前端探头独立成一个小模块,各自带一颗 ADC,互不干扰,这也正是 UART 接口外置 ADC 的天然优势。
1.2 UART接口的ADC,在长线传输上比SPI和I2C更省心
ADS122U04 最特别的地方,就是它没有采用温度 ADC 最常见的 SPI 接口,而是用了一个类 UART 的两线接口。很多人不理解这个设计,觉得 UART 速率低、协议复杂,不如 SPI 干脆。但实际上,在工业温度测量这个场景里,UART 反而是最优解。
SPI 最大的问题是需要四条线:MOSI、MISO、SCLK、CS。信号频率稍高,长线传输时时钟和数据的时序关系就变得很微妙,稍有干扰,SCLK 上多一个毛刺,整帧数据就错位了。而且 SPI 做电气隔离非常痛苦——隔离 SPI 必须同时隔离时钟和双向数据,还要保证时钟抖动,光耦、数字隔离器的延迟稍不一致,就会出现奇偶位错乱。I2C 就更不用说了,开漏上拉结构在长线上容性负载一大,上升沿变得软绵绵,别说 10 米,超过 3 米就可能开始出问题。
UART 走的是异步帧,收发双方各自有本地时钟,只要波特率误差在一定范围内,哪怕线长一点、干扰大一点,也能通过起始位重新对齐字节边界。隔离也简单,发送线和接收线各用一个数字隔离器就能搞定,配合 3.3V 或 5V 的隔离电源,模拟前端和 MCU 数字部分就能彻底断开地环路。我做工业变送器时,传感器探头和主机之间经常隔着 10~20 米的屏蔽电缆,UART 加隔离是这个场景下最稳的组合。
1.3 这颗“UART ADC”并不是全能的,选型前要认清代价
当然,任何选择都有代价。ADS122U04 通过 UART 通信,意味着不能像 SPI 那样高速连续吞吐数据。它的数据速率本身也就 20SPS 到 1000SPS 这个级别,温度信号又是缓变信号,所以完全够用,但你要是想拿它同时做振动、应力等高速采集,就力不从心了。
另一个要注意的是,UART 是异步字节流,没有硬件上的 CS 信号来区分“这是在发命令”还是“这是在读数据”。好在 ADS122U04 的命令包有明确的地址字节和命令字节,只要严格按照时序收发,问题不大;但这也意味着每个命令往返都有固定开销,不能像 SPI 那样连续读取多个通道。好在温度测量不需要高吞吐,我们实际项目里用 100SPS 轮询 4 路传感器,绰绰有余。
注意:ADS122U04 是有从机地址概念的,同一路 UART 上理论上可以挂多个 ADC,通过不同地址区分。但实际工程中我不推荐这么干,因为多从机共线需要额外的收发切换和三态控制,反而引入时序风险。我更建议每个 ADC 独占一路 UART 或通过 MCU 的多个串口分别连接。
2. 硬件设计:从传感器到ADC前端,每一步都影响测量精度
2.1 常见温度传感器接入方式对比
温度传感器类型不同,前端配置天差地别。我先列一个我在实际项目中反复用到的对照表,后面再逐一展开:
| 传感器类型 | 激励方式 | 基准接入方式 | 推荐增益 | 适用场景 |
|---|---|---|---|---|
| PT100(二线/三线/四线) | IDAC 电流激励,典型 1mA | 外部 RREF 比例式 | 8 倍 | 工业过程控制、温变模块 |
| PT1000(二线/三线) | IDAC 电流激励,典型 250µA~500µA | 外部 RREF 比例式 | 2~4 倍 | HVAC 风管温度、冷热量表 |
| K 型热电偶 | 无需外部激励 | 内部 2.048V 基准 | 128 倍 | 高温工业炉、烟气温度 |
| NTC 热敏电阻 | IDAC 电流或分压电阻 | 内部 2.048V 基准 | 1~4 倍 | HVAC 低成本室温采集 |
从表中能看出,RTD 类传感器几乎都走比例式测量,而热电偶和 NTC 走的是绝对电压测量。比例式的好处后文专门讲,这里先说硬件接线的核心点:模拟输入 AIN1~AIN4 是差动的,也就是每个通道要接成“正极-负极”的差分对,而不是像单片机 GPIO 那样“一端接传感器,一端接地”。用满量程计算:以 PT100 为例,1mA 激励电流流过 100Ω 电阻,产生 0.1V 电压,8 倍增益后变成 0.8V 信号,在 2.048V 基准下余量充足,即使 PT100 温度高到 400℃ 也不会饱和。
2.2 RTD比例式测量:为什么推荐参考电阻而不是内部基准
很多人第一次用 ADS122U04 测 PT100 时,会习惯性地把内部 2.048V 基准打开,然后直接用 IDAC 激励热电阻,测电压再换算电阻。这样当然能跑通,但精度天花板很低,因为 IDAC 电流源本身有温漂,电流值并不绝对准确,出厂标称和实际值之间可能有千分之几的偏差,对应到温度上可能就是 0.2~0.5℃ 的误差。
比例式测量就是为了干掉这个误差。做法是:让同一个 IDAC 电流既流过 RTD,也流过一颗低温漂精密电阻 RREF,然后把 RREF 两端的电压作为 ADC 的参考电压。这样,ADC 输出的数字码代表的是被测电压和参考电压的比值,而这两个电压都由同一个电流产生,电流的绝对值大小、温漂、电源波动都会被自动抵消。所以只要 RREF 自身阻值够准够稳,测出来的 RTD 阻值就准,整个过程几乎和 IDAC 的电流精度无关。
RREF 阻值的选择有讲究。我常用的搭配是 PT100 配 2kΩ、IDAC 给 1mA,这样 RREF 两端电压约 2V,接近内部基准满量程,又不至于超过 ADC 的输入范围;PT1000 配 6.8kΩ、IDAC 给 250µA,则 RREF 电压约 1.7V,PT1000 在 600℃ 时阻值约 3130Ω,产生的电压约 0.78V,配合 2 倍增益,完全落在量程内,同时 250µA 的激励也让传感器自热效应小得多。
提示:RREF 一定要用温漂系数低的精密电阻,常规厚膜电阻温漂 50~100ppm/℃ 就能造成零点漂移,我建议至少用 25ppm/℃ 以下的薄膜电阻,要求再高就上 0.1% 精度、10ppm 以内的金属箔电阻。
2.3 热电偶接入和冷端补偿,初学者最容易搞混的地方
热电偶测的是热端和冷端的温差电势,冷端必须做温度补偿。ADS122U04 内部集成温度传感器,可以用来读取芯片自身温度,理论上是能做冷端补偿的,但实际项目中我更推荐把冷端补偿传感器放在接线端子上,尤其是当传感器探头通过延长线连接时。原因很简单:冷端补偿要补偿的是“热电偶导线与铜导线分界点”的温度,而不是 ADC 芯片内部的温度。芯片离接线端子还有一段 PCB 走线,这段走线产生的附加热电势虽然很小,但在 128 倍增益下也会造成不小的误差。
硬件上注意两点。第一,热电偶输入脚建议加一个较大阻值的偏置电阻到地,避免共模电压漂移导致 ADC 输入超范围。第二,冷端补偿用的 NTC 或温度传感器芯片,要尽量贴近热电偶端子,并避开板上的功率器件和电源芯片。我做 K 型热电偶变送器时,把冷端温度传感器放在端子正下方,并在 PCB 上开了一条隔热槽,防止 MCU 的热量沿铜皮传导过来,效果非常明显。
2.4 与R7FA2A2AD3CFP的接口设计:少一根线,多一份心安
ADS122U04 和 MCU 之间本质就是 UART 的两根线:发送、接收,再加上地线。接法上最容易犯的错误是把发送和接收搞反——MCU 的 TXD 要接到 ADC 的 RX(接收),MCU 的 RXD 接到 ADC 的 TX(发送),很多同学按 SPI 的习惯想当然,觉得“发送接发送”,结果上电后死活读不到数据。
硬件上我还会在 UART 两线上各串一个 100Ω 到 1kΩ 的电阻,目的是限流和阻尼。工业现场线缆存在分布电容,串阻能抑制振铃,还能在误接电源时保护 MCU 和 ADC。如果现场电磁环境复杂,UART 线上还要加上 TVS 管到地,我一般用双向 TVS,钳位电压选 5~6V,既不影响 3.3V 电平,也能把静电和浪涌泄放掉。
如果要做电气隔离,就在 MCU 和 ADC 之间加数字隔离器。隔离器的电源用隔离 DCDC,数字地和模拟地彻底分开,UART 变成两路单向隔离,比隔离 SPI 简单太多。RA2A2 的串口直接接隔离器,注意复位时序——ADC 上电后需要一小段时间完成内部初始化,MCU 这边要等 ADC 准备好再发第一条命令,我会在初始化函数里加一个 100ms 的延时来保证时序稳定。
3. 固件实现:UART命令交互、寄存器配置和数据换算
3.1 先搞清UART帧结构和命令交互方式
ADS122U04 不是那种“上电就自动往外面吐数据”的 ADC,它更像一个带串口的小型仪器:MCU 发命令包,ADC 返回响应或数据。这种交互模式好处是确定性强,坏处是 MCU 得按状态机来管理命令时序,不能像 SPI 那样完全靠硬件控制器自动搬数据。
我推荐在 RA2A2 上用串口 DMA + 空闲中断来收发,这样 MCU 不阻塞。典型命令流程是:MCU 发送寄存器写入命令包,ADC 执行后返回状态;MCU 发送启动转换命令,ADC 开始采样;MCU 定时发送读数据命令,ADC 返回 3 字节的 24 位转换结果。命令包的构成是地址字节、命令字节、参数数据,某些命令还带 CRC 校验字节,具体宏定义如下,真实编码值以手册命令表为准:
#define ADC_CMD_RESET 0x06 #define ADC_CMD_START 0x08 #define ADC_CMD_RDATA 0x10 #define ADC_CMD_RREG 0x20 #define ADC_CMD_WREG 0x40 #define ADC_DEV_ADDR 0x00 // 默认地址,根据硬件引脚确定这里要特别提醒一点:ADS122U04 的命令,尤其是复位命令,有最小脉冲宽度的要求。我最初参考别人的驱动,复位命令后立刻读寄存器,结果数据全是 0xFF,后来查手册才发现复位后器件需要几十毫秒的稳定时间。稳妥的写法是复位后延时 50ms 左右,再读取器件 ID 或寄存器值确认通信正常,然后再进入配置阶段。
3.2 寄存器配置:什么时候用单次转换,什么时候用连续转换
ADS122U04 的寄存器组不算复杂,核心配置分布在几个配置寄存器里,分别管输入多路选择、增益、数据速率、基准、IDAC 电流等。我写了一个配置函数,把常用参数封装成结构体,这样代码可读性好很多:
typedef struct { uint8_t mux; // 输入通道选择,取值参照寄存器说明 uint8_t gain; // PGA增益档位 uint8_t data_rate; // 数据速率档位 uint8_t vref; // 基准选择: 内部/外部 uint8_t idac_on; // IDAC电流源使能 uint8_t idac_mag; // IDAC电流大小 } adc_config_t; static void adc_write_config(const adc_config_t *cfg) { uint8_t buf[4]; /* 构造四个配置寄存器字节, 位含义按手册逐项设置 */ buf[0] = (cfg->mux << 4) | (cfg->gain & 0x07); buf[1] = cfg->data_rate; /* 连续转换模式, 数据速率档位 */ buf[2] = (cfg->vref << 7) | (cfg->idac_on & 0x03); buf[3] = cfg->idac_mag; adc_send_command(CMD_WREG, buf, 4); }这里不直接贴逐位含义,是因为不同版本的寄存器映射略有差异,拿到 datasheet 对照设置即可。但有两个原则是通用的:第一,配置寄存器不要一次性把所有位都写上,优先用读-改-写的方式,避免覆盖默认值;第二,增益和数据速率的组合会影响噪声,后面专门讲怎么配。
关于单次转换和连续转换的选择,我的建议是:如果只测一路温度,用单次转换加中断唤醒;如果同时测多路传感器,用连续转换,然后按通道切换节奏读取。单次转换的好处是能严格控制功耗,尤其在变送器由 4-20mA 环路供电的场合,环路电流就那么点,不能让 ADC 一直满速跑。
3.3 读取24位数据并换算成真实电阻或温度
ADS122U04 返回的 24 位数据是二进制补码,最高位是符号位,所以要先合成带符号的 32 位整数,再做换算。我在 RA2A2 工程里写了一个读取函数,校验字节对齐和符号扩展:
static int32_t adc_read_signed(void) { uint8_t rx[4]; int32_t raw; /* 发送读数据命令后接收 3 字节数据 */ adc_send_and_receive(CMD_RDATA, rx, 3); /* 三字节补码扩展为 int32 */ raw = ((int32_t)rx[0] << 16) | ((int32_t)rx[1] << 8) | (int32_t)rx[2]; if (raw & 0x800000) { raw |= 0xFF000000; /* 符号扩展 */ } return raw; }得到原始码之后,换算公式取决于测量类型。如果是 RTD 比例式测量,RREF 是已知的,那么被测电阻值可以直接用比例关系算出来,公式是 R_rtd = (ADC_RT_CODE / 0x7FFFFF) × RREF,其中 0x7FFFFF 是接近正满量程的码值。直观理解就是:ADC 输出表示“RTD 电压占参考电压的比例”,参考电压是同一电流流过 RREF 产生的,所以比例就等于 RTD 阻值与 RREF 阻值的比值。
换成温度值,PT100 和 PT1000 都用 IEC60751 的多项式,0℃ 到 850℃ 范围可以用简化二次式:Rt = R0 × (1 + A×t + B×t²),其中 R0 是 0℃ 时的标称阻值,A 和 B 是标准系数。我习惯先用二分查找把电阻对应到粗略温度,再用一次牛顿迭代修正,实测精度能做到 0.1℃ 以内。热电偶就要查 NIST 多项式表,工作量稍大,但思路一致:先由电压查温度,再叠加冷端补偿温度。
3.4 通信错误处理和CRC校验,别让小概率事件恶心到你
UART 在工业现场再抗干扰,也不能保证百分之百不丢帧。我见过不少项目,MCU 读完 ADC 直接解析数据,不做任何校验,结果偶发一个字节错位,温度瞬间跳几百度,触发误报警。ADS122U04 的读数据命令返回的是固定长度数据,当通信异常时,解析出来的数值往往不在合理范围内,所以固件里必须加数据合理性判断。
我习惯在驱动层做三件事:一是读到的原始码超出传感器物理范围时,判定为无效数据并重新同步 UART;二是开启 CRC 校验,命令包和响应数据带 CRC 字节后能拦截绝大多数位错误;三是在应用层做滑动滤波加突变检测,单次数值跳变超过 5℃ 时不直接使用,连续多次确认后才更新显示。这套逻辑写起来不复杂,但能让系统在工业现场少很多莫名其妙的故障。
提示:如果使用了 RC 滤波和软件均值,还要注意“真实跳变”和“异常跳变”的区分。温度变送器在供电中断再恢复时,温度本来就该快速变化,所以突变检测要设置一个安全窗口,比如 3 秒内累计变化不超过 30℃,否则会把正常现象也过滤掉。
4. 精度校准与噪声控制:24位ADC不代表能测出24位精度
4.1 数据速率和数字滤波怎么搭配,才能躲开工频干扰
ADS122U04 的最高数据速率虽然能到 1000SPS,但温度测量完全没有必要跑那么快。数据速率越高,等效噪声越大,24 位 ADC 的优势就越体现不出来。我实测过一颗 PT1000 探头,在 1000SPS 下峰峰值噪声达到 ±15 个 LSB,换算成电阻就是 ±3Ω,温度抖动近 1℃;降到 100SPS 时,峰峰值噪声降到 ±3 个 LSB,对应温度抖动约 0.1℃;再降到 20SPS,噪声能进一步压到 ±1 个 LSB 附近。
选择数据速率时,除了看噪声指标,还要考虑工频干扰。如果现场环境有 50Hz 工频,我建议数据速率选 20SPS 左右,因为 ΔΣ ADC 内置的滤波特性能在 50Hz 及其整数倍频率附近提供陷波效果。虽然 50Hz 不是 20SPS 的整数倍关系,低速率下 ADC 自身数字滤波已经能有效压制工频噪声,实际效果比单纯加快速率明显得多。HVAC 项目里风柜、水泵都是感性负载,工频干扰是主要噪声来源,20SPS 是我最常用的档位。
4.2 增益余量设计:别把ADC灌到满量程,留出裕量才能稳定
设计增益时,很多人喜欢把信号放大到接近满量程,觉得这样分辨率最高。这个思路不能算错,但工程上不会这么激进,因为传感器本身的离散性、接线端子老化、温度超范围等情况下,信号可能超出满量程,ADC 直接饱和,读数固定在最大值上,就完全失去意义了。
我的做法是让标称最大信号只占到满量程的 60%~80%。以 PT1000 在 HVAC 的应用举例,测量范围设定为 -20℃~120℃,对应阻值约 850Ω~1520Ω。用 250µA 激励,最高点电压约 0.38V,满量程如果按内部 2.048V 算,只占 18% 左右,这时候我愿意把增益提上去。但如果用 1mA 激励,最高点电压 1.52V,再用 8 倍增益就直接饱和了,所以增益必须反过来往低处调。每次改传感器量程时,都先把理论最高电压算一遍,再定增益档位,这是避免“满量程饱和”的最好办法。
增益档位和基准电压配合也有讲究。比例式测量时,参考电压由 RREF 决定,增益只是把 RTD 压降放大到和参考电压可比的程度,并非越大越好。因为增益太大,等效输入噪声也会被放大,RTD 微小电阻变化虽然能分辨出来,但基线抖动跟着一起放大,最后温度换算结果反而更晃。
4.3 从零漂到增益误差:一套能落地的标定流程
任何 ADC 系统,出厂前都要标定。ADS122U04 的失调电压和增益误差虽然很小,但配合外部 RREF、保护电阻、走线压降之后,整体链路还是有偏差。我的标定流程分三步:
第一步是零点标定。把 ADC 输入短接,读取输出码,这个码就是零点偏移,在软件里保存并减去。注意,短接位置要在传感器接口处,而不是 ADC 芯片引脚处,这样能把输入保护电阻的压降也标定进去。
第二步是增益标定。用一个高精度标准电阻箱接到传感器端子,分别设置两个已知阻值点,比如 PT1000 用 1000Ω 和 1500Ω,读取数据,计算实际增益和理论增益的比值,存为增益补偿系数。实际操作时,最好用干体炉或恒温槽配合标准铂电阻温度计,这样标出的不是纯电阻误差,而是完整的“电阻-温度”传递误差。
第三步是线性验证。在测量范围内选 5 个温度点,记录每个点的显示值和标准值,计算最大偏差。如果偏差呈线性,说明增益补偿系数没调好;如果偏差在某个区间突然变大,要检查是不是传感器引线接触不良或绝缘下降。我在 HVAC 项目里用的恒温槽设定在 0℃、25℃、50℃、75℃、100℃ 五个点实测,标定后整体误差能控制在 ±0.15℃ 以内。
4.4 实测数据参考:不同配置下的噪声表现
下面这张表是我在某次开发板测试时记录的典型数据,传感器为 PT1000,室温 25℃,供电 3.3V LDO,仅供参考对比趋势:
| 数据速率 | PGA 增益 | 内部基准 | 测量方式 | 温度峰峰值抖动 |
|---|---|---|---|---|
| 20SPS | 2 | 比例式 | 500 次采样统计 | ±0.04℃ |
| 100SPS | 2 | 比例式 | 500 次采样统计 | ±0.12℃ |
| 1000SPS | 2 | 比例式 | 500 次采样统计 | ±0.85℃ |
| 20SPS | 8 | 比例式 | 500 次采样统计 | ±0.06℃ |
从表里能明显看出,数据速率对噪声的影响远大于增益档位。想要高精度,把速率降下来比什么都管用。如果系统必须同时满足高速率和低噪声,那就得上外部硬件滤波,比如在模拟输入端加简单 RC 低通,把高频噪声先滤掉一部分,再进 ADC 采样。
5. 现场避坑实录:HVAC机房和工业现场最容易翻车的五个地方
5.1 接地环路:看起来量出的是温度,其实量的是地电位差
工业现场最容易翻车的不是芯片本身,而是接地。传感器探头一端接设备管道,另一端接 ADC 模块,如果两端各自接了不同的地,地之间存在几百毫伏甚至几伏的电位差,ADC 输入就会叠加一个直流共模电压。24 位 ADC 的分辨率太高,这点地电位差在输出码上直接就是不可忽略的误差。
我踩过一次很典型的坑:在某化工厂的现场变送器上,探头接入不锈钢管道,管道通过法兰良好接大地,而变送器内部的地是开关电源的浮地,两者之间实测有 1.2V 左右的电位差,导致温度读数整体偏高了 10℃ 以上。后来把直流 AC-DC 换成隔离模块,模拟地和现场管道地在接线端子处单点接地,读数立刻恢复正常。只要涉及金属管道或设备外壳,都要先确认地电位关系,别迷信“共地没问题”的说法。
5.2 大功率设备启停:UART线上莫名丢数据,不一定是波特率没配对
HVAC 机房里的冷水机组、风柜电机一启停,UART 偶尔会丢帧。最初我以为是波特率漂移,检查半天没发现问题,后来用示波器抓到,是电机启动瞬间电缆上的感应尖峰直接耦合到了 UART 线缆上,幅度超过芯片逻辑电平阈值,造成误触发。
解决办法是在硬件上加滤波和钳位。UART 接收线上加一个 10nF 左右的电容到地,和串阻组成低通,能滤掉几十纳秒的窄尖峰;同时加 TVS 管做钳位。软件侧也别闲着,接收数据做好帧头帧尾校验,宁可丢掉一帧,也不要拿错数据去算温度。我后来甚至在协议里加了“连续两帧数据校验一致才更新输出”的规则,虽然多了一条 20SPS 的延迟,但可靠性提升明显。
5.3 长线传输:传感器线不是越粗越好,屏蔽层接法有讲究
温度探头到 ADC 模块的线缆,如果超过 5 米,我一般用屏蔽双绞线。双绞线能让两根信号线上的电磁感应噪声基本等量且反相,ADC 的差分输入正好把它们抵消掉。屏蔽层的作用是阻挡外部电场干扰,但它不是随便接个地就完事——屏蔽层必须单端接地,而且只能接在 ADC 模块这一端,另一端悬空。如果两端都接地,屏蔽层会变成地环路的一部分,反而把地电位差引到系统里来。
线径方面,不要太粗,0.5mm² 左右足够信号传输,重点是绞合工艺和屏蔽覆盖率。我曾经图省事用了普通平行线,结果 10 米外测量误差波动明显增大,换成屏蔽双绞后噪声电平至少下降了三分之二。
5.4 电源纹波:模拟部分和数字部分,老老实实分电源
ADS122U04 对电源噪声其实有一定免疫力,因为它的参考电压如果是外部比例式的,电源波动会同时影响信号和基准,部分抵消。但内部基准模式下,电源上的纹波会直接注入测量路径。HVAC 控制柜里常常是开关电源统一供电,纹波可能有几十毫伏,直接给 ADC 供电效果很差。
我给 H VAC 模块供电时,用的是两级处理:先由开关电源进一个低噪声 LDO,比如 3.3V 输出,再用 LC 滤波给模拟电源引脚;数字电源和模拟电源引脚中间加磁珠隔离。RA2A2 的 IO 供电用另一路 LDO 也来得方便。这样虽然多花了几毛钱的成本,但能把示波器上看到的几十毫伏毛刺压到几毫伏以内,实测 ADC 噪声也明显下降。
5.5 冷端补偿被电路板热量干扰:明明是室温,读出来却偏高3℃
用热电偶时,冷端补偿传感器的位置直接影响最终精度。我第一版 PCB 把冷端芯片放在 MCU 旁边,想着离 ADC 近些走线方便。结果一上电,MCU 发热导致冷端芯片处温度上升,冷端补偿值偏大,热电偶读数整体偏低。后来我把冷端芯片挪到接线端子正下方,PCB 上也刻意避开了 MCU 正下方的走线区域,同时给冷端芯片加了一个小小的导热焊盘贴到端子上,让补偿传感器感受的是真正的接线端子温度。改版后,实测从“偏高 3℃”降到“偏差 0.2℃ 以内”。
另外一个容易忽略的细节:接线端子本身的材质也会产生热电势。铜质端子和镀锡端子之间、不同金属的连接点,都会形成寄生热电偶。虽然单个寄生热电势只有微伏级,但在 128 倍增益下也会放大成不可忽视的温度误差。选端子时尽量选择同材质、同镀层的产品,并且把冷端补偿点放在所有不同金属交界面的“共同温度”位置,让各寄生热电势相互抵消。
写在最后的一点个人体会
这套方案我从最初的 EVM 评估板玩到产品量产,前前后后改了三版。第一版想着“RA2A2 自带 ADC 不用白不用”,结果在长线传感器和隔离需求面前一次次返工;第二版规规矩矩用外置 ADS122U04,但电源和接地没处理好,噪声和漂移修得脑壳疼;第三版才真正吃透了比例式测量和冷端补偿的精髓,把硬件、固件、校准的配合理顺了。后来我得出一个经验:温度测量项目里,芯片选型只是起点,真正决定成败的是信号链的整体设计——激励、基准、滤波、隔离、校准,每一个环节都在和“误差”赛跑。ADS122U04IPWR 加 R7FA2A2AD3CFP 这套组合,在这个赛道上给我的感觉是相当可靠,也让我对“为什么工业仪表厂商偏爱专用模拟前端”这件事有了更直观的理解。如果你们也在做类似的 HVAC 或工业温度采集项目,希望这篇文章能帮你少走几步弯路。