☰
HVAC温度采集实战:ADS122U04与STM32F469II高精度设计
2026/11/5 3:16:55 网站建设 项目流程

工业现场的温度测量,说起来简单,做起来全是细节。PT100、热电偶、热敏电阻这些传感器本身精度可以做到很高,但真正决定系统测量精度的,往往是信号链前端的ADC和参考基准。我最近在做一个HVAC机组的温度采集模块,用的是ADS122U04IPWR配STM32F469II这套组合,踩了不少坑,也积累了一些实战经验。这篇文章就把整个设计过程拆开来讲——从为什么选这颗ADC、硬件怎么搭、寄存器怎么配、到实测中遇到的问题和解决办法,尽量把每个决策背后的逻辑说清楚。如果你也在做工业或HVAC场景的温度采集,尤其是多路RTD或热电偶的方案,这篇内容应该能帮你少走一些弯路。

1. 为什么HVAC温度采集需要24位ADC而不是MCU内置的12位

1.1 HVAC场景对温度精度的真实需求

很多人第一反应是:STM32F469II本身就有12位ADC,直接拿来用不就行了?我在项目初期也这么想过,但实际算一下就知道不够用。

HVAC系统里常见的温度测量范围是-50°C到+150°C,以PT100为例,0°C时阻值100Ω,100°C时138.51Ω,平均每度变化约0.385Ω。如果用12位ADC、3.3V参考电压,最小分辨电压是3.3V/4096≈0.8mV。PT100在1mA激励电流下,每度产生0.385mV的电压变化。也就是说,12位ADC的理论分辨率刚好卡在每度一个LSB左右,实际有效位数还要打折,根本没法做0.1°C级别的测量。

换成24位ADC,同样是3.3V参考,理论LSB是3.3V/16777216≈0.197μV,对应PT100的温度分辨率约0.0005°C。当然实际有效位数(ENOB)不可能达到24位,ADS122U04在增益128、20SPS数据率下,有效分辨率大约21.5位,换算下来温度分辨率约0.003°C,完全满足HVAC对0.1°C精度的要求。

这里有个关键点:ADC的位数不是越高越好,而是要和传感器灵敏度、激励电流、增益匹配。ADS122U04内置PGA,增益可设1到128,这就省掉了外部仪表放大器,对成本和板面积都是好事。

1.2 ADS122U04IPWR的关键特性拆解

ADS122U04IPWR是TI的一款24位ΔΣ ADC,4通道差分输入,内置PGA、振荡器和参考电压。我选它的核心理由有几个:

  • 内置2.048V参考电压:初始精度0.05%,温漂5ppm/°C。对于PT100测量,参考电压的稳定性直接决定测量精度,外置参考芯片不仅增加成本,还多一路噪声源。
  • PGA增益1到128:PT100在1mA激励下满量程才138mV左右,用增益16或32可以把信号放大到ADC的最佳输入范围,充分利用动态范围。
  • 双匹配IDAC电流源:10μA到1.5mA可编程,专门为RTD测量设计。两路电流源可以自动消除引线电阻影响,做三线制RTD测量非常方便。
  • SPI接口:和STM32F469II对接简单,最高支持到几MHz时钟。
  • 20SPS到2000SPS数据率:HVAC温度变化慢,用20SPS就够了,还能开启50/60Hz工频抑制。

对比一下常见的替代方案:ADS124S08通道更多但封装更大,MAX31865专门做PT100但只支持RTD不支持热电偶。ADS122U04在灵活性和集成度之间找到了不错的平衡点。

1.3 STM32F469II在这个方案里的角色定位

STM32F469II是STM32F4系列里的高性能型号,180MHz主频,2MB Flash,384KB RAM,带LTDC液晶控制器和Chrom-ART加速器。有人会问:温度采集用得着这么强的MCU吗?

