做工业温度采集这么多年我一直有个习惯能用分离器件解决的问题就不把系统复杂度堆到一个芯片里。ADS122U04IPWR 加 MK20DN128VFM5 这套组合是我在多个工业和 HVAC 项目里反复用过的方案前前后后调过不少版本踩过的坑也不少。今天把这套方案从头到尾拆一遍从传感器前端到 MCU 通信从校准到现场抗干扰把能讲的细节都讲透希望能给正在做类似测温板卡的工程师一点参考。这套方案解决的核心问题很简单用一颗 24 位 Delta-Sigma ADCADS122U04配合一颗 Cortex-M4 内核的 Kinetis MCUMK20DN128VFM5把 PT100、PT1000、热电偶、NTC 这些常见温度传感器的微弱信号转成高精度温度值应用到 HVAC 的冷冻水温度监测、压缩机排气温度采集、工业管道测温、电机轴承温度预警等场景。选这两颗芯片的原因也很直白ADS122U04 自带可编程电流源、PGA、内部基准和片内温度传感器前端电路可以做得非常精简MK20DN128VFM5 封装小、外设丰富16KB SRAM 和 128KB Flash 对于测温固件来说绰绰有余两者配合在成本和体积上都比较均衡。下面按我实际的开发顺序来写先讲方案选型思路再讲传感器前端和寄存器配置然后是 MK20 侧的通信实现最后是校准、PCB 布局和现场问题排查。整个链路比较长但对于真正要做产品的人来说每一段都不该跳过。1. 方案选型为什么是这两颗芯片1.1 ADS122U04 解决的核心痛点ADS122U04 是 TI 的一颗 24 位 Delta-Sigma ADC四通道输入最大特点是“集成度高”。它内部除了 ADC 核心之外还集成了可编程增益放大器PGA、两个可配置的 IDAC 激励电流源、一个内部基准电压源、一个内部温度传感器以及完整的数字滤波和 SPI 接口。这意味着做温度采集时外部几乎不需要放精密运放和稳压基准一个传感器、几个电阻电容就能组成完整的前端链路。很多人会问为什么不用 MCU 内置 ADC答案很简单精度和稳定性差太远。普通 MCU 的 12 位或 16 位 ADC先不说分辨率不够光基准电压温漂和线性度就很难满足工业级温度测量的需求。24 位 Delta-Sigma ADC 配合内部 PGA 的指标能把温度分辨率做到 0.01 摄氏度甚至更高而普通 MCU 内置 ADC 往往连 0.1 摄氏度的稳定复现都困难。尤其是测量 PT100 这种阻值变化非常微弱的传感器0.385 欧姆每摄氏度1 毫安激励下信号只有 0.385 毫伏每摄氏度没有 PG A 放大和足够高的信噪比根本测不出稳定的结果。ADC 的外部元件越少产品的批量一致性越好校准成本也越低。这也是我选 ADS122U04 而不是其他裸 ADC 的关键原因。另外这颗芯片的功耗很低正常工作电流只有毫安级加上 MK20DN128VFM5 本身支持多种低功耗模式非常适合做电池供电的无线温度记录仪。当然大部分 HVAC 场景都有电源供电低功耗算是一个不错的附加分但对于仓储、冷链这类需要用电池的场合这个优势就会变成刚需。1.2 MK20DN128VFM5 在这里的定位MK20DN128VFM5 是 NXP Kinetis K20 系列的成员Cortex-M4F 内核带 DSP 和 FPU 指令。虽然它的主频和 Flash 大小在今天的 MCU 市场里不算顶配但对于温度采集这个活儿来说非常够用128KB Flash 写固件绰绰有余16KB SRAM 做环形缓冲和协议栈不紧张FPU 做线性化计算和滤波算法非常舒服。这颗芯片吸引我的另外一点是外设匹配度。它带 FlexTimer、PDB、DMA、低功耗 UART、I2C、SPI做多通道温度采集时可以由片内 PDB 定时触发 ADC 完成时序控制也可以用 DMA 把 SPI 数据直接搬到内存MCU 内核只需要做计算和诊断。对于需要同时支持 Modbus、Sensor 数据记录和多路温度扫描的产品这套外设组合非常顺手。封装是 VFM也就是 QFN 32 脚 5x5mmPCB 面积占用很小。做 HVAC 温控面板或者工业传感器探头板卡尺寸往往被结构卡得很死小封装优势在这个时候就很明显了。1.3 这套方案的适用边界任何方案都有边界说清楚边界能省很多弯路。这套方案最舒服的区间是测量 -50 摄氏度到 300 摄氏度之间的温度传感器用 PT100、PT1000、NTC 或者 K/J 型热电偶。在这个区间内ADS122U04 的分辨率和稳定性都能发挥得很好。如果量程要覆盖 800 摄氏度以上的高温热电偶也能做但要额外考虑冷端补偿精度和 PCB 热布局复杂度会上一个台阶。另一个边界是采样速度。Delta-Sigma ADC 的速率和分辨率是矛盾的ADS122U04 在低速率档位才能获得最佳有效位数。温度信号本身就是缓变信号所以通常把数据速率配在 20 SPS 到 50 SPS 之间。如果你的系统还需要同时高速采集压力、振动信号那就不能指望一片 ADS122U04 全包需要另外加高速 ADC 或单独的信号链。还有一点ADS122U04 的输入范围是受限的不能直接测量高电压信号。如果现场有 4-20mA 信号或者几十伏的电压需要前端做分压和钳位保护不能直接接进来。关于保护电路我后面会在 PCB 布局部分细说。2. 传感器前端设计先把模拟部分做对2.1 PT100/PT1000 的激励电流选择用 ADS122U04 测 PT100我基本都是配置内部 IDAC 输出 1 毫安恒定电流让电流流过 PT100 电阻产生一个随温度变化的电压信号再把电压送入 PGA。原因是 1 毫安在 PT100 上的自热效应可以接受同时信号幅度也足够大0 摄氏度时 PT100 阻值 100 欧姆1 毫安电流产生 100 毫伏信号100 摄氏度时阻值约 138.5 欧姆产生约 138.5 毫伏。把这个信号用 PGA 增益 16 放大ADC 的输入范围就能被充分利用。PT1000 的情况稍微不同它的 0 摄氏度阻值是 1000 欧姆相同电流下信号大了 10 倍所以激励电流可以降下来一般用 0.25 毫安到 0.5 毫安避免大电流在电阻上产生过多自热。PT1000 的优势是引线电阻影响相对小劣势是信号源阻抗更高对 PCB 漏电流更敏感。测量 PT1000 时ADC 输入引脚旁边的走线要尽量短板面要清洗干净否则湿度大时漏电流会给结果带来明显偏差。关于自热效应很多人会忽略。PT100 在空气中散热条件差1 毫安电流持续流过传感器自身温升可能到 0.1 摄氏度级别这会直接影响测量准确度。所以做高精度测量时可以采用“脉冲激励”的方式只在采样窗口打开 IDAC采样完成立刻关断降低平均功耗。ADS122U04 的 IDAC 支持软件开关这个做法在低功耗产品里很常用。阻值与温度的换算PT100 在 0 到 850 摄氏度范围一般用 IEC 60751 标准的多项式公式比较复杂。工程上我更推荐查表加线性插值把电阻到温度的关系表存在 MCU Flash 里运行时二分查找精度和速度都不错。对大多数 0-100 摄氏度 HVAC 测量来说线性近似也够用但超过这个范围误差会变大不建议偷懒。2.2 热电偶测量与冷端补偿热电偶本身只输出毫伏级电压而且它的参考端冷端温度必须已知才能计算出真实温度。ADS122U04 内部集成了芯片温度传感器可以直接拿来做冷端补偿参考。这里有一个设计技巧芯片温度传感器读到的温度不能直接当冷端温度用因为芯片封装本身会发热PCB 温度也可能和热电偶冷端实际温度有差异。我通常会刻意把热电偶的冷端也就是接线端子或连接器位置靠近 ADS122U04让两者的热平衡尽量好同时读取芯片内部温度时做一点软件滤波取一段时间的平均值。用 ADS122U04 测 K 型热电偶时PGA 增益一般设 32 或 64。K 型热电偶的塞贝克系数大约 41 微伏每摄氏度64 倍增益后就是约 2.6 毫伏每摄氏度对于 24 位 ADC 来说分辨 0.01 摄氏度绰绰有余。但要注意热电偶信号是直流的低噪声测量最大的敌人是 50 赫兹工频干扰所以数字滤波器的配置很重要。ADS122U04 有内部滤波器把数据速率配置成接近 50Hz 的整数分频值配合软件均值滤波可以把工频干扰压得很低。热电偶还有一个容易踩的坑开路。热电偶线比较细震动环境下容易断。工业产品里必须做开路检测。最简单的做法是给输入端加一个很大的上拉到基准电压比如 10 兆欧姆电阻热电偶正常连接时源阻抗只有几十欧姆这个电阻不影响测量一旦热电偶断了输入端会被拉到基准电压ADC 读数直接接近满量程软件判断这个特征值就能报警。ADS122U04 本身也支持传感器开路检测可以通过配置内部电路实现具体取决于寄存器设置我在固件里两种方法都做过最终还是倾向于外部电阻方案因为逻辑更直观排查问题更容易。2.3 NTC 与两线制接法如果产品定位是低成本 HVAC 室内温控器NTC 是绕不开的选项。NTC 的优势是便宜、灵敏度高缺点是线性度差、一致性靠 B 值分档。用 ADS122U04 测 NTC可以用一个 10 千欧姆精密电阻和 NTC 组成分压电路ADC 测分压点电压软件通过 Steinhart-Hart 公式换算出温度。也可以直接用 IDAC 恒流激励 NTC测量 NTC 两端电压这样和 PT100 的测量逻辑完全统一固件只需要一套读数框架。NTC 的 B 值分散性让很多工程师头疼。B 值偏差 1%温度误差可能到 1 摄氏度以上。解决办法有两个一是采购时指定 B 值精度二是每台设备出厂做单点校准。单点校准也很简单在 25 摄氏度标准温度槽里读一次 ADC 值软件里补偿 B 值的偏差即可。大批量生产时这个校准过程可以在产线测试工位自动完成十几秒就好。2.4 引线电阻与三线制连接PT100 在工业现场经常要远离变送器引线可能长达几十米甚至上百米。两线制接法下导线电阻直接串联进传感器电阻会造成很大的正偏差铜导线 0.5 平方毫米百米来回约有 3.4 欧姆左右对应 PT100 接近 9 摄氏度误差这绝对不可接受。所以工业现场必须用三线制。ADS122U04 的两个 IDAC 电流源在这里正好各司其职。一个 IDAC 从远端引线 A 注入电流到 PT100另一个 IDAC 从近端引线 B 注入相同的电流然后差分测量中间两根引线上的电压。由于两个电流源电流相等两根引线上的电压降相等在差分测量中被抵消引线电阻的影响大幅降低。当然这要求两个 IDAC 的匹配度足够好ADS122U04 芯片内两个电流源的匹配精度是很高的正好能满足这个需求。如果现场要求更高精度比如实验室标准设备可以用四线制也就是开尔文接法。四线制下激励电流走两条线电压测量走另外两条线测量回路几乎没有电流导线电阻影响理论上为零。代价是需要多拉一根电缆。ADS122U04 的通道多四线制接法也完全支持两个差分通道接传感器另外用开关切换的方式也可以扩展。3. MK20 侧的实现SPI 时序与采样逻辑3.1 ADS122U04 的寄存器配置流程ADS122U04 的寄存器不算多但配置错了现象会很奇怪比如读数全零、符号位翻转、或者数据逐位跳动。我通常把配置分成三步走。第一步是复位和等待上电稳定硬件复位以后延时至少几十毫秒让内部基准和参考电容稳定下来。第二步写配置寄存器包括 PGA 增益、数据速率、滤波器模式、IDAC 电流大小和输出通道映射。第三步连续读几次转换结果丢弃前几次数据等待数字滤波器稳定。配置寄存器时最需要注意的是 IDAC 通道和 PGA 输入通道的配合。PT100 的电流注入通道必须和 ADC 的差分输入通道对齐。如果你用通道 AIN0 和 AIN1 做差分输入同时又想让 IDAC 电流从 AIN2 流出、从 AIN3 回流那寄存器里的通道映射要仔细算清楚否则会出现“电流路径和测量路径不一致”的问题。这个错误不会导致芯片损坏但读出来的数据基本是乱的还会消耗大量排查时间。数据速率的选择前面提过尽量让内部滤波器的陷波频率对准工频。国内 50 赫兹电网数据速率配成 20 SPS 或者 45 SPS 附近往往能获得比较好的工频抑制效果。如果应用现场还有其他噪声源比如变频器需要根据实际情况调整。3.2 DRDY 中断与连续转换模式ADS122U04 有一个 DRDY 引脚每次转换完成会拉低这个引脚可以直接接到 MK20DN128VFM5 的 GPIO 中断脚。用中断方式读取数据CPU 不用空转等转换完成功耗更低时序也更准。Kinetis 的 GPIO 中断配置很简单把引脚设为下降沿触发中断在中断服务函数里通过 SPI 读回 3 个字节数据。这里有一个常见问题如果 MCU 处理中断不及时DRDY 引脚已经低了一段时间新的转换结果没有被及时读走那么读到的可能是旧数据。解决方法是每次读取前先检查 DRDY 信号是否有效然后在一个转换周期内完成读取。更稳妥的做法是把 SPI 读取放到主循环中通过标志位处理而不是在中断函数里做复杂操作。连续转换模式和单次转换模式的选择取决于应用。如果系统需要保持一定采样率连续模式更省事MCU 只管按时读数据。如果系统强调低功耗应该用单次转换模式需要测量时发送命令启动转换DRDY 拉低表示完成读完数据后芯片自动进入低功耗状态下一轮测量再启动。这对电池供电设备至关重要。3.3 字节序与数据拼接的坑ADS122U04 输出 24 位转换结果SPI 一次可以读 8 位也可以配置成 16 位模式。我个人推荐用 8 位模式连续读 3 个字节原因很简单24 位数据在 16 位模式下会跨字节边界处理起来容易错位。数据拼接时要注意高位在前还是低位在前ADS122U04 默认是 MSB first。三个字节拼接成一个 32 位有符号整数时先取出高字节左移 16 位中字节左移 8 位低字节直接放进最低 8 位。然后把整个结果视作有符号数如果最高位是 1说明 ADC 读数是负值需要符号扩展到 32 位。这个扩展很容易被忽略尤其在测量负温度时热电偶输出为负电压ADC 结果会以二进制补码形式出现不注意符号扩展的话-0.2 摄氏度会被算成 65535.8 摄氏度这种离谱值。另外MK20 的 SPI 模块支持 8 位和 16 位帧格式配置时如果没把帧格式设对读回的数据会自动翻转字节序现象是每个 ADC 值都抖动很大而且低字节和高字节交换以后数值看起来仍然像有效数据。排查方法很简单把 ADC 输入短接读取结果如果数值稳定且接近零说明字节序正确如果数值在小范围跳动往往是字节序或者位长配置出了问题。3.4 采样率规划和软件滤波ADS122U04 的数字滤波器已经能衰减一部分高频噪声但系统级的软件滤波也不能省。我常用的组合是ADC 输出数据率设 20 SPS软件里再做一个 4 到 8 点的滑动平均这样输出约 2 到 5 Hz 的稳定温度流。这个带宽对 HVAC 和工业温度监控来说完全够用而且能大幅降低读数的短期抖动。软件滤波的一个细节是区分“随机噪声”和“真实温度变化”。温度信号本来就缓慢变化如果用均值滤波窗口太长会导致报警响应迟钝。比如电机轴承温度突然升高如果滤波窗口有 10 秒报警会延迟很久。我的做法是保留原始 ADC 值用于趋势判断同时输出均值结果用于显示。当原始值和均值之差超过阈值时触发快速响应逻辑把滤波窗口临时缩短。这个思路有点类似看门狗但实际效果很好既保证了稳态精度又保住了动态响应。4. 校准与精度温度测量的最后一公里4.1 系统失调校准与增益校准很多工程师以为 ADC 分辨率高就能测准这是典型误区。ADS122U04 本身指标好但在实际系统里PCB 上的寄生电阻、基准误差、PGA 失调都会让最终误差超过需求。所以产品出厂前必须做校准这一步省不了。我习惯做两点校准。第一点用精密电阻替代传感器比如 PT100 用 100 欧姆 0.01% 精密电阻模拟 0 摄氏度第二点用 138.51 欧姆精密电阻模拟 100 摄氏度。分别记录 ADC 原始读数然后算出失调offset和增益系数gain固件里存储这两个参数运行时用线性校正公式修正读数。校准过程必须考虑环境温度。最好在恒温室内做避免手和身体热源影响板卡。校准完成后把参数写进 Flash 或者 EEPROM同时记录一个校验值防止读取错误。很多产品出问题都出在校准参数丢失或写错加个 CRC 校验能省很多售后。4.2 基准电压与电源噪声处理ADS122U04 内部基准电压有不错的初始精度和低温漂但它的性能发挥取决于供电电源质量。如果电源纹波大ADC 转换结果会出现周期性的跳动尤其当纹波频率落在数字滤波器通带内时很难滤除。我的经验是模拟供电用 LDO 而不是开关电源直接供电如果系统主电源已经是开关电源至少加一级 LC 滤波再进 ADC 模拟电源引脚。去耦电容的摆放很关键。ADS122U04 的 AVDD 和 DVDD 引脚附近各放一个 10 微法陶瓷电容高频小电容 0.1 微法放到尽量靠近引脚的位置。参考电压引脚 REF 如果有外部电容要选择低泄漏的 C0G 或 X7R 类型不推荐使用大容量电解电容。MK20DN128VFM5 侧的数字电源和模拟电源也要分开走线最后在一点汇合。Kinetis 的 ADC 内部有自己的参考如果和 ADS122U04 共用电源数字电压扰动的耦合会影响测量稳定。所以我的板卡上MK20 与 ADS122U04 的电源各自独立 LDO中间用电感或磁珠隔离。4.3 线性化与温度转换公式的选择对于 PT100我前面提到查表插值这里再补充一点查表时不要直接用电阻值查温度更好的是先把校准后的 ADC 读数转换为电阻值再用电阻值查温度。因为校准和线性化应该分属不同层级ADC 到电阻是硬件校准电阻到温度是物理转换中间隔一道逻辑清晰便于调试。NTC 的温度转换一般用 Steinhart-Hart 公式公式里三个系数需要根据 NTC 的 B 值拟合。实际计算时为了节省 MCU 资源可以把公式简化成查表加插值。Kinetis K20 有 FPU跑完整公式本身没压力但我还是倾向于查表因为公式系数一旦不匹配误差会非常诡异而查表数据可以直观核对。热电偶的线性化比较复杂K 型和 J 型都有多项式而且冷端补偿和热电偶电势是分开计算再合并的。处理流程是先读热电偶端电压再读芯片内部温度作为冷端温度将冷端温度换算成对应的热电偶电势加到热电偶端电压上最后查总电势到温度的表。这个流程看起来绕但必须这么做否则冷端补偿就是错的。5. 工业与 HVAC 场景落地从实验室到现场5.1 多通道扫描与建立时间ADS122U04 有四个通道用来测四路温度时通道切换后要等数字滤波器稳定前几次转换结果通常是无效的。如果要求四路都达到稳定精度每一路至少需要 3 到 5 个转换周期所以实际有效吞吐率不是一个通道转换率的四倍而是有一定折扣。针对这个特性我建议把“同一传感器的连续测量”和“传感器间的轮流切换”分层处理。比如四个通道循环扫描每个通道测完一轮以后把该通道最近几轮的数据做加权平滑提高稳定性。这个方法在 HVAC 的多点温度监测里非常实用尤其是一个设备要管压缩机排气、冷凝管温、蒸发器管温和室内环境温度四个测点时费时间但不能出错。5.2 低功耗模式与电池供电设计ADS122U04 加 MK20DN128VFM5 的组合在低功耗方面有很强的可塑性。MK20 的多种低功耗模式可以配合使用系统大部分时间处于 STOP 模式RTC 定时唤醒或者 GPIO 唤醒唤醒后给 ADC 上电、采样、存储然后再回到停止模式。ADC 单次转换模式下平均电流可以从毫安级降到几十微安级别。这里有一个经验快速启动比快速计算更重要。每次唤醒如果 MCU 和 ADC 的启动时间太长功耗就被拉高。所以低功耗设计时要仔细规划“唤醒-采样-存储-睡眠”的时间轴尽量把采样次数缩减到最少。配合 MK20 的低功耗 UART 或者 I2C可以让外部主机随时查询最新温度数据而不必让整个系统持续运行。5.3 现场干扰与隔离方案工业现场最怕的是变频器启动、继电器吸合、电机换向带来的共模和差模干扰。温度传感器的线缆是主要耦合路径。我的经验是第一道防线在传感器线缆屏蔽双绞线屏蔽层单端接地。第二道防线在板卡入口串联小阻值电阻加 TVS 管和滤波电容。第三道防线在 PCB 布局模拟地和数字地在 ADC 芯片底下一点汇合避免形成地环路。如果传感器和主机之间距离特别远或者对安全性有要求可以考虑做隔离。MK20 侧通过 SPI 隔离芯片比如 ISO 系列的 SPI 隔离器方案只隔离数字接口ADC 仍在远端测量。这种方案对 HVAC 现场来说实施简单、性价比高。如果压力传感器之类的模拟信号也需要隔离成本会高很多需要在项目初期就定下来。6. 实测问题与排查速查表这套方案我用过几个版本也帮朋友排查过类似问题下面把一些最典型的故障现象和解决办法列出来方便大家对照处理现象可能原因排查与解决读回数据全零SPI 通信没建立CS 片选错误检查 CS 引脚电平用逻辑分析仪抓 SCLK、MOSI、MISO 波形读数固定接近 0x7FFFFF / 0x800000传感器开路或 IDAC 激励没打开检查 IDAC 寄存器配置测量传感器两端是否有电流读数在小范围剧烈跳动供电纹波大或 SPI 字节序/帧长错配用示波器看电源纹波核对 SPI 模式以及字节拼接逻辑数值整体偏大两线制接法引入引线电阻或校准系数丢失改三线制检查 Flash 中校准参数负温度显示为巨大正值有符号扩展没做检查高位符号位扩展逻辑尤其在热电偶负电压场景通道切换后前几帧数据异常数字滤波器未稳定丢弃切换后前 3~5 个转换结果芯片内部温度读数偏高且波动大芯片自身发热或 PCB 热设计不佳软件对内部温度取样时做均值热电偶冷端尽量远离发热器件数据偶发跳变到某个极限值现场干扰耦合进传感器线缆添加屏蔽、滤波、TVS检查地环路这些问题大多不是芯片本身不好而是系统集成层面的细节没处理好。尤其是“SPI 字节序”和“冷端补偿”这两个点我见过太多人花几天时间查来查去最后就是一句“哦原来是这样”的问题。最后再分享一个我自己的习惯每块板子调试阶段先不要接任何传感器把 ADC 差分输入短接看看读数能不能稳定在零点附近。这一步能快速判断 ADC 自身和 MCU 通信是否正常把问题隔离在“前端传感器”和“后端数据处理”两个区间里。如果短接读数都乱跳就别急着去查传感器接线了问题大概率在供电、SPI 或者寄存器配置上。ADS122U04 和 MK20DN128VFM5 这套组合我到现在还在用它做新项目的原型并不是因为这是最前沿的方案而是它足够稳每一条参数、每一段时序我都能讲清楚为什么。做温度测量这类低带宽、高精度、长周期运行的产品稳比新更重要。如果你也正在选型希望这篇文章能帮你少走几步弯路。