☰
基于STM32L4与24位ADC的温度采集方案:PT100与热电偶信号链全解析
2026/11/5 6:25:02 网站建设 项目流程

前阵子做了一套用于工业现场和HVAC系统的多通道温度采集板,主控选了STM32L4S5ZI,前端ADC选了ADS122U04IPWR。这套组合专门用来测PT100/PT1000热电阻和K型热电偶,也顺带留了两路NTC。实测下来,在风管温度、冷冻水管供回水温度、电机轴承以及压缩机排气管温度这些场景里,精度和稳定性都够用,今天就把整个方案从选型逻辑、硬件信号链、软件配置到标定和排障完整复盘一遍。如果你正在做温度采集、数据记录、楼宇自控或者工业状态监测相关项目,这篇文章至少能帮你理清三件事:为什么带UART接口的24位ADC在温度采集场景里比SPI接口更省事;RTD和热电偶从接线到程序计算到底应该怎么做;以及哪些坑是数据手册上不会写、但实际调试基本必踩的。

1. 选型逻辑:为什么是“带UART的24位ADC”加L4+主控

1.1 温度测量里最让人头疼的三件事

温度测量看起来原理简单,实际工程里麻烦非常多。首先是信号幅度小:PT100在0℃时是100Ω,到400℃时也只有大约247Ω,每1℃的变化不过零点几欧姆;K型热电偶更夸张,输出热电势大约只有40µV/℃,稍微有一点噪声就会被淹没。其次是传感器和主控的距离远,工业现场的探头往往在风道、管道、设备夹层里,距离主板从几十厘米到十几米都很常见,走线一长,干扰和压降问题都来了。最后是电磁环境差,HVAC系统里有变频器、压缩机、电机,工业现场更是各种大功率设备,这些都会通过空间辐射和地线耦合把噪声灌进采集系统。

这几个特点直接决定了前端ADC该有的形态:分辨率至少要24位,需要有低噪声可编程增益放大器,输入要支持差分方式,还要具备传感器激励电流和断线检测能力,通信接口则越简单越抗干扰越好。这样看下来,ADS122U04这颗芯片就非常合适。

1.2 ADS122U04IPWR的核心特性拆解

ADS122U04IPWR可以理解成一颗“自带各种配套电路的模拟前端”。它虽然是24位Δ-Σ ADC,但真正值钱的不仅仅是高分辨率,而是单芯片集成了测温需要的几乎所有外围:四个模拟输入可以配置成两路差分或四路单端,通过内部多路复用器切换;低噪声PGA支持1到128倍增益;内部有2.048V电压基准,也支持外部基准;内部还有两个可编程恒流源IDAC,专门给RTD热电阻提供激励电流;再加上内部温度传感器、传感器开路短路检测,以及最关键的一个UART串行接口。也就是说,一颗ADS122U04搭上几个电阻电容,就是一个完整的传感器信号调理前端,后面只要接一颗MCU负责控制和计算即可。

我把自己选型时比较看重的参数列了个表:

项目参数说明
分辨率24位Δ-Σ架构,适合小信号
通信接口UART比SPI少2到3根线,连接灵活
差分输入2路也可配置成4路单端
PGA增益1/2/4/8/16/32/64/128热电偶小信号必须靠高增益
电压基准内部2.048V或外部支持比例测量可消除电流源误差
IDAC恒流源2路,约50µA到1.5mARTD激励、断线检测都能用
工作温度-40℃到+125℃工业场景绰绰有余

1.3 为什么UART接口在温度采集里反而更香

通常我们习惯了SPI接口的ADC,觉得SPI标准、速度高。但在温度采集场景里,UART接口带来的好处非常明显。SPI至少要接SCLK、CS、MOSI、MISO四根线,而且每次通信都要通过GPIO控制CS时序;当ADC芯片就在MCU旁边时问题不大,一旦ADC被放到传感器附近、主控放在控制柜里,SPI长距离走线很容易受干扰,时钟信号一旦变形,通信就整个乱掉。

