资讯详情

ADS122U04IPWR+PIC18F97J94:UART接口远程温度采集系统设计全流程

📅 2026/11/5 5:06:18 | 华诺云谱 👁 阅读
ADS122U04IPWR+PIC18F97J94:UART接口远程温度采集系统设计全流程
最近调完一套温度采集系统板子上的主角是 TI 的 ADS122U04IPWR配合 Microchip 的 PIC18F97J94目标很明确把工厂车间和 HVAC 机组里分散布置的温度信号稳定、准确地送进控制器。这套组合乍一看有点冷门但实际用下来我认为它是中小规模工业测温里很省事的一套搭配。ADS122U04IPWR 是一颗带 UART 接口的 24 位 Δ-Σ ADCPIC18F97J94 则是一颗自带 LCD 驱动和多个串口的单片机芯片本身的功能正好互补。这篇就把从选型、电路设计、固件开发到现场调试的完整过程写出来适合正在做温度采集、楼宇自控或者打算把手头的传感器方案做一次升级的朋友参考。1. 为什么是 ADS122U04IPWR PIC18F97J94这套方案的定位与价值1.1 一个被很多人忽略的痛点传感器离控制器远怎么办很多初次接触工业温度采集的工程师第一反应是选一颗 SPI 接口的 ADC再随便配个单片机好像就能完事。SPI 确实快但在工业现场温度传感器往往不在主控板旁边。HVAC 的风机盘管、冷却塔、风管上的传感器可能离控制器十几米甚至几十米工厂里更夸张仪表层和执行层隔着半层楼。SPI 是同步串行总线SCK 和片选信号一旦拉长到几米波形畸变、抖动、干扰问题就全冒出来了别指望靠降速解决问题现场布线成本和故障率都扛不住。I2C 稍好一点但寻址、上拉电阻、电平转换在多点位长距离应用里也是无止境的折腾。UART 在这类场景里反而成了天然的“老朋友”。只要波特率别拉太高9600 或者 19200普通双绞线就能走几十米而且很容易转成 RS-485/RS-422和现场的上位机、PLC、触摸屏直接对接。所以把 ADC 的接口做成 UART 并不是技术倒退而是真正考虑到了工业布线的现实。ADS122U04IPWR 正是这样一颗专门为“远程测量”设计的 ADC它的接口就是 UART这让整个信号链从一开始就避开了同步总线的长距离痛点。1.2 ADS122U04IPWR 的选型逻辑UART 口是所有自控人的“母语”ADS122U04IPWR 不是普通的串口 ADC。它是一颗完整的 24 位 Δ-Σ 模数转换器内部集成了可编程增益放大器 PGA、两个匹配的激励电流源 IDAC、内部基准电压源还有温度传感器和 CRC 校验功能。这意味着什么意味着你只需要把传感器电阻或者热电偶的毫伏信号接到它的模拟输入端它会自己把信号放大、滤波、转换成数字量然后通过 UART 发给你中间几乎不需要额外搭运放、基准源和精密恒流源电路。板子面积和 BOM 成本都省了一大截。从实际收益来看24 位分辨率对于温度测量来说属于“高配但不过剩”。PT100 在 0℃ 时大约 100Ω温度变化 1℃ 电阻变化约 0.385Ω如果用 1mA 激励电流对应的电压变化只有 385μV。普通 16 位 ADC 在 5V 参考电压下的最小分辨电压是 76μV勉强能用但余量不大而 24 位 ADC 即使有噪声也能把信号分辨得很干净。再配合 PGA 可调增益把毫伏级小信号放大到合适的满量程范围这样读出来的温度在 0.1℃ 量级上才有可能稳定。我选它还有一个很现实的原因UART 接口对单片机几乎没有门槛。只要你会用串口收发字节就能操作这颗 ADC。不需要研究复杂的 SPI 时序、DMA 描述符、寄存器级 bit-banging。尤其对于从 PLC 或自控背景转来做嵌入式方案的人UART 几乎是“母语”上手速度快得惊人。调试的时候一根 USB 转 TTL 就能把 ADC 的数据直接引到电脑上不用先跑通整套 MCU 固件这对前期方案验证特别友好。1.3 PIC18F97J94 在 HVAC 场景的互补优势PIC18F97J94 这颗芯片第一眼看过去可能觉得平平无奇但它有个非常贴合 HVAC 场景的杀手锏内置段码 LCD 驱动。HVAC 控制面板最典型的需求就是显示温度值、设定值、运行模式如果外扩 LCD 驱动器既增加 BOM 又占 I/O。用这颗 MCU直接把面板上的段码液晶接上省掉一个驱动芯片这在实际量产中就是实打实的成本优势。它还有多个增强型 UART 模块这点正好和 ADS122U04IPWR 搭配。一个系统里如果只有一两路温度一个 UART 口就够但 HVAC 机组往往是多路采集风管温度、回水温度、室外温度、压缩机排气温度一路一路接进来看似没问题实际上多个 ADS122U04 用多个 UART 并行接每个传感器独立通信互不干扰读数据的实时性也高。PIC18F97J94 有足够的串口资源来干这件事不会因为外设数量而捉襟见肘。另外它的供电范围宽、功耗控制灵活工作温度范围也能覆盖工业产品的常规要求。对 HVAC 设备来说主控板往往不是单纯的处理单元还要兼顾按键扫描、阀体控制、风机调速、故障报警这些杂活PIC18 的引脚丰富度和抗干扰能力在这些年经受了大量验证。把温度采集这种“精细活”交给 ADS122U04把逻辑控制和面板交互交给 PIC18F97J94分工明确整体可靠性反而更容易把控。2. 硬件设计从传感器到 ADC 到 MCU 的信号链搭建2.1 温度传感器的选择RTD 还是 NTC在我做过的 HVAC 和工业项目里传感器的选用基本取决于精度需求和成本预算。NTC 热敏电阻便宜灵敏度高在 -40℃ 到 150℃ 范围内响应很快但非线性非常严重而且器件一致性差批量生产时必须逐点标定或者依赖软件查表。ADS122U04IPWR 内置的 IDAC 电流源可以直接给 NTC 供恒流但 NTC 高阻值区域对噪声敏感布线稍差就会让温度读数抖动。如果系统精度要求是 ±0.5℃ 甚至 ±0.2℃那就老老实实上 PT100/PT1000 铂电阻。铂电阻线性度好虽然价格贵一些但在工业现场属于“一次到位”的选择。HVAC 的冷热水管温度、风管温度精度要求没有实验室那么夸张但长期稳定性很重要铂电阻和单片机、ADC 组成的系统调校一次能稳定用很多年后面维护成本低。这个选择逻辑我用一个表总结过很多次对比维度NTC 热敏电阻PT100 铂电阻成本低中高线性度差需要查表或拟合较好近似线性长期稳定性一般易漂移好工业计量级灵敏度高阻值变化大较低需高分辨率 ADC与 IDAC 适配可直接适配注意自热匹配度高适合比率测量适合场景消费级 HVAC、低成本测温工业过程、高精度 HVAC 监控如果让我给第一次尝试这套方案的人一个建议直接用 PT100。因为 ADS122U04IPWR 的分辨率足够高PT100 的微弱信号也能抓得很准而且你省掉了对付 NTC 非线性的精力可以把时间花在系统调试上。2.2 模拟前端与比率式测量电路拆解ADS122U04IPWR 的 IDAC 电流源是这套方案的灵魂。做电阻类温度测量最常见的接法是让恒流源激励传感器然后测传感器上的电压。麻烦在于任何电流源都有温漂和噪声激励电流一变测出来的电压就跟着变。ADS122U04IPWR 提供了一个很聪明的解法让同一个 IDAC 电流同时流过传感电阻和一个精密参考电阻ADC 用外部参考电压方式去测传感电阻两端的压降。具体接法是这样的IDAC1 从某个引脚输出先经过参考电阻 Rref 回到模拟地在参考电阻上产生一个稳定的参考电压同时IDAC 电流也经过 PT100 温度传感器。因为流过参考电阻和 PT100 的电流完全相同PT100 电压和 Rref 电压的比值就等于它们的电阻之比最后 ADC 转换结果直接反映这个比例电流源的绝对精度和漂移被完全抵消掉了。这就是比率式测量的核心。这种接法要求 Rref 精度和温漂必须足够好建议用 0.1% 精度、温度系数 25ppm/℃ 以内的精密电阻比如金属箔电阻或高稳定性薄膜电阻。我实际采用的电路是IDAC1 配置为 500μA 或 1mA 输出经过 Rref 到地再从同一路径经过 PT100 后接入差分输入正端。PGA 增益我通常设在 8 到 16 倍这样 0℃ 时 PT100 上的 100mV 信号被放大到 0.8V 到 1.6V处于 ADC 满量程的安全区间内。如果是 PT1000激励电流可以用 500μA 或者更小因为阻值大电压本身就是够用的太大的电流反而会因为自热效应引起测量偏差。关于自热我自己的经验是在小体积封装、空气静止的场合1mA 激励在 PT100 上会产生将近 0.1℃ 的附加升温这个误差虽然不大但对高精度要求来说不能当作没看见。优先用 500μA信号幅度降低一半靠 PGA 增益拉回来自热影响会小很多。传感器线缆比较长的时候尽量用四线制或三线制接法两线制的线电阻误差很难消除尤其 PT100 这种低阻传感器。2.3 电源、地线与 PCB 布局的实战注意点每一次有人说自己板子上的 ADC 读数跳得没法看我判断九成问题出在电源和地上。ADS122U04IPWR 是 24 位精度器件模拟电源和数字电源虽然可以在芯片内部处理但外部供电纹波一旦超过几个 mV转换结果就会出现肉眼可见的底噪。我板子上的做法是模拟供电用 LDO 单独供后面放 10μF 钽电容加 0.1μF 陶瓷电容组合数字部分供电从另一个 LDO 出中间用电感或磁珠隔离两路。地线处理更要命。ADC 的模拟地引脚和数字地引脚不能图省事直接混接铺铜比较好的做法是模拟地 AGND 作为模拟信号的回流地数字地 DGND 负责 MCU 和串口部分两者在板子的某一点单点连接。传感器线缆的屏蔽层也只在一端接地避免形成地环路。我在第一版板子上就没注意屏蔽层两端都接了地结果现场变频器一启动温度数据直接漂了 2℃ 以上后来把屏蔽层改成控制板一端接地问题立刻消失。PCB 布局上最核心的原则是让模拟小信号走线尽可能短尽量靠近 ADS122U04 的输入引脚并避开数字走线。参考电阻和去耦电容要放在 ADC 旁边IDAC 的输出路径不要和晶振、串口线平行走线。PIC18F97J94 的晶振和 UART 走线算数字信号必要时在中间加一条地线隔离。还有一点容易被忽略ADC 输入引脚旁边有没有放一个几百 pF 的电容到地用来滤掉射频干扰。这个电容不能太大太大会让信号建立时间变慢一般 1nF 以内比较稳妥。3. 固件开发把 24 位数据从 ADS122U04 读进 PIC18F97J943.1 MCU 侧初始化与 UART 链路打通PIC18F97J94 跑 UART 是我的老本行但新项目第一次调还是建议先把 MCU 侧串口单独调通不接 ADC拿一块 USB 转 TTL 直接自发自收确认波特率、字节格式都对了再往下走。我常用的波特率是 192008 位数据位、无校验、1 位停止位这个速率在 24 位数据量下完全够用同时距离十几米时误码率也低。如果现场干扰极强可以降到 9600配合 CRC 校验会更稳。PIC18F97J94 的 EUSART 配置要点是波特率发生器要老老实实按手册算 SPBRG 值。主频越高波特率误差越小但也不要盲目把主频拉到极限优先保证器件在工业温度范围下运行稳定。我一般把系统主频配置在 32MHz 左右算出来的 SPBRG 误差在 0.1% 以内足够了。串口接收要开启帧错误和溢出错误中断这两个标志位在现场就代表“线缆被干扰”或“对方上电太快没同步”。读 UART 数据时我习惯用一个环形缓冲区中断里只收字节、置标志主循环里再解析命令帧这样不容易丢数据。3.2 ADS122U04 的配置指令与数据读取流程ADS122U04IPWR 的 UART 通信是命令-响应模式主机发命令ADC 干完活或读取请求时回数据。第一次用的时候不要急着把所有功能全配置上我建议按“复位 - 写寄存器 - 触发转换 - 读数据”的最小路径走通再慢慢加功能。上电后第一件事是发复位命令或等待器件自身复位完成然后通过写寄存器指令配置 PGA 增益、数据速率、激励电流值、内部基准开关、单端/差分模式等关键参数。这里特别注意写寄存器命令的数据字节顺序千万别搞反我踩过坑写成反序之后读出来的数据完全不对后来翻手册逐字节对照才发现。还有一个隐藏技巧配置完成后把配置寄存器的内容读回来和你想写进去的值对比一下。这个自检步骤在批量生产时特别重要用来筛掉出厂一致性不佳的芯片。数据读取分连续转换和单次转换两种模式。连续模式适合要求实时性高的控制场景只要转换完成ADC 自动更新数据你随时可以发读数据命令单次模式适合低功耗应用触发一次转换等数据就绪标志或直接延时一段时间再读。在 HVAC 控制场景里我通常用连续模式但主循环会做一个时间片管理比如每 500ms 读一次当前温度避免为了图快把串口资源和 MCU 时间全占满。一次完整读取流程大概是确认 DRDY 引脚或状态位 - 发送读数据命令 - 接收 3 个字节的数据 - 拼接成 24 位原始码。3.3 从补码到温度数据处理别丢符号位ADC 输出的是 24 位二进制补码这直接关系到最后温度是正还是负。24 位补码的范围是从 -8388608 到 8388607对应负满量程到正满量程。很多人在这一步犯的典型错误是把它当成无符号数来读结果室温下读出来变成一百多万的“巨大电压”再换算温度直接爆表。我处理的办法是先判断最高位是 0 还是 1如果是 1就把整个值减去 16777216还原成负数。得到真正的有符号原始码后再做电压换算。电压等于原始码乘以参考电压除以 2 的 23 次方再除以 PGA 增益细节公式以数据手册为准。对于 PT100 加比率式外部参考的结构可以跳过电压绝对值直接利用原始码和满量程的比值算电阻比这样连参考电压的绝对精度都可以不关心只需要一个准确的 Rref。换算成电阻后PT100 的温度值一般用查表法或者多项式拟合。MCU 资源够的话存一个每 10℃ 的线性插值表查表加插值误差可以做到 0.1℃ 以内。我实际项目中用的是 0℃ 到 200℃ 温度点表间隔 10℃配合线性插值效果非常稳定。浮点运算在 PIC18 上不是强项尽量用定点数做比如把温度乘以 10 存成整数显示时再拆整数部分和小数部分这样既省 CPU 又不会出现打印格式问题。3.4 多通道与多路 ADC 扩展的规划ADS122U04IPWR 本身有四通道输入可以配置成四个单端输入或者两路差分输入。如果需要在同一个 ADC 上切换多个传感器切换命令前一定要让通道稳定一段时间尤其是传感器线缆较长、输入电容较大时稳定时间不够就直接采数读到的值会偏低。我的习惯是在通道切换之间加至少一次空转换让输入信号建立起来再发起正式转换。如果点位更多PIC18F97J94 的优势就出来了。它有多个 EUSART可以同时挂好几片 ADS122U04IPWR每片独立通信。多片 ADC 挂在同一个 MCU 上时我给每一片分配固定设备标识代码里做成结构体数组把每个通道的当前温度、状态标志、最近一次通信时间都放在结构体里主循环统一调度。这种设计在后续加点位时只需要改数组长度和传感器配置表不用重写通信逻辑。4. 精度标定与 HVAC/工业现场调试的“魔鬼细节”4.1 为什么必须做两点标定而不是只调零点很多工程师把“硬件能读到数”当成“精度合格”这是大忌。ADS122U04IPWR 是精密器件但整个信号链里还有参考电阻、传感器、分压节点、板级热电动势等误差源。只做一个零点漂移校准能消除固定偏置却消不掉增益误差。实际测 0℃ 可能很准测 100℃ 时却差了 0.8℃这就是典型的增益误差。两点标定的做法不复杂把传感器分别放到 0℃ 和 100℃ 两个已知温度点各取一段稳定的读数。根据这两个实际值算出一组偏移量和增益修正系数存到 MCU 的 Flash 里。之后每读一个原始温度先按修正系数做乘加运算再输出最终温度值。0℃ 可以用冰水混合物做但要等热平衡100℃ 用沸水注意当地大气压带来沸点偏差如果精确要求高用精密电阻箱模拟传感器阻值来标定反而更省事。比如 0℃ 对应 100Ω100℃ 对应 138.51Ω电阻箱比水的控温精度高一个量级。更高要求时可以做三点标定覆盖低、中、高三个温度段用二次多项式拟合消除轻微非线性。我之前的项目对精度要求是 ±0.2℃ 全范围两点标定不够加了 50℃ 第三个点之后误差才压到目标内。4.2 抗工频干扰与软件滤波策略HVAC 现场最不缺的就是电磁污染变频风机、水泵、接触器、大功率可控硅调光都在给模拟信号“投毒”。ADS122U04IPWR 本身是 Δ-Σ ADC内置数字滤波器对工频有不错的抑制能力但前提是你选对了数据速率。很多默认数据速率虽然快但对 50Hz 电网干扰的抑制并不理想。我的经验是优先选择手册里明确写了“50/60Hz 抑制最高”的那个数据档位哪怕转换速率慢一点也无所谓温度本来就不是一个要求毫秒级响应的物理量。软件层我再加两道保险采样平均值滤波和中位值滤波。中位值滤波主要对付偶然的尖峰脉冲比如接触器吸合一瞬间的毛刺中位值滤波后再做滑动平均把随机噪声进一步抹平。实测下来一组 5 次中位值加 10 次滑动平均能在不牺牲稳态响应的情况下把数据抖动压到 ±0.02℃ 级别。需要注意的是滤波强度太大会让温控系统的反馈滞后风机或者阀门的动作跟不上温度变化引起振荡。所以滤波窗口要配合控制周期调控制周期短就少滤控制周期长就可以多加几次平均。4.3 长距离布线与 RS-485 扩展的现场经验如果系统点位比较集中UART 直接连就行一旦要跨越车间或者楼层我更推荐把 UART 信号转 RS-485 传输。TTL 电平到 RS-485 之间用一个隔离型收发器比如带光耦隔离或内置隔离电源的模块把控制板和现场传感器网络彻底隔开。这样做的好处是现场接地电位不一致导致的共模电压差、地环路噪声基本都能被 RS-485 的差分传输和隔离化解掉。RS-485 布线要遵循手拉手总线结构不要星形连接末端并联 120Ω 终端电阻。线材用屏蔽双绞线屏蔽层单端接地。波特率 19200 时几百米距离问题不大。多台 ADS122U04 在 RS-485 总线上工作时可以用带地址的通信方式不同 ADC 配不同地址上位机或 MCU 按地址轮询。这时候 PIC18F97J94 的多个 UART 就能分别管理不同总线段把高速本地采集和远程低速网络分开系统容量和稳定性都能提升不少。我在一个工厂的实际部署中就是这样把 16 路温度扩展到 64 路主机和从机之间走隔离 RS-485模拟量信号没有再跨长距离跑整个系统投运后很少出问题。所以说这套方案的扩展能力并不是纸面参数把它放进现场能少走很多弯路。4.4 低功耗与自热控制的取舍如果你的设备靠电池供电或者需要满足待机功耗要求那就不能一直开着激励电流和 ADC。ADS122U04IPWR 支持低功耗模式可以按需唤醒、单次转换。我做过一个用电池供电的 HVAC 管路温度记录器平时 MCU 进睡眠定时器每 30 秒唤醒一次给 ADC 上电、开 IDAC、触发转换等数据稳定后读回然后立刻关掉 ADC 电源。整个测量周期约 30ms平均功耗非常低。这里有个容易忽略的点每次刚给 ADS122U04 上电后不要马上转换要留出内部基准和 IDAC 的建立时间否则第一组数据会明显偏大或偏小。我自己在代码里固定等 20ms 再发触发命令数据就完全正常了。自热控制更依赖硬件。前面提到的激励电流选小一些是最直接的办法。另外传感器本身跟被测物的热接触要良好如果传感器只是悬空在风道里测出来的不是空气温度而是传感器自身的热平衡温度误差很大。在管道安装时传感器的导热套管、插入深度、导热硅脂都直接影响动态响应和稳态精度。这些环节做得不到位ADC 再精确也白搭。5. 常见问题排查温度读数不准和通信异常的根因分析5.1 典型故障现象速查表做调试和售后时我把现场最容易碰到的问题汇总成了一个速查表技术群和同事都找我要过。现在整理出来按“现象 - 可能原因 - 处理方法”直接给现象可能原因处理方法读数为满幅正/负值或稳定不变差分输入接反把 ADC 输入正负端对调读数为全 0xFFFFFF片选、上电时序异常或输入被钳位检查供电和复位时序确认激励电流通路读数跳变几度甚至十几度电源纹波大、屏蔽层未单端接地检查 LDO 滤波、屏蔽层接法、走线隔离远传后数据混乱偶尔丢字节波特率误差大或 RS-485 端接缺失重新计算 SPBRG检查端接电阻长时间运行读数缓慢漂移参考电阻温漂大换低温度系数精密电阻做周期自校准0℃ 准但 100℃ 偏增益误差未标定做两点或三点标定温度响应迟钝滤波后滞后严重滤波窗口太长或数据速率过低缩短滑动平均窗口提高转换速率休眠唤醒后第一读数异常ADC 未稳定就转换上电后延时先空转换一次5.2 我最常踩的坑上电时序与“看起来正常”的假通信第一个坑是处理器和 ADC 的上电时序。PIC18F97J94 如果复位后立刻给 ADS122U04 发配置命令而 ADC 的供电或内部振荡器还没完全稳定命令就会丢失而且 ADC 不会主动报告“我没收到”。表现非常具有迷惑性串口正常命令也发出去了但 ADC 就是不响应。排查到最后才发现是 MCU 侧复位引脚释放得太早。后来我在代码里加了一个简单的延时MCU 上电后先等 100ms 再初始化外设之后再也没有出现过这个问题。第二个坑是“假通信”串口调试助手里能看到一堆数据波形看起来也对但字节之间的间隔或者时序不对导致 ADC 把指令解析成了乱码。我遇到过一次做了一半的板子示波器看 TX 波形和 RX 波形都正常波特率也对但无论怎么发数据ADC 都不回。折腾了几个小时最后用逻辑分析仪抓整帧才发现我发的配置帧多了一个字节刚好把后续命令的首字节吞掉。从那以后我每写一条通信命令都会先在逻辑分析仪里确认报文长度再进可视化链路测试。如果你所在地没有逻辑分析仪一个最简单的办法发一条固定命令用万用表看 ADC 引脚上有没有对应的电压跳变有时候比看数据更快。第三个比较隐蔽的问题是热电动势传感器线缆接头处用了不同金属材质比如铜线和铁螺丝直接连接会形成一个微型热电偶产生几微伏到几十微伏的电压。在 24 位 ADC 面前这足以引起零点漂移。解决办法是尽量用相同材质的端子避免在信号通路上形成异种金属连接点同时保持接线端子温度一致减小温度梯度。写在最后这套方案给我留下的真实体会ADS122U04IPWR 和 PIC18F97J94 这套组合我在多个项目里反复用从楼宇空调箱到小型工业烘箱心得可以浓缩成一句话整套系统最难的不是把硬件跑通而是让它在现场干扰下长期稳定地保持精度。芯片本身可以很优秀但参考电阻、PCB 布局、屏蔽接地、标定流程、通信状态机每一个环节都值得花时间打磨。真正测出稳定数据的那个晚上往往是前面所有“看起来多此一举”的细节全部做到位的时候。如果后面还有机会做同类方案我想把总线那边再扩展一下让多个 ADS122U04 挂在一条 RS-485 总线上配合本地缓存和数据记录做更完整的设备级监控。最后再分享一个小技巧量产前一定要写一个自动化自检程序把配置寄存器回读、激励电流通路、通信误码率测试都跑一遍能筛掉绝大多数现场“灵异故障”的隐患。温度采集这件事本质上是把每个细节都拧紧不着急慢慢来数据自然会给你最诚实的回报。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