单看温度采集确实用不着,但这个项目里STM32F469II还要跑LCD显示、Modbus通信、数据记录和PID控制算法。温度采集只是其中一个任务。F469的硬件SPI接口配合DMA,可以在后台自动搬运ADC数据,CPU几乎不占用,这对多任务系统很重要。

另外F469的浮点运算单元(FPU)在做温度线性化和多点校准多项式计算时很有用,单精度浮点运算一个周期就能完成,不用软件模拟。

2. 硬件设计:从PT100到ADC的完整信号链

2.1 三线制PT100的接线逻辑与IDAC配置

工业现场PT100通常用三线制接法,目的是消除引线电阻的影响。原理很简单:两根引线分别通电流和测电压,第三根作为补偿线。ADS122U04有两路匹配IDAC,可以分别从两个引脚输出激励电流,在ADC内部做差分测量时自动抵消引线电阻。

具体接线方式:IDAC1从AIN0输出,经过PT100的上引线;IDAC2从AIN3输出,经过PT100的下引线;ADC测量AIN0和AIN1之间的差分电压。这样两根引线上的压降在差分测量中被抵消,只剩下PT100本身的压降。

这里有个容易忽略的细节:两路IDAC的匹配度。ADS122U04的IDAC匹配误差典型值0.1%,如果不匹配,引线电阻的补偿就不完全。假设引线电阻5Ω,IDAC失配0.1%,引入的误差是5Ω×0.001×1mA=5μV,对应PT100约0.013°C,可以接受。

2.2 模拟前端滤波与保护电路

工业环境的电磁干扰比实验室恶劣得多,模拟前端必须做滤波和保护。

差分滤波:在AIN0/AIN1和AIN2/AIN3之间各放一个差分电容(100nF),再在每根信号线上串一个1kΩ电阻,对地放10nF电容,构成截止频率约1.6kHz的RC低通滤波。这个频率远高于20SPS数据率对应的奈奎斯特频率,不会影响有用信号,但能有效抑制高频干扰。

过压保护:HVAC现场可能出现浪涌或接线错误,我在每路输入前加了BAT54S双肖特基二极管做钳位,把电压限制在-0.3V到VDD+0.3V之间。再串一个100Ω的限流电阻,防止钳位电流过大。

共模滤波:ADC的共模输入范围是AVDD-0.1V到AVSS+0.1V,实际使用时最好让共模电压在AVDD/2附近。PT100的共模电压由IDAC电流和引线电阻决定,通常在0.5V到1.5V之间,在允许范围内。

2.3 电源与地去耦策略

ΔΣ ADC对电源噪声很敏感,尤其是参考电压和模拟电源。我的做法是:

  • 模拟电源AVDD用独立的LDO供电,和数字电源DVDD分开,中间用磁珠隔离。
  • AVDD对AVSS放1μF和100nF电容,尽量靠近芯片引脚。
  • 参考电压引脚REFP/REFN放1μF和100nF电容,REFP还要加一个10μF钽电容做低频去耦。
  • 模拟地和数字地单点连接,连接点选在ADC的AVSS引脚下方。

实测下来,如果模拟电源和数字电源共用一路LDO,ADC的噪声会明显增大,20SPS下有效位数可能掉1到2位。这个坑我踩过,后来改了电源方案才解决。

3. STM32F469II与ADS122U04的SPI通信实现

3.1 SPI模式选择与时钟配置

ADS122U04的SPI接口支持模式1(CPOL=0,CPHA=1),STM32F469II的SPI配置需要匹配。我用的配置是:

  • SPI时钟:分频到2.5MHz左右,ADS122U04最高支持到4MHz,但为了信号完整性留了余量。
  • 数据位:8位,MSB先行。
  • NSS:软件控制,用GPIO手动拉低拉高,因为ADS122U04的片选需要在命令之间保持低电平。

这里有个细节:ADS122U04的命令和数据处理有严格的时序要求。比如发送START/SYNC命令后,需要等待至少4个tCLK周期才能读取数据。如果用硬件NSS自动控制,时序可能不满足,所以建议用软件NSS。

