☰
基于ADS122U04与MK24FN1M0的高精度温度采集系统设计
2026/11/5 3:16:19 网站建设 项目流程

前两年我一直在折腾工业数据采集相关的小板子,最常遇到的问题就是“温度测不准”。不是硬件选型不行,就是软件补偿没做好,折腾到最后才发现,温度测量这个活,看起来简单,真要稳定到 0.1℃ 级别,从传感器、ADC、MCU、算法到校准,每个环节都藏着坑。最近做了一个基于 ADS122U04IPWR 和 MK24FN1M0VDC12 的方案,分别用于测量工业和 HVAC 应用中的温度,整体效果比较满意,今天就把完整的思路、电路要点、固件实现、校准过程和踩坑记录整理出来,希望能帮到同样在做高精度温度采集的朋友。

ADS122U04 是一颗 24 位 Δ-Σ ADC,带可编程增益放大器、多路复用器和电流激励源,非常适合接 PT100/PT1000 热电阻和热电偶;MK24FN1M0VDC12 是 NXP Kinetis K24 系列的 MCU,Cortex-M4F 内核,主频能跑到 120MHz,1MB Flash、256KB SRAM,浮点运算和 DSP 指令都有。这套组合的典型应用就是工业现场的多路温度监测、HVAC 冷冻水/新风机组温度测量这类需要长期稳定、又要一定精度的场景。下面从选型逻辑开始讲,再到硬件、固件、校准和现场问题,尽量把每一步为什么这么做说清楚。

1. 项目概览:一颗 Δ-Σ ADC 加一颗通用 MCU 的组合逻辑

1.1 为什么温度测量要 24 位而不用 MCU 内置 ADC

很多人会问:MK24FN1M0VDC12 这颗芯片本身就带 16 位 ADC,为什么还要外挂一颗 ADS122U04?这个问题我当年也纠结过,实际对比下来才明白,通用 MCU 内置 ADC 和专用测量 ADC 之间的差距,不在标称位数,而在模拟前端。

先说热电阻测量。PT100 在 0℃ 时阻值 100Ω,温度每变化 1℃ 大约只变化 0.385Ω。如果用 1mA 激励电流,温度每变化 1℃ 产生的电压变化只有 0.385mV。想要分辨出 0.1℃ 的温度变化,就需要分辨约 0.0385mV 的信号。MCU 内置 16 位 ADC 如果参考电压是 3.3V,一个 LSB 是 3.3V/65536≈50μV,看起来好像够用,但加上输入失调、增益误差、参考电压漂移、数字噪声这些因素之后,实际有效分辨率能有 12 位就不错了,测 0.1℃ 就很吃力。

ADS122U04 这类 Δ-Σ ADC 不一样。它内部有低噪声 PGA,增益可以开到 1 到 128,24 位分辨率配合 PGA 可以把微小信号放大到接近满量程,同时内置 2.048V 的低漂移参考电压。也就是说,信号链的“测量主体”由专用芯片完成,MCU 只负责控制和计算,这就把模拟和数字的职责分离了,抗干扰能力和精度稳定性都提升不少。

1.2 ADS122U04IPWR 与 MK24FN1M0VDC12 的分工

温度测量系统可以拆成三块:信号采集、信号处理、数据输出。ADS122U04 负责第一块,也就是把 PT100/PT1000/热电偶的信号转成数字;MK24FN1M0VDC12 负责后面两块,包括通过 SPI 读取转换结果、做线性化计算、滤波、报警判断,以及通过 RS485/以太网/无线把数据送出去。

为什么选 MK24FN1M0VDC12 而不是更便宜的 M0 内核 MCU?因为温度换算不像读 ADC 数据那么简单。PT100 的电阻-温度关系用 Callendar-Van Dusen 方程描述,热电偶的非线性更明显,如果用浮点数在 Cortex-M0 上硬算,一个通道的换算可能要耗掉几毫秒,多通道轮询时 CPU 占用率会很高。K24 有 FPU 和 DSP 指令,做这些计算快得多,1ms 以内能搞定好几个通道。而且它资源充足,还能同时维护 Modbus 协议栈、本地显示和故障记录,不用为存储空间发愁。

1.3 这组合在 HVAC 和工业现场能做什么

