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 Flash128KB 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位分辨率加上PGA128等效输入分辨率能到微伏级换算成温度就是0.01℃级别完全够工业A级要求。通道隔离方面四通道差分输入天然支持两线制、三线制、四线制RTD接法。三线制能抵消引线电阻四线制精度最高但接线多。HVAC现场一般用三线制PT1000引线电阻影响小接线也方便。长期漂移方面ADS122U04IPWR的内部基准温漂是5ppm/℃典型值配合MCU做定期零点校准和增益校准年漂移可以控制在0.1℃以内。MCU这边可以存校准系数到Flash上电自检时读回来。现场干扰方面差分输入本身抗共模干扰再加上RC滤波和TVS保护长线缆引入的工频干扰和浪涌基本能压住。SPI走线尽量短必要时加隔离芯片这个后面实操部分细说。2. 核心细节解析与实操要点2.1 ADS122U04IPWR的寄存器配置与关键参数ADS122U04IPWR有四个配置寄存器0x00到0x03上电默认是外部基准、PGA1、连续转换关闭。要让它跑起来至少得配这几项输入多路复用器MUX选择四路差分输入中的哪一路或者内部温度传感器、AVDD/4等。增益PGA1到128RTD小信号一般用32或64热电偶用128。数据速率5SPS到2000SPS温度测量用20SPS或45SPS就够兼顾速度和50Hz/60Hz抑制。基准选择内部2.048V基准或外部基准内部基准省事但精度略低要求高时用外部REF5025。IDAC电流10μA到1.5mAPT100用1mAPT1000用0.5mA或1mANTC用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位要置1CKP和CKE决定时钟极性和相位。ADS122U04IPWR要求SCLK空闲低、数据在上升沿采样所以CKP0、CKE1具体看手册时序图不同模式可能不同实测确认最稳。SPI时钟计算FSCK FPB / (2 * (SPIxBRG 1))。假设外设总线时钟80MHz要跑4MHzSPIxBRG 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回到AIN1REF和REF-接在RTD两端做比例测量。这样激励电流的漂移会被比例测量抵消精度更高。热电偶接法热电偶输出直接进ADC差分输入PGA128但必须做冷端补偿。冷端补偿可以用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到AVDD0.3V工业现场浪涌很容易超TVS管不能省。我见过没加TVS的板子雷击后ADC直接报废。2.4 电源与地处理ADS122U04IPWR的AVDD和DVDD可以分开供电AVDD用3.3V或5VDVDD用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三线制、PGA32、1mA IDAC、20SPS、内部基准为例// ADS122U04IPWR配置示例简化 // 寄存器0MUXAIN0/AIN1PGA32PGA使能 write_reg(0x00, 0x08 | 0x04); // MUX和PGA配置 // 寄存器1数据速率20SPS连续转换 write_reg(0x01, 0x04 | 0x00); // 寄存器2内部基准IDAC1mAIDAC1接AIN0 write_reg(0x02, 0x10 | 0x04 | 0x01); // 寄存器3IDAC2关闭DRDY专用引脚 write_reg(0x03, 0x00); // 启动连续转换 send_command(0x08); // START/SYNC写完后等DRDY变低读3字节数据。24位数据是二进制补码正负满量程对应±2^23-1。换算成电压V (code / 2^23) * VREF / PGA。VREF2.048VPGA32所以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)其中R0100ΩA3.9083e-3B-5.775e-7C-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总数)。假设FPB80MHz波特率500kbpsTQ总数16BRP80M/(2500k16)5。实际写5实测波形没问题。输出数据格式我一般用定点数温度乘以100存成int16比如25.34℃存成2534。这样传输效率高上位机解析也简单。4. 常见问题与排查技巧实录4.1 常见问题速查表问题现象可能原因排查方法解决方法SPI读回全0或全1CS极性错误、SPI模式不对示波器看SCLK、MOSI、CS波形检查CKP/CKE确认CS上电高温度值跳变严重滤波不足、地环路干扰短接输入端看噪声加RC滤波、单点接地、软件滤波温度值恒定不变MUX配置错误、DRDY未触发读寄存器确认配置重新配置MUX检查DRDY中断校准后仍有偏差基准漂移、引线电阻测基准电压、测引线电阻用外部基准、三线制补偿长时间运行后漂移温漂、器件老化定期校准、记录漂移曲线选低温漂器件、软件补偿多通道串扰切换后未等稳定切换后丢弃第一个数据增加切换延时、丢弃首样本电源纹波大去耦不足、LDO不稳示波器看AVDD纹波加LC滤波、换低噪声LDO4.2 独家避坑技巧坑一DRDY中断丢失。PIC32MX795F512L的外部中断如果没清标志位会反复进中断。我一开始忘了在ISR里清IFS0bits.INT0IF结果程序卡死在中断里。后来养成习惯ISR第一件事就是清标志。坑二SPI时钟太快导致数据错位。ADS122U04IPWR标称支持2MHz SCLK但实际布线上如果走线超过10cm1MHz以上就容易出错。我的做法是先跑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位但价格也上去了。如果要求更低成本可以用ADS112016位精度差一些但够用。选型时先算清楚精度需求别盲目追高。软件方面我建议把采集、滤波、换算、校准做成独立模块方便移植。MCU的Flash和RAM都够不用太抠。中断优先级要配好DRDY中断优先级高于通信中断避免数据丢失。最后分享一个小技巧ADS122U04IPWR的DRDY引脚可以配置成专用引脚或跟DOUT共用。如果SPI总线忙用专用引脚更稳。配置寄存器3的DRDY位域控制这个默认是专用引脚别改。这个方案我前后调了三个月从原理图到PCB到固件到现场调试踩的坑基本都写出来了。工业温度测量没有捷径就是细节堆出来的。希望这些经验能帮你少走弯路。