ADS122U04用的是UART,本质上就是普通串口。MCU开发板几乎每个型号都有好几个串口可用,连接只需要收发两根线,距离远一点还可以把电平换成RS-232或者RS-485,这在现场调试和布线时非常方便。我自己在传感器和主控分开放置的时候,就经常用485接到控制柜,成本低、抗干扰性也好。对慢速的温度信号来说,串口速率完全不是瓶颈。

1.4 STM32L4S5ZI在这条信号链里的角色

主控选STM32L4S5ZI,不是因为它性价比多极致,而是因为它特别适合这种“模拟前端+计算+通信”的项目结构。这颗芯片是STM32L4+系列,Cortex-M4F内核带FPU,最高120MHz,做RTD线性化、热电偶多项式换算这些浮点运算非常快。Flash有2MB,SRAM有640KB,我可以把RTD和热电偶的整段查找表直接放到Flash里,不用省空间。低功耗特性也很好,配合LPUART和一些睡眠模式,如果未来做成电池供电的无线温度记录器,这套组合也压得住功耗。

L4S5ZI的串口资源非常多,我在项目里分配了一个USART给ADC,一个USART给调试日志,一个给RS-485通讯,一个给对外Modbus协议,完全够用不会打架。唯一需要提前注意的是它内部集成SMPS降压模块,开关节点会对模拟电路造成干扰,我后来把模拟供电和数字供电分开处理,中间加了磁珠和LC滤波,同时让SMPS开关节点远离ADS122U04的模拟输入走线,问题就解决了。

1.5 这套方案实际覆盖了哪些场景

我在这个项目里验证过的应用基本覆盖了常见工业和HVAC需求。冷冻水管供回水温度用PT100四线接入;风管内送风回风温度用PT1000或NTC;工业电机轴承温度用PT100长线接入;压缩机排气管温度和加热设备表面温度用K型热电偶。四种传感器共用一块主板,固件里按通道配置传感器类型,换传感器时不用改PCB,这让主板的生产和备货都简单很多。

2. 硬件信号链:RTD、热电偶和NTC的真实接法

2.1 RTD为什么要用三线或四线,接线差别在哪里

RTD热电阻的原理是电阻随温度变化,PT100在0℃时100Ω,100℃时138.5Ω,大约每度变化0.385Ω。如果只接两根线,那两根导线本身的电阻会直接叠加到测量结果里,1Ω的导线电阻相当于引入约2.6℃的误差。HVAC现场探头线动不动就十几米,两线制基本不能用,所以至少要用三线制。

三线RTD是工业上的折中方案。三根线里,两根承载激励电流,第三根专门用来反馈电压,通过ADC内部两个IDAC分别激励不同的路径,让激励电流经过的引线电阻和测量路径的引线电阻相互抵消。这种方法在大多数工况下可以把引线误差压到0.1℃以内。四线RTD则是开尔文接法,两条线走电流,两条线测电压,电流线上的压降完全不会进入测量回路,所以精度最高。如果现场探头本身是四线制并且位置允许,我一般直接接四线,省去很多后顾之忧。

2.2 比例测量:把电流源精度误差直接消掉

RTD测量需要一个恒流源提供激励电流,然后用ADC去读RTD两端电压。如果用内部2.048V作为ADC参考电压,那么电流源本身的精度和温度漂移会直接影响温度精度,通常必须靠校准去修正。ADS122U04支持比例测量,做法是让外部基准电阻R_REF也走同一个电流源回路,ADC的参考电压和RTD上的电压是由同一个IDAC电流产生的。这样最终读到的码值和电流源实际大小几乎无关,只取决于RTD和R_REF的电阻比值,数学上可以简化成:

code = R_RTD / R_REF × 2^23

