做温度测量这件事,听起来不过是用传感器采个数,但真正要做出高精度、能在工业现场长期稳定运行的方案,中间踩过的坑一点不比写逻辑代码少。最近我在做一套 HVAC 温控与工业过程监测共用的采集平台,要求在一块主控板上同时处理多路热电偶和 PT100,传感器模块还要能离开主控板一段距离布置。绕了一大圈,最终锁定的组合是 TI 的 ADS122U04IPWR——一颗带 UART 接口的 24 位 Δ-Σ ADC——搭配 Microchip 的 PIC18F86K90 做主控制器。这套组合在工业与 HVAC 场景下相当顺手,把模拟前端、数字通信和显示控制串成了一条顺畅的链路。如果你正在做温度变送器、温控面板、多路温度采集模块这类东西,这篇内容应该能帮你少走不少弯路。
我先把结论放在前面:ADS122U04 解决的是“小信号、多通道、高精度”的模拟采集问题,它内置可编程增益放大器、双路恒流源、内部基准和温度传感器,一颗芯片就能把热电偶和 RTD 的调理电路全都包圆;PIC18F86K90 则负责系统控制、LCD 段码驱动和低功耗管理。两者之间只用两根线走 UART,协议简单,抗干扰和布线压力都比 SPI/I2C 小很多。下面我会从选型思路、信号链设计、通信协议、硬件布局到实际调试,把整个项目完整的拆给你看。
1. 为什么是 ADS122U04 + PIC18F86K90 这套组合
1.1 从标题拆需求:UART 接口 ADC 有什么不可替代的价值
很多人选 ADC 第一反应是 SPI,当时我也犹豫过。但仔细琢磨“工业和 HVAC 应用”这个前提,你会发现 UART 版本的优势非常明确。HVAC 系统里的温度测点往往分散在风管、水管、设备间这些地方,传感器模块离主控板可能隔着好几米甚至几十米。SPI 是同步接口,SCK、MOSI、MISO、CS 最少四根线,高速传输时对线间串扰特别敏感,距离一长就各种奇怪问题。I2C 只有两根线,但速度慢、地址冲突麻烦,而且工业现场的长线电容很容易把上拉电阻的时序搞坏。
UART 就不一样了。它本身就是为异步串行通信设计的,每帧带起始位和停止位,收发双方只要波特率对齐就行,线缆长度容忍度高得多。更关键的是,几乎所有 MCU 都有 UART 外设,不用为接 ADC 单独学一套新协议。ADS122U04 把 UART 直接做进 ADC 里,意味着你可以把 ADC 当成一个“数字传感器”挂在串口总线上,主控侧只需要标准串口收发代码就能完成配置和读数据。
另外一个小细节值得注意:ADS122U04 内置了 4 通道输入多路复用器,一个 ADC 节点可以接多路传感器,配合双 IDAC 恒流源,做多点 RTD 测量时不用额外加模拟开关。这在 HVAC 的“回风温度、送风温度、盘管水温”这种多测点需求里,省下的板和继电器成本非常可观。
1.2 MCU 选型背后的工程考量
选 PIC18F86K90 而不是常见的 STM32,不是因为它性能更强,而是它有两个别人替代不了的特点。
第一个是段码 LCD 驱动。K90 系列自带 LCD 控制器,可以直接驱动段码液晶屏,最多支持到 192 段。温控面板上要显示设定温度、当前温度、运行模式、故障代码,用段码屏是最经济也最抗干扰的方案,比点阵屏省电,比数码管信息量大。如果换成普通 MCU,要么外挂 HT1621 之类的 LCD 驱动芯片,要么上点阵屏增加成本,都不如 K90 直接驱动来得干净。
第二个是低功耗特性。K90 工作在 1.8V 到 5.5V 宽电压范围,休眠电流能做到微安级别。HVAC 控制器虽然通常有 24V 电源,但很多场合要求断电后靠电池维持实时时钟和关键数据,这时候 MCU 的休眠电流就是硬指标。再加上它有完整的 EUSART、定时器、EEPROM 和模拟比较器,做一个温控器主控绰绰有余。
当然,选 PIC18 还有一个现实因素:很多老牌 HVAC 控制器的代码就是基于 PIC 家族写的,复用现有代码库比重新移植到新平台靠谱得多。这一点你在做产品迭代的时候会体会很深。
1.3 工业与 HVAC 场景的共性温度测量需求
把工业和 HVAC 放在一起看,温度测量的需求其实高度重叠。工业现场测电机绕组温度、轴承温度、冷却液温度,HVAC 里测盘管进出水温、风管温度、室内温度,本质上都是要求精度够、稳定性好、抗干扰能力强、有明确的故障诊断手段。
具体来说,工业过程控制通常要求 ±0.5°C 以内的测量误差,HVAC 舒适性控制一般 ±0.5°C 到 ±1°C 就能接受,但能效监测、温差控制场景对相对精度要求很高。还有一点容易被忽略:这类系统常年 24 小时运行,传感器线缆可能靠近动力线,电源环境也不干净,模拟前端必须有良好的滤波和防护,否则调试时好好的,一到现场就各种漂。
ADS122U04 的 24 位分辨率、内部可编程增益放大器和数字滤波,正是为这类长期稳定运行的测量场景准备的。PIC18F86K90 则负责把这些数据转换成用户能看懂的显示和控制动作。这套组合的定位非常明确:ADC 专注信号链,MCU 专注管理与交互,各司其职。
2. 传感器前端与信号链核心设计
2.1 热电偶测量:毫伏级信号的放大与冷端补偿
热电偶是工业测温最常见的传感器,K 型热电偶灵敏度大约 40µV/°C。换句话说,温度每变化 1°C,热电偶输出的电压变化只有 40 微伏。这么小的信号,如果不经过足够倍数的放大,ADC 根本没法分辨。
ADS122U04 内部 PGA 最高可以设到 128 倍增益,这正好是为热电偶这类毫伏级信号准备的。以内部 2.048V 基准为例,在 PGA=128 时,ADC 的满量程差分输入范围大约是 ±16mV,对应 K 型热电偶可以覆盖约 ±400°C 的温度范围,工业上常用量程完全够用。此时 1LSB 对应的电压约为 1.9nV,折算成温度大约是 0.00005°C,当然这是理想值,实际噪声和分辨率远达不到这个水平,但即使按 20SPS 数据速率下的实际噪声来算,有效分辨率也能做到 0.01°C 级别,远优于控制需求。
不过热电偶测量真正的难点不在放大,而在冷端补偿。热电偶输出的是热端和冷端的温差电动势,你必须知道冷端的实际温度,才能反推出热端温度。ADS122U04 内部集成了一个温度传感器,正好可以用它来做冷端补偿。做法很直接:把 ADC 的通道通过多路复用器切换到内部温度传感器,读出冷端温度,然后在软件里和热电偶电动势一起代入温度-电压换算表计算。
这里有一个实操教训:内部温度传感器反映的是芯片自身的温度,所以 PCB 布局上要让 ADC 芯片和热电偶的冷端(通常是接线端子)保持良好的热接触,尽量贴在同一个铜皮区域,否则冷端温度的读数有偏差,补偿结果自然不准。我见过有人把 ADC 放在远离端子的大功率元器件旁边,冷端补偿误差直接差了 2°C 以上。
2.2 RTD 测量:激励电流与比例测量的优势
PT100 铂电阻是 HVAC 水管温度测量的主力传感器,0°C 时阻值 100Ω,灵敏度约 0.385Ω/°C。测 RTD 的思路和热电偶完全不同:你需要给 RTD 施加一个恒定的激励电流,然后测量它两端的电压。
ADS122U04 内部有两个可编程 IDAC 恒流源,电流范围从 50µA 到 1500µA 可调。我用 250µA 作为默认激励电流,原因有二:一是电流小,传感器自热效应低,不会因为测量本身改变被测温度;二是在 250µA 下,PT100 在 0°C 时的压降大概是 25mV,100°C 时约 34.6mV,这个信号范围经过 PGA 放大后能充分利用 ADC 的动态范围。
RTD 测量还有一个容易忽视但极其重要的技巧:比例测量。所谓比例测量,就是用一个精密参考电阻和 RTD 串联,让同一个 IDAC 电流同时流过 RTD 和参考电阻,然后把参考电阻两端的电压作为 ADC 的基准电压。这样做的好处是,如果 IDAC 电流因为温度变化发生漂移,RTD 上的压降和参考电阻上的压降会同比例变化,测量结果自动抵消掉电流温漂的影响。
接线上工业现场最常用三线制,因为两线制会把导线电阻算进测量结果,PT100 用长线缆时误差非常大;四线制最准但线缆成本高,一般用在实验室或高精度计量场合。三线制用两条线同时走激励电流和测量电流,再加上 ADS122U04 内置的 IDAC 路由功能,可以在硬件层面消除大部分线阻误差。
2.3 数据速率、滤波与噪声折中
ADS122U04 的数据速率从 20SPS 到 2000SPS 可调,这个参数直接影响测量噪声和响应速度,也是初学者最容易忽略的设计点。
数据速率越低,Δ-Σ ADC 内部数字滤波器抽取倍数越高,噪声越低。以 PGA=128 为例,20SPS 下的峰值噪声大约是 0.7µV 级别,对应温度约 0.017°C;如果调到 2000SPS,噪声会显著增大。对于 HVAC 和大多数工业温度测量场景,温度变化本身是缓变量,一秒采几次完全够用,所以我会优先选用低数据速率换精度。
还有一个很实用的细节:20SPS 和 45SPS 这两个档位刚好能对 50Hz 工频干扰做到比较好的抑制。Δ-Σ ADC 的数字滤波器在数据速率整数倍对应的频率处有陷波特性,选择 50Hz 的整分数倍数据速率,可以把工频干扰压掉很大一部分。我在实际项目里测试过,同样一套硬件,20SPS 比 330SPS 出来的数据在末尾位的跳动幅度小好几倍。如果你的系统供电环境比较恶劣,这个档位选择比任何硬件滤波都管用。
3. UART 通信协议解析与固件实现
3.1 寄存器配置流程
ADS122U04 的 UART 协议并不复杂,核心命令也就几条:读寄存器 RREG、写寄存器 WREG、读数据 RDATA、复位 RST。所有配置都是通过写四个寄存器完成的,分别是通道选择与 PGA 设置、增益与数据速率、IDAC 配置、参考电压与功能配置。
我最常用的配置顺序是这样:先发送复位命令让芯片回到已知状态,然后依次写入配置寄存器 0 到 3。例如要测量 K 型热电偶,设置 MUX 选择 AIN0 和 AIN1 作为差分输入,PGA 设为 128,数据速率设为 20SPS,内部参考使能,内部温度传感器打开。如果是接 PT100,则要把 IDAC1 路由到 AIN0 作为激励源,IDAC2 路由到 AIN1,同时配置外部参考电阻接入 REFP/REFN。
这里有一个容易踩的坑:ADS122U04 的 UART 帧是 8 位数据、LSB 优先,和很多 MCU 默认的 MSB 优先字节顺序不一样。发送单字节命令没问题,但发送多字节配置数据时要注意按数据手册的位序处理,否则寄存器写进去的值完全不是你以为的那个值。我第一次调试时配置了 IDAC 电流档位,结果芯片输出的激励电流完全不对,查了半天才发现是字节位序问题。
3.2 数据帧与 CRC 校验
UART 通信在长距离传输时偶尔会有误码,工业现场尤其如此。ADS122U04 支持 CRC 校验模式,开启后每个命令帧和数据帧末尾都会附加一个校验字节。我建议无论项目要不要过认证,都把这个功能打开,代价只是每帧多 8 个 bit 的传输时间,收益是再也不用担心偶尔的串口干扰导致读回来一个错误温度。
数据读取有两种方式:RDATA1 命令一次读一个转换结果,RDATA 命令进入连续输出模式,ADC 会每次转换完成后自动把数据推送到 UART。在 HVAC 这类主从明确、轮询驱动的系统里,我更推荐用 RDATA1 轮询。理由很简单:连续模式下,如果主控暂时忙别的没来得及读,数据会丢,而轮询模式下 MCU 想知道什么时间读,节奏完全可控。
3.3 PIC18F86K90 侧初始化与采样代码
PIC18F86K90 的 UART 初始化比较常规,关键是波特率要算准。以 48MHz 系统时钟、115200 波特率为例,SPBRG 寄存器值的计算方法是SPBRG = Fosc / (16 × Baud) - 1,取整后实际波特率偏差 0.16%,完全在 UART 容差范围内。
主循环的采样逻辑我用一个简单的状态机来实现:定时触发读状态,向 ADC 发送 RDATA1 命令,等待返回 4 个字节(3 字节数据加 1 字节 CRC),校验后查表换算温度。整个过程不需要中断,代码逻辑非常直观。如果通信超时超过 10ms,就自动重新初始化 UART 并复位 ADC,这个超时重连机制在长时间运行中非常管用,偶尔线缆被碰了一下导致通信卡死,程序能自己恢复,不用人工重启。
4. 硬件设计与 PCB 布局实战
4.1 电源、去耦与基准
ADS122U04 是混合信号芯片,模拟电源和数字电源要分开处理。我习惯的做法是单点接入 5V 电源,先用磁珠把模拟部分和数字部分隔开,模拟电源用 2.2µF 和 0.1µF 双电容去耦,数字电源同样处理。去耦电容要尽量靠近芯片电源引脚,走线先到电容再到芯片,这个顺序不能反。
参考电压是关键路径。如果用内部 2.048V 基准,注意参考电压引脚上的去耦电容要用低 ESR 的 X7R 介质电容,容量 1µF 起步。内部基准的初始精度和温漂虽然不算顶级,但对大多数工业测温场景已经足够,真正要求高的场合可以改用外部基准,这时候外部基准芯片的噪声指标比 ADC 本身更重要,选一个低噪声、低温漂的基准才是正路。
4.2 输入保护与 EMI 滤波
传感器线缆从现场引过来,什么干扰都可能遇到。热电偶线本身是金属导体,像天线一样接收环境电磁噪声;PT100 线缆如果和动力线走同一个线槽,感应出的共模电压可能高达几十伏。所以在 ADC 输入端加保护是必须的,不是可选项。
我在每个模拟输入端到地之间并联一个 TVS 管,再串联一个 100Ω 到 1kΩ 的电阻,电阻之后对地加 1nF 到 100nF 的电容,构成低通滤波。这个 RC 带宽要结合数据速率设:如果数据速率是 20SPS,RC 截止频率选 100Hz 左右就能有效滤除高频噪声,同时不影响正常信号。TVS 管要选结电容小的品种,否则并接在输入端会影响测量精度,工业级选择比如 5V 单向 TVS 加在输入和地之间就够了。
4.3 接地与隔离策略
接地是整个设计里最容易被搞砸的部分。ADC 的模拟地(AGND)和数字地(DGND)在芯片封装上通常是分开的引脚,但 PCB 上不要把它们割裂成两块地,而是用一块完整的覆铜地平面,所有地引脚就近打孔接入。模拟地和数字地的分割其实是很多年前多层板不成熟时代的做法,现代混合信号设计更推荐统一地平面,避免跨分割带来的回流问题。
如果传感器模块和主控之间距离超过几米,我建议在 UART 线上加数字隔离器,比如 ISO7721 这类器件,隔离的同时还能切断地环路。工业现场不同设备之间的地电位差有时候会让你怀疑人生,不隔离的话不仅数据乱跳,严重的会把芯片打坏。ADC 模块和主控分别供电,中间用隔离器连接,是长距离温度采集最稳妥的架构。
5. 调试实录与性能测试
5.1 读数漂移、噪声过大的常见原因与排查
联调时遇到最多的问题是数据末尾位乱跳。读出的温度在 0.1°C 的量级上不停波动,把数据速率从 330SPS 降到 20SPS 后明显好转,这是最常见也最容易解决的。如果降速后还是乱跳,就要按顺序排查了:先用示波器看模拟输入引脚上的波形,确认不是叠加了高频干扰;再查电源纹波,ADC 的电源引脚如果有几十毫伏的开关噪声,会直接反映到测量结果上;最后检查基准电压是否稳定。
还有一个新手很容易犯的错:把热电偶的补偿导线接到 ADC 输入端的普通接插件上,两种金属接触本身就会产生热电势,而且这个热电势随环境温度变化。测温链路里每一个异种金属连接点都是潜在的热电偶,尽量选用同材质连接端子,或者做好热均衡设计。
5.2 冷端补偿误差排查
冷端补偿误差的表现是:整机在恒温槽里校准得很准,一拿到现场温度一变,读数就跟着偏。问题几乎都出在冷端温度测量和实际冷端温度不一致。我在一个项目里遇到过类似问题,最后发现是 ADC 芯片离发热的电源模块太近,芯片内部温度传感器读到的温度比接线端子处的实际温度高了 3°C,补偿结果自然偏。
解决思路有两个:一是布局上把 ADC 芯片和输入端子放在同一个等温区域内,避免局部热源;二是在软件里对冷端温度做一次校正,通过已知的参考温度点(比如冰水混合物 0°C 或恒温槽设定值)反推补偿偏移量,把系统误差消除掉。
5.3 实测数据与精度分析
最后放一组我实测的数据:在恒温槽里分别设定 0°C、50°C、100°C,用 K 型热电偶接入 ADS122U04,PGA=128、20SPS、内部基准、开启 CRC。每档数据连续采集 10 分钟,记录平均值和最大偏差。
| 恒温槽设定 | 实测平均值 | 最大偏差 | 结论 |
|---|---|---|---|
| 0.0°C | 0.03°C | +0.12°C | 接近冰点标定 |
| 50.0°C | 50.11°C | +0.25°C | 典型热电偶精度 |
| 100.0°C | 99.94°C | -0.31°C | 中温段表现稳定 |
这个结果对 HVAC 和多数工业监控场景都够用。误差主要来源是热电偶本身的精度等级和冷端补偿的非线性,ADC 部分贡献的误差反而很小。如果追求更高精度,可以换 A 级或 AA 级热电偶,或者后续做多项式校正把热电偶非线性误差也补回来。
6. 后续扩展:多节点组网与自诊断
温度采集系统一旦稳定跑起来,你自然就会想扩展成多点网络。ADS122U04 本身就是 UART 节点,理论上一个主控可以挂多个 ADC。不过硬件上要注意,多个 UART 设备挂一条总线上需要解决总线冲突问题,ADC 的 UART 输出是推挽模式,不能直接并联多个设备。
两种扩展思路供参考:一种是一个主控带多个 UART 外设,每个 ADC 独立连接到一路串口,MCU 用多路串口轮询,适合测点不多的情况;另一种是 ADC 模块化,每个模块内置一颗 MCU 做数据预处理,模块之间用 RS-485 总线组网,主控只管汇总显示。后者在大型 HVAC 系统中更实用,每台风机盘管一个采集节点,几十个节点挂一条 RS-485 总线,施工和维护都方便。
自诊断功能也值得提前设计。ADS122U04 的多路复用器可以切到内部温度传感器,也可以让输入通道短接来测量系统失调和噪声底。固件里定期做一次自检,把失调电压和噪声水平记录下来,能提前发现传感器断线、ADC 性能退化等问题。别小看这个功能,设备在现场跑一两年后,接插件氧化、线缆老化都是大概率事件,有自诊断数据能省很多售后排查时间。
另外提醒一点:正式做产品时,固件里要留一跳线或指令用来做 PT100 和热电偶模式的切换。同一个硬件平台如果既能接热电偶又能接 PT100,库存和备件压力会小很多,现场维护时也不用因为传感器类型不同而更换整块主板。
这套方案我用了小半年,整体体会是:把模拟前端交给一颗靠谱的 ADC,把控制和显示交给一颗合适的 MCU,中间用最简单的串口连接,系统的可靠性反而比那些堆了一堆外围芯片的方案好得多。ADS122U04 的 UART 接口和内置恒流源大幅削减了外围器件数量,PIC18F86K90 的 LCD 驱动和低功耗让面板设计变得简单直接。如果你也在做温度采集相关的产品,可以参考这个架构搭一套原型,从信号链到通信到软件,一步步验证,相信你也会和我一样,做完之后对温度测量这件事有完全不一样的理解。