做工业温度采集这些年,我试过的方案从分立运放加MCU内置ADC到外置高精度ADC芯片都有,但真正让我愿意反复拿出来用的组合,是ADS122U04IPWR搭配一颗“老古董”级别的8位单片机PIC18F4458。这个组合谈不上时髦,但稳定、便宜、好买、效果一点不含糊,尤其适合工业和HVAC这种对可靠性要求高、对成本又敏感的现场。
ADS122U04IPWR是TI出品的一颗24位四通道ADC,最难得的不是精度,而是它带了UART接口,这让它和只有一路EUSART的PIC18F4458配合起来非常顺手:不用额外IO模拟SPI,也不占用太多内存,MCU这边只需要几百个字就把驱动跑起来了。两颗芯片组合起来,既能接热电偶、RTD,也能接NTC,覆盖HVAC里最常见的送风温度、回风温度、盘管温度、压缩机排气管温这些测点,做出来的设备还具备量程宽、走线长、抗干扰强的特点,非常适合作为中端仪表或控制器里的核心采集通道。
这篇文章我不打算抄数据手册,直接把项目里踩过的坑、算过的账、验证过的方法整理出来。无论你是做温控器的、做冷水机组控制的,还是搞大棚环境监测的,这套思路应该都比单纯把芯片堆上去更值得看。
1. 从需求到选型:为什么是ADS122U04与PIC18F4458的组合
1.1 温度测量在工业与HVAC中的真实痛点
很多做控制器的朋友上来就喜欢选大厂高端MCU,觉得芯片越强越好。但放到实际测温场景里,你会发现真正的瓶颈根本不在于单片机主频够不够,而在于末端信号能不能被准确、稳定地数字化。
HVAC系统里的温度测点往往有几个特征:传感器和控制器之间距离可能超过十米,电缆经过变频器、接触器、电动阀这些强干扰源;测温范围虽然不极端,但要求长期漂移小、重复性好;在主板空间和成本上又压得很紧。用一个12位内置ADC加分压电路去测NTC,温控精度能做到正负0.5摄氏度已经算烧高香,如果还要测PT100甚至热电偶,那就完全是另一码事了——热电阻的输出只有几十毫伏,热电偶更是只有几毫伏到几十毫伏,MCU内部ADC的分辨率和噪声根本不够看。
这时候外置高精度ADC是绕不开的路。ADS122U04的方案之所以让我留下深刻印象,是因为它很少见的把24位转换器和UART接口做在了一起。你不用去跟SPI时序搏斗,也不需要考虑隔离方案里额外的时钟线,一条TX一条RX就能把数据拿回来,这在工程实现上的省心程度是实打实的。
1.2 ADS122U04的核心定位:24位精度与UART接口
ADS122U04本质上和经典ADS1220是同一代产品,但接口从SPI换成了UART。它内部集成了一个24位Delta-Sigma调制器,带四通道输入多路复用器,两个可编程激励电流源IDAC,一个PGA可编程增益放大器,还有一个内置温度传感器。
这几项拼在一起的意义很直接:
- 24位分辨率配上可编程增益1到128倍,意味着从热电偶的微伏级信号到电桥的伏级信号全都能覆盖;
- 双IDAC电流源让RTD比例测量有了标准的激励手段,接PT100和PT1000都不用另外加恒流源电路;
- 内置温度传感器可以为热电偶的冷端补偿提供依据,至少能省掉一路外部测温芯片;
- UART接口简化了和单片机之间的连接,而且支持地址扫描,一条总线还能挂多个ADS122U04,做多通道采集扩展时相当方便。
ADS122U04的数据速率最高能到1000SPS,这个速度对温度测量来说已经非常富余。工业仪表通常用20SPS,就是为了拿50Hz/60Hz工频干扰抑制能力。你完全可以把数据速率降到20SPS去换更高的有效分辨率,价格和抗扰能力都会更理想。
1.3 PIC18F4458的角色:外设资源与任务分工
PIC18F4458是一颗很经典的8位USB单片机,16KB Flash、768字节RAM,工作电压2.0V到5.5V。它内部自带一路EUSART模块,这正是我选它的核心原因——和ADS122U04的UART无缝对接,不需要任何软件模拟时序。
我在项目里给它分配的任务是这样的:PIC负责上电初始化、通过EUSART对ADS122U04下发配置命令、轮询/中断方式读取转换结果、把原始码换算成电压再换算成温度,最后通过另一路通信接口(RS485或者CAN)把数据发出去。如果产品还需要在本地显示和按键设置,这颗芯片的IO资源也足够用。
有人可能会问:PIC18F4458的USB模块在这个项目里用得上吗?说实话,最初选型时我就是看中了USB能力,打算做一款带USB配置接口的仪表,但后来量产版本为了省成本把USB功能砍掉了,只保留UART和RS485。所以如果你想用它做纯温度采集,不需要USB也可以,这并不浪费,因为它仍然是很常见的工业级芯片,供货和开发环境都非常成熟。
2. 硬件设计的关键决策:原理图与PCB布局不可忽略的细节
2.1 电源与基准电压的处理
这颗ADC虽然标称支持宽电源范围,但我在实际项目中坚持用一路单独的5V模拟电源给AVDD,数字部分DVDD也统一接5V,只是通过磁珠和电容把模拟地和数字地在芯片附近做了单点连接。原因很简单:Delta-Sigma ADC的电源抑制比不是无限大的,如果供电上叠加了开关电源的毛刺,最后都会反映到转换码里。
基准电压的选择要分场景。ADS122U04内部有一个2.048V基准源,接热电偶或者不需要高精度比例测量的场合可以直接用。但如果是RTD测量,我强烈建议使用外部基准电阻结合IDAC电流源做比例测量,也就是把IDAC电流流过基准电阻产生的压降作为ADC的参考电压。这种做法的好处是电流源的绝对值漂移不会影响测量结果,因为激励电流和被测量电压的漂移方向一致,比例关系天然抵消掉了。
我项目里的典型接法是:IDAC1设为500µA,从REFOUT这个电流源输出,先流过基准电阻RREF(1.5kΩ,温漂系数5ppm),再流过PT100传感器,最后回到地。基准电阻两端接REF_P和REF_N,产生的参考电压是500µA乘以1.5kΩ等于0.75V。
2.2 传感器输入通道与抗混叠滤波
ADS122U04的输入阻抗很高,可以直接接传感器,但直接接不等于建议你直接接。我在第一版PCB上就踩过坑:热电偶输入线走了十几厘米,完全没有滤波,结果现场一开变频器,读数直接跳了十几度。
正确做法是在每个模拟输入端对地并联一个电容,同时在与传感器串联路径上放一个几十到几百欧姆的电阻。对Delta-Sigma ADC来说,抗混叠滤波器的截止频率要远低于调制器频率,但又不能太低导致输入建立时间太长。以20SPS采样率为例,我常用1kΩ串阻加100nF对地电容,时间常数约100微秒,足够稳定,同时对射频干扰也有明显的衰减作用。
需要注意电容材质。模拟输入端的滤波电容我从来不用X5R、Y5V这类高倍率电容,它们的容值会随电压和温度变化,这在高精度测量中就是误差源。用小封装C0G电容或者至少是薄膜电容会更稳。
2.3 PCB布局:模拟地与数字地的铺设原则
ADS122U04是TSSOP-16封装,布局空间不大,但没有太大难度。关键点有三条:一是ADC下方尽量铺完整地平面,不要在芯片正下方走数字信号线;二是IDAC的电流回路要短而粗,避免激励电流的回路面积过大;三是基准电阻RREF要贴近REFP和REFN引脚,并且两边走线等长对称。
地平面分割方面我做的是整板统一地,不割裂模拟地数字地,但在布局上把数字接口部分(UART的TX/RX)放在芯片一侧,模拟输入和基准放在另一侧。这个做法比盲目分割地更实用,也更不容易出EMI问题。如果系统里还有开关电源或者继电器,注意让继电器线圈的驱动线和敏感模拟线保持一定距离,或者直接分层走线。
3. 串口通信协议与PIC18F4458的驱动实现
3.1 ADS122U04的命令帧结构
ADS122U04的UART通信并不是把ADC数据直接推给主机,而是要主机主动发命令。芯片收到命令字节后,再根据命令类型返回数据或者等待后续数据字节。这里最常用的命令有三个:
| 操作 | 命令字节 | 说明 |
|---|---|---|
| 读数据 RDATA | 0x00 | 读取当前转换结果的24位数据 |
| 读寄存器 RREG | 0x20加寄存器号 | 读取配置寄存器 |
| 写寄存器 WREG | 0x30加寄存器号 | 写配置寄存器 |
这里我必须提一句:寄存器读写的具体编码在不同版本数据手册上画法略有差异,我项目里以应用手册中的命令表为准。你拿到板子后第一件事也应该是对照芯片丝印和数据手册确认命令,不要盲目照抄别人的代码。
ADS122U04一共有四个配置寄存器,分别控制输入多路复用器和PGA、数据速率和基准源、IDAC电流源、以及基准电压相关配置。写寄存器时,主机先发WREG命令字节,随后紧跟着发送要写入的寄存器值。
3.2 读写寄存器和读取数据的固件流程
PIC18F4458的EUSART配置成115200-8-N-1,和ADS122U04对接。初始化这一步要仔细,因为芯片上电默认是连续转换模式,寄存器值都是默认状态,如果不写配置,拿到的数据常常不是你期望的那个通道。
我的初始化流程是这样的:
void ADS122U04_Init(void) { // 复位后等待芯片稳定 __delay_ms(50); // 配置寄存器0:AIN0-AIN1差分输入,启用PGA,增益设为8 // 具体位定义参考数据手册寄存器映射 ADS122U04_WriteReg(0x00, 0x20); // 配置寄存器1:20SPS数据速率,内部基准使能,连续转换 ADS122U04_WriteReg(0x01, 0x04); // 配置寄存器2:IDAC1电流设为500uA,输出到AIN0引脚 ADS122U04_WriteReg(0x02, 0x78); // 配置寄存器3:外部基准REF_P/REF_N作为参考 ADS122U04_WriteReg(0x03, 0x80); }写寄存器的底层函数用PIC的EUSART发送一字节即可:
void ADS122U04_WriteReg(uint8_t reg, uint8_t val) { EUSART1_Write(0x30 | reg); // WREG命令 EUSART1_Write(val); // 寄存器值 }读取转换数据时,主机先发RDATA命令,再连续读取三个字节。ADS122U04返回的24位数据是二进制补码形式,最高位是符号位:
int32_t ADS122U04_ReadData(void) { uint8_t b0, b1, b2; int32_t raw; EUSART1_Write(0x00); // RDATA命令 b2 = EUSART1_Read(); // 最高字节 b1 = EUSART1_Read(); b0 = EUSART1_Read(); // 最低字节 raw = ((int32_t)b2 << 16) | ((int32_t)b1 << 8) | b0; // 24位有符号数扩展 if (raw & 0x800000) raw |= 0xFF000000; return raw; }这个过程看着简单,但有几个细节必须注意。首先是时序,主机发完RDATA后,ADC需要一小段时间准备数据,不能立刻就去读UART RX缓冲器,否则读到的是上一个周期的残留数据。实际项目中我在RDATA之后加了至少几十微秒的延时,或者等接收缓冲非空标志再读。
其次是数据就绪判断。ADS122U04有一个DRDY引脚,正常工作时会周期性拉低表示新数据准备好。最稳妥的驱动方式是把DRDY接到PIC的外部中断引脚,在中断里触发读取,这样既能保证数据新鲜,又不用在主循环里反复查询。
3.3 数据就绪信号DRDY的利用方式
我实际调试中发现,轮询DRDY和中断DRDY效果差别很大。如果只在主循环里定时读,恰好赶上ADC正在刷新数据而主机命令还没来得及发出,读到的可能是不完整的跳变数。虽然只是偶尔一个坏点,但用在PID温控闭环里就会引起执行器抖动。
所以后来我把DRDY接到PIC18F4458的INT0引脚,下降沿触发外部中断。中断服务程序里发RDATA并读回三个字节,存入一个全局变量,主循环只负责解析和上报。20SPS的采样率对8位单片机来说负荷极低,整个中断函数占用时间不到几十微秒,完全不会影响其他任务。
4. 三种典型温度传感器的接入与换算方法
4.1 RTD(PT100/PT1000)比例测量接线与计算
RTD是工业测量里最让人放心的传感器方案,但2线制接法有个天然缺陷:导线电阻和热电阻串联,会被当成有效电阻算进去。要解决这个问题,可以用3线制接法,让IDAC电流分别流过传感器和补偿回路,再通过差分测量抵消引线电阻的误差;更彻底的是4线制,激励和测量分开,导线电阻影响几乎可以忽略。
我项目里因为距离不太长,用的是3线制。典型接法是:IDAC1电流从AIN0引出,流过PT100后再回流到地;同时再引一路同样的IDAC电流流过一根补偿线,把补偿线上的压降也接入差分输入的另一端。这样实际测量的电压就是PT100两端的净压降,与线阻基本无关。
换算公式要区分PT100和PT1000。以PT100为例,0℃时的阻值是100Ω,温度系数大约是0.385Ω/℃。传感头在0℃时产生的信号电压是500µA乘以100Ω等于50mV,经过PGA放大8倍后是400mV,而ADC参考电压是0.75V。那么ADC码值可以这样估算:
- 满量程双极性范围是±0.75V/8=±93.75mV(输入端等效)
- 24位ADC在±93.75mV输入范围内的LSB约为22.4µV(按2^23计数计算)
- 50mV对应的码数大约是50mV除以22.4µV等于2232千码
实测下来,在0到100℃区间,分辨率能做到小数点后三位甚至更细,已经完全超出PT100传感器本身的线性度极限了。所以最终限制测量精度的不是ADC,而是传感器本身的精度和引线误差,这个认知对做仪表的人来说很重要。
PT1000因为阻值大,IDAC电流要降低到250µA,或者减小PGA增益,否则信号会超出参考电压范围。我在板子上留给软件一个配置接口,切换PT100和PT1000时只需要改寄存器值和换算系数,硬件上不用动。
4.2 热电偶测量与冷端补偿
热电偶的优点是量程极宽,HVAC里测排烟温度或者制冷压缩机高温侧时会用到K型或J型热电偶。但热电偶原理决定了它必须做冷端补偿,也就是要测出热电偶冷端所处位置的温度,再把这个温度对应的热电势加到实测值上。
ADS122U04内置了温度传感器,可以直接读取芯片结温。如果把热电偶冷端贴着芯片附近放置,理论上结温就能代表冷端温度。实际操作中我会在冷端加一小块铜块或导热垫,让热电偶端子到芯片的热阻尽量小、热时间常数尽量一致,补偿效果会明显提升。
热电偶信号处理要注意输入范围。K型热电偶在0到1000℃的温差电势大约是41mV,如果PGA增益设为128,满量程输入范围只有2.048V/128等于16mV(按内部基准计算),信号直接溢出。所以测热电偶时增益通常取16或32,配合外部基准或内部基准,把满量程设置在64mV到128mV比较合适。
数据速率方面,热电偶信号本来就小,噪声影响相对明显,我建议把采样率设在20SPS并开启工频抑制。如果现场变频器噪声很重,还可以对连续多个读数做滑动平均,实测能把显示跳动控制在0.1℃以内。
4.3 NTC热敏电阻的适配
HVAC里用得最多的其实是NTC热敏电阻,因为它便宜、响应快,温度范围虽不大但足够覆盖-40到120℃的空调控制器需求。NTC的缺点是阻值曲线强非线性,需要查表或多项式拟合;而且NTC本身没有标准,不同厂家的B值不同,换传感器要重新标定。
ADS122U04测NTC并不需要特殊的比例测量技巧。直接把NTC和精密电阻串联,用内部基准电压激励,把NTC的分压接到ADC输入即可。IDAC电流源在这里可以不用,因为串联分压的线性度由激励源稳定度决定,而内部基准源比IDAC更适合当简易激励源。
换算上我推荐用Steinhart-Hart方程或者分段线性插值表。分段插值表实现简单,在50℃附近取几个校准点,查表加线性插值就能把误差控制在0.1℃以内。ADS122U04的高分辨率在这里反而显得“奢侈”,大多数NTC系统用16位ADC就够,但兼顾同一块板子上其他高精度测点时,这也不算浪费。
5. 标定、误差分析与HVAC实测经验
5.1 系统标定流程
ADS122U04芯片本身的线性度非常好,但整个测量链路里还有传感器误差、引线误差、参考电阻误差、PCB热电势等多个误差源,所以整机标定这一关不能省。
我对这套系统做的标定分两步。第一步是零点校准:把模拟输入短接到地,读取ADC输出,把这个偏移量记录下来,在每次转换结果里扣除。Delta-Sigma ADC的失调主要来自PGA和输入偏置电流,开机校准一次通常就够了,但环境温度变化大的场合每半小时自动校准一次更稳。
第二步是增益校准:用精密信号源或者精密电阻模拟已知传感器阻值,分别读几个点,算出实际增益和理论增益的偏差系数,存到EEPROM里。我实测一块板子的增益偏差大约在0.05%左右,校准后整机测温误差可以做到0.2℃以内(PT100传感器本身按AA级计算)。
标定数据格式建议同时保存温度值和原始码,不要只保存换算后的温度。原因很实际:现场如果怀疑某一路异常,工程师需要同时看到原始码来区分是传感器坏了还是信号链问题。
5.2 误差来源与消除
高精度测温系统最大的敌人有三个:热电势、温漂和共模干扰。
热电势说起来很反直觉:不同金属接触点只要有温差就会产生电动势,这在铜导线、焊盘、连接器甚至PCB铜箔之间都会存在。解决思路是让输入路径上的所有连接点温度尽量一致,尤其是输入端子附近不要有发热元器件。我遇到过测温读数随机漂移0.3℃,排查到最后发现是一颗LDO正好贴在输入端子下方,把局部温度拉高了。把LDO移远之后,问题立刻消失。
温漂主要来自基准电阻和PGA。基准电阻选5ppm以下温漂的金属膜电阻是关键,这钱不能省。PGA温漂没法完全消除,只能通过校准点的温度补偿来近似修正。
共模干扰在长线测温时最头疼。模拟输入端对地的共模电压如果超过电源轨,会直接破坏ADC转换结果。我的处理是每一路输入对地加一个100kΩ下拉电阻,把悬空线缆上的感应电荷泄放掉,同时在ADC输入端并联一对背靠背的二极管做输入保护,防静电和浪涌。
5.3 HVAC应用中的抗干扰与长线问题
HVAC现场的长线干扰和实验室环境完全不同。冷冻站里变频器一启动,母线电压波动和辐射干扰一起来,如果模拟前端没做好,再好的ADC也是白搭。
我在冷冻站项目里总结出三条实用经验:
第一条,传感器线缆必须用屏蔽双绞线,屏蔽层单端接地。双绞线的目的是抑制差模干扰,屏蔽层是抑制共模干扰。如果两端都接地,屏蔽层会形成地环路,反而把干扰引进来。
第二条,UART通信线和模拟输入线分开走线管,至少保持20cm距离。PIC18F4458的UART接口信号是标准逻辑电平,在长线传输时上升沿快,谐波丰富,如果和热电偶线绑在一起走,每一帧命令都会在模拟线上感应噪声。
第三条,软件上对连续采样值做50Hz工频对消。如果数据速率选择20SPS,正好是50Hz的整数分频,配合一次数字滤波,可以把工频干扰抑制到很低的程度。这一招在照明谐波大的商业楼宇里特别管用。
我最后再分享一个实操中的体会:ADS122U04和PIC18F4458这套组合的功耗并不高,整板待机能做到几毫瓦级别,对于需要电池供电的温湿度记录仪来说也完全可行。如果你手头正好在做HVAC控制器或者工业数据采集模块,可以先用这套方案搭一个最小系统跑起来,把寄存器配置和基准电压处理搞明白,再往产品形态上扩展。毕竟在测温这个领域,把基础信号链路做扎实,比换更贵的MCU带来的提升要明显得多。