news 2026/11/5 5:04:19

基于ADS122U04与STM32的工业级高精度温度测量方案设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于ADS122U04与STM32的工业级高精度温度测量方案设计

1. 工业与HVAC温度测量方案的整体设计思路

工业现场和HVAC系统里的温度测量,跟我们在实验室用个DS18B20随便测测完全是两码事。工业场景下,传感器可能离主控板几十米远,现场有变频器、接触器、大功率电机在疯狂制造电磁干扰,温度信号本身又极其微弱——热电偶满量程输出也就几十毫伏,铂电阻在0度时不过100欧姆,激励电流稍微大一点就自热。这些因素叠加在一起,就决定了整个信号链的设计必须围绕三个核心词展开:高分辨率、抗干扰、低漂移。

我这次选用的方案是ADS122U04IPWR搭配STM32F103RC。先说这颗ADC为什么值得选。ADS122U04是TI的一款24位ΔΣ型ADC,内置PGA、双匹配电流源、振荡器和参考电压,封装是TSSOP-16,工作温度范围覆盖-40到125度,天生就是为温度传感器设计的。它支持两路差分输入或四路单端输入,内置的PGA可以做到1到128倍增益,这意味着热电偶输出的几十毫伏信号可以直接进ADC,不需要外部再搭仪表放大器。更关键的是它内部集成了两个10微安的匹配电流源,做铂电阻测量时可以直接用这两个电流源做比例式测量,彻底消除激励电流漂移带来的误差。

STM32F103RC这边,Cortex-M3内核,256KB Flash,48KB RAM,三个SPI接口,资源上绰绰有余。选它不是因为性能有多强,而是因为它在工业领域太常见了,供货稳定,开发工具链成熟,HAL库和标准库都有大量现成代码可以参考。对于温度测量这种采样率要求不高的应用,F103的处理能力完全够用,甚至可以说是大材小用。

整个方案的信号链是这样的:传感器(热电偶或PT100/PT1000)→ 输入滤波网络 → ADS122U04 → SPI → STM32F103RC → 数据处理与显示/上传。这个架构看起来简单,但每个环节都有讲究。输入滤波网络要兼顾差模和共模干扰抑制,ADC的配置要匹配传感器类型,STM32端的软件滤波算法要能进一步压制随机噪声。下面我会逐层拆解。

注意:工业现场的温度测量,精度和稳定性永远排在速度前面。不要为了追求采样率而牺牲分辨率,ADS122U04在20SPS时能给出接近22位有效分辨率,这个速度对温度测量完全够用。

2. ADS122U04IPWR的核心特性与配置要点

2.1 为什么选24位ΔΣ ADC而不是逐次逼近型

逐次逼近型ADC(SAR)在速度上有优势,但在分辨率和抗噪性上跟ΔΣ架构没法比。ΔΣ ADC通过过采样和噪声整形,把量化噪声推到高频段,再通过数字滤波器滤除,从而在低频段获得极高的有效分辨率。温度测量的信号带宽通常只有几赫兹到几十赫兹,正好落在ΔΣ ADC最擅长的区间。

ADS122U04在增益为1、数据率为20SPS时,噪声RMS大约只有0.9微伏。换算成有效位数,对于2.048V的参考电压,有效分辨率接近21.5位。这个性能意味着即使用PT100这种灵敏度只有0.385欧姆/度的传感器,配合10微安激励电流,每度对应的电压变化只有3.85微伏,ADC也能轻松分辨出0.01度的变化。

2.2 内部PGA和电流源的实战价值

ADS122U04的PGA增益可以配置为1、2、4、8、16、32、64、128。做热电偶测量时,K型热电偶在1000度时输出约41毫伏,冷端补偿后实际差分电压更小。如果直接用增益1,ADC的满量程是±2.048V,41毫伏只占满量程的2%,浪费了大量动态范围。把PGA设为128倍后,41毫伏被放大到5.25V,虽然超过了参考电压,但实际使用中我们会把参考电压设为内部2.048V,增益设为32或64,让信号落在满量程的60%到80%之间,这样既充分利用了ADC的动态范围,又留有余量防止饱和。