先说工业场景。我做过的一个案例是给一套小型反应釜测多点温度,包括釜内介质、夹套进出口,用 PT100 传感器,量程 0℃ 到 150℃。这类场景要求长时间连续运行,每天的测量偏差最好不超过 0.2℃,而且现场偶尔会有变频器、电机启停带来的电磁干扰。ADS122U04 的 Δ-Σ 架构本身对噪声有一定抑制能力,配合外围滤波和屏蔽,实测下来很稳。

HVAC 场景则不太一样。冷冻水供回水温度、新风机组盘管出风温度、风管回风温度这些点,量程通常在 -20℃ 到 100℃ 之间,精度要求反而不高,稳定是关键。HVAC 系统经常是全年无休运行,控制逻辑会跟着温度波动调阀门、调变频器,如果测量值有周期性抖动,控制器就会反复动作,既费电又磨损设备。所以这种场景更看重 ADC 的数字滤波效果和长期稳定性。

这两个场景加在一起,正好覆盖了“工业级精度”和“HVAC 级稳定”两个需求维度,一套硬件方案通吃,减少一个项目一套板子的重复设计。

2. 信号链与硬件设计:从传感器到 ADC 的关键细节

2.1 SPI 接线、DRDY 中断与隔离

ADS122U04 和 MK24FN1M0VDC12 之间走 SPI 接口,接线不算复杂:SCLK、DIN、DOUT、CS,外加一个 DRDY 引脚。DRDY 是转换完成标志,低电平表示“数据准备好了”,这个引脚必须接。

我建议把 DRDY 接到 K24 的一个 GPIO 中断引脚上,而不是用轮询。因为 ADS122U04 转换速率可以设成 20SPS 到 2kSPS 的不同档位,轮询容易浪费 CPU,而且如果时序稍微没对齐,读了半新半旧的数据,结果就会跳一下。用中断方式后,每次 DRDY 下降沿触发一次 SPI 读取,数据天然是完整的。

如果有长距离传感器信号线,或者现场有较大的地电位差,建议在 SPI 总线和 DRDY 线上加数字隔离器,比如 ISO7741 这类。隔离的意义不只是把干扰挡在外面,更是防止地环路电流影响测量精度。我的经验是,在没有良好接地的工业现场,隔离后的数据稳定度肉眼可见地好一点,尤其是热电偶这种低电平信号,等电位差的影响非常致命。

2.2 RTD 比例测量:把误差抵消在源头

PT100/PT1000 测量最推荐的方式是比例测量法。ADS122U04 内置两个可编程激励电流源,可以让电流流过 RTD 和一个精密参考电阻,参考电阻两端的电压同时作为 ADC 的参考电压。这样系统的测量公式就变成:

T = f(Vrtd / Vref) = f(Rrtd / Rref)

电流源的绝对值漂移不会进入结果,因为 RTD 电压和参考电压是同一个电流产生的,分子分母的电流项约掉了。这是把误差从源头抵消的一个典型案例,不需要额外软件补偿。

实操时参考电阻精度很关键,至少选 0.1% 以下的低温漂电阻,温漂系数最好在 10ppm/℃ 以内。我用的是 1000Ω 的精密电阻配 PT1000,这样激励电流设成 250μA 时,参考电压等于 250mV,RTD 在 0℃ 时的电压也大约 250mV,信号和基准刚好成比例,ADC 能在合理范围内满量程利用。

这里有个新手常犯的错:用分压法测 RTD,即固定电阻和 RTD 串联,用 ADC 测 RTD 上的电压。这种方式对固定电阻的精度和电源稳定性要求极高,因为电源波动会直接叠加到测量结果里。比例测量就没有这个问题,ADC 内部把 Vref 和 Vin 同时采样,比率的毛刺远小于绝对电压的毛刺,所以只要能走比例式,就不要用分压式。

2.3 热电偶、共模电压和冷端补偿

热电偶的路数其实比热电阻多一层坑,主要是两点:信号幅度小、需要冷端补偿。

K 型热电偶大约每摄氏度变化 40μV,比 PT100 的信号还小一个数量级。所以热电偶输入模式下,PGA 增益要设大一些,通常设成 32 或 64。而且热电偶没有激励电流,要面对的是共模电压问题——热电偶的测量端和冷端如果不在同一个电位上,可能叠加一个直流偏置电压。ADS122U04 的 PGA 有一定的共模输入范围,超出之后测量结果会偏,甚至饱和。我在一个现场遇到过热电偶焊到了加热管外壳上,外壳带电,结果读数乱跳,后来加了前端射频滤波偏置电阻网络才好。

