做嵌入式系统集成这些年温度采集始终是我觉得“水最深”的环节。尤其是工业和HVAC这类场景看似只是“读个温度”真正做进去才知道里面的门道传感器选型、引线电阻补偿、冷端补偿、24位ADC的配置、UART通信时序、PCB布局对抗干扰的影响每一环都可能让最终的测量结果偏差几度甚至十几度。我最近在一个项目里用了ADS122U04IPWR搭配MK20DN128VFM5这套组合来搭建温度测量系统从硬件设计到软件调试跑了一遍完整流程踩了不少坑也攒了一些心得。这篇就把整个方案从头到尾拆开讲清楚适合正在做工业数据采集、HVAC控制器或者高精度温度监测的同行参考尤其是准备用UART接口ADC搭配MCU做多点测温的朋友。1. 系统总体架构与方案选型思考1.1 为什么选择ADS122U04IPWR作为采集前端ADS122U04是TI推出的24位Δ-Σ ADC最大特点是内置了UART接口这在实际工程里非常讨巧。常规做法是选SPI或I2C接口的ADC需要MCU侧用GPIO模拟协议或者挂总线但ADS122U04直接把数据输出和寄存器配置全部走串口收发MCU那边只要有一路空闲的UART就能接管整个采集链路不用额外占用IO做片选、时钟和数据的时序控制代码结构也干净很多。这颗芯片本身也是专门为温度测量设计的内部集成了可编程增益放大器(PGA)、两个激励电流源、内部温度传感器以及针对RTD和热电偶测量的专用输入通道。24位的分辨率在满量程下对应LSB极小配合PGA增益可以轻松分辨0.001℃级别的电阻变化这在HVAC的应用里属于“性能过剩”但过剩的总比不够用强尤其是当传感器线缆拉长、现场干扰大时高分辨率能兜住一部分动态范围损失。1.2 MK20DN128VFM5在系统中的角色MK20DN128VFM5是NXP Kinetis系列的Cortex-M4 MCU主频跑到120MHz带128KB Flash和足够的外设资源。选用它做控制核心并不是因为它算力有多强而是这颗芯片在UART外设、定时器以及低功耗模式上的表现非常稳健很适合做数据汇聚、处理与上传。温度测量这种任务本身对CPU负载要求不高真正重要的是MCU能在长时间循环采集中保持稳定的通信时序不被中断嵌套或看门狗复位干扰。我在这套方案里的分工是ADS122U04负责把传感器信号变成数字量MK20DN128VFM5负责UART指令下发、数据接收、滤波校准、人机交互和上位机通信。MCU侧的所有代码都用寄存器级操作实现没有用库函数虽然初期开发慢一点但后期排查通信问题、调整时序时能直接控制每一个时钟周期效果非常明显。1.3 完整信号链路与工作流程整个系统的信号链可以概括为传感器PT100或热电偶→ ADS122U04模拟输入通道 → 内部PGA放大 → 24位Δ-Σ调制器数字化 → UART输出 → MK20接收原始码值 → 软件完成滤波、线性化、冷端补偿 → 得到最终温度值。ADS122U04上电后会按照内部默认配置开始转换但实际使用中必须由MCU通过UART发送配置命令字写入多路复用器选择、PGA增益、数据速率、激励电流大小等参数之后芯片持续转换并自动将结果帧回传。MCU侧需要严格根据数据手册上的时序图来解析应答帧不能想当然地用通用串口接收逻辑去处理。硬件连接传感器接入ADC输入引脚ADC的TXD/RXD与MK20的UART交叉相连共地。软件流程初始化UART和IO→配置ADC寄存器→读取转换结果帧→码值换算→滤波和补偿→工程单位输出。2. 硬件电路设计核心要点2.1 ADS122U04外围电路与参考电压配置ADS122U04的模拟电源和数字电源建议分开走。AVDD输入我用的是一个低噪声LDO输出的3.3VDVDD也接同一路电源但中间用磁珠做隔离数字电源的噪声不会直接串入模拟部分。参考电压方面这颗ADC支持用REFP和REFN引脚外接精密基准源也可以直接使用AVDD和AVSS作为参考。我在自己的板子上用了外部基准因为实测下来内部AVDD路径的噪声在24位分辨率下会直接反映到结果码值里尤其在PGA增益较高时更明显。参考电压选的是2.5V的精密基准芯片这样在单极性测量下满量程对应02.5V。配合PGA增益设置可以根据传感器输出范围把信号放大到合适的幅度。需要注意的一点是参考电压的噪声直接影响测量精度基准输入引脚旁边的去耦电容一定要靠近芯片引脚放置我用了10μF和0.1μF组合实测纹波控制得不错。2.2 传感器接口设计RTD引线电阻与热电偶冷端处理这套系统里我用得最多的传感器是PT100和PT1000热电阻以及K型热电偶。对于PT100如果采用两线制接法引线电阻会直接叠加在传感器电阻上导致测量结果偏高。在HVAC现场传感器到采集板之间可能走10米甚至更长的线每米双绞线的电阻大概在0.1Ω量级两颗线就是0.2Ω对应PT100的温度误差约0.5℃——这个误差在工业现场绝对不可接受。所以实际布线时我全部采用了三线制接法一根线走激励电流的正端两根线分别接参考电阻两端和传感器一端这样ADS122U04内部的比例测量机制可以自动抵消一部分引线电阻。如果条件允许四线制精度更高但现场布线成本和难度会上升取舍之下三线制是性价比最高的方案。对于热电偶注意点完全不同。热电偶输出的是毫伏级电压信号没有引线电阻问题但必须做冷端补偿。我用的方案是热电偶接入ADC其中一个差分通道同时利用ADC内部温度传感器读取芯片附近的冷端温度再用软件把冷端温度换算成对应的电压值叠加到测量结果上。这个方法的准确度取决于冷端温度传感器和热电偶接线端子之间的热耦合程度所以PCB设计时我把冷端接线端子和ADC芯片尽量靠近减少热梯度。2.3 UART通信链路与MK20的电气匹配ADS122U04的UART电平是标准3.3V TTL电瓶MK20DN128VFM5的GPIO和UART引脚也是3.3V供电两者直连不存在电平不匹配的问题。但工业现场线缆可能引入共模干扰我在这里加了光耦隔离把模拟采集部分和数字控制部分在电气上完全切开。光耦选的是高速型波特率设置115200时信号完整性依然很好。连接方式如下ADS122U04的TXD → 光耦输入侧 → 光耦输出侧 → MK20的UART_RXADS122U04的RXD → 光耦输出侧 ← 光耦输入侧 ← MK20的UART_TX两侧电源独立地线分离只在最后汇聚到系统大地这个设计的好处是即使传感器端碰到意外的电压冲击或浪涌也不会直接烧毁MCU。代价是通信链路多了两级光电转换延迟但只要波特率选得合理完全不影响正常通信。2.4 PCB布局对测量精度的实际影响这部分是很多人容易忽略的。ADS122U04这类高精度ADC对PCB布局非常敏感我第一版打样就是因为布局随性导致测量噪声底噪高出理论值好几个数量级。关键经验如下模拟输入走线和数字信号走线必须分开最好用地线包围模拟输入区域。ADC芯片正下方保持完整的地平面不要走数字线穿越。传感器引线进入板端后第一时间加共模电感或RC低通滤波滤除高频干扰。激励电流源输出的走线尽量短而宽避免压降导致激励电流不稳定。我实测过同样配置下不同布局方案的噪声表现优化布局后的ADC输出码值跳动范围从±40 LSB降到了±3 LSB差距就是这么夸张。3. 软件驱动与数据通信实现3.1 UART通信协议与帧结构解析ADS122U04的通信协议看起来简单但细节非常多。芯片上电后默认处于连续转换模式会自动以约20SPS的速率向外发送转换结果。数据手册里明确规定了三种基本命令写寄存器、读寄存器、复位。所有操作都以命令字节发起后面跟具体的数据字节。我实际用到的命令主要就两个一个是写配置寄存器用于设置输入通道、增益、数据速率和激励电流另一个是发送读转换结果请求。要注意的是芯片的转换结果输出格式是24位二进制补码分为三个字节MSB中字节LSB。组合起来再根据PGA增益和参考电压换算成实际电压值。MCU侧代码的逻辑是初始化UART设置波特率1152008位数据1位停止位无校验。延时等待ADC完成上电复位。发送写配置寄存器命令设置PGA增益为128激励电流为1000μA数据速率为20SPS。进入主循环发送读取命令等待应答帧接收3个字节数据拼装成24位整数。这里有一个容易踩的坑ADS122U04的UART是全双工的但单向命令和应答帧之间没有任何硬件握手MCU必须靠延时或状态机来区分什么时候该读什么时候该写。我的做法是发完读取命令后用定时器做一个5ms超时窗口在这个窗口内等待应答帧超时则重新发送命令。3.2 ADS122U04寄存器配置与关键参数解析ADS122U04的配置寄存器组包括输入多路复用器选择(MUX)、PGA增益(PGA)、数据速率(DR)、滤波器模式以及激励电流设置等。每个寄存器都是8位宽配置时一次性写入完整寄存器组是最省事的方式。对于PT100测温我用的配置是输入选择AIN0作为正输入AIN1作为负输入。PGA增益16倍。因为PT100在0℃时电阻约100Ω激励电流1000μA下产生的信号电压只有100mV用16倍增益放大后大约1.6V正好在ADC量程内有较好的分辨率覆盖。数据速率20SPS。配合内部集成滤波器对50Hz工频干扰的抑制效果很好。激励电流源1000μAIDAC1接AIN0IDAC2接AIN1。对于K型热电偶激励电流不需要开启PGA增益设置会高一些我用了64倍增益因为热电偶的毫伏级信号太小不加高增益会浪费24位分辨率。3.3 温度计算关键环节RTD查表与热电偶线性化拿到ADC码值之后不能直接把电压值往温度上套。PT100的电阻-温度特性是非线性的工程上最常用的是Callendar-Van Dusen方程或者直接使用IEC 60751标准中的多项式公式。我在MK20里用了一个查表加线性插值的方法预先存一张-50℃到300℃的PT100分度表间隔1℃查表得到温度区间后再做线性插值。这个方法精度可以做到0.1℃以内而且计算量小非常适应MCU的实时性要求。热电偶方面K型热电偶的热电势与温度关系同样非线性。我的做法是直接使用多项式拟合法把测量的毫伏值代入5阶多项式计算出对应的温度。多项式系数可以从NIST ITS-90标准数据表拟合得到也可以用TI提供的参考算法库直接迁移过来。还要注意冷端补偿的叠加顺序先把冷端温度来自ADC内部温度传感器查表或多项式换算成热电势值再加到测量的热电势上最后用总热电势查温度。3.4 软件滤波与数据平滑策略即便使用24位ADC工业现场的电磁干扰还是会在码值上留下毛刺。我在MK20的固件里做了两级滤波第一级是中值滤波取最近5次采样值排序去掉最大值和最小值取中间3个值的平均值作为有效采样。这一级可以有效消除尖峰脉冲干扰。第二级是滑动平均滤波每次处理会与历史计算结果做加权平均权重系数我这里取0.3新值占30%历史值占70%。这个系数可以根据实际系统的响应速度要求调整追求快速响应就加大新值权重追求平稳就降低。HVAC控制器对温度响应的要求相对温和0.3比较合适。实测下来原始码值抖动范围如果波动30 LSB经过两级滤波后输出结果可以稳定在12 LSB以内对应的温度波动约0.02℃效果非常可观。4. 系统级标定、调试与现场问题排查4.1 标定流程与标准源选择硬件和软件都跑通之后系统精度不会自动达到规格书指标必须做标定。我的标定流程分三步走先用精密电阻箱模拟PT100电阻值从80Ω到200Ω之间设5个标准点记录ADC输出的码值建立电压与码值的直接对应关系校准ADC的增益误差和偏移误差。然后用标准的干井式温度校验炉或玻璃温度计校准进行整体系统标定把传感器探头插入校验炉从0℃到100℃之间取5个点记录系统输出的温度值与校验炉显示值的差做误差曲线修正。最后把修正系数固化到MK20的Flash里上电时自动加载。这里有个细节每台设备的标定数据必须单独保存不能所有设备共用一份出厂参数因为ADC的偏移误差和增益误差是器件个体的温度漂移特性也各不相同。4.2 常见问题速查表与排查记录我在这个项目里整理了一份问题排查记录分享几个最典型的故障现象可能原因排查方法与解决措施读数偏高且随引线长度增加而增大RTD接成了两线制引线电阻未补偿改为三线制接法确认激励电流流过参考电阻与传感器路径读数周期性波动频率约100Hz电源工频干扰未有效抑制检查电源滤波确认去耦电容靠近芯片引脚将数据速率设置为20SPS抑制50Hz谐波通信无应答或帧错乱波特率不匹配或UART信号电平问题用示波器测量TXD/RXD波形确认光耦两侧电平转换正确检查波特率误差热电偶读数偏差随环境温度变化冷端补偿未生效或冷端传感器位置不当确认软件中读取了内部温度传感器数据检查冷端接线端子与芯片的热耦合情况全部通道读数跳变剧烈AGND与DGND连接不当或布局干扰检查地平面完整性模拟地与数字地在ADC下方单点连接4.3 工业现场抗干扰的几条实战经验最后聊几个容易踩坑的现场问题。第一传感器线缆必须使用屏蔽双绞线屏蔽层单端接地不能两端都接地否则会形成地环路导致测量结果严重漂移。这个我在实验室里做得挺好一到现场就被变频器的共模干扰教做人了后来把屏蔽层改成现场端接地才解决。第二ADC的参考电压基准芯片尽量远离任何开关电源或继电器驱动电路。PCB布板时如果空间充裕最好把基准芯片放在整个板子的“安静区”用独立的地平面和电源过孔。第三MCU在处理UART数据时不要在主循环里直接阻塞等待。我的做法是启用UART接收中断用环形缓冲区收帧主循环只做帧解析和数据处理。否则一旦有高优先级中断插进来串口帧就收不全整条链路都跟着挂。第四关于看门狗。加看门狗必须结合通信状态考虑如果UART死等ACK时喂狗不及时容易误复位但如果不喂又可能真死机。我在通信出错时增加重置计数超过阈值再系统复位而不是一超时就复位。这套方案搭建完成之后我把它接入一个HVAC冷冻水温度监测节点实际运行了两周24小时连续采集的温度波动控制在±0.15℃以内完全满足楼宇自控系统的需求。对于更高精度要求的工业测控场景把外部基准源换成更高档的再接四线制RTD底噪还能再降一个量级。ADS122U04加MK20这个组合胜在接口简洁、性能余量大、软件复杂度可控。如果项目需求往后扩展比如增加湿度、压力等模拟传感器通道这套硬件架构基本不需要改版只需在软件上扩展配置寄存器即可。最后再多说一句做这类高精度采集项目时千万别省标定的时间数据的准确度不是靠“算”出来的是“校”出来的。
阅读完成 · 觉得有帮助?