内部双电流源做比例式测量是另一个亮点。传统做法是用一个精密激励电流流过PT100和参考电阻,然后测量PT100上的电压。但激励电流会随温度漂移,参考电阻也有温漂。ADS122U04的方案是让同一个电流源先流过PT100,再流过参考电阻,ADC分别测量两个电压,然后取比值。这样电流源的漂移在比值中被抵消,参考电阻的温漂也被抵消,只剩下PT100本身的精度和ADC的线性度。实测下来,这种比例式测量在-40到125度范围内的整体误差可以控制在0.1度以内。

2.3 寄存器配置的关键参数

ADS122U04的配置寄存器有四个,分别控制多路复用器、增益、数据率、工作模式、电流源、参考电压等。下面这张表是我在实际项目中总结的关键配置项:

配置项推荐值说明
多路复用器差分输入热电偶和PT100都建议用差分输入,共模抑制比更好
PGA增益32或64根据传感器满量程输出选择,信号占满量程60%-80%最佳
数据率20SPS温度测量不需要高速,20SPS时噪声最低
工作模式正常模式连续转换模式适合实时监测,单次模式适合低功耗场景
电流源10微安做PT100测量时开启,热电偶测量时关闭
参考电压内部2.048V内部参考的温漂典型值5ppm/度,足够工业应用
滤波器同步50/60Hz抑制工业现场工频干扰严重,必须开启

配置寄存器的写入通过SPI接口完成,上电后需要先发送复位命令,然后依次写入四个配置寄存器。这里有个细节:ADS122U04的SPI模式支持模式1和模式3,STM32F103RC的SPI需要配置成对应的时钟极性和相位。我一般用模式1,即CPOL=0,CPHA=1,数据在时钟第二个边沿采样。

实操心得:配置寄存器写入后,建议回读一次确认写入成功。我遇到过因为SPI时序问题导致配置寄存器写入失败,ADC输出一直是满量程的情况,排查了半天才发现是SPI时钟相位设错了。

3. STM32F103RC端的硬件设计与SPI驱动

3.1 硬件连接与PCB布局要点

STM32F103RC和ADS122U04之间的连接不算复杂,但有几个地方必须注意。SPI的四根线(SCLK、MISO、MOSI、CS)要尽量短,如果ADC和MCU不在同一块板上,建议用屏蔽线或者双绞线。ADS122U04的DRDY引脚一定要接到STM32的外部中断引脚上,这样MCU可以在数据准备好时立即读取,避免轮询造成的延迟和功耗浪费。

电源方面,ADS122U04的模拟电源和数字电源建议分开供电,模拟电源用LDO单独供给,数字电源可以跟STM32共用。模拟地和数字地在ADC下方单点连接,避免数字噪声串入模拟部分。参考电压引脚旁边要放一个1微法到10微法的钽电容,再并联一个0.1微法的陶瓷电容,滤除高频噪声。

PCB布局上,ADS122U04的模拟输入引脚要走差分对,尽量等长,远离时钟线和电源线。如果做PT100测量,激励电流源的走线也要对称,否则引线电阻不匹配会引入误差。我一般会在模拟输入前端加一个RC低通滤波,截止频率设在1kHz左右,电阻用100欧姆,电容用1微法,既能滤除高频干扰,又不会影响温度信号的带宽。

3.2 SPI驱动代码实现

STM32F103RC的SPI驱动可以用HAL库,也可以用标准库。我这里用HAL库演示,因为HAL库的移植性更好。初始化代码如下:

SPI_HandleTypeDef hspi1; void SPI1_Init(void) { hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; HAL_SPI_Init(&hspi1); }

SPI时钟预分频设为64,STM32F103RC的主频是72MHz,SPI时钟就是1.125MHz。ADS122U04的SPI最高支持到4MHz左右,1.125MHz足够安全,而且能减少高速时钟带来的干扰。