冷端补偿必须做,否则热电偶没法用。ADS122U04 内部有一个温度传感器,可以用来测量芯片附近的冷端温度。实现方式是:ADC 通道轮询热电偶端和内部温度传感器端,再根据冷端温度修正热电偶的电动势。要注意传感器和接线端子之间尽量靠近,中间不要有发热元件,最好把冷端埋在 PCB 大面积铺铜区域,让温度场尽量均匀。我见过冷端传感器旁边走了一根电源线,结果读数随负载波动上下漂,后来调整了布局才好。

2.4 供电、参考电压和 PCB 布线

ADS122U04 的供电和参考电压是精度的一半。芯片允许 2.7V 到 5.5V 供电,我习惯给模拟部分用低压差线性稳压器单独供电,比如 3.3V 或 5V 的 LDO,不要和数字部分共用一个开关电源。开关电源的开关纹波虽然频率高,但 Δ-Σ ADC 如果没滤干净,会折回到基带里变成噪声。

外部参考电压方面,ADS122U04 内置了 2.048V 基准,在很多应用里够用。如果对精度要求更高,可以外接 REF5030 这类精密基准。我的经验是,内置基准用来做一般工业测量已经不错,但如果你做的是仪表类产品,需要长期保证 0.05% 以下的准确性,外接基准会让你校准起来更省事,因为它的初始精度和温漂可预测。

PCB 布局的几条铁律:模拟输入引脚走线尽量短,避开数字走线;AGND 和 DGND 用单点连接或磁珠连接;芯片底下铺完整的地平面;激励电流源输出引脚的走线要对称,减少因为线电阻不等引入的误差。另外,SPI 时钟线旁边不要贴着模拟输入线走,这个我在第一版 PCB 上疏忽了,结果发现 ADC 输出低 2 位一直抖,后来重新改了布线才恢复正常。

3. 固件实现:寄存器配置、采样调度与温度换算

3.1 初始化与 CONFIG0-CONFIG3 配置示例

ADS122U04 的寄存器是 8 位宽的,需要配置的有 CONFIG0 到 CONFIG3。我把这套配置整理成了一个表,方便直接抄作业:

寄存器主要功能推荐值(RTD+热电偶混合方案)
CONFIG0输入 MUX 选择、增益和 PGA 旁路增益 32,PGA 使能,通道按计划切换
CONFIG1数据速率、滤波器模式、基准选择20SPS 或 40SPS,内部基准,高分辨率模式
CONFIG2激励电流源、传感器检测250μA 电流源,开传感器开路检测
CONFIG3内部温度传感器、转换模式、空闲状态开启 TSEN,单次转换或连续模式按需切换

以 K24 的 SPI 外设为例,初始化代码大概长这样:

SPI_Type *spi = SPI1; spi_init(spi); // 设置为主模式,模式1:CPOL=0, CPHA=1,时钟2-4MHz adc_cs_low(); spi_write(spi, 0x40); // 写入 CONFIG0 的命令字(16位,高字节为寄存器地址+写命令) spi_write(spi, 0x54); // 增益32,PGA使能等配置 adc_cs_high(); // CONFIG1 ~ CONFIG3 类似

这里必须要强调 SPI 模式。ADS122U04 数据手册推荐使用模式 1,也就是 CPOL=0、CPHA=1。我第一次用的时候就因为 MCU 上电默认是模式 0,导致读回来的数据全是 0xFF,排查了半天才发现是 SPI 相位不对。如果你是第一次用这颗芯片,可以先读寄存器校验,读不到正确的 ID 就优先检查 SPI 模式。

3.2 单次转换还是连续转换:HVAC 现场的选择

ADS122U04 支持单次转换和连续转换。单次转换的好处是省功耗、通道切换灵活;连续转换的好处是不用每次等启动时间,数据一直刷新。

我的习惯是:多通道场景用连续转换,然后通过修改 MUX 通道来轮询。具体来说,先把采集目标切到第一通道,连续转换跑几个周期,丢弃前面两三组不稳定数据,再读后面的结果;读完切到第二通道,重复这个过程。这种方式避免了单次模式下每次配置到数据稳定之间的等待,在 20SPS 下也能保证每个通道每秒刷新好几次,对 HVAC 控制足够。

