1. 工业与HVAC温度测量项目的整体设计思路
1.1 为什么选这两个核心器件
工业现场和HVAC系统的温度测量,跟实验室里拿个万用表测室温完全是两码事。前者面对的是长线缆、强电磁干扰、宽温区、多通道轮询、还要长期稳定运行。我做过几个HVAC机组控制器和工业烘箱温控板的项目,踩过的坑基本都集中在信号链前端和地环路处理上。这次分享的方案,核心是ADS122U04IPWR这颗24位ΔΣ ADC搭配PIC32MX795F512L这颗32位MCU,构成一套四通道差分温度采集系统,适配PT100、PT1000、热电偶以及NTC等多种传感器。
先说ADS122U04IPWR。它是TI的一款低功耗、24位、四通道差分输入的ΔΣ型ADC,内置PGA(可编程增益放大器)、基准电压源、激励电流源(IDAC),还有温度传感器。这几个特性凑在一起,对温度测量来说几乎是量身定做:PGA能把PT100那种毫伏级的小信号放大到ADC满量程附近,IDAC可以直接给RTD提供恒流激励,内部基准省掉外部基准芯片,四通道差分输入又能同时接多路传感器。封装是TSSOP-16,工业级温度范围-40到125℃,焊接和布板都不算难。
再说PIC32MX795F512L。这是Microchip PIC32MX系列里资源比较丰富的一颗,MIPS32 M4K内核,80MHz主频,512KB Flash,128KB RAM,带USB、CAN、以太网、多个SPI/I2C/UART。选它做温度采集主控,主要看中三点:一是SPI接口速率够高,能跑ADC的连续转换模式;二是CAN和以太网外设方便接入楼宇自控网络或工业总线;三是RAM够大,可以开多通道缓冲和滤波算法,不用外挂存储。对于HVAC这种需要多机组联网、又要本地做温度补偿和PID控制的场景,这颗MCU的性价比很合适。
1.2 系统架构怎么搭
整套方案的信号链是这样走的:传感器(PT100/热电偶/NTC)→ 模拟前端(滤波、保护)→ ADS122U04IPWR(激励+放大+ADC)→ SPI → PIC32MX795F512L(采集、滤波、换算、控制)→ 输出(CAN/以太网/继电器/PWM)。
这里有个关键设计决策:激励和采集要分开考虑。RTD需要恒流激励,热电偶需要冷端补偿,NTC需要分压或恒流。ADS122U04IPWR的IDAC可以配置成两路电流源,分别给两路RTD供电,但四通道同时接不同传感器时,激励方式就得灵活切换。我的做法是把四通道分成两组:一组走RTD恒流模式,一组走热电偶/电压模式,通过模拟开关或直接换接线来适配。如果项目要求四路全RTD,那就用两路IDAC轮流激励,配合ADC的通道轮询,也能做,只是采样率会降下来。
MCU这边,SPI配置成主机模式,时钟先跑1MHz,稳定后再往上提到4MHz甚至8MHz。ADS122U04IPWR支持最高2MHz的SCLK,但实际布线上如果走线长、干扰大,建议先降速跑通再提速。中断方面,用ADC的DRDY(数据就绪)引脚接MCU外部中断,每次转换完成触发一次SPI读取,这样比轮询效率高得多,也方便做多通道调度。
1.3 这个方案解决了哪些实际问题
工业HVAC温度测量的痛点,我归纳下来主要是四个:小信号精度、通道隔离、长期漂移、现场干扰。
小信号精度方面,PT100在0℃时是100Ω,激励电流1mA,满量程也就几十毫伏到几百毫伏。普通12位ADC根本不够看,ADS122U04IPWR的24位分辨率加上PGA=128,等效输入分辨率能到微伏级,换算成温度就是0.01℃级别,完全够工业A级要求。
通道隔离方面,四通道差分输入天然支持两线制、三线制、四线制RTD接法。三线制能抵消引线电阻,四线制精度最高但接线多。HVAC现场一般用三线制PT1000,引线电阻影响小,接线也方便。
长期漂移方面,ADS122U04IPWR的内部基准温漂是5ppm/℃典型值,配合MCU做定期零点校准和增益校准,年漂移可以控制在0.1℃以内。MCU这边可以存校准系数到Flash,上电自检时读回来。
现场干扰方面,差分输入本身抗共模干扰,再加上RC滤波和TVS保护,长线缆引入的工频干扰和浪涌基本能压住。SPI走线尽量短,必要时加隔离芯片,这个后面实操部分细说。
2. 核心细节解析与实操要点
2.1 ADS122U04IPWR的寄存器配置与关键参数
ADS122U04IPWR有四个配置寄存器(0x00到0x03),上电默认是外部基准、PGA=1、连续转换关闭。要让它跑起来,至少得配这几项:
- 输入多路复用器(MUX):选择四路差分输入中的哪一路,或者内部温度传感器、AVDD/4等。
- 增益(PGA):1到128,RTD小信号一般用32或64,热电偶用128。
- 数据速率:5SPS到2000SPS,温度测量用20SPS或45SPS就够,兼顾速度和50Hz/60Hz抑制。
- 基准选择:内部2.048V基准或外部基准,内部基准省事但精度略低,要求高时用外部REF5025。
- IDAC电流:10μA到1.5mA,PT100用1mA,PT1000用0.5mA或1mA,NTC用10μA到100μA。
- 转换模式:单次或连续,连续模式配合DRDY中断最省心。
配置顺序很重要:先写配置寄存器,再发START/SYNC命令启动转换。如果中途改MUX或PGA,最好先发POWERDOWN再重新配置,避免切换瞬间的毛刺影响结果。
注意:ADS122U04IPWR的配置寄存器是双缓冲的,写完后需要发START/SYNC才生效。我一开始没注意,改了MUX发现数据没变,查了半天手册才发现这个问题。
2.2 PIC32MX795F512L的SPI与中断配置
PIC32MX795F512L的SPI模块配置起来比较灵活,但坑也不少。关键寄存器是SPIxCON、SPIxBRG、SPIxSTAT。主机模式下,SPIxCON的MSTEN位要置1,CKP和CKE决定时钟极性和相位。ADS122U04IPWR要求SCLK空闲低、数据在上升沿采样,所以CKP=0、CKE=1(具体看手册时序图,不同模式可能不同,实测确认最稳)。
SPI时钟计算:FSCK = FPB / (2 * (SPIxBRG + 1))。假设外设总线时钟80MHz,要跑4MHz,SPIxBRG = 80M / (2 * 4M) - 1 = 9。实际写9,实测SCLK约4MHz,没问题。
中断方面,DRDY接MCU的INT0或某个外部中断引脚,下降沿触发。中断服务程序里拉低CS,读3字节数据,再拉高CS。注意SPI读取要等ADC的DRDY变低后再操作,否则读出来是旧数据或无效数据。
// PIC32MX795F512L SPI初始化示例(简化) SPI1CON = 0; SPI1CONbits.MSTEN = 1; // 主机模式 SPI1CONbits.CKP = 0; // 空闲低 SPI1CONbits.CKE = 1; // 上升沿采样 SPI1CONbits.SMP = 0; // 中间采样 SPI1BRG = 9; // 约4MHz SPI1CONbits.ON = 1; // 使能SPI2.3 传感器接口与模拟前端设计
PT100三线制接法:两根引线接RTD两端,第三根从RTD一端引到ADC的另一个输入,用来抵消引线电阻。ADS122U04IPWR的IDAC从AIN0输出,经过RTD回到AIN1,REF+和REF-接在RTD两端做比例测量。这样激励电流的漂移会被比例测量抵消,精度更高。
热电偶接法:热电偶输出直接进ADC差分输入,PGA=128,但必须做冷端补偿。冷端补偿可以用ADS122U04IPWR的内部温度传感器,或者外挂一颗DS18B20测接线端子温度。内部温度传感器精度一般(±0.5℃),要求高时用外部。
NTC接法:NTC和精密电阻分压,或者用IDAC恒流激励。分压法简单但非线性,恒流法线性好但需要额外电阻。我一般用10μA IDAC激励10k NTC,输出电压在ADC范围内,软件做Steinhart-Hart换算。
模拟前端保护:每个输入串100Ω电阻,并联0.1μF电容到地,再并TVS管(如SMBJ5.0A)。100Ω电阻和0.1μF构成低通滤波,截止频率约16kHz,能滤掉大部分高频干扰。TVS管钳位浪涌,保护ADC输入不超绝对最大额定值。
提示:ADS122U04IPWR的模拟输入绝对最大额定值是AVSS-0.3V到AVDD+0.3V,工业现场浪涌很容易超,TVS管不能省。我见过没加TVS的板子,雷击后ADC直接报废。
2.4 电源与地处理
ADS122U04IPWR的AVDD和DVDD可以分开供电,AVDD用3.3V或5V,DVDD用3.3V跟MCU一致。模拟地和数字地单点连接,一般在ADC下方用0Ω电阻或磁珠连接。基准电压如果不用内部基准,外部REF5025的供电也要干净,加LC滤波。
MCU这边,PIC32MX795F512L的VDD和VDDCORE要分别加去耦电容,100nF和10μF并联,尽量靠近引脚。晶振走线要短,包地处理。如果板子上有继电器或PWM驱动,强电和弱电要分区,地平面分割清楚。
3. 实操过程与核心环节实现
3.1 硬件搭建与上电检查
第一步是焊接和上电检查。ADS122U04IPWR是TSSOP-16,引脚间距0.65mm,手工焊接需要细烙铁头和放大镜。焊完后先用万用表测电源引脚对地电阻,确认没有短路。上电后测AVDD和DVDD电压,应该是3.3V或5V,偏差不超过5%。
然后测SPI通信。MCU先发一个读寄存器命令(0x20 | 寄存器地址),读回默认值。ADS122U04IPWR的配置寄存器0默认值是0x00,寄存器1默认值是0x00,寄存器2默认值是0x00,寄存器3默认值是0x00。如果读回全0或全1,检查SPI模式、CS极性、MISO/MOSI是否接反。
我遇到过CS一直拉低导致SPI无法通信的情况,后来发现是GPIO初始化时忘了把CS置高。这个坑很典型,建议上电后先把所有SPI相关GPIO设成安全状态,再初始化SPI模块。
3.2 寄存器配置与转换启动
配置流程我整理成一个函数,按顺序写四个寄存器,然后发START/SYNC。以PT100三线制、PGA=32、1mA IDAC、20SPS、内部基准为例:
// ADS122U04IPWR配置示例(简化) // 寄存器0:MUX=AIN0/AIN1,PGA=32,PGA使能 write_reg(0x00, 0x08 | 0x04); // MUX和PGA配置 // 寄存器1:数据速率20SPS,连续转换 write_reg(0x01, 0x04 | 0x00); // 寄存器2:内部基准,IDAC=1mA,IDAC1接AIN0 write_reg(0x02, 0x10 | 0x04 | 0x01); // 寄存器3:IDAC2关闭,DRDY专用引脚 write_reg(0x03, 0x00); // 启动连续转换 send_command(0x08); // START/SYNC写完后等DRDY变低,读3字节数据。24位数据是二进制补码,正负满量程对应±2^23-1。换算成电压:V = (code / 2^23) * VREF / PGA。VREF=2.048V,PGA=32,所以LSB = 2.048 / 32 / 2^23 ≈ 7.6nV。这个分辨率对PT100来说绰绰有余。
3.3 温度换算与校准
PT100的电阻-温度关系用Callendar-Van Dusen方程:
- 0℃到850℃:R(T) = R0 * (1 + AT + BT^2)
- -200℃到0℃:R(T) = R0 * (1 + AT + BT^2 + C*(T-100)*T^3)
其中R0=100Ω,A=3.9083e-3,B=-5.775e-7,C=-4.183e-12。反解T可以用多项式拟合或查表插值。我一般用分段线性插值,每10℃一个点,精度0.01℃足够。
校准分两步:零点校准和增益校准。零点校准用精密电阻模拟0℃(100Ω),增益校准用250Ω模拟约400℃。校准系数存Flash,上电读回。ADS122U04IPWR的内部基准有初始误差和温漂,要求高时用外部基准,或者用MCU的内部温度传感器做温度补偿。
实操心得:校准电阻要用0.01%精度的,普通1%电阻校出来的系数不准。我一开始用1%电阻,结果批量生产时每块板子偏差都不一样,后来换了0.01%电阻,一致性好了很多。
3.4 多通道轮询与滤波
四通道轮询时,每次切换MUX后要等至少一个转换周期再读数据,否则读到的是上一通道的残留。我的做法是:切换MUX → 发START/SYNC → 等DRDY → 读数据 → 丢弃第一个数据 → 再等DRDY → 读第二个数据作为有效值。这样能避开切换瞬态。
滤波方面,硬件RC滤波已经做了,软件再做滑动平均或中值滤波。滑动平均窗口取8或16,中值滤波取5点。如果现场工频干扰严重,可以在软件里做50Hz陷波,或者把ADC数据速率设成20SPS(内置50Hz/60Hz抑制)。
// 滑动平均滤波示例 #define FILTER_LEN 8 int32_t filter_buf[FILTER_LEN]; int32_t filter_sum = 0; int filter_idx = 0; int32_t filter_update(int32_t new_val) { filter_sum -= filter_buf[filter_idx]; filter_buf[filter_idx] = new_val; filter_sum += new_val; filter_idx = (filter_idx + 1) % FILTER_LEN; return filter_sum / FILTER_LEN; }3.5 通信与输出
PIC32MX795F512L的CAN模块可以配置成500kbps或250kbps,接入楼宇自控网络。以太网模块可以跑Modbus TCP或MQTT,把温度数据上传到上位机。如果只是本地控制,用UART输出到触摸屏也行。
CAN配置的关键是波特率计算:BRP = FPB / (2 * 波特率 * TQ总数)。假设FPB=80MHz,波特率500kbps,TQ总数=16,BRP=80M/(2500k16)=5。实际写5,实测波形没问题。
输出数据格式我一般用定点数,温度乘以100存成int16,比如25.34℃存成2534。这样传输效率高,上位机解析也简单。
4. 常见问题与排查技巧实录
4.1 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方法 |
|---|---|---|---|
| SPI读回全0或全1 | CS极性错误、SPI模式不对 | 示波器看SCLK、MOSI、CS波形 | 检查CKP/CKE,确认CS上电高 |
| 温度值跳变严重 | 滤波不足、地环路干扰 | 短接输入端看噪声 | 加RC滤波、单点接地、软件滤波 |
| 温度值恒定不变 | MUX配置错误、DRDY未触发 | 读寄存器确认配置 | 重新配置MUX,检查DRDY中断 |
| 校准后仍有偏差 | 基准漂移、引线电阻 | 测基准电压、测引线电阻 | 用外部基准、三线制补偿 |
| 长时间运行后漂移 | 温漂、器件老化 | 定期校准、记录漂移曲线 | 选低温漂器件、软件补偿 |
| 多通道串扰 | 切换后未等稳定 | 切换后丢弃第一个数据 | 增加切换延时、丢弃首样本 |
| 电源纹波大 | 去耦不足、LDO不稳 | 示波器看AVDD纹波 | 加LC滤波、换低噪声LDO |
4.2 独家避坑技巧
坑一:DRDY中断丢失。PIC32MX795F512L的外部中断如果没清标志位,会反复进中断。我一开始忘了在ISR里清IFS0bits.INT0IF,结果程序卡死在中断里。后来养成习惯,ISR第一件事就是清标志。
坑二:SPI时钟太快导致数据错位。ADS122U04IPWR标称支持2MHz SCLK,但实际布线上如果走线超过10cm,1MHz以上就容易出错。我的做法是先跑1MHz,稳定后再逐步提到4MHz,每提一次都测误码率。
坑三:IDAC电流源接错引脚。ADS122U04IPWR的IDAC1和IDAC2可以路由到不同AIN引脚,配置寄存器2的IDAC1位域决定路由。我一开始没看手册,IDAC1默认路由到AIN0,但我RTD接在AIN2/AIN3,结果没电流。后来改成IDAC1路由到AIN2才正常。
坑四:内部温度传感器精度不够。ADS122U04IPWR的内部温度传感器精度±0.5℃,做冷端补偿时误差会传到热电偶读数上。要求高时用外部DS18B20或PT1000测冷端,精度能到±0.1℃。
坑五:Flash校准系数被擦除。PIC32MX795F512L的Flash写操作要先擦除再写,如果校准系数存在同一页,擦除时会一起丢掉。我的做法是把校准系数存在单独的Flash页,写之前先读出来备份,擦除后再写回。
4.3 现场调试经验
现场调试时,先别急着接传感器,用精密电阻箱模拟PT100,从0℃到400℃逐点测,记录误差曲线。如果误差在±0.1℃以内,说明硬件和软件都没问题。然后再接实际传感器,对比标准温度计。
如果现场干扰大,先把ADC数据速率降到20SPS,开启50Hz抑制。还不行就加隔离芯片,SPI侧用ADuM3151或类似型号,电源用隔离DC-DC。隔离后地环路切断,干扰会小很多。
长线缆测量时,线缆电阻和电容会影响信号。PT100三线制能抵消线阻,但线缆电容会跟RC滤波一起改变截止频率。我的做法是现场实测线缆电容,重新计算RC参数,或者直接用四线制,彻底消除线阻影响。
注意:四线制接线多,现场施工容易接错。如果施工队伍不专业,三线制更稳妥。我见过四线制接成两线制的,精度反而更差。
5. 方案扩展与个人体会
这套方案不止能测温度,换个传感器就能测压力、流量、应变。ADS122U04IPWR的四通道差分输入和PGA,对桥式传感器特别友好。PIC32MX795F512L的CAN和以太网,方便接入各种工业网络。我后来用同样的架构做了压力采集板,只改了传感器接口和换算公式,硬件基本没动。
如果项目要求更高精度,可以把ADS122U04IPWR换成ADS1220或ADS1262,前者是20位,后者是32位,但价格也上去了。如果要求更低成本,可以用ADS1120,16位,精度差一些但够用。选型时先算清楚精度需求,别盲目追高。
软件方面,我建议把采集、滤波、换算、校准做成独立模块,方便移植。MCU的Flash和RAM都够,不用太抠。中断优先级要配好,DRDY中断优先级高于通信中断,避免数据丢失。
最后分享一个小技巧:ADS122U04IPWR的DRDY引脚可以配置成专用引脚或跟DOUT共用。如果SPI总线忙,用专用引脚更稳。配置寄存器3的DRDY位域控制这个,默认是专用引脚,别改。
这个方案我前后调了三个月,从原理图到PCB到固件到现场调试,踩的坑基本都写出来了。工业温度测量没有捷径,就是细节堆出来的。希望这些经验能帮你少走弯路。