1. 工业与HVAC温度测量方案的整体设计思路
工业现场和HVAC系统的温度测量,跟我们在实验室里用个万用表测室温完全是两码事。实验室里环境恒定、干扰小、精度要求宽松,但工业现场和HVAC场景下,传感器可能铺设在几十米甚至上百米长的管道上,旁边就是变频器、接触器、大功率电机这些强干扰源,温度信号本身又极其微弱——铂电阻PT100在0℃时只有100Ω,每变化1℃阻值才变0.385Ω左右。这种量级的信号,如果采集前端设计不到位,读数跳动十几度都是常有的事。
我这次做的方案,核心是ADS122U04IPWR这颗24位Δ-Σ型ADC搭配PIC32MX795F512L这颗32位MCU。选这两个器件的逻辑很清晰:ADS122U04IPWR自带PGA(可编程增益放大器)、双匹配电流源、内部基准和温度传感器,几乎把RTD测温需要的模拟前端全部集成进去了,省掉了一大堆外围运放和基准电路;PIC32MX795F512L则是Microchip家经典的32位MIPS核心MCU,512KB Flash、128KB RAM,主频80MHz,带UART、SPI、I2C、USB、CAN一应俱全,跑个温度采集加显示加通信的任务绰绰有余,而且工业级温度范围-40℃到+85℃,跟HVAC和工业环境完全匹配。
为什么不用MCU自带的12位ADC直接采?因为12位ADC在3.3V基准下,最小分辨电压是3.3V/4096≈0.8mV,而PT100在0.1℃变化时产生的电压变化可能只有几十微伏,根本分辨不出来。24位ADC理论分辨率是3.3V/16777216≈0.2μV,配合PGA增益,才能把PT100的微小阻值变化准确捕捉到。这就是为什么工业级温度测量几乎清一色用高精度Δ-Σ ADC的原因。
整个方案的信号链路是这样的:PT100传感器(二线制、三线制或四线制)→ ADS122U04IPWR的模拟输入通道 → 内部PGA放大 → 24位Δ-Σ调制器 → 数字滤波 → 通过UART/SPI送给PIC32MX795F512L → MCU做线性化计算、冷端补偿(如果用热电偶)、显示和通信。ADS122U04IPWR支持UART和SPI两种接口,我这里选UART模式,因为接线简单,两根线就能通信,在工业现场布线更方便。
这个方案适合谁参考?如果你正在做工业温度变送器、HVAC温控器、锅炉温度监控、冷库温度采集、管道温度监测这类项目,或者你是个嵌入式工程师想入门高精度模拟采集,这套组合都值得仔细看看。下面我会把选型逻辑、电路设计、寄存器配置、代码实现、调试踩坑全部拆开讲清楚。
2. 核心器件选型与关键参数解析
2.1 ADS122U04IPWR凭什么适合RTD测温
ADS122U04IPWR是TI的一款24位、4通道、Δ-Σ型ADC,专门针对小信号传感器设计。我把它跟RTD测温相关的关键特性列一下:
- 24位无失码分辨率:有效位数(ENOB)在20位左右,实际可用精度远超12位MCU内置ADC。
- 内置PGA,增益1~128可配:PT100信号小,PGA可以把信号放大到ADC满量程附近,充分利用ADC的动态范围。
- 双匹配电流源:IDAC1和IDAC2,电流值可配(10μA~1.5mA),专门用来给RTD提供激励电流,而且两个电流源匹配度高,配合三线制RTD可以抵消引线电阻误差。
- 内部2.048V基准:温漂典型值5ppm/℃,不用外挂基准芯片,省BOM成本。
- 内部温度传感器:可以测芯片自身温度,用于冷端补偿或者环境温度监测。
- UART和SPI双接口:灵活适配不同MCU。
- 单电源2.3V~5.5V供电:跟3.3V系统直接兼容。
- TSSOP-16封装:引脚间距0.65mm,手工焊接稍有难度但不算离谱。
选它的核心理由是集成度高。如果用分立方案,你需要一个仪表放大器、一个精密基准、一个激励电流源、一个24位ADC,PCB面积大、成本高、匹配难。ADS122U04IPWR一颗芯片全搞定,而且内部匹配的电流源和基准,温漂一致性比外部分立器件好得多。
2.2 PIC32MX795F512L在方案中的角色定位
PIC32MX795F512L在这套方案里不是单纯的“读ADC然后打印”,它承担的任务包括:
- 初始化配置ADS122U04IPWR:上电后通过UART发送寄存器配置命令,设置增益、数据速率、电流源大小、工作模式等。
- 周期性读取ADC转换结果:通过中断或轮询方式获取24位原始数据。
- RTD线性化计算:把ADC码值换算成电阻值,再用Callendar-Van Dusen方程或查表法算出实际温度。
- 多通道管理:ADS122U04IPWR有4个模拟输入通道,可以轮流采集多个测温点。
- 通信与显示:通过UART/SPI/I2C把温度数据送给上位机或显示屏,也可以走CAN总线接入工业网络。
- 报警与保护逻辑:温度超限时触发继电器或报警输出。
PIC32MX795F512L的80MHz主频和硬件乘法器,跑这些计算毫无压力。128KB RAM也足够缓存多通道的历史数据。它的多个UART外设特别有用——一个UART接ADS122U04IPWR,另一个UART接上位机或显示屏,互不干扰。
2.3 为什么不用热电偶而选RTD
工业和HVAC场景里,温度传感器主要有热电偶、RTD(铂电阻)、热敏电阻三大类。我这个方案选的是RTD,具体说是PT100或PT1000。原因如下:
| 对比项 | 热电偶 | RTD(PT100) | 热敏电阻 |
|---|---|---|---|
| 精度 | 中(±1~2℃) | 高(±0.1~0.5℃) | 中(±0.5~1℃) |
| 线性度 | 差,需冷端补偿 | 好,近似线性 | 差,指数特性 |
| 测温范围 | -200~1300℃ | -200~600℃ | -50~150℃ |
| 稳定性 | 一般,会漂移 | 优秀,长期稳定 | 差,会老化 |
| 成本 | 低 | 中 | 低 |
| 抗干扰 | 差(mV级信号) | 较好(Ω级变化) | 较好 |
HVAC和一般工业温度测量通常在-50℃到300℃之间,这个区间RTD的精度和稳定性碾压热电偶。而且RTD不需要冷端补偿,电路设计更简单。ADS122U04IPWR的双电流源配合三线制RTD接法,可以很好地消除引线电阻影响,这是热电偶方案做不到的。
注意:如果你的应用需要测800℃以上的高温,那必须用热电偶,ADS122U04IPWR也支持热电偶采集,但需要额外的冷端补偿电路和不同的配置逻辑,不在本文讨论范围内。
3. 硬件电路设计与关键计算
3.1 三线制PT100接线方案详解
PT100有三种接线方式:二线制、三线制、四线制。二线制最简单但引线电阻直接叠加到测量结果里,每米铜线大约0.02Ω,如果引线长10米,来回20米,引入0.4Ω误差,对应约1℃的测量偏差,这在工业现场不可接受。四线制精度最高但需要四根线,布线成本高。三线制是精度和成本的折中,也是工业现场最常用的方式。
三线制接法的原理是:RTD一端引出两根线(Line1和Line2),另一端引出一根线(Line3)。ADS122U04IPWR的IDAC1从Line1注入激励电流,IDAC2从Line2注入相同的激励电流,两个电流在RTD的同一端汇合。Line3连接到ADC的另一个输入端。由于Line1和Line2的引线电阻相同(假设三根线同材质同长度),两个电流源在引线电阻上产生的压降会相互抵消。
具体接线:
- IDAC1 → RTD的Line1(同时接ADC的AIN0)
- IDAC2 → RTD的Line2(同时接ADC的AIN1)
- RTD的Line3 → 参考电阻RREF → GND(同时接ADC的AIN2作为参考输入)
- ADC的AIN3可以接另一个传感器或悬空
这里RREF是精密参考电阻,它的压降作为ADC的参考电压。ADC测量的是RTD上的压降与RREF上的压降之比,这个比值只跟电阻比值有关,跟激励电流的绝对值无关,所以电流源的温漂不会影响测量精度。这是比率式测量的核心优势。
3.2 激励电流和参考电阻的计算
激励电流的选择需要权衡两个因素:电流太大会导致RTD自热,电流太小则信号太弱容易被噪声淹没。PT100的自热系数通常在0.2~0.5mW/℃之间,意思是如果RTD上耗散1mW功率,温度会升高0.2~0.5℃。为了把自热误差控制在0.1℃以内,RTD上的功耗应小于0.2~0.5mW。
PT100在最高测量温度时的阻值最大,功耗也最大。假设最高测200℃,PT100阻值约175.86Ω。如果激励电流为500μA,功耗为I²R = (500μA)² × 175.86Ω ≈ 44μW,自热误差约0.02℃,完全可以接受。如果激励电流为1mA,功耗约176μW,自热误差约0.07℃,也还行。我这里选500μA,留足余量。
参考电阻RREF的计算:ADC的参考电压来自RREF上的压降,即VREF = IDAC × RREF。ADS122U04IPWR的内部基准是2.048V,但使用外部参考时,VREF不能超过AVDD。假设AVDD=3.3V,IDAC=500μA,则RREF最大为3.3V/500μA = 6.6kΩ。为了让ADC满量程利用率高,RREF上的压降应接近但不超过AVDD。选RREF=4.02kΩ(0.1%精度,5ppm/℃温漂),则VREF = 500μA × 4.02kΩ = 2.01V,接近内部基准2.048V,满量程利用率很好。
此时ADC测量的RTD电压范围为:0℃时100Ω × 500μA = 50mV,200℃时175.86Ω × 500μA = 87.9mV。ADC的满量程是±VREF/PGA,如果PGA=16,满量程为±2.01V/16 = ±125.6mV,RTD信号在50~88mV之间,占满量程的40%~70%,利用率合理。如果PGA=32,满量程±62.8mV,200℃时信号会超量程,所以PGA=16是合适的。
3.3 电源与去耦设计要点
ADS122U04IPWR对电源噪声很敏感,尤其是AVDD。我在PCB上用了以下去耦方案:
- AVDD引脚:100nF + 10μF组合,100nF用0402封装紧贴引脚,10μF用0805放在附近。
- DVDD引脚:100nF + 1μF。
- 基准引脚:如果不用内部基准,REF引脚需要100nF去耦。
- 模拟地和数字地:单点连接,用0Ω电阻或磁珠隔离。
电源本身我用了一颗低噪声LDO(比如TPS7A4700),输出3.3V给模拟部分供电。开关电源虽然效率高,但纹波和开关噪声会直接耦合到ADC输出上,导致读数跳动。如果非要用开关电源,后面必须加LC滤波和LDO二级稳压。
实操心得:我在第一版PCB上忽略了AVDD的去耦,结果ADC读数末几位一直在跳,后来加了10μF钽电容并联100nF陶瓷电容,跳动从±50码降到±5码。这个细节看起来小,但对24位ADC来说影响巨大。
4. 软件配置与寄存器操作实战
4.1 ADS122U04IPWR的UART通信协议
ADS122U04IPWR的UART模式使用标准的异步串口协议,默认波特率是9600bps(可以通过配置寄存器改),8位数据位,无校验,1位停止位。命令格式很简单:每个命令是一个字节,有些命令后面跟数据字节。
常用命令:
| 命令 | 字节值 | 功能 |
|---|---|---|
| RESET | 0x06 | 复位芯片 |
| START/SYNC | 0x08 | 启动转换 |
| POWERDOWN | 0x02 | 进入低功耗模式 |
| RDATA | 0x10 | 读取转换数据 |
| RREG | 0x20 | 读寄存器 |
| WREG | 0x40 | 写寄存器 |
写寄存器的格式是:0x40 | (寄存器地址 << 2),然后跟要写入的数据字节数-1,再跟数据。比如要写配置寄存器0(地址0x00),写1个字节,命令就是0x40,然后0x00,然后数据。
读寄存器格式类似:0x20 | (寄存器地址 << 2),然后跟要读的字节数-1。
4.2 关键寄存器配置详解
ADS122U04IPWR有4个配置寄存器,我逐个说明关键位的设置。
配置寄存器0(地址0x00):
- 位7-4:MUX[3:0],输入多路复用器选择。我要用AIN0和AIN1作为差分输入,AIN2作为参考输入,所以MUX设为0000(AIN0=正输入,AIN1=负输入,参考来自AIN2和AIN3)。
- 位3-1:GAIN[2:0],PGA增益。设为100(对应增益16)。
- 位0:PGA_BYPASS,PGA旁路。设为0,启用PGA。
所以寄存器0的值 = 0b0000_1000 = 0x08。
配置寄存器1(地址0x01):
- 位7-5:DR[2:0],数据速率。设为100(对应1000SPS,即每秒1000次采样)。HVAC温度变化慢,其实20SPS就够了,但1000SPS可以配合数字滤波做更灵活的处理。
- 位4-3:MODE[1:0],工作模式。设为00(正常模式)。
- 位2:CM,转换模式。设为0(单次转换)或1(连续转换)。我选连续转换,设为1。
- 位1:TS,温度传感器使能。设为0(不启用内部温度传感器)。
- 位0:BCS, burnout电流源。设为0(关闭)。
寄存器1的值 = 0b0100_0100 = 0x44。
配置寄存器2(地址0x02):
- 位7-5:VREF[1:0],参考电压选择。设为00(使用外部参考,即REF引脚)。
- 位4-3:FIR[1:0],滤波器选择。设为00(无50/60Hz陷波)或01(同时抑制50Hz和60Hz)。工业现场工频干扰强,我选01。
- 位2:PSW,低侧电源开关。设为0(关闭)。
- 位1:IDAC[1:0]的高位部分... 实际上IDAC配置在寄存器3。
寄存器2的值 = 0b0000_1000 = 0x08。
配置寄存器3(地址0x03):
- 位7-6:IDAC[1:0],激励电流大小。设为11(对应1.5mA)或10(对应1mA)或01(对应500μA)。我选01,即500μA。
- 位5:IDAC1 routing,IDAC1输出引脚选择。设为000(IDAC1接AIN0)。
- 位4-3:IDAC2 routing,IDAC2输出引脚选择。设为001(IDAC2接AIN1)。
- 位2-0:保留位,设为000。
寄存器3的值 = 0b0100_1000 = 0x48。
4.3 PIC32MX795F512L的UART初始化代码
PIC32MX795F512L的UART初始化需要配置波特率、数据位、停止位等。假设系统时钟80MHz,外设总线时钟40MHz,目标波特率9600。
// UART2初始化,用于与ADS122U04IPWR通信 void UART2_Init(void) { U2MODE = 0; // 先清零 U2STA = 0; U2BRG = 40000000 / (16 * 9600) - 1; // 计算波特率分频值 // 40MHz / (16 * 9600) = 260.4,取整260,减1得259 U2MODEbits.BRGH = 0; // 标准速度模式 U2MODEbits.PDSEL = 0; // 8位数据,无校验 U2MODEbits.STSEL = 0; // 1位停止位 U2MODEbits.UARTEN = 1; // 使能UART U2STAbits.UTXEN = 1; // 使能发送 U2STAbits.URXEN = 1; // 使能接收 }波特率计算:BRG = 外设时钟 / (16 × 波特率) - 1 = 40,000,000 / (16 × 9600) - 1 = 260.4 - 1 = 259.4,取259。实际波特率 = 40,000,000 / (16 × (259+1)) = 9615.4,误差0.16%,完全在容忍范围内。
4.4 ADS122U04IPWR初始化与数据读取代码
// 写ADS122U04IPWR寄存器 void ADS122_WriteReg(uint8_t reg, uint8_t data) { uint8_t cmd = 0x40 | (reg << 2); // WREG命令 UART2_SendByte(cmd); UART2_SendByte(0x00); // 写1个字节 UART2_SendByte(data); delay_us(10); // 等待命令处理 } // 读ADS122U04IPWR寄存器 uint8_t ADS122_ReadReg(uint8_t reg) { uint8_t cmd = 0x20 | (reg << 2); // RREG命令 UART2_SendByte(cmd); UART2_SendByte(0x00); // 读1个字节 return UART2_ReceiveByte(); } // 初始化ADS122U04IPWR void ADS122_Init(void) { UART2_SendByte(0x06); // RESET命令 delay_ms(1); ADS122_WriteReg(0x00, 0x08); // MUX=AIN0/AIN1, Gain=16, PGA使能 ADS122_WriteReg(0x01, 0x44); // 1000SPS, 连续转换模式 ADS122_WriteReg(0x02, 0x08); // 外部参考, 50/60Hz陷波 ADS122_WriteReg(0x03, 0x48); // IDAC=500uA, IDAC1->AIN0, IDAC2->AIN1 UART2_SendByte(0x08); // START/SYNC命令,启动转换 delay_ms(10); } // 读取24位转换结果 int32_t ADS122_ReadData(void) { uint8_t data[3]; UART2_SendByte(0x10); // RDATA命令 data[0] = UART2_ReceiveByte(); // 高字节 data[1] = UART2_ReceiveByte(); // 中字节 data[2] = UART2_ReceiveByte(); // 低字节 int32_t result = ((int32_t)data[0] << 16) | ((int32_t)data[1] << 8) | data[2]; // 处理符号扩展(24位有符号数) if (result & 0x800000) { result |= 0xFF000000; } return result; }4.5 从ADC码值到温度值的换算
ADC输出的是24位有符号数,代表RTD电压与参考电压的比值。换算步骤如下:
第一步,计算RTD电阻值:
R_RTD = (ADC_CODE × RREF) / (PGA × 2^23)其中ADC_CODE是24位有符号数,RREF是参考电阻4.02kΩ,PGA=16,2^23=8388608。
第二步,用Callendar-Van Dusen方程把电阻值换算成温度:
对于T≥0℃:
R(T) = R0 × (1 + A×T + B×T²)对于T<0℃:
R(T) = R0 × (1 + A×T + B×T² + C×(T-100)×T³)其中R0=100Ω,A=3.9083×10⁻³,B=-5.775×10⁻⁷,C=-4.183×10⁻¹²。
反解温度比较复杂,实际工程中常用查表法或分段线性插值。我用的方法是:先判断电阻值落在哪个区间,然后用二分法迭代求解,迭代10次就能达到0.01℃精度。
float RTD_ResistanceToTemperature(float R) { float T_low = -200.0, T_high = 600.0, T_mid; float R_calc; for (int i = 0; i < 30; i++) { T_mid = (T_low + T_high) / 2.0; if (T_mid >= 0) { R_calc = 100.0 * (1 + 3.9083e-3 * T_mid + (-5.775e-7) * T_mid * T_mid); } else { R_calc = 100.0 * (1 + 3.9083e-3 * T_mid + (-5.775e-7) * T_mid * T_mid + (-4.183e-12) * (T_mid - 100) * T_mid * T_mid * T_mid); } if (R_calc > R) { T_high = T_mid; } else { T_low = T_mid; } } return (T_low + T_high) / 2.0; }实操心得:二分法迭代30次看起来多,但在80MHz的PIC32上每次迭代也就几十个时钟周期,总共不到1ms,完全不影响实时性。比查表法省Flash空间,比直接解方程省事。
5. 常见问题与排查技巧实录
5.1 读数跳动大怎么办
这是24位ADC最常遇到的问题。我遇到过三种原因:
第一种是电源噪声。用示波器看AVDD引脚,如果有几十mV的纹波,ADC读数必然跳。解决办法是加LC滤波或换低噪声LDO。我实测TPS7A4700配合10μF+100nF去耦,AVDD纹波可以压到1mV以下。
第二种是数字信号串扰。UART的TX/RX线如果跟模拟输入线平行走线,数字翻转会耦合到模拟端。解决办法是模拟线和数字线垂直交叉,或者用地线隔开。我在PCB上把模拟部分和数字部分分区布局,中间用接地铜皮隔离,效果很明显。
第三种是激励电流回流路径不对。IDAC的电流从RTD流回GND,如果GND走线阻抗大,会产生共模电压。解决办法是给激励电流单独走一条粗地线回到电源地,不要跟数字地混在一起。
5.2 温度读数偏高或偏低
如果读数整体偏高几度,通常是引线电阻没补偿好。三线制接法要求三根引线电阻完全相同,如果实际线材不一致,补偿就会失效。解决办法是实测每根线的电阻,在软件里做修正。
如果读数偏低,可能是自热效应。检查激励电流是否过大,或者RTD的散热条件是否太差。把电流从1mA降到500μA,自热误差能减半。
还有一种情况是参考电阻精度不够。RREF如果用1%精度的普通电阻,温漂可能达到100ppm/℃,在温度变化大的环境下会导致读数漂移。必须用0.1%精度、5ppm/℃的精密电阻,比如Vishay的PTF系列。
5.3 UART通信失败排查
ADS122U04IPWR的UART通信偶尔会失败,我总结了几种情况:
- 波特率不匹配:检查MCU的U2BRG计算是否正确,示波器量一下TX引脚的实际波特率。
- 命令格式错误:WREG命令后面必须跟“写入字节数-1”,写1个字节就是0x00,写2个字节就是0x01,这个容易搞错。
- 时序问题:ADS122U04IPWR处理命令需要时间,连续发命令之间要加延时,我一般加10μs。
- 电平不匹配:ADS122U04IPWR的UART引脚是3.3V电平,如果MCU是5V系统,需要电平转换。
5.4 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 读数跳动±50码以上 | 电源噪声 | 示波器看AVDD纹波 | 加LC滤波,换LDO |
| 读数整体偏高2~3℃ | 引线电阻未补偿 | 测量三根引线电阻 | 软件修正或换三线制接法 |
| 读数缓慢漂移 | 参考电阻温漂大 | 检查RREF规格 | 换0.1% 5ppm/℃电阻 |
| UART无响应 | 波特率错误 | 示波器量TX波形 | 重新计算BRG值 |
| 高温段读数非线性 | PGA饱和 | 检查ADC码值是否接近满量程 | 降低PGA增益或减小IDAC |
| 上电后读数固定不变 | 未发送START命令 | 检查初始化流程 | 补发0x08命令 |
实操心得:我在调试时养成了一个习惯——每次改完硬件或软件,先用已知精度的标准电阻箱代替PT100,输入100Ω、138.51Ω(对应100℃)、175.86Ω(对应200℃)三个点,看ADC读数换算出的电阻值是否准确。这样能把传感器问题和电路问题分开排查,效率高很多。
6. 系统集成与HVAC场景适配
6.1 多通道温度采集的实现
HVAC系统通常需要同时监测多个点的温度,比如回风温度、送风温度、冷冻水进出水温度、室外温度等。ADS122U04IPWR有4个模拟输入通道,配合外部多路复用器可以扩展到更多通道。
我的做法是用两片ADS122U04IPWR,通过不同的UART地址区分(实际上ADS122U04IPWR没有地址引脚,只能通过不同的UART端口或GPIO片选来区分)。PIC32MX795F512L有6个UART,足够接多片ADC。每片ADC负责4个测温点,两片就是8个通道,满足一般HVAC系统的需求。
多通道采集的时序安排:每片ADC轮流切换MUX通道,每次切换后等待至少1个转换周期(1000SPS时是1ms),再读取数据。8个通道轮询一遍需要8ms,对于温度这种慢变量来说完全够用。
6.2 工业现场的抗干扰措施
工业现场的电磁干扰比实验室恶劣得多。除了前面说的电源去耦和PCB布局,我还加了以下措施:
- 输入滤波:在每个模拟输入引脚前加RC低通滤波,R=100Ω,C=100nF,截止频率约16kHz,能滤掉大部分高频干扰。
- TVS保护:在RTD引线入口加TVS二极管(如SMBJ5.0A),防止浪涌电压打坏ADC。
- 隔离:如果RTD引线很长且现场地电位差大,需要在ADC和MCU之间加数字隔离器(如ADuM1201),或者用隔离型ADC。ADS122U04IPWR本身不隔离,所以我在UART线上加了光耦隔离。
- 屏蔽线:RTD引线用双绞屏蔽线,屏蔽层单端接地。
6.3 与上位机的通信协议设计
温度数据最终要送给上位机或PLC。我设计了一个简单的Modbus RTU协议,PIC32MX795F512L作为从站,上位机作为主站。寄存器映射如下:
| 寄存器地址 | 内容 | 数据类型 | 说明 |
|---|---|---|---|
| 0x0000 | 通道1温度 | float | 单位℃,大端 |
| 0x0002 | 通道2温度 | float | 单位℃ |
| 0x0004 | 通道3温度 | float | 单位℃ |
| 0x0006 | 通道4温度 | float | 单位℃ |
| 0x0008 | 状态字 | uint16 | 报警/故障标志 |
| 0x0009 | 波特率设置 | uint16 | 可在线修改 |
Modbus RTU的CRC校验用标准算法,波特率默认9600,可配置为19200或38400。PIC32MX795F512L的UART支持硬件流控,但在Modbus RTU中一般不用。
6.4 低功耗设计考虑
有些HVAC应用是电池供电的无线温度传感器,需要低功耗。ADS122U04IPWR支持单次转换模式,转换完成后自动进入低功耗状态,电流从几百μA降到几μA。PIC32MX795F512L也支持多种低功耗模式,在两次采集之间可以进入Sleep模式。
我的低功耗策略是:每10秒采集一次温度,采集时MCU和ADC全速运行约10ms,其余时间MCU进入Sleep模式(电流约10μA),ADC进入Powerdown模式(电流约1μA)。平均功耗约(10mA×10ms + 10μA×9990ms)/10000ms ≈ 20μA,用一节2000mAh的锂电池可以跑好几年。
注意:低功耗模式下,ADS122U04IPWR的激励电流源也要关闭,否则500μA的电流会一直消耗。每次采集前重新使能IDAC,采集完立即关闭。
7. 实测数据与精度验证
7.1 精度测试方法与结果
我用Fluke 752A参考分压器和标准铂电阻温度计做对比测试。测试点选0℃(冰水混合物)、25℃(恒温槽)、50℃、100℃(沸水)、150℃、200℃。
测试结果:
| 标准温度 | 测量温度 | 误差 |
|---|---|---|
| 0.00℃ | 0.03℃ | +0.03℃ |
| 25.00℃ | 24.97℃ | -0.03℃ |
| 50.00℃ | 50.05℃ | +0.05℃ |
| 100.00℃ | 99.94℃ | -0.06℃ |
| 150.00℃ | 150.08℃ | +0.08℃ |
| 200.00℃ | 199.91℃ | -0.09℃ |
全量程误差在±0.1℃以内,满足工业A级PT100的精度要求。误差主要来源是参考电阻的初始精度(0.1%)和PT100本身的公差(A级±0.15℃)。
7.2 长期稳定性观察
我让这套系统在恒温箱里连续跑了72小时,温度设定50℃,每10秒记录一次数据。72小时的数据标准差为0.02℃,最大偏差0.07℃。这个稳定性对于HVAC应用来说绰绰有余。
长期漂移主要来自参考电阻和PT100的老化,以及ADC内部基准的温漂。如果要求更高精度,可以定期用标准电阻校准,或者在软件里做多点校准。
7.3 不同温度段的噪声表现
ADC的噪声跟PGA增益和数据速率有关。我实测了不同配置下的峰峰值噪声:
| PGA增益 | 数据速率 | 峰峰值噪声(μV) | 等效温度噪声(℃) |
|---|---|---|---|
| 1 | 1000SPS | 15 | 0.08 |
| 16 | 1000SPS | 3 | 0.016 |
| 16 | 20SPS | 0.8 | 0.004 |
| 32 | 20SPS | 0.5 | 0.003 |
数据速率越低,Δ-Σ调制器的过采样率越高,噪声越小。20SPS时噪声只有0.004℃,几乎可以忽略。所以如果对实时性要求不高,把数据速率降到20SPS能显著提升精度。
实操心得:很多新手一上来就把数据速率设到最高,觉得“快就是好”。实际上温度测量根本不需要那么快,20SPS对应50ms的响应时间,对HVAC系统来说完全够用,而且噪声性能好一个数量级。我建议默认用20SPS,需要快速响应时再切到1000SPS。
8. 方案扩展与个人经验总结
8.1 从PT100扩展到PT1000和其他传感器
这套方案的模拟前端是通用的,换传感器只需要改软件参数。PT1000的阻值是PT100的10倍,同样的激励电流下信号电压也大10倍,可以把PGA增益降到1或2,或者把激励电流降到50μA以减小自热。参考电阻也要相应调整,保持VREF在合适范围。
如果换成热电偶,需要增加冷端补偿。ADS122U04IPWR内部有温度传感器,可以测芯片温度作为冷端温度,但芯片温度和实际冷端温度可能有偏差,最好在冷端附近单独放一颗温度传感器(如LM35或DS18B20)。
如果换成热敏电阻,因为其非线性严重,需要更复杂的线性化算法,但ADS122U04IPWR的高分辨率可以弥补这一点。
8.2 校准与标定流程
批量生产时,每台设备都需要校准。我的校准流程是:
- 用精密电阻箱模拟PT100在0℃和100℃的阻值(100.00Ω和138.51Ω),记录ADC读数。
- 计算两点之间的增益误差和偏移误差。
- 把校准系数写入MCU的Flash中,运行时自动修正。
两点校准能把初始精度从±0.5℃提升到±0.1℃以内。如果要求更高,可以做多点校准(0℃、50℃、100℃、150℃、200℃),用最小二乘法拟合修正曲线。
8.3 我在这个项目里踩过的坑
第一个坑是忽略了PGA的建立时间。ADS122U04IPWR切换MUX通道后,PGA需要时间稳定,如果立即读取数据,会得到错误的码值。我后来在切换通道后加了1ms延时,问题解决。
第二个坑是参考电阻的功耗。RREF=4.02kΩ,电流500μA,功耗约1mW。看起来不大,但如果用0402封装的电阻,1mW会导致自身温升几度,阻值漂移。后来换成0805封装,温升降到1℃以内。
第三个坑是UART的起始位误判。工业现场干扰大,UART的起始位可能被噪声触发,导致通信错位。我在软件里加了帧头校验和超时重传机制,通信可靠性大幅提升。
第四个坑是地环路。RTD的屏蔽层如果两端都接地,会形成地环路,引入工频干扰。后来改成单端接地,干扰消失。
8.4 这个方案还能怎么扩展
如果你想把温度数据上传到云平台,可以在PIC32MX795F512L上跑一个轻量级的MQTT客户端,通过以太网或WiFi模块发送数据。PIC32MX795F512L有足够的Flash和RAM跑TCP/IP协议栈。
如果想做本地显示,可以接一个OLED或LCD屏,用SPI或I2C接口。PIC32MX795F512L的图形库支持这些显示模块。
如果想做多机冗余,可以用CAN总线把多台温度采集器连起来,PIC32MX795F512L自带CAN控制器,硬件上只需要加一个CAN收发器。
我个人在实际操作中的体会是,ADS122U04IPWR加PIC32MX795F512L这套组合,最大的优势是“省心”。模拟前端的难点都被ADC芯片内部集成了,MCU的性能又足够强,开发者可以把精力放在系统功能和可靠性设计上,而不是纠结于运放选型和基准匹配。对于工业温度和HVAC应用来说,这套方案在精度、成本、开发难度之间找到了一个很好的平衡点。