做采集板这些年,被客户问到过最多的问题之一,就是“能不能给我推荐一个简单点的高精度温度采集方案”。这里的“简单”其实包含两层意思:硬件好搭、通信好调。直到我遇到ADS122U04IPWR和PIC18LF47K42这对组合,才算是真正找到了一个可以称得上“省心”的答案。
这套方案最吸引我的地方,是它把24位高精度ADC和UART接口直接封装在一起。不用学SPI时序、不用抠引脚电平、不用为高速时钟布线发愁,一条串口线就能把转换结果送回单片机。配合PIC18LF47K42这颗低功耗、带UART但功能密度很高的8位MCU,在工业温控器和HVAC楼宇自控场景里,几乎可以承担从传感器激励、信号调理、数据采集到上传报警的全部工作。
这篇文章我会把这套方案的完整设计过程拆开来讲,包括器件选型背后的理由、硬件参数怎么算、固件协议怎么搭,以及我在实际调试中踩过的一些坑。适合正在做温度采集项目、或者对高精度ADC应用还不熟悉的工程师参考,内容会尽量做到“拿到就能用”。
1. 整体架构与方案选型思路
1.1 为什么要选“UART接口的24位ADC”这种组合
做温度和工业模拟量采集,传统的路子基本是“高精度ADC + SPI接口 + MCU”。其中最常用的就是ADS1220、ADS124S08这类器件,功能强、精度高,但代价是SPI时序得自己写,采样率和数据读取节奏都要自己控制。有些工程师用着用着,问题往往不是出在模拟前端,而是出在“SPI读数据偶尔错一位”“DMA和中断优先级没调好”。
ADS122U04的定位很有意思,它就是TI专门把SPI换成了UART的版本。芯片内部的核心模拟链路和ADS1220同源,但数字接口改成了标准异步串口。这带来几个实打实的好处:第一,MCU端只要有UART外设就能直连,不用额外占用GPIO模拟时序;第二,UART天然适合远距离传输,走线三五米也比SPI稳妥得多;第三,调试时直接用USB转TTL模块就能跟ADC对话,逻辑分析仪都不一定用得上。
VAV变风量末端、冷却机组、水泵轴承测温、风管温度变送器,这类HVAC场景里传感器往往分布在几百米范围内,UART接口配合RS-485收发器可以很方便地构成多点采集网络。而PIC18LF47K42本身自带EUSART模块,波特率精度可以通过内部振荡器校准,省掉一颗外部晶振也是可以做到的。
1.2 系统整体信号链路
我们设计的温度采集系统,信号链路大致是这样一个流程:传感器先出微弱电压信号,经过ADS122U04内部的输入多路选择器进入可编程增益放大器,再经过24位Delta-Sigma调制器和数字滤波器,最后通过UART接口把结果发送给PIC18LF47K42。
这套链路里,ADS122U04承担了几乎所有模拟信号处理工作,MCU只负责协议解析、控制逻辑和对外通信。PIC18LF47K42的CPU频率不需要很高,因为ADC的采样率由数据率寄存器决定,通常在20SPS到200SPS就够工业温度用了。MCU真正要做的,是每100ms左右读一次结果,做滤波和线性化,再把数据换算成温度值通过RS-485总线送出去。
为什么用两颗芯片而不是一颗带24位ADC的MCU?原因很简单:内置ADC的MCU大多数是12位或16位,精度达不到工业温度测量的千分之一要求。外加ADC的好处是模拟部分和数字部分可以完全隔离,电源噪声干扰路径也容易控制。
1.3 这个方案适合什么场景
这套方案最适合的场景就是“多通道、高精度、低速率的温度采集”。ADS122U04有四个差分输入通道,可以同时接PT100/PTC1000、热敏电阻和热电偶。HVAC系统里常见的传感器类型基本都能覆盖。
如果要做温控器的话,一个ADS122U04接两个通道的PT1000,加上PIC18LF47K42控制继电器或DAV接口的阀门执行器,整套BOM的成本和复杂度都很可控。如果做冷水机组或者压缩机排气温度监控,通道数再多一点,可以考虑用两颗ADC挂在同一条UART总线上,芯片的地址位最多可以区分四台设备,扩展性也够用。
2. 核心器件深度解析
2.1 ADS122U04IPWR 的关键特性
先把这个ADC的基本面列清楚,后面讲应用细节时好对照着看。
| 参数项 | ADS122U04IPWR |
|---|---|
| 分辨率 | 24位 Delta-Sigma ADC |
| 输入通道 | 4路差分/7路单端,可配置 |
| 内置PGA增益 | 1/2/4/8/16/32/64/128倍 |
| 内置基准电压 | 2.048V,精度0.05%,温漂典型3ppm/°C |
| 通信接口 | 异步UART,默认波特率9600bps |
| 供电电压 | 2.3V 至 5.5V 模拟电源 |
| 封装 | TSSOP-20,4.4mm 宽体 |
| 工作温度 | -40°C 到 +125°C 结温 |
这板子最让人觉得顺手的,是它所有寄存器配置和数据读取都走UART,一条发送线一条接收线就搞定。而且芯片支持通过硬件引脚DOUT/DIN设置波特率,找一根引脚在上电时给个高/低电平就能切速率范围,省得程序里反复试波特率。
ADS122U04内部的数据率寄存器支持1.875SPS到200SPS的设置,配合50Hz/60Hz工频抑制滤波器之后,在工业现场采样结果非常稳定。对于温度信号这种缓变信号,我一般建议选20SPS这个档位,既保证噪声水平够低,又能兼顾响应速度。
2.2 PIC18LF47K42 在系统中的角色
PIC18LF47K42是Microchip新一批8位MCU中很有代表性的一颗,整个系列主打“外设联动”。它里面除了常规的UART、SPI、I2C、ADC、PWM之外,还集成了CLC可配置逻辑单元、CWG互补波形发生器、带计算功能的ADC和NVM非易失性存储器。
在温度采集系统里,PIC18LF47K42主要承担几个角色:一是作为UART主机,按照时间片轮询方式向ADS122U04发送命令并接收结果;二是负责温度线性化算法,把ADC原始码转成实际工程值;三是作为整个仪表或控制器的调度中枢,管理RS-485通信、按键、显示和报警。
这颗MCU还有一个好处是低功耗表现好,LF后缀代表低压低功耗版本。如果整套系统要设计成两线制的4-20mA回路供电仪表,那PIC18LF47K42加ADS122U04的总功耗可以控制在3mA以内,这在8位MCU体系里是非常有竞争力的。
2.3 不同传感器类型的适配策略
ADS122U04的输入多路选择器非常灵活,每个通道都可以独立配置增益和测量方式。实际项目中我通常按这种思路分配:
- PT100/PT1000铂电阻:一般用激励电流源模式,芯片内部提供250µA激励电流,接2线或3线制RTD都可以。增益选1倍或2倍,满量程对应几百毫伏级别的电桥输出电压。
- NTC热敏电阻:不用恒流源,直接用分压电路,VREF通过已知电阻和NTC分压后进入ADC。这种接法最简单,但线性化得靠查表。
- 热电偶:信号电压非常小,K型热电偶0到100°C才输出约4mV,必须开PGA增益64倍或128倍。内部基准2.048V除以增益之后,满量程大概±16mV到±32mV,正好匹配热电偶的信号范围。
实际做HVAC系统时,一套板子里混着PT1000和NTC也很常见。我的做法是在初始化时把每个通道的配置写进EEPROM,上电后按配置文件动态设置寄存器,这样一块PCB就能兼容多种传感器,生产管理省事很多。
3. 硬件设计实操细节
3.1 关键参数计算与增益选择
温度测量系统最核心的指标是“能分辨多少度”,这取决于ADC的噪声水平和传感器灵敏度。我们以PT1000和K型热电偶各算一笔账。
PT1000在0°C时电阻为1000Ω,温度系数约为3.85Ω/°C。用250µA恒流激励,电压变化量是0.25mA×3.85Ω=0.9625mV/°C。如果ADC增益设1倍,内部基准2.048V,满量程范围±2.048V,24位理论上可分辨到2.048V/2^23≈0.244µV/LSB。但实际受ADC噪声限制,20SPS数据率下有效分辨率大约19.5位,即约5µV级别的噪声。换算成温度,就是5µV除以962.5µV/°C,约0.005°C,这个指标已经远远超出常规HVAC温控需求。
再看K型热电偶,灵敏度约41µV/°C。如果不放大,5µV噪声对应0.12°C,其实也能用,但低温段误差会显得比较大。开64倍增益之后,等效噪声就到0.1µV以下,温度分辨率可以做到0.01°C级别,冷端补偿误差反而成为主导因素。
我的经验是:除了传感器信号极小的场景,不要盲目把增益开到最大。增益越大,虽然分辨率越高,但输入偏置电压和温漂的影响也同步放大。比如PT1000场景用1倍或2倍增益就够,热电偶场景才需要64/128倍。
3.2 基准电压与供电方案
ADS122U04内部自带2.048V基准,对于绝大多数HVAC应用已经够用。但这颗基准的温漂指标是典型值3ppm/°C,在-40°C到85°C的工业环境下,还会引入几十ppm的误差。如果系统要求全温范围内精度0.1%,我的建议是改用外部精密基准,比如REF5025这种2.5V基准,温漂可以做到3ppm/°C以内,稳定性更好。
不过要提醒一句的是,外部基准电压和内置基准的选择会影响增益和满量程计算,改基准电压之后所有通道的换算系数都得同步调整。所以我把基准配置放在EEPROM参数里,方便产线校准时统一修改。
供电方面,模拟电源AVDD和数字电源DVDD我建议分开走,至少用磁珠隔开。派别紧凑的电路板上,PIC侧的数字开关噪声会通过地线窜到ADC的模拟地,导致最后一位数字乱跳。我踩过的坑是,初始PCB上AGND和DGND在ADC芯片下方做了一整块地平面铺铜,效果反而不如分区单点汇地。
3.3 PCB布局与布线注意要点
ADS122U04采用TSSOP-20脚封装,引脚间距0.65mm,手工焊接不太友好,但用钢网回流焊就没有难度。布板时有几个细节值得特别注意:
- 差分走线:如果传感器接线比较长,模拟输入走线尽量双绞并尽量靠近,避免两条线拾取不等量的共模噪声。
- 基准旁路电容:REFOUT引脚要加1µF和0.1µF双电容,而且必须紧贴芯片引脚,走线过孔换层都要注意。
- 晶振位置:如果PIC18LF47K42需要外加晶振,晶振不要放在ADC电源走线旁边,晶振谐波对24位ADC来说就是实打实的干扰源。
- 温度传感器远离发热器件:这是最容易被忽略的。如果板上同时有功率电阻、LDO或继电器驱动,一定要把这些发热源和传感器走线拉开距离。哪怕只有2°C的板内温升,反映到ADC误差上就是好几个代码值。
实际项目中我还遇到过“信号线经过加热电阻下方,导致零点漂移”的案例。排查了大半天,最后用热像仪一看,PCB上那一段走线温度比周边高了5°C,铜箔电阻变化直接串进了测量回路。从那以后,我布温度采集板都会在敏感走线旁边留出隔离槽,宁可绕一点路。
4. 固件实现与核心协议处理
4.1 UART通信初始化与命令交互
ADS122U04默认波特率9600bps,数据格式8位数据、偶校验、1位停止位。上电后芯片会输出两个字节的XON字符,主机应在初始化时读取并丢弃它们。然后就可以用命令寄存器进行配置。
常见命令包括:
- 0x04 SYSOP:系统操作命令,比如复位、启动转换、断电模式。
- 0x20 | 地址:读寄存器命令。
- 0x40 | 地址:写寄存器命令。
- 0x1C 读取数据:读取当前转换结果的24位数据。
如果使用连续转换模式,芯片会不断自动转换,主机只需按数据率周期读取结果。如果使用单次转换模式,每次转换完成后,主机可以通过读取命令主动拉取结果。我这里推荐用连续模式,原因是MCU的调度比较规整,不会因为偶发忙乱漏掉采样点。漏采样对温度系统倒不是很致命,但滤波算法会因此出现毛刺。
用PIC18LF47K42的EUSART模块时,初始化要点是把波特率寄存器SPBRG算好。内部振荡器32MHz时,9600bps对应的SPBRG值为207,误差小于1%。整个通信没有特殊外部硬件要求,但需要注意接收超时处理,因为ADC拉低DOUT表示“数据准备好”,这个信号不是我们主动查询的,必须依赖UART的接收中断来触发读取流程。
4.2 寄存器配置与数据读取示例
下面是一段基于PIC18LF47K42的C语言风格初始化示例,展示了如何配置ADS122U04工作在连续转换模式、四通道循环采集、PGA增益64倍:
// 使能发送与接收 void UART_Init(void) { // 配置EUSART1,8位数据,偶校验,1停止位,波特率9600 // SPBRG = Fosc / (64 * 9600) - 1 = 207 } void ADS122U04_Init(void) { // 复位ADC UART_SendByte(0x04); // SYSOP 复位 // 写配置寄存器 PGA=64倍, 数据率20SPS uint8_t pga_cfg = 0x22; // PGA增益64 UART_SendByte(0x43); // 写寄存器地址0x03 UART_SendByte(pga_cfg); // 设置输入多路选择,通道A0/A1 差分 UART_SendByte(0x41); UART_SendByte(0x01); // 启动连续转换 UART_SendByte(0x04); UART_SendByte(0x02); } // 读取转换结果(24位) int32_t ADS122U04_ReadData(void) { UART_SendByte(0x1C); uint8_t b0 = UART_ReceiveByte(); uint8_t b1 = UART_ReceiveByte(); uint8_t b2 = UART_ReceiveByte(); int32_t raw = ((int32_t)b0 << 16) | ((int32_t)b1 << 8) | b2; // 数据为24位偏移二进制,转换为有符号数 if (raw & 0x800000) raw |= 0xFF000000; return raw; }实际上每个寄存器的位定义需要对照最新数据手册逐项确认。举例来说,PGA寄存器里除了增益位之外,还有“输入偏置使能”“低噪声模式”等开关位,不同版本的硅片默认值也可能有差异。所以我的习惯是每次拿到新批次芯片,先读一遍所有寄存器,把默认值和手册对一下再做全局初始化,避免“一直用默认值却以为改了配置”这种隐性问题。
4.3 数据滤波与断线检测
24位ADC配合20SPS数据率时,噪声水平虽然已经很低,但现场如果有变频器、电机启停,还是能把干扰耦合进模拟前端。我在固件里一般加两层处理:
第一层是移动平均滤波,取最近8个点做算术平均。这样能把高频毛刺压掉,代价是响应速度稍慢,但温度系统对响应速度几乎不敏感。第二层是离散一阶低通滤波器,用公式y_new = y_old + (x - y_old) * alpha,alpha取0.1到0.3之间。这种IIR滤波的好处是内存占用小,适合在8位MCU上跑。
断线检测也很重要。RTD如果断了,ADC输入会拉到电源轨或基准电压,此时读出来的码值会是一端极限。捕捉方法很简单:判断原始码值是否超过满量程的99.5%。比如24位偏移二进制码,正常测量最高值在某个区间,一旦读到接近0xFFFFFF或接近0x000000,基本可以认定为开路或短路。我通常在软件里定义一个“传感器错误”标志,超过阈值连续5次再去报警,这样可以防止误报。
5. 常见问题排查与速查表
5.1 读取数据不稳定、数值乱跳
这种现象大部分不是ADC坏,而是通信时序或数据帧格式出了问题。最常见的两个坑:
- 校验位配置不对:ADS122U04是偶校验,就是说8位数据加校验位之后1的个数为偶数。很多人按默认无校验配置,读出来的数据偶尔对偶尔错,而且错误没有规律。
- XON没有处理干净:上电后ADC发来的两个字节XON如果不丢弃,会被当成普通数据解析,直接把后续命令帧对齐打乱。所以初始化时一定要先读走这两个字节,或者发一个复位命令后再清空接收缓冲区。
板级干扰也会造成读数抖动。我曾经遇到过一个现场问题,设备在车间里运行时读数漂移严重,用手摸线缆反而变好。最后发现是屏蔽层单端接地的位置不对,导致屏蔽层本身变成了天线。正确做法是屏蔽层在传感器端接地,远离MCU端悬空。
5.2 温度读数整体偏高或偏低
如果读数整体偏移,优先怀疑基准电压不准。内部基准出厂精度0.05%,但如果你用的外部基准和预期值有偏差,就得在ADC换算系数里做修正。我的做法是做一个单点校准:输入端用精准电压源加一个已知电压,比如100mV,读回码值后反算实际基准电压,然后把修正值存进EEPROM。
第二个常见原因是输入多路选择器的通道配置搞混了。ADS122U04有7个单端输入引脚,4路差分输入,不同模式下通道编号不是连续对应的。如果厂家给的单子写“通道AIN2接PT1000”,你代码里配置成AIN1,就会出现“原理图明明接线对了数据却不对”的怪现象。排查时建议直接读寄存器,再对照引脚电压实测。
5.3 上电后ADC无响应
先确认一件事:ADC的复位引脚有没有被拉低。ADS122U04的/RESET引脚是低电平有效,很多人在原理图里漏了上拉电阻,导致芯片一直处在复位状态。规范做法是/RESET接10kΩ上拉到AVDD,用一个100nF电容到地做延时上电复位。
还有电源顺序问题。ADS122U04要求模拟电源先到,数字电源后到,至少相差200µs。如果共用一路电源,用DCDC直接升压,上电瞬间可能出现反复跌落,芯片逻辑状态就不对了。稳妥方案是给DVDD加一个RC延时,或者直接用一个EN引脚可控的LDO。
下面整理了一张速查表,方便现场排查时对照:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 数据完全不变 | UART不通或复位引脚拉低 | 检查/复位引脚电平和示波器抓UART波形 |
| 数据每隔几个点跳变 | 校验位错误或XON未丢弃 | 确认8-E-1格式,清空接收缓冲区 |
| 读数比实际值高0.5°C | 基准温漂或增益误差 | 做单点校准,改写基准修正系数 |
| 通道间互相串扰 | 模拟多路器切换后未加稳定延时 | 切换通道后延时50ms再读数据 |
| 特定温度点误差突然变大 | 传感器线性化表不连续 | 改用分段二次插值或高密度查表 |
| 低温漂移大、高温正常 | 冷端补偿估算偏差 | 检查热电偶冷端是否紧贴板内测温点 |
5.4 低功耗模式下的注意事项
想让系统在电池供电下运行,ADS122U04支持断电模式,通过SYSOP命令控制。MCU可以定时唤醒,执行一次转换,再把ADC切回断电状态。功耗可以压到几十微安级别。
但这里有个容易忽略的点:从断电模式恢复后,ADC内部基准重新稳定需要时间,通常要等50ms以上,否则第一次转换结果是不准的。如果你把唤醒、转换、断电的周期做得太短,比如每100ms循环一次,那第一次结果会被系统当成正常数据参与滤波,导致周期性偏差。解决办法是唤醒后先读一个结果丢弃,第二个结果才参与运算。
6. 个人实操经验与扩展思路
这套方案我从原型测试到小批量生产过几次,总体印象是“上限很高,但需要耐心校准”。ADS122U04的量产一致性相当好,只要外围布局规整,出问题的概率很低。真正需要花精力的,往往不是芯片本身,而是传感器探头、接线端子、PCB热设计这些东西。
我个人在实际操作中的体会有三条。第一,不要迷信“24位ADC就等于0.001°C精度”。ADC分辨率只是下限,系统的误差上限是由基准、传感器、冷端补偿、电路板温漂共同决定的。HVAC行业里0.1°C的显示分辨率已经是高标准,把精力花在标定和长期稳定性上比追求位数更有意义。第二,TSSOP-20封装焊完之后,务必用万用表逐个检查引脚之间有没有桥连。这种封装的引脚间距小,稍微一点助焊剂残留都可能在湿度大时产生漏电流,拖累高阻输入的性能。用洗板水彻底清洗后最好再涂一层三防漆。第三,所有涉及温度信号的走线和元器件,摆放前先想一遍“哪条路径会经过大功耗器件”,比布完板之后再回头割线容易得多。
这套ADC+MCU架构后续还可以扩展成多传感器数据记录仪、4-20mA回路供电变送器,甚至做成MODBUS-RTU从站设备。ADS122U04的UART接口天然适合挂在RS-485总线上,只要在固件里加一层MODBUS协议栈,整个采集节点就能无缝接入现有SCADA系统。对于正在规划温度采集产品形态的团队,这个方案确实值得认真考虑。
最后再分享一个小技巧:量产校准的时候,不要在常温下只校一个点。我的做法是设置三个温度点(比如0°C、25°C、60°C)做两点或三点标定,把每个通道的增益误差和偏移误差拟合成多项式系数,烧录到每台设备的EEPROM里。这样即使基准温漂不能完全消除,软件补偿也能把全温区误差压到极致。调试工具上,用USB转串口模块直接连ADS122U04的TXD/RXD,不出数据就先在电脑上跟芯片对话,能省掉大量反复烧录固件的耗时。