读写ADS122U04的寄存器需要遵循它的命令格式。ADS122U04的命令分为两类:一类是控制命令,比如复位、启动转换、关机;另一类是寄存器读写命令。读寄存器的命令是0x20加上寄存器地址左移2位,写寄存器的命令是0x40加上寄存器地址左移2位。下面是一个写寄存器的函数:

void ADS122U04_WriteReg(uint8_t reg, uint8_t value) { uint8_t cmd = 0x40 | (reg << 2); ADS122U04_CS_LOW(); HAL_SPI_Transmit(&hspi1, &cmd, 1, 100); HAL_SPI_Transmit(&hspi1, &value, 1, 100); ADS122U04_CS_HIGH(); }

读寄存器类似,先发送读命令,然后发送一个空字节读取数据:

uint8_t ADS122U04_ReadReg(uint8_t reg) { uint8_t cmd = 0x20 | (reg << 2); uint8_t value; ADS122U04_CS_LOW(); HAL_SPI_Transmit(&hspi1, &cmd, 1, 100); HAL_SPI_Receive(&hspi1, &value, 1, 100); ADS122U04_CS_HIGH(); return value; }

读取转换数据时,ADS122U04会输出24位数据,需要分三次读取,然后拼合成一个32位有符号整数:

int32_t ADS122U04_ReadData(void) { uint8_t buf[3]; int32_t data; ADS122U04_CS_LOW(); HAL_SPI_Receive(&hspi1, buf, 3, 100); ADS122U04_CS_HIGH(); data = ((int32_t)buf[0] << 16) | ((int32_t)buf[1] << 8) | buf[2]; if (data & 0x800000) { data |= 0xFF000000; } return data; }

注意:ADS122U04的数据是24位补码格式,最高位是符号位。拼合后必须做符号扩展,否则负温度会变成很大的正数。这个坑我在第一次调试时踩过,零下温度显示成几万度,查了半天才发现是符号位没处理。

3.3 DRDY中断与数据采集流程

ADS122U04的DRDY引脚在转换数据准备好时会拉低,STM32F103RC可以通过外部中断检测这个下降沿,然后在中断服务函数里读取数据。中断服务函数要尽量简短,只做数据读取和标志位设置,数据处理放到主循环里做。

volatile uint8_t adc_data_ready = 0; volatile int32_t adc_raw_data = 0; void EXTI0_IRQHandler(void) { if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) != RESET) { __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0); adc_raw_data = ADS122U04_ReadData(); adc_data_ready = 1; } }

主循环里检测到adc_data_ready标志后,进行温度换算、滤波、显示或上传。这种中断加主循环的架构,既能保证数据不丢失,又不会因为中断处理时间过长影响其他任务。

4. 温度传感器选型与信号调理实战

4.1 热电偶与铂电阻的适用场景对比

工业和HVAC场景下,温度传感器主要分两大类:热电偶和铂电阻。热电偶基于塞贝克效应,两种不同金属在温度梯度下产生热电势,优点是测量范围广(K型可以覆盖-200到1372度)、响应快、成本低、耐振动,缺点是输出信号微弱、需要冷端补偿、线性度一般。铂电阻基于金属电阻随温度变化的特性,PT100在0度时100欧姆,PT1000是1000欧姆,优点是精度高、线性度好、稳定性强,缺点是响应慢、需要激励电流、成本相对高。

HVAC系统里,风管温度、水温、室内温度这些场景,温度范围通常在-40到150度之间,PT100或PT1000是首选。工业过程控制里,锅炉、熔炉、反应釜这些高温场景,K型或S型热电偶更合适。我这次的项目两种都支持,通过更换前端调理电路和ADC配置来切换。

4.2 PT100比例式测量电路详解