工业场景如果对功耗不敏感,也可以用同样策略。如果是在电池供电的无线温度采集器上,就建议用单次转换加定时唤醒,功耗差别很大。我帮朋友做过一个无线温度标签,用单次转换+20SPS 等效速率,STM32 在 DS 模式和 ADC 关断状态下,平均电流能做到微安级别,但这就是另一个话题了。

3.3 线性化算法在 K24 上的落地

从 ADC 原始码值到实际温度,中间至少经过 3 步:将原始码转换成比例值、算电阻、查表或计算得到温度。我分享一个从实测项目中提炼出来的流水线:

第一步,计算 RTD 电阻值:

float raw_ratio = (float)adc_code / 0x7FFFFF; // 24位ADC,双极性输出约±2^23 float rtd_res_internal = raw_ratio * RREF * PGA_GAIN_FACTOR;

第二步,如果是 PT100,看温度范围。0℃ 以下用 Callendar-Van Dusen 方程迭代求根,0℃ 以上用二次多项式或查表插值。K24 有 FPU,迭代 5 到 10 次完全没压力,一个通道 0.1ms 内就能算完。

第三步,热电偶就绕不开查表。把 NIST 的 ITS-90 热电偶分度表压缩成稀疏表,用线性插值,表大小控制在几 KB 到十几 KB。K24 有 1MB Flash,随便放。

我在 K24 上用单精度浮点实测,温度换算误差在量程范围基本落在 0.01℃ 以下,真正的精度瓶颈反而不在算法,而在传感器本身和 ADC 的噪声。

3.4 让 MCU 别闲着:多通道调度与 FIFO 思路

固件架构上,我建议用状态机调度多通道采集。每次 DRDY 中断,代表当前通道的一次转换完成,立即读数据,然后切换下一通道。ADC 通道切换后有一个稳定时间,需要丢几个点。我的做法是:每个通道连续测 8 次,取中间 4 次做平均,这样既能滤掉随机噪声,又能避开切换瞬间的不稳定值。

如果通道数多到 8 路以上,建议把平均窗口拉长到 16 次,并加上简单的滑动平均。HVAC 场景温度变化本来就不快,更新周期慢一点完全能接受。工业现场如果要求快速响应,那就调高 SPS 和 FPGA 那边的数据处理频率。不过,ADS122U04 在 20SPS 下能提供 50Hz/60Hz 工频干扰抑制,如果现场有 380V 设备,这档位几乎是免费的抗干扰手段,能不开高分倍率就不要开。

4. 精度校准:把标称参数变成真正可用的测量结果

4.1 误差源拆解:哪些是芯片的锅,哪些是你的锅

很多人在实验室里测完说“我的板子很准”,拉到现场就崩,主要原因是没分清误差来源。我习惯把系统误差拆成 5 个部分:ADC 本身的增益误差、失调误差、参考电压误差、传感器偏差,以及非线性误差。

ADS122U04 的增益误差一般能做到 0.02% 以下,失调也有限。但如果你的增益设置了 32 倍,输入信号又小,失调和噪声会被放大,这时候不做校准会很吃亏。参考电压如果用内置的,芯片出厂有一定精度范围,但温度漂移还存在。传感器偏差更明显,工业上 A 级 PT100 在 0℃ 允许误差大约 ±0.15℃,比 ADC 本身的误差还大。

所以校准策略要分两步:先校准整个通道的增益和失调,再针对传感器做系统标定。这两个步骤不能混着做,否则你根本不知道误差出在哪个环节。

4.2 两点校准实操记录

两点校准是最常见的方法,一个点定失调,一个点定增益。以 PT100 为例,我用一个精密电阻箱模拟 RTD 阻值,调出 100Ω 对应 0℃ 和 138.51Ω 对应 100℃ 的两个点。

先在 0℃ 点采样,记录 ADC 输出码值,记为 cal_zero;再在 100℃ 点采样,记为 cal_full。固件里保存这两组值,后续每个采样值都用这两点做线性修正:

float corrected = (raw - cal_zero) * (REF_TEMP_100 - REF_TEMP_0) / (cal_full - cal_zero) + REF_TEMP_0;

