☰
基于ADS122U04与PIC18F4620的高精度PT100测温方案详解
2026/11/5 1:03:29 网站建设 项目流程

在工业仪表和HVAC控制系统里泡久了,你会发现“测温度”这件事看着简单,真正做稳定却不容易。不少项目一开始用NTC加运放凑合,后来被现场飘移、工频干扰和长线压降折腾到崩溃。我从几年前开始在很多测温方案里固定使用ADS122U04IPWR这颗24位ADC配合PIC18F4620做主控,把PT100/PT1000的微弱电阻变化转换成稳定、可上位的温度数据。这套组合在风管温度、冷冻水温度、工业管道测温这些场景里,实测下来非常稳,尤其适合对精度和长期可靠性有要求、但采样率不需要太高的场合。这篇文章就把我从选型、硬件设计到固件调试的完整过程拆开讲一遍,希望能给正在做类似项目的人省点弯路。

1. 为什么选这两个芯片:方案背后的真实逻辑

1.1 ADS122U04 到底强在哪儿

先说ADC。ADS122U04IPWR里的U,代表的是UART接口,这是它和普通SPI版本ADS1220最核心的区别。这颗芯片是TI的24位ΔΣ型ADC,内部集成可编程增益放大器(PGA,1到128倍),两个可配置的激励电流源(IDAC),一个2.048V内部基准,四个模拟输入通道,以及针对50Hz/60Hz工频抑制的数字滤波器。最让我看重的是它的UART接口——工业现场传感器往往离控制器几米甚至几十米,SPI和I2C这种同步接口在长距离下容易受干扰,而UART只要转成RS485就能稳定远传,还能实现最多16个设备菊花链串联。这意味着一个MCU串口可以挂一排ADS122U04,每个节点独立采集多路温度,非常适合HVAC这种多点布线的项目。

从精度角度看,24位分辨率听起来吓人,但实际工程里我们买的不是那几位有效位数,而是它内部的低噪声PGA和可编程滤波能力。PID控制或者HVAC楼宇自控需要的是长期重复性好、不漂移,而不是某一次读数“看起来精确”。ADS122U04配合PT100这种铂电阻,在-40℃到150℃范围内做到±0.1℃级别是完全现实的,这个精度已经超过了绝大多数HVAC现场的需求。

1.2 PIC18F4620 作为主控的角色

PIC18F4620是Microchip一颗非常成熟的8位MCU,40脚封装,64KB Flash、4KB SRAM、1KB EEPROM,内部振荡器最高8MHz还可以开4倍PLL到32MHz。它带一个增强型EUSART,用来和ADS122U04做UART通信正合适。可能有人会问,做温度采集为什么不上STM32?我的看法是:测温这个任务本身对算力完全没有压力,20SPS的采样率下8位机绰绰有余。PIC18F4620的优势在于工业环境里极其皮实,工作电压范围宽(2.0V-5.5V),抗干扰能力强,开发工具链也成熟,而且这颗料库存量大、价格稳定。在保证功能的前提下,简化供应链和降低BOM复杂度,本身就是工程选型的重要一环。

1.3 这套组合适合什么场景

我用这套组合落地过的场景包括:HVAC机房的风管温湿度系统、冷冻水供回水温度监测、工业设备轴承温度预警,以及冷库多点测温。共同特点是:精度要求高(±0.1到±0.5℃)、采样速度低(每秒几次就够)、现场电磁环境恶劣、传感器到控制器距离远。如果你做的是消费类小产品,或者只是实验室里调着玩,那完全没必要上这个组合;但如果是需要长期在线运行、维护人员不可能天天校准的系统,ADS122U04加上PIC18F4620的性价比就体现出来了。下面我把硬件的每个环节拆开讲。

2. 硬件电路:从传感器到ADC到MCU的完整链路

2.1 传感器选型:RTD、热电偶还是NTC

温度传感器选型很大程度上决定了整个系统的下限。HVAC和工业测温里常见三类:NTC热敏电阻、热电偶、铂电阻RTD。我直接说结论:能用RTD就不要用NTC,能远传测温就不要用热电偶裸奔。

传感器类型测温范围典型精度输出信号适合场景主要坑点
NTC热敏电阻-40~150℃±0.3℃(需校准)电阻非线性消费类、短距离换料要重新校准,长期漂移
热电偶K型-200~1260℃±1~2℃微伏级电压高温工业炉必须冷端补偿,线性差
PT100铂电阻-200~650℃±0.1~0.3℃电阻近似线性工业/HVAC高精度引线电阻需处理
PT1000铂电阻-50~300℃±0.1~0.3℃电阻近似线性HVAC、楼宇自控灵敏度高但电流要小