PT100的比例式测量电路是这样的:ADS122U04的内部电流源从AIN0输出,流过PT100,再流过参考电阻Rref,最后回到AIN3。ADC测量PT100两端的电压和Rref两端的电压,然后取比值。假设PT100的阻值为Rpt,参考电阻为Rref,ADC测得的比值就是Rpt/Rref。因为PT100的阻值与温度有确定的关系,通过查表或公式反算就能得到温度。

参考电阻的选择很关键。ADS122U04的内部参考电压是2.048V,电流源是10微安,那么参考电阻上的压降不能超过2.048V,所以Rref最大不能超过204.8千欧。但Rref太大,PT100上的压降就太小,信噪比会下降。我一般选Rref为PT100在满量程温度时阻值的1到2倍。比如测量-50到200度,PT100在200度时约175.86欧姆,Rref选200欧姆或300欧姆比较合适。这样PT100上的压降在0到1.76毫伏之间,Rref上的压降在2毫伏左右,ADC的PGA设为128倍后,信号落在满量程的10%到20%,还有提升空间。如果把电流源改成50微安或100微安,信号会更大,但自热效应也会更明显。

自热效应是PT100测量中容易被忽视的问题。10微安电流在PT100上产生的功率是I²R,100欧姆时只有10纳瓦,自热引起的温升可以忽略不计。但如果用1毫安激励电流,功率就是100微瓦,在静止空气中可能导致0.1度以上的自热误差。所以小电流激励是PT100测量的正确选择,代价是需要更高的PGA增益和更低的噪声。

4.3 热电偶冷端补偿的实现方法

热电偶测量的是热端和冷端之间的温差,要得到热端的绝对温度,必须知道冷端的温度。冷端补偿的常见做法是在热电偶接线端子附近放一个温度传感器,比如LM35、DS18B20或者PT1000,测量冷端温度,然后根据热电偶的分度表计算出热端温度。

ADS122U04有一个内置的温度传感器,精度大约0.5度,可以用来做冷端补偿。但它的位置在芯片内部,跟实际冷端(接线端子)之间可能有温差,所以更可靠的做法是用外部传感器测冷端。我一般用PT1000贴在接线端子旁边,用ADS122U04的另一路输入测量,这样冷端补偿的精度可以做到0.1度以内。

冷端补偿的计算过程是这样的:假设热电偶输出热电势为Vth,冷端温度为Tc,根据热电偶分度表,冷端温度Tc对应的热电势为Vc,那么热端温度Th对应的热电势为Vth + Vc。然后查表或通过多项式拟合反算出Th。K型热电偶在0到1000度范围内的多项式拟合误差可以做到0.1度以内,用四阶或五阶多项式就够了。

实操心得:热电偶的冷端补偿,冷端温度测量点的位置比测量精度更重要。如果冷端传感器离接线端子太远,测到的温度跟实际冷端温度差好几度,补偿效果就大打折扣。我一般用导热硅胶把PT1000贴在接线端子背面,再用隔热棉盖住,减少环境温度波动的影响。

5. 数据处理、滤波与温度换算

5.1 从ADC原始码到温度值的换算链路

ADC读到的原始码是24位有符号整数,范围是-8388608到8388607。换算成电压的公式是:V = (raw / 8388608) × Vref / PGA。其中Vref是参考电压,PGA是增益。对于PT100比例式测量,我们不需要计算绝对电压,直接算比值:Rpt/Rref = Vpt / Vref_adc,其中Vpt是PT100上的电压,Vref_adc是参考电阻上的电压。因为两个电压是用同一个ADC、同一个参考电压测量的,参考电压的漂移被抵消。

得到Rpt后,通过Callendar-Van Dusen方程反算温度。PT100在0度以上时,Rpt = R0 × (1 + A×T + B×T²),其中R0=100欧姆,A=3.9083e-3,B=-5.775e-7。0度以下时还要加一个C项,但HVAC场景一般不会低于-40度,用二次方程就够了。反算T的公式是:T = (-A + sqrt(A² - 4B(1 - Rpt/R0))) / (2B)。这个公式在-200到850度范围内精度可以做到0.01度以内。