我实际采用的接法是IDAC1给RTD供电,IDAC2给R_REF供电,R_REF两端接到ADC的REF+和REF-,RTD电压接到AINP和AINN。这样一个设计里,两个IDAC的匹配精度会直接影响测量结果,不过TI规格书上给的匹配指标通常够用,再加上出厂前做一轮增益校准,整套系统做到0.1%以内是没有问题的。

R_REF的取值直接关系到满量程利用率和自热功耗,我常用的一组参数如下:

传感器激励电流建议R_REF说明
PT1001mA2kΩ满量程利用率高,自热可以接受
PT10000.25mA8.2kΩPT1000阻值大,激励电流必须减小
K型热电偶不用IDAC不用直接PGA放大热电偶信号

这里最关键的是R_REF这颗电阻,我建议选0.05%精度、10ppm/℃以内的低温漂金属膜或薄膜电阻。这个电阻的温漂会直接表现为温度读数的漂移,我踩过便宜色环电阻的坑,温度一上来整表读数漂了将近1℃,换成低温漂电阻后才稳定下来。

2.3 热电偶输入:小信号加偏置,还要记住冷端

热电偶本身输出的是热电势,K型大约40µV/℃,几百度温差也就是十几毫伏到几十毫伏,所以PGA必须开到64或128才有意义。ADS122U04的差分输入范围是围绕模拟电源的,但热电偶信号可能是正也可能是负,比如热端低于冷端时输出负热电势,而单电源系统的模拟地没法直接处理负压。

我的做法是给每个热电偶输入端加偏置电阻,把共模电压抬到模拟电源的一半左右。如果芯片有内置偏置电压选项就直接开启,没有就用两颗等值电阻分压,经1kΩ电阻接到输入端。差分信号经过这种偏置后,PGA只放大差值,共模电平对最终结果影响很小。

还有一个容易忽略的问题:热电偶测的是热端和冷端的温差,冷端就是热电偶与PCB端子接触的地方。这个冷端温度必须用另一颗温度传感器测出来,再换算成热电势补偿到读数里。我在方案里同时读取内部芯片温度和端子旁一颗校准过的NTC,把两者平均后作为冷端温度,比单独使用内部传感器更稳。

2.4 NTC通道怎么接最简单

NTC热敏电阻成本低、响应快,适合精度要求不高、大约±0.5℃就够的HVAC风管温度测量。NTC是负温度系数,阻值变化范围很大,不能直接用线性公式,我用Steinhart-Hart公式或者查表插值处理。电路上既可以做成分压电阻结构,也可以用IDAC直接激励。要注意的是分压用的那颗固定电阻同样要选低温漂型号,否则NTC本身的优良重复性会被一个劣质分压电阻毁掉。

2.5 电源和PCB布线,细节决定成败

模拟电源和数字电源我建议分开走。项目里我用一颗低噪声LDO提供模拟3.3V给ADS122U04,MCU的数字3.3V在板上单点连接。AVDD、DVDD、VREF引脚都分别放0.1µF和10µF去耦电容,电容要尽量靠近芯片引脚,回路越小越好。ADS122U04周围不要走高速开关信号,特别是STM32L4S5ZI的SMPS开关节点和UART收发线,要么绕远,要么加地线屏蔽。RTD的激励线和测量线要成对布,去现场传感器的连接用屏蔽双绞线,屏蔽层在主板端单点接地。热电偶线属于低电平差分信号,很容易拾取共模干扰,所以两条线要保持对称走线,不要和UART线长距离平行。

3. 软件核心:UART初始化、寄存器配置与原始码换算

3.1 先配置UART,波特率够用就行

我在STM32CubeMX里面选了USART2作为ADC通信口,波特率设成19200,8位数据位,无校验,1个停止位。为什么不用很高的波特率?温度采集本身是慢变信号,ADC我一般配置成20SPS到90SPS,一帧数据最多4个字节,19200的速率完全够用,而且低波特率对长距离传输的抗干扰能力更好。如果确实要在2kSPS满速采样,那再提高到115200也不迟。