HVAC系统里PT1000越来越流行,因为相同温度下它阻值变化大,引线电阻占比小;但工业场合用PT100更多,因为探头规格统一、备件好买。实际项目中我会根据传感器安装距离和预算选择三线制或四线制接法,下面重点讲三线制怎么接到ADS122U04上。

2.2 三线制PT100的接线原理

铂电阻测温的本质是测电阻。最简单的二线制接法在长线缆下误差很大,因为导线的电阻也串进了测量回路。比如线长50米,铜线电阻可能达到3-5Ω,对应PT100大约8-13℃的误差,这是绝对不能接受的。所以工程上至少要用三线制。

ADS122U04内部有两个匹配的IDAC恒流源,用它们做三线制极其方便。接线方式是这样的:IDAC1接到PT100的一端(同时作为AIN0正输入),IDAC2接到PT100的另一端(同时引出一根补偿线到AIN1负输入附近),PT100剩下的公共端回到电源地或者直接回AGND。两个IDAC电流相等,假设两根线缆长度相同、电阻相等,那么线路电阻在AIN0和AIN1上的压降恰好抵消,差分电压就只剩下PT100本体上的压降。这个原理和电桥类似,但省掉了桥臂电阻,简单可靠。

我实际调试时发现一个容易忽略的问题:三线制补偿的前提是两根引线电阻严格一致。现场如果接的线径不同,或者端子氧化导致接触电阻不一样,补偿就不完全。所以接线时尽量用同规格、同长度的屏蔽双绞线,接线端子用镀金或防腐蚀的,不要图便宜用普通螺丝端子。

2.3 激励电流与增益怎么算

激励电流的选择是个平衡问题:电流越大,PT100上的压降越大,分辨率越高;但自热效应也越严重,而且可能超过PGA的输入范围。我常用的经验值是PT100用1mA,PT1000用250µA或者500µA。这里算一个实际例子。

PT100在0℃时电阻100Ω,200℃时约175.84Ω。用1mA激励,压降范围是100mV到176mV。ADS122U04内部基准2.048V,如果PGA设为8,则满量程是±256mV,176mV留了约30%裕量,可以保证信号不饱和。如果贪心把PGA设为16,满量程只有±128mV,200℃时直接溢出,转换结果就会满码跳变。反过来,如果只测0-100℃(最大138.5mV),PGA设8依然合适。

PT1000配250µA时,0-200℃压降约250-440mV,PGA设4(满量程±512mV)是安全的,而且2400Ω满量程范围可以覆盖到200℃以上。电流越小自热越小,但要注意的是小电流下压降也小,信号容易淹没在PGA噪声里。ADS122U04在PGA增益4时等效输入噪声大约几百纳伏量级,250µA下对应电阻分辨率远超0.01Ω,所以不用太担心。

2.4 保护器件和PCB布局的细节

工业现场最怕的不是传感器本身坏,而是静电、浪涌和变频器干扰从传感器线窜进来。我在这套电路上通常做三级保护:输入端串联100Ω到1kΩ的限流电阻,并联TVS管到AVDD和AVSS,再在ADC输入引脚附近放RC低通滤波。RC的截止频率不需要太高,因为我最终只要20SPS的数据率,抗射频干扰才是主要目的。R取1kΩ、C取100nF时截止频率约1.6kHz,既不影响信号又很好地滤掉了高频噪声。

PCB布局上的教训我踩过不少。ADS122U04是混合信号芯片,模拟电源AVDD和数字电源DVDD要分别退耦,至少每个电源引脚一个0.1µF陶瓷电容紧贴引脚,再各加一个10µF钽电容。模拟地和数字地建议在ADC芯片下方单点连接,不要大面积铺成一个地平面让数字电流串进模拟回路。PIC18F4620的晶振和UART走线尽量远离ADC输入端。如果系统里还有继电器或PWM驱动,那电源隔离和磁环基本是必须的,不然测出来的温度曲线会跟着负载跳。

3. 固件实现:UART通信与温度换算

3.1 串口波特率的工程选择

PIC18F4620的EUSART做UART并不复杂,但波特率误差是个容易被轻视的坑。它的波特率发生器是根据系统时钟分频的,如果时钟频率选得不好,算出来的实际波特率和目标值差太多,通信就会偶发错帧。

我当时用内部8MHz时钟配38400bps,计算方法是当BRGH=1时,SPBRG = FOSC / (16 × Baud) - 1,也就是8,000,000 / (16 × 38,400) - 1 ≈ 12.02,取12后实际波特率是38,461,误差只有0.16%,非常稳定。如果非要用32MHz时钟跑115200,算下来SPBRG约16.36,取16时实际波特率117,647,误差约2.1%,已经接近UART容差上限,长距离通信很容易出错。所以我的建议是:没有19.6608MHz这类标准UART晶振时,老老实实用8MHz内部晶振配38400bps。ADS122U04的波特率同样支持38400,两边匹配好就行。