对于热电偶,ADC读到的电压经过PGA放大后,除以增益得到实际热电势,再加上冷端补偿的热电势,然后通过多项式反算温度。K型热电偶在0到500度范围内的五阶多项式系数是固定的,可以直接用。

5.2 数字滤波算法的选择与实现

工业现场的噪声来源很多,变频器的高频开关噪声、电机的换向噪声、接触器的电弧噪声,都会耦合到温度信号上。虽然ADS122U04的ΔΣ架构和50/60Hz抑制滤波器已经滤掉了大部分噪声,但软件端再加一层滤波会更稳妥。

我常用的滤波算法有三种:滑动平均、中值滤波和一阶低通滤波。滑动平均适合压制随机噪声,但会引入滞后;中值滤波适合剔除脉冲干扰,比如接触器动作产生的尖峰;一阶低通滤波适合平滑缓慢变化的信号,计算量小。实际项目中,我一般先用中值滤波剔除异常值,再用滑动平均平滑数据。

#define FILTER_LEN 8 int32_t filter_buf[FILTER_LEN]; uint8_t filter_idx = 0; int32_t median_filter(int32_t new_val) { int32_t temp[FILTER_LEN]; int32_t sum = 0; filter_buf[filter_idx] = new_val; filter_idx = (filter_idx + 1) % FILTER_LEN; memcpy(temp, filter_buf, sizeof(temp)); // 简单的冒泡排序 for (int i = 0; i < FILTER_LEN - 1; i++) { for (int j = 0; j < FILTER_LEN - 1 - i; j++) { if (temp[j] > temp[j+1]) { int32_t t = temp[j]; temp[j] = temp[j+1]; temp[j+1] = t; } } } // 去掉最大最小各两个,剩下的取平均 for (int i = 2; i < FILTER_LEN - 2; i++) { sum += temp[i]; } return sum / (FILTER_LEN - 4); }

这个滤波函数结合了中值滤波和滑动平均的优点,既能剔除脉冲干扰,又能平滑随机噪声。FILTER_LEN选8,去掉最大最小各两个,剩下4个取平均,计算量不大,在STM32F103RC上跑起来毫无压力。

5.3 温度换算的精度验证方法

温度换算的精度验证,最可靠的方法是用标准温度源。如果没有标准温度源,可以用精密电阻箱模拟PT100的阻值,然后看ADC读数和换算结果是否跟电阻箱设定值一致。比如把电阻箱设为100.00欧姆,对应0度,看显示是不是0.00度;设为138.51欧姆,对应100度,看显示是不是100.00度。

热电偶的验证稍微麻烦一些,需要用到毫伏信号源。K型热电偶在100度时输出4.096毫伏(冷端0度),在500度时输出20.644毫伏。用毫伏信号源输出这些电压,看换算结果是否跟分度表一致。冷端补偿的验证可以在恒温箱里做,把冷端和温度计放在一起,看补偿后的温度是否跟温度计一致。

注意:温度换算的精度验证,一定要在系统稳定后做。ADC上电后需要一段时间才能达到热平衡,PT100和参考电阻的温漂也需要时间稳定。我一般让系统预热30分钟后再做精度测试,否则数据会漂。

6. 常见问题排查与避坑经验实录

6.1 ADC读数跳动大或噪声高的排查思路

ADC读数跳动大是最常见的问题,原因可能有很多。第一步先检查电源,用示波器看模拟电源上的纹波,如果纹波超过10毫伏,就要加强滤波。第二步检查参考电压,ADS122U04的内部参考虽然方便,但如果有外部干扰,可以换成外部精密参考,比如REF5025。第三步检查输入滤波,如果传感器引线很长,没有屏蔽,很容易引入干扰,加一个RC低通滤波和共模扼流圈会有明显改善。