3.2 寄存器配置流程与关键参数

ADS122U04有4个配置寄存器,上电后需要按顺序写入。我的配置流程是:

// 配置寄存器0:MUX=AIN0/AIN1差分,增益=16,PGA使能 ADS122U04_WriteReg(0x00, 0x08); // 配置寄存器1:数据率=20SPS,连续转换模式,工频抑制使能 ADS122U04_WriteReg(0x01, 0x04); // 配置寄存器2:IDAC=1mA,IDAC1接AIN0,IDAC2接AIN3 ADS122U04_WriteReg(0x02, 0x50); // 配置寄存器3:内部参考使能,IDAC使能 ADS122U04_WriteReg(0x03, 0x30);

关键参数说明:

  • 增益选择:PT100在1mA下满量程约138mV,内部参考2.048V,增益16时输入范围是2.048V/16=128mV,刚好覆盖。如果增益选32,输入范围64mV,会削顶。所以增益16是最优选择。
  • 数据率:20SPS对应50/60Hz抑制,HVAC温度变化慢,这个速率足够。如果需要更快响应,可以选45SPS或90SPS,但工频抑制会减弱。
  • IDAC电流:1mA是PT100的常用激励电流,太小信噪比差,太大自热误差明显。PT100在1mA下的自热功率是0.1mW,自热系数约0.05°C/mW,自热误差约0.005°C,可以忽略。

3.3 数据读取与DMA搬运

连续转换模式下,ADS122U04的DRDY引脚会在新数据准备好时拉低。STM32F469II可以用外部中断检测DRDY下降沿,然后在中断里读取3字节数据。

为了减少CPU占用,我用SPI的DMA接收功能。配置DMA在SPI RX事件触发,每次搬运3字节到缓冲区。DRDY中断里只需要启动DMA传输,数据处理放到主循环里做。

void EXTI_DRDY_Handler(void) { if (EXTI_GetITStatus(DRDY_PIN)) { EXTI_ClearITPendingBit(DRDY_PIN); HAL_SPI_Receive_DMA(&hspi1, adc_buffer, 3); } }

数据处理时把3字节拼成24位有符号整数,再换算成电压和温度:

int32_t raw = (adc_buffer[0] << 16) | (adc_buffer[1] << 8) | adc_buffer[2]; if (raw & 0x800000) raw |= 0xFF000000; // 符号扩展 float voltage = (float)raw * 2.048f / 8388608.0f / 16.0f; // 除以增益 float resistance = voltage / 0.001f; // 1mA激励 float temperature = (resistance - 100.0f) / 0.385f; // 简化线性计算

实际项目中温度计算要用Callendar-Van Dusen方程做非线性校正,线性近似在0到100°C范围内误差约0.4°C,不能满足要求。

4. 温度换算:从ADC码值到实际温度的完整计算链路

4.1 PT100的Callendar-Van Dusen方程实现

PT100的阻值-温度关系不是线性的,标准用Callendar-Van Dusen方程描述:

  • T≥0°C:R(T) = R0 × (1 + A×T + B×T²)
  • T<0°C:R(T) = R0 × [1 + A×T + B×T² + C×(T-100)×T³]

其中R0=100Ω,A=3.9083×10⁻³,B=-5.775×10⁻⁷,C=-4.183×10⁻¹²。

从阻值反算温度需要解方程,正向计算容易,反向解析解比较复杂。工程上常用两种方法:

方法一:分段线性插值。把-50到150°C分成若干段,每段用线性近似。我试过每10°C一段,最大误差约0.02°C,够用了。查表法实现简单,运算量小,适合MCU。

方法二:牛顿迭代法。用正向方程做迭代,初值取线性近似值,迭代3到4次就能收敛到0.001°C以内。代码稍复杂但精度更高。

我最终用的是分段线性插值加二次修正,在STM32F469II上跑一次换算不到10μs,完全不影响系统实时性。

4.2 参考电压温漂的补偿