如果你嫌线性修正不够,还可以做多点插值,把每个标定点的误差做成一个补偿表,用分段线性补偿。我的体会是,如果传感器本身就是 A 级,两点校准后整机误差做到 0.2℃ 以内是常规操作;如果不校准,可能出厂时就有 0.5℃ 到 1℃ 的偏差,在 HVAC 控制里可能看不出来,但工业计量就会被打回。

4.3 没有标准源也能做的快速校验

不是每个项目都有标准电阻箱和干井炉,我给一个在现场也能操作的土办法。找保温杯装满冰水混合物,充分搅拌几分钟,把探头插进去,稳定后读数应该接近 0℃。这个方法解决不了增益误差,但能快速验证通道和软件有没有明显问题。如果要验证增益,就用一块精度 0.1% 的低温漂电阻直接接在 RTD 输入端,模拟某个固定温度点,对比系统读数。比如接一个 130.90Ω 的电阻,对应 PT100 大约 80℃,看系统读出来是不是 80℃ 左右。

这个方法的精度上限不高,但做产线抽检、发布前冒烟测试已经很实用。真正出厂计量还是需要正规标定源,这个不能省。

5. 实战问题排查与避坑记录

5.1 常见故障速查表

我把项目现场遇到过的问题整理成了一个速查表,排查时对照着定位会快很多。

现象可能原因解决思路
SPI 读回全 0xFFSPI 模式不对、CS 时序不对、接线错先用示波器看 SCLK/CS 时序,确认模式 1
读数稳定但整体偏小PGA 增益设置错误或参考电压不对检查 CONFIG 寄存器,用已知电阻点验证
读数周期性跳动开关电源纹波、地环路模拟部分改 LDO 供电,加磁珠或隔离
换通道后前几个点异常ADC 输入切换后的稳定时间不足丢前 4~8 个点再取平均
RTD 读数直接是满量程传感器开路或接触不良检查激励电流源、开启开路检测
热电偶读数乱跳共模电压过高或冷端温度不均加偏置电阻网络、改善冷端布局

5.2 三个最容易被忽略的隐形坑

第一个是 24 位读数的符号处理。ADS122U04 的输出是二进制的补码格式,直接把内存里的原始值转成 float 再算,如果没做符号扩展,低温段读数可能错得离谱。我在固件里强制转成有符号 int32 之后再归一化,问题消失。

第二个是激励电流源的启动时间。电流源不是瞬间稳定的,从开启到稳定需要一点时间。连续切换通道时,如果通道里接了高阻传感器,RC 常数刚好和电流源启动时间互相影响,最开始那几次转换结果会偏低。解决办法是切换通道后至少丢弃 4 个转换周期。

第三个是冷端补偿的采样时机。ADS122U04 内部温度传感器响应速度比较慢,冷端温度的变化会滞后于实际环境温度。如果你在快速轮询中每次都读内部温度传感器,可能读到的是几秒前的温度,导致热电偶输出跟着冷端温度来回抖。我的做法是降低冷端传感器的采样频率,每 5 到 10 秒更新一次冷端温度,热电偶通道则保持正常刷新频率。这个细节对最后 0.1℃ 级别的稳定性很有帮助。

5.3 几个实用建议

做完这个项目之后,我给自己定了几条规矩,也分享给大家参考。原理图里模拟和数字地之间的单点连接要非常明确,不要在芯片下方留一条模数地断带;PCB 布局时,把参考电阻放在离 ADC 尽量近的位置,引脚走线短一点;固件里每个通道独立记录原始码值和换算温度,出现异常时方便追溯。

功耗方面,KT 24 芯片本身功耗不低,但对 HVAC 柜内设备无压力,如果是便携式仪表,倒是可以考虑找更小封装的 MCU。但如果你需要跑多点线性化、存长历史趋势、做 Modbus 和协议转换,在 K24 这样的芯片上开发体验会舒服很多,不用担心资源不够用。

温度测量这块,如果只想“能跑”,方案很多;要做到“长期稳定”,还是得回到模拟设计的细节上来。ADS122U04IPWR 和 MK24FN1M0VDC12 这个组合,让我在精度、成本和开发速度之间找到了一个比较舒服的平衡点。希望这篇文章里的配置、代码和避坑记录,能帮你少走几步弯路。

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

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

立即咨询