还有一个容易被忽视的原因是SPI时钟太快。ADS122U04的SPI接口在高速时钟下可能产生时序问题,导致数据读取错误。把SPI时钟降到1MHz以下试试,如果读数稳定了,就是时序问题。另外,CS引脚的控制也很关键,CS拉低到SCLK第一个边沿之间要有足够的建立时间,CS拉高到下一个SCLK边沿之间要有足够的保持时间,具体数值参考数据手册。

6.2 温度读数漂移或不准的常见原因

温度读数漂移,首先要区分是ADC漂移还是传感器漂移。把传感器换成精密电阻,如果读数稳定,说明ADC没问题,是传感器或引线的问题。PT100的引线电阻会直接叠加到测量结果上,两线制接法每根引线引入的电阻可能有好几欧姆,对应好几度的误差。所以PT100测量一定要用三线制或四线制接法,把引线电阻抵消掉。

ADS122U04做比例式测量时,参考电阻的温漂会直接影响精度。普通厚膜电阻的温漂可能达到100ppm/度,在-40到125度的范围内,阻值变化超过1.6%,对应温度误差好几度。所以参考电阻一定要选低温漂的,比如Vishay的PTF系列或VPG的箔电阻,温漂可以做到5ppm/度以内。

热电偶的漂移主要来自冷端补偿。如果冷端温度测量不准,补偿后的温度就会整体偏移。冷端补偿的另一个坑是热电偶引线的材质。如果从热电偶到ADC的引线不是同种热电偶材料,中间就会形成新的热电偶节点,引入额外的热电势。正确的做法是用热电偶延长线,或者把冷端补偿点尽量靠近ADC。

6.3 常见问题速查表

现象可能原因排查方法解决方案
ADC读数跳动大电源纹波大示波器测模拟电源加强LDO滤波,加钽电容
ADC读数跳动大SPI时序问题降低SPI时钟时钟降到1MHz以下
ADC读数跳动大输入无滤波检查前端电路加RC低通和共模扼流圈
温度读数整体偏移参考电阻温漂大查电阻规格书换低温漂电阻
温度读数整体偏移PT100引线电阻测量引线电阻改用三线制或四线制
温度读数整体偏移冷端补偿不准对比冷端温度冷端传感器贴近端子
负温度显示为正符号位未扩展检查数据拼合代码加符号扩展
配置寄存器写入失败SPI模式不对检查CPOL/CPHA改为模式1
数据率不稳定时钟源漂移检查内部振荡器改用外部晶振

6.4 几个容易踩的坑和独家技巧

第一个坑是ADS122U04的复位时间。上电后发送复位命令,芯片需要大约1毫秒才能完成复位,如果复位后立即写配置寄存器,可能会失败。我一般复位后延时2毫秒再写配置。

第二个坑是DRDY引脚的初始状态。ADS122U04上电后DRDY可能是高电平也可能是低电平,如果直接开外部中断,可能会误触发。正确的做法是先配置好ADC,启动转换后,再清除中断标志,开启中断。

第三个技巧是使用ADS122U04的内部温度传感器做粗略的冷端补偿。虽然精度不如外部传感器,但在一些对成本敏感、精度要求不高的场合,可以省掉一个外部传感器。内部温度传感器的读数可以通过配置寄存器切换到温度测量模式,读取的码值经过换算就是芯片温度。

第四个技巧是定期做自校准。ADS122U04支持偏移校准和增益校准,可以在上电时做一次,也可以在温度变化较大时做。校准的方法是短接输入,测量偏移,然后接入已知参考电压,测量增益误差,把校准系数存到STM32的Flash里,后续测量时用这些系数修正。

7. 系统集成与工业现场部署要点

7.1 电磁兼容设计与防护

工业现场的电磁环境恶劣,温度测量板卡必须做好防护。电源入口要加TVS管和共模扼流圈,防止浪涌和共模干扰。模拟输入端口要加气体放电管或TVS管,防止静电和浪涌损坏ADC。PCB布局上,模拟区和数字区要分开,模拟地平面和数字地平面单点连接,连接点选在ADC下方。