ADS122U04内部参考的温漂是5ppm/°C,在-40到85°C范围内,参考电压变化约0.06%。对应PT100测量误差约0.15°C(100°C时)。如果应用环境温度变化大,这个误差不能忽略。

我的做法是在板上靠近ADC的位置放一个高精度温度传感器(比如TMP117),实时监测ADC环境温度,用查表法补偿参考电压的温漂。TMP117精度±0.1°C,足够用来做补偿。

补偿公式:Vref_actual = Vref_25°C × (1 + 5e-6 × (T_ambient - 25))

这个补偿把参考温漂引入的误差从0.15°C降到了0.02°C以内。

4.3 系统校准:单点与多点校准的取舍

即使ADC和参考都很准,PCB走线电阻、IDAC失配、PT100本身公差都会引入系统误差。出厂前必须做校准。

单点校准:在0°C(冰水混合物)下测一次,计算偏移量,后续所有测量减去这个偏移。简单但只能修正偏移误差,不能修正增益误差。

多点校准:在0°C、50°C、100°C三个点测量,用最小二乘法拟合增益和偏移。精度更高,但需要恒温槽等设备。

我的方案是两点校准:0°C和100°C。0°C用冰水混合物,100°C用沸水(注意当地大气压对沸点的影响)。两点校准可以同时修正偏移和增益,精度能到±0.1°C。

校准系数存在STM32F469II的Flash里,每次上电读取。校准流程通过串口命令触发,产线操作员按提示操作即可。

5. 实测中遇到的噪声问题与解决过程

5.1 现象:读数跳动超过预期

板子打回来后,第一版实测发现温度读数跳动约±0.5°C,远大于预期的±0.05°C。用示波器看ADC输入,发现信号上叠加了约50μV峰峰值的噪声,频率在几十kHz到几百kHz之间。

5.2 排查过程:从电源到布局逐级定位

排查分几步走:

第一步:确认噪声来源。断开PT100,用短路线代替,看ADC读数。如果噪声消失,说明噪声来自传感器引线;如果还在,说明是板级噪声。实测短路线时噪声降到±0.05°C,说明主要噪声来自传感器引线。

第二步:检查滤波电路。发现差分电容用的是普通X7R材质,容值随电压和温度变化大,滤波效果不稳定。换成C0G材质的100nF电容后,噪声降到±0.2°C。

第三步:检查IDAC走线。IDAC输出走线和ADC输入走线平行走了一段,存在耦合。重新布线,让IDAC走线和输入走线垂直交叉,噪声进一步降到±0.1°C。

第四步:检查地平面。发现模拟地和数字地虽然在一点连接,但连接点离ADC较远,地电流在连接路径上产生压降。把连接点移到ADC正下方,噪声降到±0.05°C。

5.3 最终方案:硬件滤波加软件平均

硬件上做了上述改进后,噪声已经满足要求。软件上再加一层保护:连续采样16次,去掉最大最小值后取平均。这样进一步把随机噪声降到±0.02°C。

但要注意:软件平均会降低响应速度。16次平均在20SPS下需要0.8秒,对于HVAC温度控制来说可以接受,因为温度本身变化慢。如果是快速温度测量场景,需要减少平均次数或提高数据率。

5.4 工频干扰的抑制验证

HVAC现场有大量电机和变频器,50Hz工频干扰很常见。ADS122U04在20SPS数据率下自带50/60Hz抑制,但前提是数据率精确匹配。我用信号发生器在输入端注入50Hz、100μV的信号,测ADC输出。20SPS下抑制比约80dB,干扰被压到1μV以下。如果切到90SPS,抑制比降到约60dB,干扰约100μV,对应温度误差0.26°C。所以在工频干扰严重的场合,一定要用20SPS数据率。

6. 多通道扩展与热电偶测量的适配

6.1 四通道轮询采集的实现