3.2 ADS122U04初始化与寄存器配置

ADS122U04上电后先要复位再配置寄存器。我习惯在MCU上电延时10ms后,给ADC发送复位命令,再延时10ms等内部电路稳定。然后用写寄存器命令依次配置四个寄存器。这里贴一段我常用的一路PT100三线制初始化代码,命令码以数据手册为准:

#define ADS_WREG 0x40 #define ADS_RREG 0x20 #define ADS_RDATA 0x10 #define ADS_RESET 0x06 void ADS122U04_WriteRegister(uint8_t regAddr, uint8_t regVal) { UART_SendByte(ADS_WREG | regAddr); UART_SendByte(regVal); } void ADS122U04_Init(void) { UART_SendByte(ADS_RESET); __delay_ms(10); // 寄存器0:AIN0+/AIN1-差分输入,PGA增益8 ADS122U04_WriteRegister(0x00, 0x0C); // 寄存器1:2.048V内部基准,连续转换,数据率20SPS ADS122U04_WriteRegister(0x01, 0xD4); // 寄存器2:IDAC1和IDAC2都开启,电流1mA ADS122U04_WriteRegister(0x02, 0x38); // 寄存器3:关闭内部温度传感器,禁止开路检测 ADS122U04_WriteRegister(0x03, 0x00); }

每个寄存器具体哪些位控制什么,不同版本数据手册会有细节差异,但配置思路是一致的:先定输入通道和增益,再定转换模式和采样率,最后开电流源。采样率选20SPS是因为ADS122U04内部FIR滤波器在这一档对50Hz/60Hz同时有很好的抑制效果,正是为工业和HVAC环境设计的。

3.3 读取24位转换结果的代码实践

ADS122U04是连续转换模式时,转换完成会通过DRDY引脚通知主机。实际项目中我把DRDY接到PIC18F4620的INT0引脚,下降沿触发中断后在中断里发送RDATA命令读取数据。注意,UART读取24位结果时要连续读三个字节,顺序是高位在前。读回来的数据是二进制补码格式,需要做符号扩展才能正确计算负电压对应的负温度。

