1. 工业与HVAC温度测量方案的整体设计思路
工业现场和HVAC系统的温度测量,跟我们在实验室里拿个万用表测室温完全是两码事。工业场景下,传感器可能离控制板几十米远,走线要穿过变频器、接触器、电机这些强干扰源旁边;HVAC系统里,你测的可能是管道里的水温、风道里的空气温度,甚至是冷媒管路的表面温度,测温范围从零下几十度到一百多度都有。这种场景下,测量方案的核心诉求就三个词:抗干扰、低漂移、够便宜。
我这次选用的组合是ADS122U04IPWR加PIC24FV16KA301。先说这颗ADC,ADS122U04是TI的一款24位ΔΣ型模数转换器,带UART接口,内置PGA(可编程增益放大器)、两个可编程激励电流源(IDAC)、以及一个温度传感器。PWR后缀是TSSOP-16封装,适合空间紧凑的板子。它最大的好处是把很多模拟前端的东西集成进去了,比如你接RTD(铂电阻)做比例式测量时,激励电流源和参考电压可以共用,直接消除激励源的漂移误差。PIC24FV16KA301是Microchip的一款16位MCU,带12位ADC、运放、比较器,5V供电,工业温度范围-40到+125°C,本身就很适合工业环境。它在这里的角色是系统主控:配置ADS122U04、读取转换结果、做线性化计算、驱动显示或通信。
为什么不用MCU自带的12位ADC直接测?因为工业测温对精度要求往往在0.1°C级别,12位ADC在5V参考下,1LSB就是1.22mV,对应PT100大约0.3°C的分辨率,再加上MCU内部ADC的噪声和温漂,实际有效位数可能只有9到10位,根本不够看。而ADS122U04在20SPS(每秒采样20次)时能给出21.7位有效分辨率,换算到PT100上就是0.005°C级别的分辨力,差距是数量级的。
整个方案的信号链是这样的:PT100或热电偶传感器 → 模拟前端(滤波、保护) → ADS122U04做高精度数字化 → UART送给PIC24FV16KA301 → MCU做温度换算和线性化 → 输出到显示或上位机。下面我会把这个链条上的每个环节拆开讲,包括我实际调试中踩过的坑。
2. 核心器件选型与关键参数解析
2.1 ADS122U04IPWR到底强在哪里
ADS122U04的核心是一个24位ΔΣ调制器,配合一个灵活的多路复用输入。它支持四种测量模式:单端、差分、以及两组差分输入。对于温度测量来说,最常用的是差分输入,因为差分能有效抑制共模干扰,尤其是工业现场那种地电位差很大的情况。
它内置的PGA增益从1到128可调。这个增益怎么用?举个例子,用K型热电偶测温,典型输出是41μV/°C,100°C温差才4.1mV。如果直接用增益1,ADC的满量程是±2.048V(用内部2.048V参考),那4.1mV只占满量程的0.2%,有效位数浪费严重。这时候把PGA设成64或128,信号就被放大到接近满量程,分辨率直接提升。
另一个关键功能是双匹配IDAC电流源。做RTD测量时,你需要给RTD注入一个激励电流,然后测量它两端的电压。传统做法是用一个恒流源,但恒流源的精度和温漂会直接影响测量结果。ADS122U04的做法是:IDAC1和IDAC2分别从两个引脚输出电流,你可以让IDAC1流过RTD,IDAC2流过一颗精密参考电阻,然后把参考电阻两端的电压作为ADC的参考电压。这样RTD上的电压和参考电压都跟同一个激励电流成正比,电流的漂移就被比值消掉了。这就是所谓的比例式测量,是RTD测温精度能做到0.01°C级别的关键。
注意:IDAC的电流值有10μA、50μA、100μA、250μA、500μA、1000μA、1500μA几档。选多大要看RTD的功耗限制。PT100在1000μA下自身发热约0.1mW,自热误差很小;但如果用PT10(10Ω)或者更小的RTD,电流就要降下来,否则自热误差会很明显。
ADS122U04还有一个内部温度传感器,精度大约0.5°C,可以用来做冷端补偿或者板级温度监测,但不要指望它做高精度测量,它的主要价值是给热电偶做冷端补偿提供一个参考。
2.2 PIC24FV16KA301的角色定位
PIC24FV16KA301是一颗16位MCU,16KB Flash、2KB RAM,带12位ADC、两个运放、三个比较器。它在这个方案里不直接参与模拟测量,而是做数字处理。为什么选它而不是更便宜的8位MCU?因为温度线性化计算需要浮点或者至少32位定点运算,尤其是热电偶的NIST多项式,系数多、阶数高,8位MCU跑起来很吃力。PIC24是16位架构,配合XC16编译器,做这些计算很轻松。
它还有一个好处是5V供电。工业现场很多传感器和变送器是5V或24V系统,5V MCU跟ADS122U04(模拟供电2.7到5.5V)可以直接对接,不需要额外的电平转换。另外它的UART、SPI、I2C外设齐全,跟ADS122U04的UART通信只需要两根线。
2.3 传感器选型:PT100还是热电偶
这是方案设计时第一个要回答的问题。PT100(铂电阻)精度高、线性度好、稳定性强,适合-200到+600°C范围,但响应速度慢,而且需要激励电流。热电偶响应快、测温范围宽(K型可以到1372°C)、成本低,但输出信号极小、需要冷端补偿、线性度差。
在HVAC场景里,水温、风温测量大多用PT100或PT1000,因为温度范围在-50到+150°C之间,PT100的精度优势明显。工业过程控制里,高温炉、锅炉烟道这些地方用热电偶更多。我这个方案两种都支持,因为ADS122U04的输入多路复用和PGA配置可以覆盖两种传感器的信号范围。
| 对比项 | PT100 | K型热电偶 |
|---|---|---|
| 测温范围 | -200~+600°C | -200~+1372°C |
| 灵敏度 | 约385μV/°C | 约41μV/°C |
| 精度(典型) | ±0.1°C | ±1~2°C |
| 线性度 | 好 | 差,需多项式修正 |
| 冷端补偿 | 不需要 | 必须 |
| 激励需求 | 需要电流源 | 不需要 |
| 成本 | 较高 | 低 |
3. 硬件电路设计与实操要点
3.1 模拟前端电路怎么搭
PT100的接口电路我采用的是三线制比例式测量。三线制的目的是消除引线电阻的影响。PT100在0°C时是100Ω,而一根普通导线的电阻可能有0.1到1Ω,如果不补偿,1Ω引线电阻就带来约2.6°C的误差,这在工业场景里是不可接受的。
具体连接方式:IDAC1从ADS122U04的引脚输出,经过一根引线到PT100的一端;PT100的另一端经过第二根引线回到ADC的AIN0;第三根引线从PT100的一端直接连到AIN1。同时IDAC2流过一颗精密参考电阻Rref(比如1.65kΩ,0.1%精度,5ppm/°C温漂),Rref两端的电压接到ADC的REF+和REF-。
这里有个细节:Rref的选值要跟IDAC电流匹配。假设IDAC设为500μA,PT100在0°C时是100Ω,两端电压是50mV。如果Rref用1.65kΩ,那参考电压是825mV。ADC的满量程输入是±Vref/增益,增益设成1时,输入范围是±825mV,PT100的50mV只占6%,分辨率浪费了。所以增益要设成16,这样输入范围变成±51.6mV,50mV刚好接近满量程。这就是为什么PGA增益的选择要跟传感器信号幅度和参考电压一起算。
热电偶的接口电路就简单得多:热电偶的正负极直接接到ADC的差分输入,PGA增益设成128(因为信号只有几十μV到几十mV)。但冷端补偿是必须的,我后面会讲怎么用ADS122U04的内部温度传感器或者外接一颗LM35来做。
3.2 电源和去耦设计
ADS122U04有模拟电源AVDD和数字电源DVDD,我建议用独立的LDO分别供电,或者至少用磁珠隔离。模拟电源的噪声直接影响ADC的转换结果,尤其是做24位转换时,电源上的几十μV纹波就能让最后几位跳变。
去耦电容的布局很关键。每个电源引脚旁边放一个0.1μF的陶瓷电容,尽量靠近引脚,另外在电源入口处放一个10μF的钽电容或MLCC做储能。AVDD和DVDD之间不要共用一条走线,从LDO出来就分开。
实操心得:我第一版板子把AVDD和DVDD接在同一个3.3V上,结果ADC的噪声底比数据手册标称值高了将近10倍。后来改成AVDD用一颗低噪声LDO(比如TPS7A4700),DVDD用另一颗普通LDO,噪声立刻降下来了。这个坑花了我两天时间排查,希望大家不要重复。
3.3 PCB布局的注意事项
混合信号PCB布局的核心原则是:模拟区域和数字区域分开,地平面单点连接。ADS122U04下面不要走数字信号线,尤其是时钟线。UART的TX和RX线要远离模拟输入引脚,最好走在板子另一层,中间用地平面隔开。
PT100的引线接入端子后,要先经过RC滤波再进ADC。我通常用1kΩ电阻串联加100nF电容到地,截止频率约1.6kHz,能滤掉大部分高频干扰,又不会影响温度信号的带宽(温度变化本身很慢,带宽几Hz就够了)。
参考电阻Rref的布局也很讲究。它要靠近ADC的REF+和REF-引脚,走线尽量短且对称。Rref本身要选低温漂的,我用的是Vishay的PTF系列,0.1%精度、5ppm/°C,虽然贵一点,但它是整个测量精度的基准,省不得。
4. 固件实现:从寄存器配置到温度换算
4.1 ADS122U04的寄存器配置流程
ADS122U04通过UART通信,上电后需要配置四个寄存器:配置寄存器0到3。我以PT100三线制、增益16、20SPS、IDAC 500μA为例,给出配置值。
配置寄存器0(地址0x00):
- 多路复用器MUX[3:0]:选AIN0和AIN1差分输入,对应值0x00
- 增益GAIN[2:0]:增益16,对应值0x04
- PGA旁路:使能PGA,值0
配置寄存器1(地址0x01):
- 数据速率DR[2:0]:20SPS,对应值0x00
- 工作模式:正常模式
- 转换模式:单次或连续,我选连续
- 温度传感器:关闭
- burnout电流源:关闭
- 参考电压选择:外部参考,对应值0
配置寄存器2(地址0x02):
- IDAC电流值:500μA,对应值0x04
- IDAC1路由:AIN0,IDAC2路由:AIN1(用于三线制引线补偿)
配置寄存器3(地址0x03):
- IDAC2路由继续配置
- 其他保留位
实际写寄存器时,每个寄存器写一个字节,通过UART发送命令0x40+寄存器地址,然后跟一个数据字节。比如写配置寄存器0,发送0x40、0x00,再发送配置值。
// PIC24FV16KA301 UART发送配置示例 void ADS122U04_WriteReg(uint8_t reg, uint8_t value) { UART1_SendByte(0x40 | (reg << 2)); // 写命令 + 寄存器地址 UART1_SendByte(value); __delay_ms(1); // 等待ADC处理 }4.2 读取转换结果与数据格式处理
ADS122U04的输出是24位二进制补码,范围从0x800000到0x7FFFFF,对应-Vref/Gain到+Vref/Gain。读取时发送0x10命令(RDATA),然后连续读三个字节,高位在前。
int32_t ADS122U04_ReadData(void) { uint8_t buf[3]; int32_t result = 0; UART1_SendByte(0x10); // RDATA命令 buf[0] = UART1_ReceiveByte(); buf[1] = UART1_ReceiveByte(); buf[2] = UART1_ReceiveByte(); result = ((int32_t)buf[0] << 16) | ((int32_t)buf[1] << 8) | buf[2]; if (result & 0x800000) { // 负数,扩展符号位 result |= 0xFF000000; } return result; }拿到原始码值后,要换算成电压,再换算成电阻,再换算成温度。以PT100为例:
电压 = (原始码值 / 2^23) × (Vref / Gain)
电阻 = 电压 / IDAC电流
温度 = (电阻 - 100) / 0.385 (近似线性,高精度需要查表或Callendar-Van Dusen方程)
Callendar-Van Dusen方程是PT100的标准换算公式:
- T ≥ 0°C时:R(T) = R0 × (1 + A×T + B×T²)
- T < 0°C时:R(T) = R0 × (1 + A×T + B×T² + C×(T-100)×T³)
其中A=3.9083×10^-3,B=-5.775×10^-7,C=-4.183×10^-12。反解温度需要迭代或者用分段线性插值。我在PIC24上用的是查表加线性插值,每10°C一个点,精度足够0.01°C。
4.3 热电偶的冷端补偿与线性化
热电偶的冷端补偿原理是:热电偶输出的是热端和冷端的温差电动势,要得到热端绝对温度,必须知道冷端温度,然后加上冷端对应的电动势。具体做法是:用ADS122U04的内部温度传感器或者外接LM35测出冷端温度T_cold,查K型热电偶分度表得到T_cold对应的电动势E_cold,然后实际热端电动势E_hot = E_measured + E_cold,再用E_hot查表得到热端温度。
K型热电偶的NIST多项式有十几阶,在PIC24上直接算太慢。我的做法是把-200到+1372°C分成若干段,每段用低阶多项式拟合,误差控制在0.1°C以内。比如0到500°C这一段,用四阶多项式就够了。
注意:热电偶的冷端补偿精度直接影响整体精度。如果冷端补偿有1°C误差,测量结果就有1°C误差。所以冷端温度传感器的精度和它跟热电偶接线端子的热耦合很重要。我通常把冷端传感器贴在接线端子旁边,中间涂导热硅脂,确保两者温度一致。
5. 常见问题与排查技巧实录
5.1 读数跳动大怎么办
这是最常见的问题。24位ADC读数跳动,原因可能有很多。我按排查顺序列一下:
第一,检查参考电压是否稳定。用示波器看REF+和REF-之间的电压,如果有几十μV的纹波,读数肯定跳。解决办法是加大参考端的滤波电容,或者在Rref旁边并联一个1μF的陶瓷电容。
第二,检查IDAC电流是否稳定。IDAC的输出电流对电源电压和温度敏感,如果AVDD不稳,IDAC就会漂。确保AVDD的LDO有足够的PSRR。
第三,检查输入滤波。PT100引线如果太长,会引入工频干扰。在ADC输入端加共模扼流圈或者RC滤波。
第四,检查ADC的转换速率和滤波设置。20SPS时ADC内部有sinc滤波器,对50Hz和60Hz工频有很好的抑制。如果设成更高速度,工频抑制就差了。
| 现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 读数跳动±1°C | 参考电压不稳 | 示波器测REF引脚 | 加滤波电容,换低温漂Rref |
| 读数跳动±0.1°C | 输入干扰 | 短接输入端看是否还跳 | 加RC滤波,远离干扰源 |
| 读数缓慢漂移 | 温度漂移 | 恒温箱测试 | 选低温漂电阻,做软件补偿 |
| 读数固定偏差 | 引线电阻未补偿 | 测量引线电阻 | 用三线制或四线制 |
| 读数随机跳变 | UART通信错误 | 检查波特率、校验 | 加CRC校验,降低波特率 |
5.2 UART通信不稳定的处理
ADS122U04的UART接口在高速率下容易受干扰。我建议波特率不要超过115200,用9600或19200更稳。另外,UART的TX和RX线要加33Ω的串联电阻,抑制反射。如果通信距离超过10cm,最好用屏蔽线。
还有一个坑:ADS122U04的UART命令和数据的时序有要求。发送命令后要等至少50μs才能发送下一个字节,否则ADC可能来不及处理。我在代码里加了1ms的延时,虽然慢一点,但稳定。
5.3 自热误差的评估与处理
PT100的激励电流会在电阻上产生热量,导致测量值偏高。自热误差的计算公式是:ΔT = I² × R × Rth,其中Rth是PT100的热阻,空气中大约30°C/W,水中大约10°C/W。
以500μA、100Ω为例:P = (500μA)² × 100Ω = 25μW。在空气中,ΔT = 25μW × 30°C/W = 0.00075°C,完全可以忽略。但如果用1mA,P = 100μW,ΔT = 0.003°C,还是很小。所以500μA到1mA的激励电流对PT100来说自热误差可以忽略。但如果是PT10或者更小的RTD,就要小心了。
实操心得:我曾经用2mA激励一个PT100,在静止空气中测量,读数比实际高了0.05°C。后来降到500μA,偏差就消失了。所以不要盲目追求大电流来提高信噪比,自热误差是个隐性成本。
5.4 校准方法与精度验证
任何高精度测量系统都需要校准。我的校准方法是:用一颗高精度电阻(比如100.000Ω,0.01%)代替PT100,读取ADC码值,计算出系统的增益误差和偏移误差,然后在固件里做两点校准。
具体步骤:
- 接100.000Ω精密电阻,记录ADC读数R1
- 接138.505Ω精密电阻(对应100°C),记录ADC读数R2
- 计算增益系数K = (138.505 - 100) / (R2 - R1)
- 计算偏移量Offset = 100 - K × R1
- 实际测量时,温度 = K × R_measured + Offset
校准时的环境温度要稳定,最好在25°C±1°C。校准电阻的精度要至少比目标精度高一个数量级。
6. 系统集成与HVAC场景适配
6.1 HVAC系统中的安装注意事项
HVAC系统的温度传感器安装位置很讲究。测水温时,传感器要插入管道足够深,通常要求插入深度是管道直径的1/3到1/2,否则测的是管壁温度而不是水温。测风温时,传感器要避开风口和死区,放在风道截面中心位置。
传感器引线要远离变频器输出线。变频器的PWM输出含有丰富的高频谐波,如果引线和变频器电缆平行走线,干扰会直接耦合进来。我通常要求引线用双绞屏蔽线,屏蔽层单端接地(接在控制板一侧)。
6.2 与上位机的通信协议设计
PIC24FV16KA301处理完温度数据后,需要通过RS-485或者Modbus送给上位机。我用的协议是Modbus RTU,温度值用两个寄存器表示,高16位是整数部分,低16位是小数部分,或者直接用32位浮点。
Modbus的波特率通常用9600或19200,地址可配置。数据更新率不用太高,1秒一次就够了,因为温度变化本身很慢。
6.3 低功耗设计的考虑
如果系统是电池供电或者需要低功耗,ADS122U04可以设成单次转换模式,转换完自动进入休眠。PIC24也有多种低功耗模式。但工业HVAC系统通常有24V供电,功耗不是主要矛盾,所以我这个方案没有特别优化功耗。
7. 实测数据与性能评估
我在实验室里用恒温槽对这套方案做了测试。恒温槽温度稳定性±0.01°C,用标准铂电阻温度计做参考。测试结果如下:
| 设定温度 | 测量值 | 误差 |
|---|---|---|
| 0°C | 0.02°C | +0.02°C |
| 25°C | 24.98°C | -0.02°C |
| 50°C | 50.03°C | +0.03°C |
| 100°C | 99.97°C | -0.03°C |
| 150°C | 150.05°C | +0.05°C |
整体精度在±0.05°C以内,满足大多数工业和HVAC应用的要求。噪声方面,在20SPS下,短接输入端的峰峰值噪声约2μV,对应PT100约0.005°C,跟数据手册标称值吻合。
热电偶模式下,用K型热电偶在300°C测试,误差约±0.5°C,主要来自冷端补偿的误差和热电偶本身的公差。如果换用更高等级的K型热电偶(比如1级),误差可以降到±0.3°C。
8. 方案扩展与变体
这套方案不只能测温度。ADS122U04的24位分辨率和灵活的多路复用,让它也能测压力、流量、应变等低电平信号。比如把PT100换成压力传感器电桥,配置好PGA增益和激励电流,就能做高精度压力测量。
另一个扩展方向是多通道测量。ADS122U04有两组差分输入,可以同时接两个传感器,通过配置寄存器切换。如果需要更多通道,可以用外部多路复用器(比如ADG1609)扩展。
在通信方面,如果不想用UART,ADS122U04也支持SPI接口(ADS122S04),配置方式类似,只是物理层不同。SPI速度更快,适合需要高速采样的场景。
最后说一个我在实际项目中遇到的教训:有一次客户现场的温度读数总是偏高2°C,排查了半天发现是PT100的引线接错了,把三线制接成了两线制,引线电阻没有补偿。所以接线端子的标识一定要清楚,最好用不同颜色的线区分。这个坑虽然低级,但现场调试时很容易犯。