如果传感器引线很长,建议用屏蔽双绞线,屏蔽层单端接地,接在板卡的模拟地上。屏蔽层不要两端接地,否则会形成地环路,引入更多干扰。对于热电偶这种低电平信号,还可以加一个隔离放大器,把传感器侧和主控侧完全隔离,彻底切断地环路。

7.2 低功耗设计与电源管理

HVAC系统里很多温度变送器是电池供电或者两线制环路供电,功耗要求很严。ADS122U04支持单次转换模式,转换完成后自动进入低功耗状态,电流消耗可以降到几微安。STM32F103RC也有多种低功耗模式,在不需要测量的时候可以进入停止模式,定时唤醒做一次测量。

两线制环路供电的设计稍微复杂一些,需要从4到20毫安的环路电流中取电。一般做法是用一个稳压管和电容储能,在环路电流的谷值期间由电容供电。这种设计对功耗的要求更苛刻,ADS122U04的单次转换模式和STM32的停止模式是必须的。

7.3 校准与长期稳定性维护

工业仪表出厂前都要做校准,温度变送器的校准一般用精密电阻箱或标准温度源。校准点通常选在量程的0%、25%、50%、75%、100%五个点,记录每个点的ADC读数和标准值,然后用最小二乘法拟合出修正系数。修正系数存在STM32的Flash里,每次测量时用这些系数修正。

长期稳定性方面,PT100的长期漂移很小,每年大概0.05度以内。ADS122U04的长期漂移也很低,但参考电阻和PCB的应力可能会引起微小变化。建议每年做一次校准,或者在系统里加一个自校准通道,定期测量一个精密参考电阻,监测系统的漂移。

实操心得:工业现场的温度变送器,防护等级和接线端子的质量比电路精度更重要。我见过很多精度很高的板卡,因为接线端子氧化或者防水没做好,在现场用了半年就出问题。所以外壳的IP等级、端子的镀金层、电缆的防水接头,这些细节不能省。

8. 实际项目中的性能实测与优化记录

8.1 实测数据与精度分析

我在实验室里用精密电阻箱模拟PT100,对这套方案做了完整的精度测试。测试点覆盖-40、-20、0、25、50、100、150、200度,每个点稳定10分钟后读取100个样本,取平均值和标准差。实测结果如下:

设定温度平均读数误差标准差
-40度-39.97度+0.03度0.008度
0度0.01度+0.01度0.006度
25度25.02度+0.02度0.007度
100度100.03度+0.03度0.009度
200度200.05度+0.05度0.012度

整体误差在0.05度以内,标准差在0.012度以内。这个性能对于工业和HVAC应用来说绰绰有余。误差随温度略微增大的趋势,主要来自PT100本身的非线性,通过更高阶的拟合方程可以进一步改善。

8.2 不同数据率下的噪声对比

ADS122U04的数据率可以配置为5、10、20、45、90、175、330、600、1000SPS。数据率越低,ΔΣ调制器的过采样率越高,噪声越低。我实测了不同数据率下的噪声RMS:

数据率噪声RMS有效分辨率
20SPS0.9微伏21.5位
45SPS1.5微伏20.8位
90SPS2.8微伏19.9位
175SPS5.2微伏19.0位
330SPS9.8微伏18.1位

温度测量对速度要求不高,20SPS完全够用,而且噪声最低。如果做多点巡检,比如一个ADC轮流测量8路温度,每路需要几十毫秒的建立时间,20SPS下每路大约50毫秒,8路就是400毫秒,对于大多数HVAC应用来说这个刷新率是可以接受的。

8.3 优化前后的性能对比

