基于UART接口24位ADC与PIC MCU的多路PT100/热电偶温度采集方案

发布时间:2026/11/5 3:14:09
基于UART接口24位ADC与PIC MCU的多路PT100/热电偶温度采集方案 有一条温度采集需求摆在我面前四路信号里既有 PT100 也有 K 型热电偶现场离传感器少则几米、多则几十米中间还要穿过变频器和接触器密集的强电区数据最终要并进 HVAC 楼宇自控或者工业 PLC。我当时选的是 ADS122U04IPWR 与 PIC18F47K42 这套组合焊完板子调通之后回头再看整个项目确实少走了很多弯路。这篇文章我会把选型逻辑、信号链搭建、固件流程、调试踩坑和现场落地经验一并写出来给正在做多点温度采集的工程师做个参考。1. 选型判断为什么放着常规 SPI 温度 ADC 不用偏选 UART 版 ADS122U04IPWR1.1 名字里的“U”是 UART不是升级版很多第一次接触这颗料的人容易把它和 ADS1220 搞混以为 U04 是新出的增强版看到“U”就自然脑补成“Ultra”。实际上 ADS122U04 里的 U 指的是 UART 通信接口器件本身是 24 位、四通道、低功耗 ΔΣ ADC带有 PGA、内部基准、IDAC 电流源和片内温度传感器。这颗芯片最值钱的地方在于它把复杂的模拟测量前端包好外部只需要一个很常规的 UART 就能取数。为什么要强调 UART因为在实际工业项目里SPI 隔离是一件很痛苦的事。SPI 最少要拉 CS、SCLK、MOSI、MISO 四根信号线穿过隔离栅就要至少四个数字隔离通道若再考虑方向控制和片选隔离器选型、布局、时序余量都会变得麻烦。UART 只有 TX、RX 两根线想隔离就一个双通道数字隔离器搞定光耦也行工程代价小一个量级。我在这个项目里PIC18F47K42 和 ADC 板并没有放在同一个地电位上。传感器侧靠近强电柜控制侧是弱电系统两边必须做电气隔离。ADS122U04IPWR 的 UART 接口在这里简直是量身定做的信号电压又是 3.3V 标准逻辑直接配数字隔离器非常顺。1.2 一颗 ADC 把模拟前端的活全包了做温度测量的核心困难不在数据怎么读而在模拟信号本身。PT100 在 0℃ 时只有 100Ω温度每变化 1℃ 大概只变化 0.385ΩK 型热电偶更夸张在 0℃ 附近输出电压只有几十微伏。这种微小信号对偏置、温漂、噪声都非常敏感如果让 MCU 自带的 12 位 ADC 去做基本就是拿着尺子量头发丝。ADS122U04IPWR 内置的可编程增益放大器能把这些小信号放大到合理的幅度内部基准给 ADC 提供稳定参考两个匹配的 IDAC 恒流源可以直接驱动 RTD片内温度传感器还能做热电偶冷端补偿。数字侧和模拟侧的分工非常清楚ADC 负责把物理量变成可靠数据MCU 负责算温度和对外通信。PIC18F47K42 在这里不需要做任何模拟信号调理只需把 UART 数据拿回来做滤波、线性化、Modbus 协议栈。1.3 与 MAX31865、ADS1220 这类方案的取舍我常常被问到同一个问题你干嘛不用 MAX31865它专门做 PT100外围电阻都不用算。MAX31865 确实是好方案但存在两个限制第一它只能接 RTD不支持热电偶而我这个项目里有一部分测点只能用热电偶第二它的接口是 SPI在隔离场景下不如 UART 利索。ADS1220 本身是颗好芯片和 ADS122U04 的模拟前端几乎一脉相承但偏偏只有 SPI 口。如果项目全部做板级直连不隔离SPI 方案没有问题可一旦涉及远距离、强干扰、隔离电源UART 版本的优势就出来了。我做了个简单的对比这样写进方案评审文档里方案接口通道数RTD 激励热电偶冷端隔离成本适用场景ADS1220SPI42×IDAC支持高板内近距离、高速采样ADS122U04UART42×IDAC支持低隔离、远传、混合传感器输入MAX31865SPI1恒流源不支持高单点 PT100、对成本敏感另外ADS122U04IPWR 后缀里的 IPWR 是 TSSOP-16 封装尺寸很小手工贴片也就是一把镊子的事。芯片功耗不高在 HVAC 这种常年通电的场景下发热也低基本不影响内部温度传感器的冷端测量。2. 信号链怎么搭从传感器到 PIC18F47K42 的硬件通路2.1 系统分工模拟前端归 ADC协议归 MCU整个采集板的信号流可以分成三段。第一段是现场传感器PT100 用三线制接法K 型热电偶用差分输入第二段是 ADS122U04IPWR它负责给传感器提供激励电流、放大信号、做模数转换然后通过 UART 把原始数据发给 MCU第三段是 PIC18F47K42它完成数字滤波、传感器线性化、故障判断再通过 RS-485 或者以太网把温度值发给楼宇自控或 PLC。这个分工最大的好处是问题域清楚。模拟部分的精度由 ADC 的规格保证数字部分的灵活性由 MCU 的软件保证。PIC18F47K42 本身是一款 8 位 MCU主频最高 64MHz带两个 EUSART 和 DMA 外设处理四路温度换算、中值滤波和 Modbus 协议绰绰有余。我甚至没把它的计算能力用满这也意味着后续想增加通道或者算法芯片还有余量。2.2 RTD 的比例式测量与三线制接线为什么 RTD 测量推荐比例式方案因为比例式测法不需要一个绝对稳定的电压基准。激励电流 IDAC 从 ADC 流出同时流过 RTD 和一个已知的精密参考电阻 Rref。ADC 的参考电压取自 Rref 上的压降而输入信号取自 RTD 上的压降两个电压由同一个电流产生电源波动、温漂、放大器增益误差都会被成对抵消。我实际用的是三线制 PT100接法很典型一根线接激励源另一根线接输入正端第三根线接到参考地或输入负端。三线制的核心思想是让两条引线的电阻分别落在电源回路和测量回路里通过差分输入把它们的影响消除掉。ADS122U04IPWR 有两个 IDAC理论上可以分别从两侧注入电流做更精细的四线制补偿但 HVAC 现场绝大多数传感器都是三线制预留四线制只在实验室标定时用过。考虑到自热效应IDAC 电流不能取太大。PT100 的功耗越小越好我一般取 500µA这时候 PT100 在 100Ω 上产生的自热功率只有 25µW对 B 级 PT100 的影响可以忽略。有些方案为了追求信号幅度把电流取到 1mA普通工况没问题但小尺寸表贴传感器上温漂会明显一点。2.3 热电偶输入和冷端补偿热电偶输出的是差分毫伏信号K 型热电偶在 0℃ 时输出 0mV在 500℃ 时大概 20.6mV灵敏度约 40µV/℃。这样的信号必须经过 PGA 放大。ADS122U04IPWR 的 PGA 增益可以设置得很高配合内部基准分辨率能达到零点几摄氏度甚至更好完全够工业现场使用。这里有个最容易忽略的环节热电偶测的是“温差”不是“绝对温度”。参考端也就是冷端必须知道它的实际温度才能把热电偶的输出换算成真实温度。有些工程师喜欢在冷端放一个 NTC 单独测再回 MCU 里做修正我更推荐直接读 ADS122U04IPWR 的片内温度传感器因为它离输入引脚近热平衡速度快温度变化时一致性更好。K 型热电偶的正确接法是把信号线直接接到 ADC 的差分输入上。补偿线、延长线不是不能接但接头处会产生新的热电势如果两处温度不一致误差会直接叠加进去。我在项目里让热电偶从探头一直到 ADC 引脚都尽量用同一根线中间不设接插件如果必须接入端子排就在端子排附近把冷端温度测点也装上。2.4 电源、隔离和 TSSOP-16 布局细节ADS122U04IPWR 的模拟电源和数字电源我分开走线各自放一个 1µF 和 0.1µF 的去耦电容数字地和模拟地在 ADC 下方单点连接而不是大面积铺成一个平面再到处过孔。这颗芯片虽然是 24 位 ADC但只要你把电源噪声压住实际读出来的数据可以很干净。TSSOP-16 引脚间距不大布局时要注意模拟输入引脚和 UART 数字引脚之间拉开距离别让数字信号在芯片底下横穿。我的经验是输入滤波电容尽量靠近 AIN 引脚参考电阻靠近 REF 引脚IDAC 的走线短而粗数字隔离器放在和 UART 同一侧。电源要隔离的话金升阳这类 DC-DC 模块后面最好再串一个低噪声 LDO因为开关电源的纹波会直接影响 ADC 性能尤其是用内部基准的时候。UART 电平方面ADS122U04IPWR 和 PIC18F47K42 都用 3.3V 供电逻辑电平本来就兼容。上拉电阻一般不需要但如果你用光耦隔离限流电阻和反向二极管得按光耦数据手册算别随手拿个 10k 电阻否则高波特率下沿不够快。3. 固件完整流程UART 驱动、寄存器配置和温度换算3.1 EUSART 初始化与 ADS122U04 复位时序PIC18F47K42 的 EUSART 初始化实际工程中用 MCC 生成代码最省事。波特率我采用 9600不是不能更高而是在有光耦或长线的工业现场9600 最稳数据量又不大四路传感器每秒几十次采样足够。初始化之后必须处理上电时序PIC 先跑起来等 10ms 左右再给 ADC 发复位命令确保 ADS122U04 内部上电完成。下面的代码是我项目里实际用的框架寄存器具体值会根据你的配置不同而不同但流程是一致的。void system_init(void) { EUSART1_Initialize(); // 初始化 UART19600, 8N1 __delay_ms(10); // 等 ADC 上电稳定 ads122u04_reset(); __delay_ms(5); ads122u04_write_reg(REG_CONFIG0, 0x10); // 示例配置输入和增益 ads122u04_write_reg(REG_CONFIG2, 0x80); // 示例开 IDAC 和基准 ads122u04_write_reg(REG_CONFIG3, 0x00); // 示例关比较器 ads122u04_start(); }关于 ADS122U04 的 UART 帧格式我强烈建议你不要凭记忆写而是把数据手册对应的通信章节打印出来对照每一帧的字节排布和校验方式实现。UART 本身没有时钟线帧与帧之间必须靠字节对齐和校验来维持同步。我的驱动里专门做了一个发送函数统一组帧统一算校验绝不允许业务逻辑里直接拼一个字节就往 UART 里丢。3.2 寄存器配置的顺序和意义配置顺序我总结成三步先配输入通道和增益再配激励电流和基准最后启动转换。为什么顺序重要因为 IDAC 没有配好之前RTD 上没有激励电流如果这时候就开始转换读到的数据毫无意义而基准源没选对即便输入有信号转换结果也不是预期的比例关系。寄存器配置里最容易出问题的是 PGA 增益和输入范围匹配。热电偶信号很小需要高增益PT100 用比例式测量时信号幅度由激励电流和电阻决定增益不能盲目调大否则信号饱和后读回来的数就是满量程或者负满量程。我建议先在调试阶段把输入的电压算一遍再决定增益。K 型热电偶在 500℃ 时约 20mVPGA 64 倍以后约 1.28V放到内部基准 2.048V 范围内余量很健康。IDAC 电流档位和参考电阻要配套。500µA 激励电流配 1kΩ 参考电阻基准电压就是 0.5V输入信号最大不能超过基准否则转换结果钳位。这些参数之间的关系需要固化在配置表里每个通道单独配不要图省事共用一套配置去读不同传感器。3.3 RDATA 读取与符号扩展读数据命令发出之后ADC 会返回转换结果。ADS122U04 的转换结果是 24 位二进制补码接收时需要先拼成整数再做符号扩展不然负温度会变成很大的正数后面算温度就会离谱。int32_t raw ((int32_t)buf[0] 16) | ((int32_t)buf[1] 8) | ((int32_t)buf[2]); if (raw 0x800000) { raw | ~0xFFFFFF; // 符号扩展 } float ratio (float)raw / 8388608.0f; // 24位有符号数的满量程转换结果的字节序一定要实测确认。我在调试时遇到过这个问题第一次读回来的数据总是跳得没规律后来发现是高低字节顺序弄反了。USB 转串口也好逻辑分析仪也好固定好帧首字节后把输入短接读一次、输入接正电压再读一次很快就能确认字节顺序。3.4 PT100 与 NTC 的温度换算如果用的是比例式测量那么 ADC 读完原始码后先转成 RTD 电阻值再通过 RTD 的特性曲线反算温度。计算公式很简单float rtd_res ratio * RREF; // RREF 为精密参考电阻有了电阻之后PT100 从 0℃ 到 850℃ 可以用 Callendar-Van Dusen 方程描述。我一般不在 MCU 里做高次闭式求解而是用一次迭代就够float res_to_pt100_cvd(float R) { const float R0 100.0f; const float A 3.9083e-3f; const float B -5.775e-7f; float T 0.0f; for (int i 0; i 3; i) { float RT R0 * (1.0f A * T B * T * T); T (R - RT) / (R0 * (A 2.0f * B * T)); } return T; }HVAC 场景大量使用 NTC 10k 热敏电阻跟 PT100 是完全不同的换算逻辑。NTC 的电阻和温度是指数关系典型公式是 Steinhart-Hart 方程。如果 MCU 资源紧张就用查表法温度点间隔 1℃表项之间线性插值精度完全够用。ADS122U04IPWR 有 4 个模拟输入NTC 和 PT100 共用一片 ADC 的好处是同一个板卡既能接 HVAC 的 NTC 传感器也能接工业侧的 PT100。3.5 用 PIC18F47K42 的 DMA 提高效率PIC18F47K42 支持 DMA可以把 UART 接收到的数据直接搬到内存缓冲区CPU 只需要在帧头出现时处理一次不需要每收一个字节就进一次中断。这对于 8 位 MCU 来说非常关键因为在工业协议栈、断线检测、滤波算法叠加之后CPU 往往会成为瓶颈。我最终的实现是这样的UART 接收中断仍然开但只负责把字节写入 DMA 环形缓冲区主循环里检查帧完整性进行 CRC 校验校验通过后直接解析温度数据。这样即使波特率提升到 19200CPU 负载也一直很低。调试时用调试串口把 MCU 收到的原始帧打印出来对比 ADC 端发出的字节很容易定位丢帧问题。4. 调试现场血泪数据跳变、丢帧和噪声的处理链路4.1 上电第一个数据异常像 -40℃ 这种“假崩溃”第一次上电调试时温度读数先出一个 -40℃ 左右的怪值然后马上恢复正常。这个现象几乎所有用串口协议芯片的人都会遇到上电瞬间 ADC 还没完成内部初始化或者 UART 帧对齐乱掉MCU 把半截命令当成了有效数据。我处理的方法是软件复位发送之后立刻清空 UART 接收缓冲丢弃所有可能错位的字节。然后在启动转换前进行一次“空读”把 ADC 输出的首帧数据丢掉。这样做看起来浪费一次转换时间但换来了长期可靠性。现场设备不可能保证每次都严格按时序上电宁可慢一拍也不能读错数。还有一个类似的问题如果 MCU 发送配置命令后没有等足够的处理时间就马上发启动指令配置可能没有生效。我后来统一在每条命令之后固定留出几个字节时间的延时虽然半自适应但在 9600 波特率下完全够用。4.2 ±0.5℃ 的跳变跟输入信号关系不大项目刚开始时PT100 通道的数据总是稳定跳动幅度大概在 0.5℃ 左右数字滤波加上了也没用。我一度怀疑是传感器或接线问题后来用示波器测 ADC 的 AVDD 引脚发现上面叠加了约 10mV 的开关噪声源头是板上的降压 DC-DC 给数字电路供电模拟电源被干扰了。解决办法很常规DC-DC 后面加低压差 LDOLDO 到 AVDD 之间再串磁珠去耦电容放在 ADC 电源引脚附近。改完以后同样滤波算法下跳动降到 0.1℃ 以内。这件事给我的教训是24 位 ADC 的噪声指标再漂亮前端电源脏了也是白搭。调试时先看 AVDD 纹波再看 REF 引脚电压最后才怀疑芯片本身。4.3 UART 乱码和偶发的 CRC 失败UART 乱码在工业现场特别容易冒出来尤其是走线穿过继电器、接触器区域的时候。第一个排查方向是波特率误差。PIC18F47K42 主时钟我配的是 64MHz理论上算出来的 9600 波特率误差很小但隔离光耦的上升沿变缓之后接收端采样点会偏移偶尔就错一位。我当时的处理分两步第一步把波特率从 19200 降到 9600乱码立刻减少第二步把光耦换成了响应更快的数字隔离器上升沿快误码率又降一个级别。如果你只能接受光耦方案务必在光耦输出端加施密特触发整形别让缓慢的边沿直接进 MCU 的 RX 引脚。这里还必须开启帧错误和溢出错误检测。PIC18F47K42 的 EUSART 自带这些标志位我在接收中断里检查 FERR 和 OERR一旦出现就主动丢掉整帧同时记一个错误计数器连续多次错误就触发软件复位。这样的防御式处理在真实项目里非常重要因为不确定的干扰随时可能打断帧同步。4.4 强电干扰下的最后一道防线HVAC 项目中压缩机启动瞬间、变频器加速瞬间温度读数偶尔会出现瞬间跳变持续一两帧后恢复。这种瞬态干扰很难完全靠电源滤波解决我采用了软件和硬件双保险。硬件上传感器差分输入靠近 ADC 引脚处加了一阶 RC 低通滤波器截止频率设置在 10Hz 左右既能滤掉高频共模噪声又不影响温度信号。软件上主循环维护一个 FIFO对每路温度做 5 次采样的中位值平均。中位值平均对尖峰脉冲干扰特别有效而且几乎没有时延问题0.1℃ 以内的稳定误差完全可以达到。5. HVAC 和工业落地断线检测、校准和总线桥接5.1 断线检测不能只靠“数据超出范围”传感器断线时RTD 开路会让 ADC 输入悬空输出往往走向满量程NTC 短路时输出会走到另一个极端。简单判断上下限确实能拦住大部分故障但现场更需要的是一套可靠的状态位让上位机知道哪一路是正常值哪一路是传感器异常。我的做法是在固件里对每路通道做一个运行状态机正常态、开路告警、短路告警、数据无效。当 ADC 原始码连续三次超出合理范围状态机才切换成告警只要中间有一次恢复正常就立即回到正常态。这样避免传感器插头抖动一瞬间就误报警。ADS122U04IPWR 本身还支持输入偏置和开路检测相关配置但我在固件层面做判断更灵活不依赖具体寄存器实现。5.2 现场校准和批量标定HVAC 应用通常不需要太高的绝对精度但工业现场不一样设备验收时是要看实测温度误差的。我在每块板子上都留了一个校正通道用一个精度 0.01% 的精密电阻替换传感器再把 ADC 测出的电阻值和精密电阻标称值做比较得到一个增益修正系数。批量生产时我把标定流程做成两步第一步在输入引脚接入已知电阻采集原始比例值第二步把标称电阻值和实际读数的比例关系存储到 Flash。这样每块板子的参考电阻、增益误差都会被校正掉。注意标定时要让系统充分预热 15 分钟以上ADC 内部基准温度漂移稳定下来再采集不然你标定的误差里其实包含了温漂。5.3 和上位机、PLC 数据桥接Modbus-RTU 是首选温度测出来光自己看没有价值最终得送到楼宇自控或者工业 PLC 里去。PIC18F47K42 自带两个 UART一个接 ADS122U04IPWR另一个接 RS-485 收发器跑 Modbus-RTU整个板子就是一个标准的四通道温度采集从站。寄存器地址我按功能排好前四路是测量温度用有符号整数表示单位 0.01℃紧接着是传感器状态字最后是版本号和诊断计数器。Modbus CRC16 用查表法实现波特率选 9600地址拨码开关做板载 DIP。这样硬件上只需要一根两线 RS-485 总线就能把十几块板子接到同一台上位机上。我在一次现场调试时遇到过 RS-485 通信偶发超时排查到最后是总线末端缺了终端电阻。加了一个 120Ω 电阻之后波形干净了通信再没出过问题。非常基础的细节但越基础越容易被忽略。这套方案我用了大半年的时间才顺手。ADS122U04IPWR 负责把棘手的模拟链路封装好PIC18F47K42 负责把采集、通信、诊断的杂活接住两者搭配从 HVAC 的多点 NTC 巡检到工业现场的 PT100/热电偶混合测温基本都能覆盖。现在再让我做类似项目我大概率还是会选这条路。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询