说起做温度采集,我最早也是直接用MCU自带的ADC去量热敏电阻,省事是真省事,但真到了工业和HVAC现场,那种方案基本撑不住。后来做分布式温度采集,开始接触高精度ADC,才开始明白专用ADC和通用MCU内置ADC之间的差距。ADS122U04IPWR这颗料,加上STM32F401RB,配合起来做工业级和暖通空调领域的温度测量,我认为是一个非常典型、同时也值得写出来给同行看的组合。
这个组合的核心思路,其实一句话就能说明白:用一颗自带UART接口的24位ADC,把模拟信号在最前端完成转换,再用一颗成熟、供货稳定、成本可控的Cortex-M4内核MCU做协议处理和系统控制。ADS122U04这颗芯片,光看型号末尾的“U”就知道,它带的是UART接口,不是常规ADC用的SPI。这一点在分布式测温场景里特别有用,后面我会专门展开讲。
这篇文章我会按照我从选型到实际的完整思路来写,包括硬件电路细节、STM32端的软件实现、校准方法、现场踩坑记录,最后再分享一些我个人实测下来的经验。适合正在做智能楼宇、暖通集控、工业过程监控,或者打算把模拟采集前端做独立楼宇化的朋友参考。
1. 项目定位与整体架构
1.1 为什么是“ADS122U04 + STM32F401RB”
先说STM32F401RB这边。我选这颗料,原因很简单:主频84MHz,Cortex-M4F带浮点单元,做温度换算、滤波运算非常够用;容量上128KB Flash加32KB SRAM,跑一套UART协议栈和上位机通信逻辑绰绰有余。更重要的是F401系列生命周期长,在工业控制领域用得非常多,资料、封装、量产采购渠道都很成熟,不像某些新潮芯片,样品好买、批量排期能拖死你。
然后说ADS122U04。这颗芯片是TI出的24位ΔΣ型ADC,内部带了PGA可编程增益放大器、两个可配置的激励电流源IDAC、内部精密基准源,以及一个用于冷端补偿的内部温度传感器。它最特别的地方在于提供了UART从机接口,这意味着你可以用两根线(TX和RX)直接对接MCU的串口,而不像SPI那样还要额外占用SCLK、CS等引脚。对多节点采集系统来说,单条总线挂多个ADC从设备,MCU端只需要一个UART口,硬件架构一下子就清爽了。
这两颗芯片搭配起来,实际上形成了一个“高精度模拟前端 + 通用控制核心”的架构。ADC负责把温度信号转成数字码,MCU负责读取、换算、滤波、通讯和存储。相比把ADC集成在MCU内部的做法,外部专用ADC的最大优势是:模拟前端可以尽量靠近传感器,减少长距离模拟信号传输带来的干扰;同时ADC自身的分辨率和噪声性能,也是MCU内置ADC很难达到的。
1.2 工业与HVAC温度测量的真正痛点
工业现场和HVAC场景里,测温看起来是个老掉牙的需求,但实际上非常折磨人。
HVAC这边,典型的是冷冻水供水/回水温度、AHU送风/回风温度、风机盘管进出水温度。这些点位的特点是:变化慢、量程窄,但要求长期稳定、免维护。一个数据采集模块装到管井里,可能三年五年不去动它。如果系统温漂大,夏天校准好的参数到冬天就偏了,这对楼宇自控来说是很烦人的事。另外HVAC现场往往强电、弱电混在一起,变频器、水泵、风机都是干扰源,因此对ADC的抗噪性能、共模抑制能力要求很高,这恰好是ΔΣ型ADC的强项。
工业侧就更严苛了。测量范围宽,可能从-50℃到300℃甚至更高,常用Pt100/Pt1000铂电阻或热电偶。而且工业现场传感器和采集器之间的距离往往比HVAC场景远得多,几米到几十米都正常。如果直接把小信号通过模拟方式传到PLC或仪表,线缆成本高,还会引入噪声,所以一般都希望在前端就近数字化,然后用数字总线传回控制器。ADS122U04这种带UART接口的ADC,在这种分布式架构里是天然的合适角色。
还有一个容易被忽视的痛点:传感器类型太多。一条产线上可能同时存在Pt100、Pt1000、NTC热敏电阻、K型热电偶。传统方案是每一类传感器配一个独立变送器或采集卡,机柜里堆一堆模块,维护起来非常痛苦。而ADS122U04的PGA增益、激励电流、基准源都可以编程配置,同一块硬件上只要改寄存器参数,就能适配不同传感器。这个灵活性对我这种喜欢把平台做统一的习惯来说,正中下怀。
1.3 系统拓扑:一主多从的分布式测温总线
我做这个项目时的系统架构是这样的:一个STM32F401RB作为主控制器,通过UART总线挂多个ADS122U04从节点。每个从节点都配置成不同的传感器类型和不同的量程参数,或者全部相同也可以,取决于现场点位布局。
这里UART接口相比SPI接口最大的优势就体现出来了:SPI属于短距离片内通信协议,线一拉长就受不了,而且每多一个从设备就得有多一根片选线。UART是异步串行通信,天生适合小规模分布式采集,两根线就能把多个设备串起来,而且可以直接利用现有的RS485物理层驱动,把传输距离扩展到几百米。
不过要提醒一句,ADS122U04的UART从机协议和普通串口不太一样,它带有前导码、命令字节、校验字节等完整帧格式,不是说我直接发个ASCII字符就能读完数据。第一次用的时候,我差点当成普通串口设备来处理,结果对着示波器看了半天。这一点我会在软件章节详细讲。
2. 硬件设计:关键信号链细节不能省
这部分是整个项目的基石。软件写得再好,硬件信号链上有漏洞,测出来的数据照样是废的。我把设计过程中觉得最关键的几个点拿出来说。
2.1 ADC核心寄存器与初始化参数
ADS122U04的寄存器配置,重点看三组:输入多路复用器选择(MUX)、PGA增益配置、激励电流源配置。
输入MUX用来选择AIN0~AIN3中哪两个引脚作为测量输入端。比如对于RTD,我通常用AIN0和AIN1;对于热电偶,用AIN0和AIN1,但把PGA设到最大增益。这个MUX还可以做一些特殊配置,比如把测量输入端短接到内部温度传感器,用于冷端补偿。
PGA增益的选择直接关系到能测多小的信号。ADS122U04的PGA最高可以到128倍。以K型热电偶为例,它在常温附近的热电动势大概是40μV/℃,如果PGA增益只有1,那么0.1℃的分辨率对应的电压是4μV,这个量级直接怼到ADC输入上,噪声会非常明显。但把PGA设为128,信号被放大到512μV以上,ADC的量化噪声和前端噪声对整个测量链路的影响就会显著降低。代价是小信号被放大的同时,失调电压和低频噪声也被放大,所以后面必须做校准和数字滤波。
激励电流源IDAC也有两个,可以编程设置输出电流大小和流向。做RTD测量时,激励电流源的作用是给传感器提供一个恒定电流,让它的电阻变化转换为电压变化。我一般在Pt100上设500μA或1mA电流。电流设得大,信号幅度大,信噪比好,但同时传感器自身发热(自热效应)也严重,会引入额外的测量误差。这个平衡点需要取舍,Pt100在1mA激励下的自热功率是0.1mW量级,对多数应用是可接受的。
寄存器初始化代码用伪代码大致是这样:
ads122u04_write_reg(REG_CONFIG0, 0x00); // 默认MUX通道AIN0-AIN1 ads122u04_write_reg(REG_CONFIG1, 0x64); // PGA=128, 20SPS ads122u04_write_reg(REG_CONFIG2, 0x0A); // IDAC=1mA, 电流源通道选择 ads122u04_write_reg(REG_CONFIG3, 0x00); // 内部基准源, 比例测量模式注意,这些寄存器地址和具体位定义一定要以你手里最新数据手册为准,不同批次或版本可能微调,我不建议纯粹抄网上代码,而是要养成查寄存器表的好习惯。
2.2 三线制与四线制RTD接线
RTD(铂电阻温度传感器)最常用的有Pt100和Pt1000两种。它们的电阻温度特性都接近线性,Pt100在0℃时是100Ω,温度每升高1℃电阻约增加0.385Ω。但这个信号量级如果用两线制直接测,问题很大:一对导线本身就有电阻,比如1Ω的线电阻,对应Pt100大约2.6℃的温度误差,这还没算环境温度变化导致线电阻漂移的部分。
所以在工程项目里,我强烈建议RTD采用三线制或四线制。
三线制的原理,是让两个激励电流源分别走不同的导线,最终通过测量两次差动电压来抵消导线电阻。ADS122U04有两个IDAC,恰好可以支持这种接法。实际布局是:一条线接RTD的一端,另外两条线接RTD的另一端,其中一条作为激励电流回路,另一条作为电压检测线。这样电压检测线上基本没有电流流过,导线压降就不会影响测量结果。
四线制更好理解,两根线给传感器供激励电流,另外两根线专门用来测量RTD两端的电压。因为测量线上没有电流,所以它测到的就是纯粹的传感器压降,导线电阻可以忽略不计。如果现场允许,四线制是精度上限最高的接法。
我在现场做项目时,为了平衡接线成本和精度,通常长距离电缆测Pt100用三线制,关键测点或者计量需求高的用四线制,短距离板级温度采集才允许用两线制并在固件里做线阻补偿。
2.3 热电偶测量与冷端补偿布局
热电偶的原理是两种不同金属材料在两端存在温差时,会产生一个与温差相关的热电动势。这里最关键的陷阱是:热电偶测到的是“测量端”和“参考端”(冷端)之间的温差,而不是绝对温度。如果冷端温度不稳定,测量结果就是漂的。
因此冷端补偿(CJC)非常重要。ADS122U04内部自带了一个温度传感器,可以直接读出芯片结温,用这个读数配合热电偶类型做一些计算,就可以得到冷端温度。但要注意,芯片结温和传感器接线端子处的实际温度还是有差别的,尤其是当ADC芯片本身发热比较明显时,差个几度很正常。
我的做法是:在热电偶的接线端子处靠近铜排的位置贴一颗外置NTC或直接用芯片内部传感器,同时让端子位置远离板上的发热器件。如果对冷端补偿精度有苛刻要求,建议直接在上位机校准时计算一个偏移量出来。做工业现场环境,冷端补偿这一环做得好不好,往往决定了整个测温系统的绝对精度。
另外一个细节是,热电偶信号是直流毫伏级别的微弱信号,测量前必须把PGA增益设到最大。我一般用PGA=128,同时把数据速率降到20SPS或更低,以换取更好的噪声抑制能力。K型热电偶在这个配置下的典型噪声抖动能控制在0.1℃以内,实际体感非常好。
2.4 STM32F401RB外围电路与现场防护
STM32F401RB这边的外围电路,重点反而不是主控本身,而是它和ADC之间的电气接口。
我一般给ADC和MCU之间的UART线串联一个小电阻,同时加入TVS二极管做防浪涌保护。HVAC现场经常有变频器启停、电机的反电动势,这些干扰会沿着线缆传导进来,如果接口没有防护,轻则通信丢帧,重则打坏芯片。
UART电平这里还有个容易踩的坑:ADS122U04的逻辑电平由DVDD决定,如果它和STM32的电压域不一致,需要加电平转换。我习惯把两边的DVDD都统一用3.3V,这样省事不少。ADC的AVDD用5V供电以获得更好的模拟性能也可以,但数字逻辑电平还是建议走3.3V,并确保电平匹配。
供电方面,ADC的模拟电源我强烈建议不要直接从单片机的3.3V LDO输出取。因为单片机内部翻转噪声会把毛刺耦合到模拟部分。我一般用一个单独的LDO给模拟前端供电,MCU再过一组磁珠或π型滤波器,把数字和模拟电源彻底分开。
PCB布局上,ADC芯片底下铺一块完整的模拟地,RTD激励电流走线不要和数字线平行长距离布线,UART走线尽量远离电源线。这些都是基础中的基础,但现实中我看到很多工程师在这些细节上偷懒,结果调试时反复排查问题无解。
3. 软件实现:从波特率到温度数值
硬件拼好之后,软件的功夫直接决定系统能不能达到理论精度。这部分我按数据链路从上到下的顺序讲。
3.1 UART通信协议与命令帧设计
ADS122U04的UART协议不是我一开始以为的简单“发送指令、接收数据”,而是一套带地址和校验的完整从机协议。命令帧里通常包括前导字节、命令类型、寄存器地址或者数据区,以及CRC校验。写寄存器是一条帧,读寄存器是一条帧,启动连续转换又是另一条帧。
我在STM32端封装了几个基础函数:写寄存器、读寄存器、发送启动转换命令、读取转换结果。底层全部走HAL库的UART发送和接收接口。
这里要注意UART波特率的匹配。ADS122U04支持的波特率范围有一定上限,如果MCU主频和波特率偏差太大,接收会产生误码。我实测下来,室内短距离9600波特率非常稳定,但在几十米长的接线场合,波特率降到4800反而丢帧更少。毕竟温度采集本来就属于慢变信号,不需要高速率,稳定压倒一切。
一个我自己总结的UART通信可靠性的经验:每次发送完命令帧后,等待一小段延时再读取响应,不要在同一个循环里马上发下一帧。因为ADC接收到命令后需要时间去解析、执行,尤其是启动转换之后,它还需要一个模拟转换周期才能把结果放到寄存器里。抢读是通信出错的常见原因。
代码示例,基于HAL库:
// 写寄存器: cmd_frame按协议封装好 uint8_t cmd_frame[8]; uint8_t resp[8]; cmd_frame[0] = 0x00; // 前导字节 cmd_frame[1] = CMD_WRITE_REG; cmd_frame[2] = reg_addr; cmd_frame[3] = data; // cmd_frame[4..7] 填充CRC HAL_UART_Transmit(&huart2, cmd_frame, 8, 100); HAL_Delay(1); HAL_UART_Receive(&huart2, resp, 8, 100);3.2 连续转换模式下的数据读取
ADS122U04可以配置成单次转换或连续转换模式。做温度采集,我强烈建议用连续转换模式,配合DRDY引脚,或者轮询状态寄存器,来判断每次转换是否完成。
DRDY脚的设计非常有用,它会在新的转换结果可读时拉低。STM32端用一个GPIO外部中断去检测这个引脚,下降沿触发时读取数据,这样MCU完全不用忙等,可以在中断里读数据、换算、存储,然后继续跑通信。
如果不用DRDY中断,也可以采用轮询方式。因为ADC的数据速率最快也就几百SPS,MCU端用一个5ms~20ms周期的任务去读取状态寄存器,效率上完全没问题。考虑到系统复杂度,HVAC场景下我用轮询的足够,省一个GPIO,代码也更直白。
读取到的原始数据是24位有符号整数,用三个字节表示。我一般把这三个字节组装成一个int32_t,然后再经过比例换算得到电阻或电压值。24位ADC的满量程码是0x7FFFFF(约8388607),当输入电压等于正满量程时输出最大值,输入电压为负时输出补码形式。
3.3 ADC原始值到温度的换算逻辑
这部分是整个软件的核心,我要仔细讲。
对RTD来说,最推荐的测量方法是比例测量。原理是让同一个IDAC电流同时流过RTD和一个精密参考电阻RREF,以RREF两端电压作为ADC的参考基准。这样,输出码值只取决于RTD和RREF的电阻比,与电流源的绝对精度、参考电压的漂移都没有关系。这是一个很漂亮的消除误差的办法。
比例测量的换算公式非常简单:
[ R_{RTD} = \frac{code}{0x7FFFFF} \times R_{REF} ]
其中code是ADC读取到的24位有符号整数。如果code是约8388607的一半,说明RTD电阻约为RREF的一半。这个公式才是真正推荐的工程做法,尤其适合批量组装时免标定。
拿到RRTD之后,再换算成温度。Pt100的电阻温度特性最常用的计算模型是Callendar-Van Dusen方程。0℃以上,可以简化成:
[ R_t = R_0 [1 + A t + B t^2] ]
其中R0是0℃时的电阻值(Pt100就是100Ω),A约为3.9083e-3,B约为-5.775e-7。这是一个二次方程,解出t就是温度。对HVAC的0~100℃量程,这个模型的精度在零点几℃以内,足够用。
热电偶的换算更麻烦一点。思路是:先把ADC读到的原始码值换算成电压(比例因子取决于VREF和PGA增益),然后用这个电压减去或加上冷端温度对应的热电动势,最后根据热电偶类型查NIST多项式或查表得到温度。由于STM32F401RB带浮点单元,浮点运算直接上,完全不需要担心性能问题。
我实际软件里的处理是:把热电偶的温度-毫伏对照表按1℃间隔存成一个const数组,然后用插值法查询。这样省去了多项式迭代计算的复杂度,插值精度也不错,在常温段误差可以控制在0.1℃以内。
3.4 数字滤波与异常值剔除
ADS122U04本身就是一个ΔΣ型ADC,它内部已经带有数字抽取滤波器,数据速率越低,滤波效果越强。但到了现场实际应用,还需要在STM32端再加一道软件滤波。
我的做法分两层:第一层是滑动窗口均值滤波,窗口长度取4~16个点,视现场噪声情况和系统响应速度而定。HVAC系统本身热惯性很大,温度变化很慢,窗口取16个点都没有问题。第二层是中值滤波,专门对付现场偶发的尖峰干扰。先取5个原始值排序取中值,剔除异常点,再做滑动平均。这个组合在抗脉冲干扰和抑制平稳噪声方面效果都很好。
有一点需要注意:滤波太强会导致温度响应变慢。如果是做恒温控制,响应速度要求高的场景,比如半导体恒温箱,就不能用太长的窗口。我常用一个简单的自适应策略:温度变化率超过一定阈值时,自动缩短窗口长度,让系统响应跟得上;温度稳定时,再把窗口拉长,获得更好的稳定度。
4. 校准与现场精度分析
4.1 快速两点校准:用精密电阻代替干井炉
做温度采集项目,出厂校准是绕不开的。传统做法是用干井炉或恒温槽,给传感器一个已知温度,然后让系统记录码值,拟合出增益和偏移。这个方法最准确,但干井炉设备贵、校准时间长,对大批量生产来说不方便。
我常用的快速校准方法是:用精密电阻箱替代RTD,直接校准ADC信号链。因为RTD的电阻值和温度值是一一对应的,比如Pt100在0℃时对应100Ω,在100℃时对应138.51Ω。只要把电阻箱拨到100Ω和138.51Ω,就相当于给系统注入了两个标准温度信号。这时候记录ADC输出码值,计算增益和偏移系数,写进固件的配置区即可。
这样做的好处是,校准过程完全不依赖温度源,出货速度快,而且校准的是整个模拟链路,包括PGA失调、增益误差和参考电阻误差。实测下来,用这种两点校准法配合0.1%精度RREF,系统全量程误差可以控制在0.3℃之内,对大多数HVAC和工业监控需求完全够用。
校准的公式很简单,把传感器电阻值和ADC码值做线性拟合:
[ R = k \times code + b ]
两点得到两个方程,解出k和b。这个值保存在STM32内部Flash,系统每次启动时加载。这个校准方法我强力建议同行们尝试,能省不少成本。
4.2 误差预算:每一项漂移到底占多少
做高精度测量的项目,一定要养成做误差预算的习惯。这表面对应一个责任感:你凭什么说你的系统精度是0.3℃?每部分贡献是多少?不清不楚的系统精度,到了现场被别人质疑的时候就没底气了。
我按照信号链的各个环节整理一个预算表(以Pt100三线制为例):
| 误差源 | 典型数值 | 等效温度误差 |
|---|---|---|
| ADC量化噪声 | ±1 LSB以内 | 约0.005℃ |
| 内部PGA增益误差 | ±0.05% | 约0.015℃ |
| IDAC电流温漂 | ±50ppm/℃ | 比例测量下可忽略 |
| RREF电阻初始精度 | ±0.1% | 约0.03℃ |
| 导线电阻失配 | 0.1Ω以内 | 小于0.3℃ |
| 传感自热效应 | 0.5℃/mW(PT100) | 取决于激励电流 |
这里看得最清楚的一点是:在比例测量模式下,IDAC温漂并不会引入误差,因为激励电流同时流过了RTD和RREF,影响互相抵消了。这是我认为比例测量这个设计思路最牛的地方。相比之下,如果使用内部2.048V基准而不是外部RREF,参考电压的温漂就会直接折算成温度误差,这是很多初学者没意识到的问题。
4.3 现场实测与长期稳定性
我在一个风机盘管监控项目里实际跑过这套系统,点位大概有24个,全是Pt1000三线制,通过UART总线接到一块STM32F401RB主板上。现场变频器启停频繁,电磁环境不算干净。
实测数据在阀值温度25℃到45℃范围内,ADC原始码值最大抖动幅度折合成温度大约是0.06℃,经过中值+均值滤波后最终温度读数可以稳定在0.02℃的显示分辨率上,几乎没有可见的闪烁。变频器启动瞬间偶尔会有尖峰干扰,但软件中值滤波很干净地把异常点剔除了。
长期跑了三个月,和现场送风温度传感器对比,最大偏差在0.4℃以内,整体没有出现漂移的趋势。冷天和热天都覆盖到,我认为这套方案在HVAC场景下的稳定性是令人满意的。
工业场景我也试过,把传感器放到干燥箱内部测120℃的高温,连接线大概15米。因为信号在ADC前端就被数字化了,模拟线路上完全不怕衰减和共模干扰。整个系统表现跟短距离基本一致,这也是分布式ADC方案在工业上最核心的价值。
5. 踩坑实录与问题排查
这个部分我可以写很多,因为这套系统我实际调试时踩过不少坑。都是真实经历,也是常规文档里不会写的东西。
5.1 上了电没反应:三处最常见的原因
第一次上电后,我遇到的最大问题是STM32发命令,ADC完全没有响应,示波器上TX有波形,RX端纹丝不动。
排查下来第一处原因是复位引脚没处理。ADS122U04的RESET引脚如果悬空,芯片可能一直处在复位状态或者工作状态不稳定。正确做法是接一个RC上电复位电路,或者直接用MCU的GPIO控制复位时序,上电后至少等待1ms再释放。
第二处是UART的线序接反。这个听起来很蠢,但真的一不小心就会犯。尤其是用杜邦线快速验证时,TX和RX交叉,交叉来交叉去很容易接错。我后来做了一个固定转接板,把这个低级错误从根上杜绝了。
第三处不太容易想到:ADC的DVDD和AVDD供电顺序。如果AVDD先上电,DVDD后上电,有可能导致芯片内部逻辑初始化不完整。解决方法是把两个电源接到同一个总电源开关上,保证同步上电。
5.2 数值漂移:接地与共模电压的教训
有段时间我测到的温度值总是缓慢漂移,而且和真实温度有明显偏差,不是随机的跳变,是固定方向偏。一开始我怀疑是传感器问题,换了几只都是同样现象,后来用万用表量了ADC输入端的对地电压才发现:传感器的参考地线和系统电源地之间有大约0.2V的电位差。这个电位差以共模方式叠加到ADC输入上,因为ADC的共模抑制比不是无穷大,所以测量值就开始漂。
这个问题的根源是我在测试台上用了两套电源供电:一套给ADC模拟部分,一套给MCU数字部分,两套电源的负极虽然最终通过大地连接,但地线阻抗导致电位不一致。
解决方式很简单:把ADC和MCU的模拟地、数字地单点汇聚到电源地的同一个点,整个系统统一用一组电源供电。在工业现场,如果传感器和主控距离远,这个共模问题会更明显。我的建议是ADC采集板的地线一定要通过低阻抗路径连接到系统参考地,并且尽量避免多点接地。
5.3 冷端补偿带来的系统性温漂
做K型热电偶时,我一开始直接用ADS122U04内部温度传感器做冷端补偿,校准的时候误差还挺小,但到了下午机柜温度升高,测出来的炉温就开始整体往上偏。
排查时发现原因很简单:内部温度传感器的位置在芯片内部,芯片附近有一些数字电路发热,所以芯片结温比实际接线端子温度高出好几度。冷端温度差几度,对热电偶的绝对温度测量来说就是差好几度。
解决办法有两个方向。一个是在合适的PCB位置贴一颗高精度NTC,让NTC尽量贴近热电偶端子,用NTC的读数代替内部传感器。另一个办法是,如果坚持用内部传感器,就做一个多点温度补偿表格,把“内部结温 - 端子实际温度”的偏差随温度变化的曲线标定出来,程序运行时自动查表修正。
我做项目时最终选择了外置NTC方案,把NTC就放在端子正下方,用导热胶粘住。改完之后,冷端补偿精度明显改善,长时间运行也不会因为机柜温度变化而产生明显漂移。
5.4 量产与可维护性细节
最后讲一个容易被忽视的问题:当系统做成产品,不是你自己在维护时,会遇到什么情况。
第一个坑是UART总线上的地址冲突。多节点挂在同一根总线上,如果每个节点的地址都是出厂默认值,那么MCU发命令时所有ADC都会同时响应,数据就全乱了。我处理的方法是在每块ADC板的PCB上留一个4位拨码开关,作为硬件地址设定。上电时MCU扫描总线,读取每个节点的地址和传感器类型,实现自动识别。
第二个坑是传感器更换后,校准数据需要刷新。我预留了一个校准触发指令,运维人员通过上位机软件发送一次指令,系统重新执行一次校准流程,把新的系数存到本地Flash存储区。这样换传感器不用动板子上的任何东西。
第三个坑是现场故障的快速定位。我在每条UART总线上加了帧超时检测,如果某个节点连续几次没有响应,MCU会把故障节点的地址报给上位机,并自动跳过继续采集其他节点。这样,一条总线上坏了一个节点,不会导致整个系统瘫痪。这个细节在实际运维时非常省心。
6. 最后说点我的真实体会
这套“ADS122U04 + STM32F401RB”的方案,我前前后后做了几个项目版本,从最开始的手工焊接样板到后面批量投产,整体稳定性我一直是比较满意的。如果一定要总结我个人感受最深的两点,一个是比例测量这个理念在RTD应用中的全面胜利,硬件设计时把RREF和IDAC的关系想清楚了,后面整个信号链的误差就能消掉一大半。另一个是UART接口的ADC在分布式测温中远比SPI实用,硬件布线简单,地址扩展容易,节点间传输距离也高。
如果你正准备做类似的温度采集系统,我建议不要一上来就折腾复杂的方案,先按照文章里讲的框架,把PT100比例测量和STM32的UART读取先跑通,再逐步扩展到热电偶、多节点、校准和滤波章节。这个过程大概一周内能完成,但能让你把整个信号链的所有关键环节都亲手过一遍。之后再拿到现场,你会觉得心里非常有底。