1. 为什么选这对组合:从项目需求倒推方案选型
做工业温度采集和 HVAC 系统设计的人,应该都有这种感觉:选一个温度传感器不难,难的是把传感器输出的微弱信号稳定、准确地变成 MCU 能读懂的数字。这次项目用的是 TI 的 ADS122U04IPWR 与 ST 的 STM32F215RE,这个组合不是随手抓的,而是从实际需求一步步倒推出来的。
先说应用场景。工业侧和 HVAC 侧的测温点,虽然都在“测温度”,脾气却完全不同。厂房里可能要同时接 PT100 铂电阻测管道温度,又要接热电偶测锅炉或压缩机排气温度;暖通项目里还经常用 NTC 热敏电阻测风管和回水温度。如果用传统方案,每种传感器配一种调理电路,再各自接 ADC 或单片机自带的 ADC,板子会变得很臃肿,校准也麻烦。ADS122U04 四通道输入、内置可编程增益放大器,支持热电偶、RTD、热敏电阻多种传感器,正好把前端信号调理的工作统一掉了。
硬件架构上最值得注意的一点是:这颗芯片不走 SPI 或 I2C,而是走 UART。刚开始我也觉得奇怪,温度采集为什么要用串口?后来琢磨明白了——UART 抗干扰能力强,通信线可以延长到几米甚至十几米,很多时候只要两根线就够了。在工业现场,SPI 那种高速同步时钟线特别容易受电机启停、变频器干扰的影响,UART 异步通信反而更皮实。
STM32F215RE 这边,Cortex-M3 内核跑到 120MHz,处理 24 位 ADC 数据绰绰有余。关键是这芯片串口多,USART1/2/3 和 UART4/5/6 加起来有六个,留一个给 ADS122U04,其他还能接触摸屏、上位机或者组网。F2 系列自带硬件 CRC 模块,后续要做 Modbus RTU 或者自定义协议的校验帧,直接交给硬件处理,主循环占用极小。选这颗料,不光是性能,更多是看在工业级供货稳定、后续升级空间充足这一点上。
这套系统最终实现的效果是:一路 PT100、一路 K 型热电偶、两路 NTC 热敏电阻同时采集,量程覆盖 -40℃ 到 250℃,整机误差控制在 ±0.3℃ 以内(不含传感器自身误差)。下面我就把整个方案从头到尾拆开讲,包括硬件设计、寄存器配置、UART 协议对接、温度换算公式和现场踩坑记录,给同样在做工业采集或 HVAC 控制的朋友一份可以直接抄作业的参考。
1.1 工业/HVAC 温度测量的底层需求
先列一下这两类场景对测温的真实要求。工业侧,比如空压机排气温度、注塑机料筒温度、烘箱风道温度,特点是温度高、变化快、干扰大。这些场合常用热电偶(K 型、J 型)或者 PT100/PT1000 铂电阻。热电偶输出的热电势只有微伏级,几十微伏的变化就可能对应 1℃ 的温度差,这就要求 ADC 的分辨率和噪声性能都过硬。PT100 则是阻值随温度缓变,0℃ 时 100Ω,100℃ 时约 138.5Ω,变化量很小,如果激励电流不稳或者 ADC 自身的差分非线性不好,误差会非常难看。
HVAC 侧,常见的测温件是风管内的 NTC 10K 热敏电阻、回水温度传感器、盘管进出口温度传感器。温度范围通常窄(-10℃ 到 80℃),但数量多、线缆长,很多装在吊顶里或者空调机房角落,维护很不方便。最大的痛点是长线传输带来的衰减和共模干扰——风机变频器一启动,传感器线上感应出来的噪声可能有几百毫伏,直接把真实信号淹没掉。
把两类需求放到同一张需求清单上看,对前端采集芯片的要求就非常清晰了:要有多个输入通道,要内置可编程增益放大器和基准源,要能直连热电偶和 RTD,同时通信接口还必须有比较强的抗干扰能力。ADS122U04 几乎就是按着这份需求清单设计的。
1.2 ADS122U04IPWR 的前端采集优势
ADS122U04 是 24 位 Δ-Σ ADC,四通道输入,支持单端和差分两种方式,最特别的是带 UART 接口。芯片内部集成了 PGA,增益从 1 倍到 128 倍可调,微伏级的热电偶信号可以直接送进去放大,不用额外搭仪表放大电路。内部还有一个低温漂基准电压源,做 RTD 比例测量时直接用它做参考,省掉一颗昂贵的精密基准芯片。
采样率方面,ADS122U04 最高能跑到 20kSPS,但温度应用一般用 20SPS 到 1000SPS 就够了。低采样率下内部数字滤波器能抽得更深,对 50Hz 工频干扰的抑制效果更好。芯片内部自带温度传感器,这对热电偶冷端补偿非常有价值——直接读片内温度,省掉一个外部 NTC 和一路额外的采样通道。
值得一提的还有它的 UART 地址功能。多个 ADS122U04 可以挂在同一条 UART 总线上,每个芯片设置不同的地址,主控发命令时带上目标地址就能点名访问。这对多区域温度采集非常有意义,比如一个制冷站里十来个温度点,用两条线串成一串,比传统并行接法省线缆、好维护。
1.3 为什么处理器选了 STM32F215RE 而不是更低成本的芯片
有朋友会问,测个温度用得着 F2 吗?搞个 F1 或者 C8T6 不行吗?说实话,如果只是单个测点,低成本的片子确实够。但这次项目不是单点测温,而是一台设备里同时要处理好几个功能:ADS122U04 的数据解析、PID 控温算法、RS485 和上位机通信、LCD 显示、几个继电器输出。把这些功能叠起来,小容量芯片的 Flash 往往会吃紧。
STM32F215RE 的配置是 512KB Flash + 128KB SRAM,主频 120MHz。这个余量意味着我可以放心地用浮点库做温度换算公式,用状态机处理串口协议,还能在此基础上跑 RTOS 做任务调度。F2 系列有硬件 CRC 模块,算 Modbus 的 CRC16 时几乎不占 CPU,这对中大型 HVAC 控制器来说很实用。
还有一个我在意的地方是引脚兼容性。F2 和 F4 系列有不少封装引脚兼容,万一以后算法复杂度上来了要换更强的芯片,PCB 可以基本不动。选型的时候把“未来两年的升级空间”考虑进去,能省掉很多返工时间。
2. 硬件设计要点:从传感器到 MCU 的完整链路
这块是我踩坑最多的部分。硬件设计如果马虎,后面固件再怎么写也救不回来。下面按信号流向,把每个环节拆开讲清楚。
2.1 传感器接口怎么接:PT100、热电偶、NTC 三种接法
做混合采集时,首先要规划好四路输入怎么分配。我这次的分配是:AIN0-AIN1 接 PT100 做差分测量(四线制);AIN2-AIN3 接 K 型热电偶(差分),其中 AIN2 接热电偶正极、AIN3 接负极;NTC 则通过板载分压电路接在剩下的通道上。ADS122U04 只有四路模拟输入,如果同时接三类传感器,需要合理规划通道,必要时加模拟开关做通道扩展。
PT100 建议用四线制或三线制,特别是线缆比较长的时候。四线制的原理是两根线给传感器提供恒定激励电流,另外两根线专门用于采样电压,因为采样回路几乎没有电流,线上压降不会带来误差。我用的激励电流是 500μA,PT100 在 0℃ 时产生约 50mV 信号,250℃ 时约 86mV,配合 PGA 增益 16 倍,满量程分辨率足够。注意激励电流尽量别超过 1mA,否则 PT100 自身发热会产生可观的测量误差,尤其是流体静止的场合,自热效应会让读数持续偏高。
热电偶这边,关键不是放大,而是冷端补偿。热电偶测的是热端和冷端之间的温差,冷端温度一变,读数就跟着偏。我的做法是直接把热电偶的冷端接在 ADS122U04 芯片附近的 PCB 铜箔上,让冷端温度和芯片封装温度尽量一致,再用片内温度传感器读出冷端温度,在软件里做补偿。这个方法比自己外挂 NTC 贴到端子排上要靠谱得多,因为外部 NTC 贴装位置稍有偏差,冷端温度测量就不准了。
NTC 的接法相对简单,10K NTC 加一个 10K 精密电阻做分压,激励电压从内部基准引出,ADC 采集分压点电压。这里要注意分压电阻的温度系数一定要选好的(25ppm 或更优),否则 NTC 自身精度再高,也会被分压电阻的温漂拖累。
2.2 供电、基准和地的设计细节
ADS122U04 的供电范围是 2.3V 到 5.5V,我选了 3.3V 供电,和 STM32F215RE 共用电源域。但要注意,模拟供电和数字供电必须做隔离处理——至少用磁珠或 10Ω 电阻隔开,然后分别加 10μF 和 0.1μF 去耦电容。ADC 的内部基准虽然温漂低,但对外部噪声仍然敏感,基准引脚附近要铺铜,并远离开关电源和继电器驱动区域。
地线设计的经验是“单点汇地”。传感器信号地、ADC 模拟地、STM32 数字地最终在板子的电源入口处汇合到一个点,避免数字回流电流流过模拟地平面。特别是同时驱动继电器或电磁阀的项目里,如果地线到处乱走,ADC 采集值的最后几位会一直跳动——这不是算法问题,是地弹噪声。
还有一个很容易忽略的地方:UART 的 TX/RX 线。ADS122U04 的逻辑电平是 3.3V,可以直接连 STM32F215RE 的 USART 引脚。但如果板子和主控板之间距离较长,最好加一级 RS485 转接,利用差分信号传输。UART 本身是单端信号,超过 30cm 的普通导线就可能受到变频器或马达启停的干扰,出现乱码或 CRC 错误。实测下来,500mm 以内的板内连线问题不大,超过这个长度就必须考虑隔离或差分方案。
2.3 原理图与 PCB 布局的关键原则
原理图设计时,我遵循了几个原则。
供电进线处先放一个 LC 滤波器,电感选 1μH 到 10μH,配合 10μF 电容,能有效滤掉开关电源的开关纹波。ADS122U04 的 DVDD 引脚单独接 10Ω 隔离电阻,模拟电源 AVDD 直接来自滤波后的电源。
每个模拟输入引脚前都加了 RC 低通滤波器,电阻 1kΩ、电容 0.1μF,截止频率约 1.6kHz。这个滤波有两个作用:一是滤掉传感器长线上感应的高频噪声;二是为 ADC 内部的采样开关提供一个稳定的电荷来源。要注意 RC 的电阻不能太大,否则会与传感器源阻抗构成分压,带来增益误差。1kΩ 是我实测下来比较稳妥的取值。
PCB 布局上,ADS122U04 放在整块板子的中央偏传感器接口侧,尽量缩短高阻抗信号线的走线长度。模拟信号和数字信号分区走,不要平行。电源和地尽量用整块铺铜,不要有过细的地线——地线太细,回流阻抗大,噪声就大。晶振远离模拟输入引脚,继电器、开关电源等高干扰器件放在板边。
3. 固件实测:UART 协议解析与 STM32F215RE 驱动实现
硬件只是骨架,真正让系统动起来的是固件。这一节把从寄存器配置、UART 命令交互,到最终拿到 24 位二进制补码并换算成温度的完整流程讲一遍。
3.1 ADS122U04 的寄存器配置与转换流程
ADS122U04 的寄存器主要有四个:配置寄存器 0(Config0)、配置寄存器 1(Config1)、配置寄存器 2(Config2)、配置寄存器 3(Config3)。
Config0 控制输入多路选择、PGA 增益和转换模式。比如选择哪两个引脚作为差分输入对、增益设成多少倍、是单次转换还是连续转换,都在这里面。我在 PT100 通道用 16 倍增益,热电偶通道用 128 倍增益。优先选连续转换模式,这样主控随时可以读最新结果,逻辑最简单。
Config1 用于数据速率设置。温度应用我配的是 20SPS,这个速率下对 50Hz 工频干扰的抑制效果比较好,数据也足够平滑。如果系统要求更快的响应速度,可以提到 640SPS 或者更高,但高采样率下噪声会明显增大,需要靠外部滤波补回来。
Config2 是基准源选择和内部温度传感器使能。我直接选择内部基准,热电偶冷端补偿需要读取片内温度,所以温度传感器必须打开。
Config3 是 UART 接口的地址和 CRC 设置。单芯片用默认地址就行,多芯片挂在同一条总线时才需要单独分配地址。CRC 建议调试阶段关闭,量产阶段再开启。
写寄存器的 UART 命令格式很统一,基本都是“命令字节 + 数据字节”。例如写配置寄存器时发 0x42、0x43、0x44、0x45 分别对应写 Config0 到 Config3,后面跟寄存器数据;读寄存器则发 0x22、0x23、0x24、0x25。启动转换发 0x08,读转换结果发 0x12,会返回三个字节。整体协议不复杂,但每条命令的时序必须严格按数据手册来,尤其是读数据之前要确保转换已经完成。
下面是我在 STM32 上初始化的关键代码骨架:
// 初始化 USART1,波特率 9600,8N1 // ADS122U04 的 UART 波特率不是随便设的,实测 9600 很稳定 // 温度应用不需要高波特率,9600 足够 void ADS122U04_Init(void) { // 1. 写 Config0:选择输入通道、PGA 增益、连续转换模式 // 寄存器位编码以手头数据手册为准,不同批次可能有修正 uint8_t c0 = 0x00; // 连续转换模式 + AIN0-AIN1 差分 + PGA=16 // 具体位值建议边看手册边填,我这里只给框架和注释 ads_write_reg(0x42, c0); // 2. 写 Config1:数据速率设为 20SPS ads_write_reg(0x43, 0x05); // 3. 写 Config2:使能内部基准和片内温度传感器 ads_write_reg(0x44, 0x01); // 4. 写 Config3:设置 UART 地址为 1,关闭 CRC(调试阶段) ads_write_reg(0x45, 0x01); // 5. 启动连续转换 ads_send_cmd(0x08); }代码里我只给了框架,具体位值没有硬编码,原因很简单:有些数据手册版本对位域的定义做过调整,直接抄网上的代码反而容易出错。正确做法是把寄存器位的定义表打印出来,对着自己的配置需求逐位填,然后回读寄存器验证一遍。这个回读验证的动作,能帮你省下一晚上的调试时间。
3.2 STM32F215RE 端 UART 驱动与数据校验
STM32 侧的 USART 配置比较常规,但有几个细节直接影响稳定性。
首先是波特率。我最初按数据手册试过 19200,发现某些板子偶尔出现帧错误,后来降到 9600 就非常稳定了。温度采集的实时性要求没那么苛刻,9600 波特率下读三个字节大约 3ms,完全够用。如果项目需要更高的采样率,可以试 38400,但布线质量和终端电阻都要跟上。
其次是接收超时处理。ADS122U04 每发一帧数据是三个字节(24 位转换结果),接收时必须一次性收完。我推荐用 STM32 的 IDLE 中断(空闲中断)来判断一帧结束——总线上空闲超过一个字节时间就认为一帧完成,这样比固定字节数超时更灵活。当然,如果固件里用的是 DMA 加固定长度接收,也可以,但要特别注意和发送命令的节奏配合,避免把命令的响应字节和下一帧数据粘在一起。
数据校验方面,ADS122U04 支持 CRC,但开启后每帧会多一个字节,处理复杂度上升。调试阶段我强烈建议先关闭 CRC,把通信链路调通、确认数据稳定之后,再开 CRC 做量产保护。判断数据是否有效,除了看 CRC,还有一个更简单的方法是看符号扩展位:24 位数据在 32 位变量里存储时,如果电压超量程,最高位会异常,软件可以根据这个特征快速过滤坏数据。
读回来的是 24 位二进制补码,高字节在前、低字节在后。要转成有符号数,先拼成一个 uint32_t,再判断最高位(第 23 位)是否为 1,如果为 1 则做符号扩展。参考代码:
int32_t ads_read_result(void) { uint8_t buf[3]; uint32_t raw = 0; ads_send_cmd(0x12); // 发送 RDATA 命令 ads_uart_receive(buf, 3); // 接收 3 字节 raw = ((uint32_t)buf[0] << 16) | ((uint32_t)buf[1] << 8) | ((uint32_t)buf[2]); // 24 位有符号扩展 if (raw & 0x800000) raw |= 0xFF000000; return (int32_t)raw; }如果你发现读回来的数据偶尔是 0xFFFFFF 那种满量程极端值,先别急着怀疑传感器,很大概率是通信错位或者命令时序没对齐。这是最常见的坑,后面我会专门讲排查方法。
4. 实测数据:从原始码到真实温度的换算与调优
拿到 ADC 原始值之后,真正的工程问题才刚刚开始。这一节讲温度换算公式、实测过程中的校准操作,以及几个影响精度的典型坑。
4.1 三种传感器的温度换算公式
先说 PT100。PT100 的电阻-温度关系可以用 Callendar-Van Dusen 方程描述:
在 0℃ 以上:Rt = R0 × (1 + A×t + B×t²)
其中 R0 = 100Ω,A = 3.9083×10⁻³,B = -5.775×10⁻⁷。工程上如果不想在线做二次方程求解,最稳妥的办法是建一张 0.1℃ 步进的查找表,再用线性插值求温度。STM32F215RE 有 128KB SRAM,放一张几百项的表格完全没压力。
实际用 ADC 读数算电阻时,要注意比例测量的特性。如果激励电流源和基准电压都来自同一个内部源,数字输出 code 满足关系:code = (gain × Vrtd) / Vref × 2^23。代入 Vrtd = I_激励 × R_pt100,Vref = I_激励 × R_ref,整理后得到:
R_pt100 = (code / 2^23) × (R_ref / gain)
这里的 R_ref 是激励电流采样电阻,我用的是精密 1kΩ,精度 0.1%。注意这个公式里的 gain 是 PGA 的实际增益倍数,要和配置寄存器里写的值一致。
热电偶的换算相对复杂:先由 ADC 原始码算出热电势,然后根据热电偶分度表查表得到“热端相对冷端的温度”,再加上冷端绝对温度,才是真实温度。冷端温度用 ADS122U04 内置温度传感器读数,查表或线性拟合得到 Tz,最终 T_real = T_tc + Tz。K 型热电偶在 0-200℃ 范围灵敏度约为 41μV/℃,所以高精度测量对 ADC 的噪声性能要求很高。
NTC 的换算用 Steinhart-Hart 方程:
1/T = A + B×ln(R) + C×(ln(R))³
其中 A、B、C 是热敏电阻厂家提供的系数。以 25℃ 时阻值 10kΩ 的常用 NTC 为例,典型值是 A=1.129241e-3,B=2.341077e-4,C=8.767411e-8。直接用浮点算即可,STM32F215RE 的 FPU 处理这个计算毫无压力。
我建议把所有换算法则封装成独立函数,接口统一为“传感器通道号加原始码”,返回 float 温度值。以后增加新传感器类型或新通道,只需要加一个分支函数,不影响主流程。
4.2 两点校准与软件滤波实测
校准是温度采集精度最容易忽视的一环。出厂校准我做的是“冰水浴加沸水浴”两点校准。把 PT100 探头分别放入 0℃ 冰水混合物和 100℃ 沸水中(注意当地海拔对应的沸点要修正,比如高原地区沸水实际不到 100℃),记录 ADC 读数,然后做线性映射。实际操作中,沸水浴那点和 NTC 的高温段会有一定非线性,所以我额外加了一个 60℃ 的中间点做二次插值,效果很好。
热电偶的校准必须包含冷端补偿校准。我的做法是用一个精密温度源贴在 ADS122U04 芯片表面,记录内置温度传感器读数。如果发现它和真实温度偏差超过 ±0.5℃,就对内置温度传感器的偏移和增益做两点修正。工业项目里这一步不做,热电偶通道在冬夏温差大的现场读数会漂。
软件滤波我测试过三种方案:滑动平均、中值滤波、一阶低通。最终采用的是“中值 + 滑动平均”两级处理——先取 5 个点做中值滤波,去掉偶发的毛刺,再做一次 4 点滑动平均,抑制周期性噪声。实测下来,在电机频繁启停的车间里,滤波前温度跳变 ±0.8℃,滤波后稳定在 ±0.15℃ 以内,效果非常明显。
滤波代码可以简化成下面这样:
#define FILTER_N 5 float temp_filter(float new_val, float *buf, uint8_t *idx) { buf[*idx] = new_val; *idx = (*idx + 1) % FILTER_N; // 取排序后中间三个值的平均 float sorted[FILTER_N]; memcpy(sorted, buf, sizeof(sorted)); // 排序部分省略,工程上可以直接用 qsort float sum = 0; for (uint8_t i = 1; i < FILTER_N - 1; i++) sum += sorted[i]; return sum / (FILTER_N - 2); }滤波的代价是响应变慢。如果你做的是 PID 控温,滤波深度和响应速度之间要做取舍。控温项目里我一般只用中值滤波或者一阶低通,滑动平均窗口太大会让控制环路的相位滞后变大,温度容易振荡。
4.3 干扰与误差排查:几个现场案例分析
案例一:某天热电偶通道数据突然跳到满量程。检查发现热电偶延长线和动力电缆走在同一个线槽里,大功率接触器动作时感应出尖峰。解决方案:热电偶改用屏蔽双绞线,屏蔽层单端接地,把采样率降到 20SPS,问题消失。
案例二:PT100 通道读数比实际偏低 0.2℃。排查了激励电流、基准电阻、PGA 增益,都没问题。最后发现传感器延长线过长(约 15 米),线阻接近 3Ω,在 500μA 激励下产生 1.5mV 压降,换算出来相当于好几度的偏差。当时为了省一根线用了三线制,线阻补偿又没做好,最终改回四线制解决。
案例三:UART 偶发乱码。最初以为是波特率或干扰问题,反复测试后发现是 STM32 的 UART 引脚和 ADS122U04 的 TX/RX 直接连接时,引脚悬空期间电平不稳导致误码。解决办法是给 TX/RX 线各加一个 10kΩ 上拉电阻,MCU 侧开启引脚复用功能内部上拉,问题消失。
5. 工程化落地中的常见问题与排查技巧
5.1 UART 通信异常速查
通信问题是我在这类项目中遇到最多的。整理一个排查速查表:
- 现象:读不到数据,串口接收超时。检查顺序:ADS122U04 供电是否正常 → 复位引脚是否拉高 → UART TX/RX 是否接反(TX 接 RX、RX 接 TX)→ 波特率是否匹配 → 是否在连续转换模式下忘了发 RDATA 命令。
- 现象:数据偶发乱码。优先排查线路是否过长、是否靠近电机驱动或继电器线缆、是否加了上拉电阻。
- 现象:数据有规律地每隔几个点出现一次跳变。大概率是读取节奏和转换过程不同步,读到了半更新的数据。解决:读数据前查询转换完成状态,或者采用单次转换模式,每次转换完成后立刻读取。
这张表我打印出来贴在工位上,现场调试时对着查,效率很高。
5.2 测量精度上不去的排查方向
如果精度测试始终达不到预期,建议按这个顺序排查:
- 第一步查传感器本体精度,别一上来就怀疑 ADC。很多时候误差来自探头本身,比如劣质 PT100 的精度可能就有 ±0.3℃。
- 第二步查激励电流和基准电阻,用万用表量实测值替换理论值。
- 第三步查 PGA 增益误差和失调。ADS122U04 在低增益时失调性能好,高增益时失调会明显一些,可以通过短接输入端测零码,然后在软件里减掉失调。
- 第四步才是软件滤波和公式误差。
还有一个细节:如果所有通道的测量值都整体偏高或偏低 0.5℃ 左右,往往是基准源电压或激励电流的精度问题,而不是 ADC 本身的问题。这种情况做一次全量程两点校准,能解决大部分偏差。
5.3 只有现场才会发现的细节经验
最后分享几个只有实际跑过才会注意到的细节。
第一,ADS122U04 内部温度传感器的读数在 85℃ 以上可能会有漂移迹象,但这通常不影响冷端补偿——冷端温度一般不会到那么高。如果现场环境温度确实很高,建议在软件里对温度传感器读数做查表修正,或者改用外部贴装 NTC 做冷端补偿。
第二,连续转换模式下,ADS122U04 的数据就绪后会自动保持,直到下一次 RDATA 命令。如果你用中断方式读数据,不要在中断里把“发命令 + 接收”一气呵成,最好在中断里只置标志位,在主线循环中完成命令发送和接收。这样能避免在中断里耗时过长,把其他任务饿死。
第三,STM32F215RE 的 DMA 非常适合这套方案:把 USART 的 RX 配置成 DMA 循环接收,每收到 3 字节就产生传输完成中断,主循环解析数据。这样 CPU 占用几乎可以忽略,并且能确保每帧不丢字节。这个用法我在多个项目里验证过,强烈推荐。
第四,关于温漂。ADC 的输入偏置电流会随温度变化,如果传感器源阻抗很大(比如 NTC 在低温段阻抗能到几百 kΩ),偏置电流在源阻抗上产生的电压会让读数漂移。解决办法是降低源阻抗——NTC 分压电阻别选太大,或者用电压跟随器驱动 ADC 输入端。工程上我一般控制在 10kΩ 以下。
6. 后续扩展与最后一组建议
方案跑通之后,有一些方向可以继续扩展。
如果想把采集点继续加密,可以挂多片 ADS122U04 在同一 UART 总线上,通过 Config3 配置不同地址,主控逐个点名读取。多片并联时注意,UART 是点对点协议,同一条总线最好用 RS485 转差分方式,否则距离和节点数都受限。工程上比较实际的架构是 4 片做成一个小采集单元,再用 RS485 组网,而不是把所有芯片直接挂一条总线上。
通信协议层面,建议把采集数据打包成自定义帧结构,加上 CRC16 校验。用 STM32 的硬件 CRC 模块计算 Modbus CRC,速度快且省代码。量产固件里建议开启 ADS122U04 自带的 CRC,但调试固件关闭,两者不要混在同一个宏控制里——这个细节能避免很多“量产出问题、调试没问题”的怪现象。
软件层面,如果把系统升级成带 RTOS 的架构,温度采集任务可以设为最高优先级,但一定要给 UART 通信加上超时和重试机制,防止某次干扰导致读数据命令卡死。我在实际项目里给每个读取循环加了 5 次重试和 100ms 总超时,超过就上报通信异常,这样即使现场电磁环境再恶劣,系统也不会死等某个外设。
最后说一点体会:工业温度采集和 HVAC 设备的调试,最大的成本其实不在芯片或算法,而在现场环境。同一套硬件在不同现场的表现可能完全不同——有的车间有大型变频器,有的机房有高频开关电源,这些都会影响最终数据质量。所以硬件设计时预留好滤波位置,软件里预留校准参数,这套方案才能在各种现场长期稳定运行。我也算是在多次现场“救火”之后才真正明白,把余量留足,比把指标算到极限更实用。
如果你也在做类似项目,建议第一步别急着画板子,先把传感器、ADS122U04 和最小系统板按本文的接线方式搭起来,用 9600 波特率跑通一帧数据,再决定要不要为了性能做优化。我在多个项目里验证下来,这个“先跑通、再优化”的节奏,比一上来就精细设计要高效得多。