ADS122U04有4个单端或2个差分输入。如果要多路PT100,可以用外部多路复用器扩展,或者用两片ADS122U04。我用的是两片方案,每片做两路差分,共4路PT100。

两片ADC共用SPI总线,用不同的GPIO做片选。STM32F469II的SPI接口可以接多个从设备,只要片选管理好就行。数据读取时轮流拉低片选,分别读取。

轮询周期设为每通道100ms,4通道共400ms完成一轮。对于HVAC温度控制,这个刷新率足够。

6.2 热电偶测量时的配置差异

热电偶输出是mV级电压,比PT100的电阻信号更微弱。ADS122U04测热电偶时需要注意:

  • 增益选择:K型热电偶在1000°C时输出约41mV,增益32时输入范围64mV,刚好覆盖。如果用增益64,范围32mV,会削顶。
  • 冷端补偿:热电偶需要冷端补偿,我用TMP117测冷端温度,在软件里做补偿计算。
  • 断线检测:热电偶断线时ADC输入浮空,读数会漂到满量程。我开了ADS122U04的内部激励电流源做断线检测,定期注入微小电流,检测输入阻抗变化。

6.3 通道间串扰的实测数据

多通道ADC最怕通道间串扰。我实测了两片ADS122U04在4通道轮询时的串扰:通道1接PT100,通道2接固定电阻,测通道2读数受通道1切换的影响。实测串扰小于0.01°C,可以忽略。

串扰小的原因是ADS122U04内部有输入多路复用器,切换后有足够的建立时间。如果外部加多路复用器,建立时间需要额外考虑,串扰可能更大。

7. 工程化落地中的几个关键决策

7.1 采样率与响应速度的平衡

HVAC温度控制对响应速度要求不高,但也不是越慢越好。我最终选20SPS,原因是:

  • 20SPS自带50/60Hz抑制,省掉外部工频滤波。
  • 20SPS下噪声最低,有效位数最高。
  • 温度控制周期通常1秒以上,20SPS完全够用。

如果应用需要更快响应,比如快速温度保护,可以切到90SPS或175SPS,但需要接受噪声增大和工频抑制减弱。

7.2 校准周期的确定

校准周期取决于应用对精度的要求和环境条件。我的建议是:

  • 出厂校准一次,记录校准系数。
  • 现场每年校准一次,或者根据精度要求调整。
  • 如果环境温度变化大,建议每半年校准一次。

校准不需要拆机,通过串口命令进入校准模式,按提示操作即可。

7.3 故障诊断与冗余设计

工业设备要求高可靠性,我在软件里加了以下诊断:

  • ADC通信诊断:定期读ADS122U04的配置寄存器,确认值正确。
  • 传感器断线诊断:通过IDAC注入电流检测输入阻抗。
  • 读数合理性诊断:温度超出-60到200°C范围时报警。
  • 参考电压诊断:定期测量内部参考,确认在正常范围。

如果诊断到故障,系统切换到冗余通道或输出报警,避免误控制。

8. 写在最后的一些实操体会

这套方案从选型到量产花了大约三个月,中间改了两版板子。最大的体会是:ΔΣ ADC的性能发挥,七分靠硬件布局,三分靠软件配置。同样的芯片,布局不好噪声能差10倍。

另外,PT100的校准比想象中重要。我一开始觉得ADS122U04精度够高,不用校准,结果实测偏差0.3°C。后来做了两点校准,偏差降到0.05°C以内。校准用的冰水混合物和沸水,操作简单但效果很好。

还有一点:不要迷信数据手册的典型值。手册上说有效位数21.5位,那是在理想条件下的。实际板子上能到19位就不错了。设计时留足余量,别把指标卡太死。

最后分享一个小技巧:调试ADC时,先用短路线代替传感器,看噪声基底。如果短路线噪声就很大,说明是板级问题,先解决布局和电源;如果短路线噪声小,接上传感器噪声大,说明是传感器引线或滤波问题。这个排查顺序能帮你快速定位问题。

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

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

立即咨询