第一版硬件做出来的时候,ADC读数跳动比较大,标准差在0.05度左右。排查后发现两个问题:一是模拟电源的LDO输出纹波偏大,有20毫伏左右的开关噪声;二是PT100的引线没有屏蔽,耦合了变频器的干扰。改进措施是换用低噪声LDO,在LDO输出端加π型滤波,PT100引线改用屏蔽双绞线,屏蔽层接模拟地。改进后标准差降到0.01度以内,效果非常明显。

软件方面,第一版没有做中值滤波,偶尔会出现因为接触器动作导致的脉冲干扰,温度读数突然跳变好几度。加了中值滤波后,脉冲干扰被完全剔除,读数曲线平滑了很多。这个改进不需要任何硬件成本,只是多几行代码,性价比极高。

9. 方案扩展与不同场景的适配建议

9.1 多路温度巡检的扩展方法

HVAC系统里经常需要测量多个点的温度,比如新风温度、回风温度、送风温度、冷冻水进出水温度等。ADS122U04只有两路差分输入,不够用。扩展的方法有两种:一是用多片ADS122U04,通过SPI的片选信号切换;二是用外部多路复用器,比如CD4051或ADG708,把多路信号切换到ADS122U04的输入。

多片ADS122U04的方案成本高一些,但每片ADC可以独立配置,适合传感器类型不同的场景。外部多路复用器的方案成本低,但多路复用器的导通电阻会影响测量精度,做PT100比例式测量时,导通电阻会叠加到PT100或参考电阻上,引入误差。如果非要用多路复用器,建议选导通电阻低且匹配好的型号,比如ADG1408,导通电阻在几欧姆以内,而且通道间的匹配度很好。

9.2 隔离方案与远距离传输

传感器离主控板超过10米时,建议加隔离。隔离的方案有两种:一是数字隔离,在SPI总线上加数字隔离器,比如ADuM1401,把ADC和MCU隔开;二是模拟隔离,在传感器和ADC之间加隔离放大器,比如AMC1301。数字隔离的成本低,但ADC和传感器仍然共地,如果传感器侧的地电位跟主控侧差很多,共模电压可能超过ADC的输入范围。模拟隔离的成本高,但隔离更彻底,适合传感器侧地电位浮动大的场景。

远距离传输时,PT100建议用四线制接法,两根线走激励电流,两根线测电压,引线电阻完全不影响测量。热电偶建议用屏蔽双绞线,屏蔽层单端接地,如果距离超过50米,可以考虑用4到20毫安变送器,把温度信号转换成电流信号再传输,抗干扰能力更强。

9.3 与上位机通信的集成方案

温度数据最终要上传到上位机或PLC。STM32F103RC的通信接口很丰富,UART、CAN、USB都有。HVAC系统里最常用的是Modbus RTU over RS485,因为RS485抗干扰能力强,支持多点组网,传输距离可达1200米。STM32F103RC的UART加上一个RS485收发器,比如MAX485或SP3485,就可以实现Modbus RTU从站。

Modbus寄存器的映射可以这样设计:保持寄存器0x0000存放温度值的高16位,0x0001存放低16位,0x0002存放状态字,0x0003存放报警阈值。上位机通过功能码0x03读取这些寄存器,就能获取温度数据。如果需要更高速的通信,可以用CAN总线,STM32F103RC自带CAN控制器,加一个CAN收发器就行。

这个方案后续还可以扩展无线通信,比如加一个LoRa模块或者NB-IoT模块,把温度数据上传到云平台。不过工业现场对无线通信的可靠性要求很高,无线方案一般只作为有线方案的备份,或者用在布线困难的场景。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/5 5:03:49

STM32F373外挂ADS122U04:HVAC高精度温度采集方案详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 5:03:41

基于ADS122U04与STM32L031C6的工业级高精度温度测量方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 5:03:38

ADS122U04与PIC18F4682实现高精度PT100测温系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 5:02:33

高精度RTD测温:ADS122U04与RA4M2的24位ADC信号链实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 5:02:29

24位ADC与PIC18实现PT100高精度温度采集方案解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 4:59:59

ADS122U04IPWR+STM32F030RC工业温度测量实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华