volatile int32_t rawCode = 0; volatile uint8_t dataReady = 0; void __interrupt(high_priority) INT0_ISR(void) { INTCONbits.INT0IF = 0; dataReady = 1; } void ReadTemperature(void) { if (!dataReady) return; dataReady = 0; uint8_t d[3]; UART_SendByte(ADS_RDATA); d[0] = UART_ReceiveByte(); d[1] = UART_ReceiveByte(); d[2] = UART_ReceiveByte(); rawCode = ((int32_t)d[0] << 16) | ((int32_t)d[1] << 8) | d[2]; // 24位补码符号扩展 if (rawCode & 0x800000) { rawCode |= 0xFF000000; } }

这里有个细节:发送RDATA命令之后,三个数据字节会紧跟而来,MCU不需要做复杂的握手,但接收时序要紧凑,尽量不要在读取过程中插入长延时。PIC18的UART接收中断如果配置不好,偶尔会丢掉一个字节,我后来直接改为阻塞式连续读三个字节,配合DRDY中断反而更稳定。

3.4 从码值到电阻再到温度

拿到24位码值后,第一件事是换算成差分电压。ADS122U04满量程对应±VREF/PGA,所以电压公式为:

Vdiff = (rawCode / 8388608) × (VREF / PGA)

VREF取2.048V、PGA取8时,每个LSB对应约3.05µV。PT100用1mA激励,对应的电阻分辨率为3.05mΩ,折算温度分辨率约0.008℃,远远够用。得到电阻后,温度换算我通常用查表法或者Callendar-Van Dusen方程。查表法适合资源紧张的MCU,把-40℃到150℃的PT100分度表按1℃间隔存成数组,线性插值即可,误差小于0.05℃。如果Flash还富余,我更喜欢直接存电阻值而不是温度,这样插值更直接。

下面是我常用的一段电阻转温度插值伪代码,表格为PT100标准分度表:

// 假设RTable[]按温度数组index存储对应的PT100电阻值 float ResistanceToTemp(float resistance) { if (resistance <= RTable[0]) return -40.0f; if (resistance >= RTable[190]) return 150.0f; uint16_t i = 0; while (resistance > RTable[i]) i++; float t0 = (float)(i - 1) - 40.0f; float ratio = (resistance - RTable[i-1]) / (RTable[i] - RTable[i-1]); return t0 + ratio; }

这样得到的是单次采样的温度。为了让HVAC系统运行更平稳,我还会在应用层加一个16点滑动平均,20SPS的原始采样率经过平均后等效1.25Hz刷新率,对于温度这种大惯性信号完全够了,同时能把ADC码值噪声再压低到接近1/4。不要用那种“取出一个最大值最小值再平均”的复杂滤波,温度信号本身不该突变,简单滑动平均就是最优解。

4. 部署现场常见的坑与排查

4.1 转换结果不断跳动的排查流程

如果把硬件和固件都调试完,发现温度数据还是跳动,先别怀疑ADC芯片,按顺序排查往往最快。第一,检查参考电压是否干净。ADS122U04用内部基准时,对外部干扰特别敏感,我遇到过因为AVDD退耦电容焊错位置导致稳压器振荡的情况,温度码值直接跳几百个LSB。第二,确认激励电流源是否真的稳定。用万用表测PT100两端的电压,如果是1mA电流,100Ω电阻两端应该稳定在100mV左右,有波动就查连接和供电。第三,检查PGA有没有进入饱和区。如果输入共模电压或者差分电压接近满量程,AD转换会非线性失真,表现为高段跳变。先用固定精密电阻(比如用一个100Ω/0.01%的电阻代替PT100)测试系统,如果固定电阻读数平稳而PT100读数跳,那问题基本在传感器和线缆上。

4.2 通信失败与上电时序问题

UART通信最常见的低级错误是TX和RX没有交叉。ADS122U04的DIN是接收数据,应该接PIC的TX;DOUT是发送数据,应该接PIC的RX。共地也别忘了,两个板子各用各的开关电源如果不共地,UART信号参考电压不一致,收帧就会乱。另一个容易忽略的是上电时序:如果MCU已经跑起来开始发命令,而ADS122U04还在复位状态,命令就会丢失且不返回应答。我后来改成上电后先延时500ms,再发复位命令,再延时10ms,再开始配置,再也没有出现“第一条读指令没回包”的情况。

ADS122U04支持菊花链,如果你在一条UART线上串了多个ADC,寄存器配置和数据读取的命令都需要带设备地址。这块我建议一开始就用一个小型协议封装:每个设备一个地址字节前缀,按地址逐个读数据。实际项目中我在一条RS485总线上挂过8个ADS122U04,每个节点采2路PT100,稳定运行一个采暖季,没有掉过链子。

4.3 温度偏差的校准方法

长期测温系统最大的敌人是漂移和系统误差。即使ADS122U04出厂精度很高,外围电路的增益误差、PGA失调和传感器本身的偏差仍然会造成零点几度的误差。我的做法是双点校准:用精密电阻箱模拟0℃和100℃的PT100阻值,分别记录ADC码值,然后软件里做线性修正。公式很简单:

calibratedTemp = measuredTemp × gainCorrection + offsetCorrection

其中gainCorrection = 真实温度差值 / 测量温度差值,offsetCorrection = 真实零点 - 测量零点 × gainCorrection。校准完用另一个中间点电阻验证,通常能把误差压到±0.05℃以内。如果传感器探头是插在管道里的,最好带着安装套管一起标定,因为套管导热带来的滞后和偏差是重复性的,标定可以一并补偿掉。

4.4 HVAC场景的安装与布线建议

HVAC现场有太多细节能让一个设计得很好的电路板毁在施工阶段。我见过风管温度传感器直接绑在保温层外面测室温的,也见过把补偿导线和220V动力线并排走十几米的。总结几条实操经验:探头要插入风管中心位置,迎风侧安装,插入深度至少200mm;在冷冻水管上测量时要保证探头完全没入水中,套管顶部要密封防止凝露渗入;信号线用双绞屏蔽线,屏蔽层在控制器端单端接地,坚决不要两端都接地形成地环路;传感器到ADC的线缆超过20米时,优先考虑把ADC模块就近放在传感器旁边,用RS485把数字信号传回PLC而不是传模拟量,这样抗干扰能力完全不同。

这些经验看着不起眼,但在实际项目里往往决定系统到底能不能过一个冬天的考验。我做过的一个冷库测温项目,第一版PCB模拟采样板放在设备间里,结果温度数据跟着压缩机启停波动。后来把采集模块拆出来放到冷库门口,RS485上传数据,问题立刻消失。工业现场永远是物理层的问题要先解决,否则再好的ADC也白搭。

这套组合我用下来的整体感受是:ADS122U04IPWR 和 PIC18F4620 都不是各自领域里最时髦或者最高端的料,但它们搭配在一起,恰好覆盖了工业与HVAC测温项目最在意的“精度、稳定、可远程、好维护”四个点。硬件调试中遇到的各种问题,90%发生在传感器接线和供电噪声上,而不是芯片本身;只要把前端信号调理和PCB布局做扎实,后面的固件就只是水到渠成的事了。如果你也准备上手,我的建议是先买两块评估板,把UART链路和寄存器读写完全调通,再去设计自己的PCB,这个时间千万别省。顺着这个组合再往前走,还可以把多个ADS122U04通过菊花链组成RS485多点测温网络,直接对接Modbus网关,这也是我下一步打算开源出来的扩展方案。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询