HAL库初始化基本就是标准的:

UART_HandleTypeDef huart2; huart2.Instance = USART2; huart2.Init.BaudRate = 19200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; HAL_UART_Init(&huart2);

如果你拿到的ADS122U04版本是半双工单线模式,就把串口配置成半双工,再用一个GPIO控制方向。发送配置命令时拉高方向信号,接收数据时拉低,切换后加20µs左右延时再操作,否则很容易出现命令回声和帧错位。

3.2 配置寄存器,按“配置意图”逐项设置

ADS122U04的寄存器字段和命令字节在不同批次的数据手册里可能略有差异,所以这里我不准备默写每个寄存器地址,而是把配置动作拆成六件事,对照手册填值就行:

  1. 通道选择:选定哪一路或哪两路进入MUX。
  2. PGA增益:热电偶用64或128,RTD用1或2。
  3. 数据速率:RTD和热电偶场景下20SPS比较稳。
  4. 参考选择:RTD用外部参考做比例测量,热电偶用内部2.048V参考。
  5. IDAC功能:使能IDAC,设定电流输出方向和电流档位。
  6. 转换模式:配置成连续转换,之后只要等待UART数据进来读取结果。

伪代码逻辑大概是这样:

adc_wreg(CONFIG_MUX, CH0_AS_DIFF | GAIN_128); adc_wreg(CONFIG_DR, DR_20SPS); adc_wreg(CONFIG_REF, REF_EXT | IDAC_EN); adc_wreg(CONFIG_IDAC, IDAC1_TO_AINN | IDAC_1MA); adc_start_continuous();

写寄存器之后最好做一次读回校验。我实际调试时遇到过配置写不进去、数据一直显示满量程的情况,最后定位到是UART方向切换没成功。加一个读回校验能立刻定位问题是出在串口还是出在寄存器配置上。

3.3 原始码拼接:注意字节序和二进制补码

连续转换模式下,ADS122U04会把转换结果通过UART发回来。如果一帧是24位数据,我通常按3字节接收,再拼成一个int32_t:

uint8_t b[3]; int32_t raw; if (HAL_UART_Receive(&huart2, b, 3, 100) == HAL_OK) { raw = ((int32_t)b[0] << 16) | ((int32_t)b[1] << 8) | b[2]; if (raw & 0x800000) { raw -= 0x1000000; // 换成有符号数 } }

这段代码看起来简单,但字节顺序一定要确认。有的芯片UART先发低字节,有的先发高字节,我第一批数据拿回来时先把差分输入短接,看输出是否接近零,再给一个已知电压验证满量程方向,确认字节序对了才继续往下写。如果这一步没做对,后面温度公式全都会错。

3.4 从原始码到温度,查表插值最省心

如果是非比例模式,比如热电偶通道用内部参考,电压换算公式是:

Vin = raw × 2 × VREF / (PGA × 2^23)

如果是RTD比例模式,直接算电阻:

R_RTD = raw × R_REF / 2^23

得到R_RTD以后,查表插值最简单。我在Flash里放了一张PT100从-50℃到400℃每隔1℃的电阻表,用二分法找到区间,再线性插值。对HVAC里-40℃到120℃这个温度区间,这种做法的误差远小于传感器和电路本身带来的误差。热电偶则反过来,先用查表把热端温度对应的热电势查出来,加上冷端热电势,再通过逆查表把总热电势变成温度。热电偶电压和温度不是线性关系,所以逆查表的步长要小一点,我用的是0.1℃间隔的静态表。

3.5 多通道轮询,切完通道别急着读第一个样本

ADS122U04内部只有一个转换核心,多通道输入靠MUX轮询。每次切换通道后,输入电容和前端滤波器需要时间建立,如果立刻读数据,会读出明显偏大或偏小的值。我的处理是切换通道后丢弃接下来2个转换结果,等稳定后再取样本。实测在20SPS下,切换后至少等一个完整转换周期再读,数据才稳定。温度信号本来就不需要毫秒级响应,单轮扫描多个通道多消耗几十毫秒完全没关系。

4. 标定:从“ADC码值”到“可以交付的温度值”

4.1 出厂前为什么必须做一次两点标定

ADS122U04本身的失调和增益误差虽然不大,但整条链路还有R_REF电阻精度偏差、PCB走线电阻、参考源漂移等,实际系统误差通常在0.1%到0.2%,直接用于PT100就可能造成0.5℃以上偏差。所以工业产品最常见的是做两点标定:一个接近量程下端的温度点,一个接近上端的温度点,用恒温槽或干井炉完成。

具体步骤并不复杂:把PT100探头放进0℃冰水混合物或恒温槽,稳定5分钟后记录计算出的电阻值;再放到100℃沸水域或恒温槽,稳定后记录第二个电阻值。然后用这两组数据算实际比例系数和偏移量。原理上就是:

  • 设理论低点是100Ω,理论高点约138.5Ω;
  • 标定增益 = 实测高阻差 / 理论高阻差;
  • 标定偏移 = 实测低阻 - 100Ω × 标定增益。

计算得到的增益和偏移存入MCU的Flash或外部EEPROM,之后每次读数都先做一次线性修正再查表,整表的精度就能保证。

4.2 热电偶冷端补偿,精度瓶颈往往在这里

使用K型热电偶时,影响整表精度最大的往往不是ADC噪声,而是冷端温度测得准不准。芯片内部温度传感器的绝对精度并不高,在宽温环境里直接用芯片温度做冷端补偿,最终误差很容易扩大到1到2℃。我在热电偶端子块附近贴了一颗校准过的高精度NTC,把两个读数做了加权平均。

一个很实用的自检标定方法是:把热电偶两端直接短路,此时热端和冷端温度相同,整表读数应该等于冷端温度。如果不相等,把差值记录下来作为冷端补偿修正项。这个方法在常温下做一个点就能把大部分系统偏差补掉,简单有效。

4.3 传感器开短路检测:宁可上报错误,也不报怪温度

传感器断线在工业现场太常见了。RTD断线后,IDAC电流没有回路,ADC输入端要么挂在高阻状态,要么被偏置到电源轨,读出来的码值会非常接近满量程;热电偶断线也是如此。我的固件策略是如果连续3帧读到满量程附近的码值,就判定传感器开路或短路,此时冻结并上报错误状态,而不是输出一个荒谬的温度值。还要配合恢复正常后的退出机制,只有连续若干帧回到正常范围才恢复输出。

ADS122U04本身也有芯片级断线检测功能,可以周期性地给输入端注入小电流看响应,但每次检测可能影响正在进行的测量。我在连续工作模式下主要靠码值判断,断线检测留作出厂自检用,这样最不容易误判。

4.4 长期漂移和定期复检

工业设备整机一般半年到一年要复检一次。长期漂移主要来自传感器老化、PCB受潮、R_REF老化等。设计上建议在电路里预留一路本地校验电阻,把一颗0.01%精度的高精度电阻接到ADC输入,标定时先读它,如果读数和出厂记录不一致,说明系统已经有漂移,需要重新标定。这个不起眼的设计在现场维护时很有价值。

5. 实测噪声、自热和长线传输:我踩过的坑

5.1 数据速率别急着拉高,高SPS不一定好用

ADS122U04这类24位Δ-Σ ADC,数据速率越高噪声越大。我最早调试时图省事把数据速率设到1kSPS,结果PT100读数在0.1℃左右乱跳,降到20SPS后稳定性立刻变好。这里的取舍很明确:20SPS适合精度优先的PT100和热电偶测量,内置数字滤波器对50Hz和60Hz工频干扰也有不错的抑制;90到180SPS适合一般HVAC监控;1kSPS以上我只在需要看动态过程的通道使用,比如压缩机开机瞬间的排气温升曲线。如果不得不在高SPS下用,就加软件滑动平均,多采几十帧压白噪声,但这只能治标,基础数据速率决定滤波截止频率。

我自己的板子实测感受大概是这样的:

数据速率PT100读数稳定度适用场景
20SPS±0.03℃以内精度优先,长期测量
90SPS±0.05℃到0.1℃一般监控
1kSPS±0.1℃到0.2℃动态过程观察

这个表只反映我板子的情况,不同退耦、不同屏蔽会让实际数值有出入,但趋势是一致的:想稳定,就降低数据速率。

5.2 激励电流的发热,容易被忽略

PT100铂电阻在电流流过时本身会发热,1mA激励电流在100Ω上耗散0.1mW,看起来很小,但实际温升取决于探头封装和介质。不锈钢铠装探头在静止空气里可能因此偏0.1到0.3℃,在流动液体里则几乎看不出。激励电流大一点,满量程信号也大,对噪声更有利,但自热随之增大,这里需要平衡。我最终在PT100通道选0.5mA,PT1000通道选0.25mA,这是精度和自热的折中点。

更讲究的做法是脉冲激励:每次测量前才开IDAC,等ADC转换建立完再关掉,这样相同探头可以把平均自热降到持续供电时的十分之一以下。ADS122U04的IDAC可以通过寄存器开关,切换成本不高,值得尝试。

5.3 半双工切换、帧对齐和波特率漂移

如果ADS122U04在你的板子上是半双工模式,最容易出现的现象是发给ADC的命令被自己读回来。具体表现就是写完配置之后读数据,读到的内容首尾错一个字节,中间还夹着0x00。解决办法首先是切换方向后延时至少20µs再收发,其次是按帧头识别而不是固定读固定字节数,最后是排查两块板之间的地电位差,别让两边地电位不相等时靠浮空地勉强通信。

我调试时还发现MCU如果用内部HSI时钟,UART波特率误差可能到1%到2%,对长帧来说会造成误码。STM32L4S5ZI我最终统一接了外部晶振,串口误码率明显下降。建议你不管用哪颗MCU,只要做UART通信,时钟源尽量用外部晶振。

5.4 长线RTD的抗共模处理

PT100从现场传感器到主控通常要经过十几米屏蔽双绞线,屏蔽双绞线能解决大部分差模干扰,但两个输入端的共模干扰仍然可能超过ADC输入范围。我在输入端各加一个小电容到地,构成RC低通,滤掉高频共模噪声;空间允许就再加一对共模电感,不允许就靠双绞线本身。模拟地和机壳地之间用RC网络或直接单点连接,避免形成地环路。这个方法在电机附近已经验证过,数据稳定,如果旁边还有变频器,建议把传感器屏蔽层只在固定端接地,不要两端同时接地形成环路。

5.5 对这套组合的使用感受

如果让我重新设计一次,我仍然会选择ADS122U04IPWR和STM32L4S5ZI。ADS122U04把RTD和热电偶的模拟前端集成得很完整,UART接口让板间通信和现场接线都简化了;STM32L4S5ZI又有足够的Flash、RAM和浮点算力,把温度计算全部吞下,整板功耗也不高,MCU睡眠、ADC间歇工作的时候,静态功耗可以压到很低,这对未来做电池供电的无线温度采集很有价值。

如果后面有朋友要接手这套方案,我最想叮嘱的就一句话:先把数据手册里的UART帧格式和寄存器位定义核对清楚,这块不搞清楚,后面怎么调都不踏实;再把R_REF温漂预算单列一页,这块选错,标定再勤也白搭。这两件事做好,整机过检和现场交付都会省心非常多。

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

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

立即咨询