做工业控制和暖通空调系统集成这么多年我越来越觉得温度测量这件事看着简单做精了却全是细节。标题里这套组合是我最近一个HVAC项目里实际用到的方案——ADC端是TI的ADS122U04IPWR主控端是Microchip的PIC32MZ2048EFM144用来采集风管温度、冷冻水供回水温度和回风温度再送给PID回路去调节水阀和风阀。先把结论放这儿这套方案从精度、成本、可靠性三个维度来看都相当能打写出来给有类似需求的同行做个参考。项目背景是这样的现场有一套组合式空调机组控制柜离传感器最远的地方将近30米现场还有变频器、接触器这些干扰源。甲方给的精度指标是测量回路整体±0.2℃而且要求调试周期尽量短。选型时我对比了好几套方案最后定下ADS122U04IPWR加PIC32MZ2048EFM144原因后面会逐一拆开讲。如果你正在做HVAC控制器或者工业温度采集板这篇内容应该能帮你避开不少弯路。1. 为什么是这套组合方案选型思路1.1 为什么选UART接口的24位ADC而不是SPIADS122U04IPWR这颗芯片最大的特点就是它把24位ΔΣ ADC和UART通信接口做在了一起。传统做法里ADC和MCU通信用的都是SPI或I2CSPI要接SCLK、MOSI、MISO、CS四根线I2C虽然少一根但需要考虑地址配置和上拉电阻。ADS122U04直接走UARTDIN和DOUT两根线就能搞定MCU侧连一个普通UART外设就能读数据。我选它还有一个很实际的考虑调试方便。UART协议天然就能接PC的串口调试助手板上出问题时拿一根USB转TTL线直接旁路MCU就能判断是ADC配置的问题还是主控代码的问题。SPI协议用逻辑分析仪也能查但没UART这么直观。另外PIC32MZ2048EFM144本身带了6个UART挂6片ADS122U04就能在单板上扩展出24路温度采集这对多测点HVAC系统来说非常实用。当然UART方案也有代价最大的限制是点对点通信一条UART总线没法像I2C那样挂多个从机。好在PIC32MZ的UART外设数量够多工业上常规做法是用一片MCU接几片ADC而不是把几十片ADC挂一条总线上。这也是选型时要权衡的地方到底是走总线扩展节省MCU引脚还是一对一接法简化布线、提升可靠性。在HVAC这种环境干扰复杂、后期维护成本高的场景我更倾向后者。1.2 PIC32MZ2048EFM144在这套系统里负责什么PIC32MZ2048EFM144是Microchip的MIPS32 microAptiv内核MCU主频200MHz带FPU2MB Flash加512KB SRAM。这颗芯片在这个项目里干的活不少通过UART并行读取多片ADS122U04的转换结果做滤波和线性化计算跑PID控制算法同时还要管理Modbus通信、人机界面和报警逻辑。200MHz的主频在这种任务下富余量很大FPU做温度-电阻反算和PID运算时优势尤其明显。芯片名字里有一串字母搞懂它们对选型很有帮助。2048表示Flash容量2048KBE代表Flash带ECC校验F代表高速型号M代表带加密引擎144是引脚数。ECC Flash在工业环境里很重要现场辐射干扰和电压跌落都可能导致Flash数据翻转ECC能在运行时发现并纠正单bit错误。这点在长周期运行的HVAC控制器上不是锦上添花而是实打实的可靠性保障。我选择144引脚封装还有一个原因引脚裕量充足。做温控器难免要顺带接几个数字输入输出、RS-485收发器、LCD屏和按键矩阵如果选了100脚或更小的封装最后总会为了抢引脚而牺牲某个功能。144脚版本在首版设计调试时可以让我把所有外设接口全部铺开后续做成本优化时再往小封装收敛开发阶段的空间冗余非常值得保留。1.3 整体架构与数据流整套系统的数据流很清晰传感器把温度量变成电阻或电压信号ADS122U04完成激励、放大、ΔΣ转换和数字滤波通过UART把24位转换码发送给PIC32MZMCU再经过线性化算法还原成温度值供控制逻辑使用。这里ADC不只是做模数转换还要管理传感器的激励电流和参考电压所以它实际上是“模拟前端加转换器”的双重身份。对外通信方面PIC32MZ通过UART连接RS-485收发器跑Modbus RTU协议把温度数据和控制状态上传到楼宇自控系统。温度采样周期和PID运算周期是分开的ADC以固定数据率连续转换MCU按50ms的控制周期去取最新值中间用DMA搬运数据CPU只在需要时做计算和协议处理。这种设计保证了控制环路的实时性又不浪费MCU的运算能力。供电方案上模拟部分和数字部分严格分开模拟5V给ADS122U04的AVDD供电数字3.3V给MCU和DVDD中间用磁珠和0欧电阻做单点连接。地平面也做了分割ADC和传感器接口下方的模拟地独立铺铜只在MCU附近汇合。这套架构是后续所有精度指标的根基如果供电和地没处理好再好的ADC也发挥不出性能。2. 温度信号链设计从传感器到数字量2.1 PT100/PT1000比例测量法与三线制接线HVAC系统里用得最多的是PT100和PT1000铂电阻。PT100在0℃时阻值100Ω灵敏度约0.385Ω/℃也就是说温度变化1℃电阻只变化不到0.4Ω。这么小的变化量如果用电桥加差分放大器器件误差和温漂会让精度很快劣化。我采用的方案是比例测量法让ADS122U04内部的一个IDAC恒流源同时流过参考电阻和RTD然后用同一个ADC分别测量两端的电压。比例测量的核心原理是如果同一个电流I先后流过参考电阻Rref和RTD或通过通道切换分别测量那么Vrtd / Vref Rrtd / Rref电流I和基准电压Vref的影响会被抵消。具体实现上用一颗高精度低温漂的参考电阻比如0.1%温漂5ppm的金属箔电阻放在ADC的基准输入端电流I流过它产生基准电压同一路电流再流过RTD产生信号电压。这样即使IDAC电流随温度漂移了比例值也保持不变这是保证长期测量稳定性的关键。很多工程师头一次听到这个思路会觉得绕但弄明白之后就会发现信号链里最值钱的不是ADC的分辨率而是这个“比值不变”的巧妙设计。传感器接线方式直接影响测量误差。两线制最简单但导线电阻会直接叠加进RTD阻值哪怕只有2Ω线阻就会带来约5℃的误差所以精度要求高的场合根本不能用。三线制是工业现场的常用折中方案两根线给RTD供电第三根线作为电压检测线软件里做一次简单的算术校正就能把线阻影响压到很小。ADS122U04内部有两个IDAC还专门为三线制RTD做了匹配设计用两个相同的恒流源分别给两根激励线供电系统自动完成线阻补偿。四线制精度最高但现场布线成本和传感器成本都上去了通常只在实验室校准和计量场景使用。实际项目里我建议探头线缆尽量用三线制线芯截面按传输距离和允许压降选一般18AWG到22AWG就够。另外PT100自热效应也要留意电流太大探头自身发热会引入误差。我习惯把IDAC电流设在500μAPT100在0℃时功耗不到0.025mW自热基本可以忽略而信号幅度依然足够覆盖ADC的有效分辨率。2.2 热电偶测量与冷端补偿的关键处理除了RTD这套系统里还要测冷冻水管道表面温度偶尔也会用到热电偶做高温测点。热电偶输出的是微伏级电压信号K型热电偶灵敏度大约41μV/℃一个200℃的温差也就8mV左右普通ADC直接采肯定不行。ADS122U04内部集成了PGA可编程增益放大器最高可以把信号放大到128倍微伏级信号被抬到几伏满量程再进ΔΣ调制器量化噪声的影响就小多了。这就是为什么24bit ADC往往搭配内置PGA一起用芯片厂商在信号链集成上已经把路铺好了。热电偶测量绕不开冷端补偿问题。热电偶测的是热端和冷端的温差电动势冷端温度变了读数就跟着漂。传统做法是把冷端放在冰水混合物里显然不现实。ADS122U04的做法是在芯片内部集成一颗温度传感器用来测量冷端温度固件里查热电偶分度表把对应的补偿电压加到信号上再整体换算成热端温度。关键技巧是让接头尽量靠近芯片引脚让两者的温度尽量一致PCB上还要避免功率器件和散热风道造成板间温梯度。软件处理上我不用复杂的非线性补偿多项式因为不同热电偶类型有对应的标准系数直接查表或按标准多项式展开就行。K型热电偶的温度范围从-200℃到1372℃HVAC里一般只用到-40℃到300℃这一段查表加线性插值就足够应付。我的经验是在冷端补偿计算时把结果量纲先统一成毫伏再和测量电压相加不然单位混着经常算错调试时特别容易栽这个跟头。2.3 模拟前端噪声与PCB布局注意点ADS122U04再厉害输入端拾取到噪声一样白搭。ICP风柜里变频器一启动现场的电磁干扰能把差模信号打回原形。我在布局时把模拟输入走线放在内层上下用地包裹输入线上靠近ADC引脚处并联一个100pF到1nF的滤波电容配合芯片自带的数字滤波可以明显把共模干扰压下去。PGA增益高的时候模拟电源纹波对输出码的影响会被等比例放大所以AVDD引脚附近要放一个0.1μF陶瓷电容加一个10μF钽电容且必须紧贴引脚放置。PCB布局还有个容易被忽略的细节参考电阻的走线。因为比例测量法的基准电压直接由流过参考电阻的电流产生如果参考电阻靠近干扰源基准波纹就会直接影响转换结果。我把参考电阻放在ADC的REFP和REFN引脚正下方走线尽量短粗周围留出禁布区避免和数字信号交叉。传感器连接器也放在板子边缘屏蔽层单端接地。这些处理都属于“开头花十分钟后面省十小时调试”的典型设计。供电方面如果现场只有一路24V电源可以用开关电源先降到5V再加一级低噪声LDO给模拟部分供电。开关电源的纹波通常在几十毫伏级别直接给ADC供电气死人不偿命。我实测过模拟供电从开关电源直出改成LDO后同一块板的噪声底降低了将近一半这个改善是立竿见影的比换更高档的ADC还管用。3. 固件实现UART驱动与温度转换3.1 ADS122U04寄存器配置与命令交互ADS122U04是通过UART接收命令、返回数据的从机模式波特率可以配置我按MCU端时钟算好后统一设在115200。上电后第一件事不是读数据而是发一个复位命令让芯片回到已知状态然后配置四个配置寄存器分别搞定输入多路复用开关选择、PGA增益、数据率滤波、IDAC电流档位和基准电压源选择。寄存器值的具体含义在数据手册里有表格工程上最稳妥的做法是先把一版配置写死在初始化数组里调完再做成可动态修改的结构体。配置好之后ADC就按设定的数据率持续转换。读取时MCU先发一条带CRC校验的读取命令然后从UART接收3个数据字节加状态字节。读取时序上有个容易踩的坑刚上电或者刚改寄存器后ADC可能还在自校准或模拟滤波稳定阶段此时读到的几组数据往往是乱的。我一般在发送配置命令后延时100ms再连续读5组数据丢弃之后的读数才认为是有效的。// 伪代码示意具体命令字以datasheet为准 void ads122u04_init(void) { uart1_send_cmd(ADS_RESET); delay_ms(20); ads_write_reg(CR0, 0x00); // 输入通道选择、PGA1 ads_write_reg(CR1, 0x10); // 数据率、滤波模式 ads_write_reg(CR2, 0x44); // IDAC电流设置、基准选择 ads_write_reg(CR3, 0x00); // 传感器设置 delay_ms(100); for (int i 0; i 5; i) { ads_read_raw(); // 丢弃稳定前的数据 } }实际项目中我还会在初始化后回读一遍寄存器确认写入成功。UART通信只要有一根线接触不良或者波特率微偏命令就会静默失败有时候现象特别隐蔽——比如读数全为0或者全部满码。回读寄存器这个动作虽然多花几十行代码但在现场排除通信故障时能省下一两个小时绝对值得加。3.2 PIC32侧UART与数据处理PIC32MZ侧我用的是UART1配置成8数据位、无校验、1停止位。波特率寄存器有个固定计算公式U1BRG (外设时钟频率 / (16 × 波特率)) - 1。如果外设时钟是100MHz目标波特率115200算出来是53.24取整后实际波特率和目标值会有万分之几的偏差UART通信容错范围内完全没问题。不过要注意PIC32MZ的外设时钟和系统时钟是两套体系必须先通过PBCLK分频配置器确认UART模块的时钟来源很多人初始化半天没波形就是栽在这。接收数据我优先用DMA这样CPU不会被一串串字符打断数据到达后直接写入缓冲区主循环按帧解析即可。这段代码可以直接复用但记得把DMA描述符里的地址和长度对齐不然会出现莫名其妙的丢字节。void uart1_init(uint32_t baud) { U1BRG (PBCLK / (16 * baud)) - 1; U1MODE 0x8000; // ON1, 8N1 U1STA 0x1400; // UTXEN1, URXEN1 IEC0bits.U1RXIE 1; // 开启接收中断 } uint32_t ads_read_raw(void) { uint32_t code 0; uart1_send_cmd(ADS_READ_CMD); while (!uart1_available()) { } code | uart1_getc() 16; code | uart1_getc() 8; code | uart1_getc(); return code; }拿到24位原始码之后第一件事是符号扩展。ADS122U04的输出是二进制补码如果最高位是1说明信号是负的比如热电偶反接或者通道差分输入反了直接按无符号数处理会得到一个天文数字转成温度后完全错误。符号扩展之后再按比例关系反算传感器电阻值。比例公式是Rrtd Rref × raw_code / ref_code这里ref_code是基准电压对应的满量程码与参考电阻和PGA的配合有关。这个换算直接在固件里用浮点算就行PIC32MZ有FPU浮点运算速度快得很根本不用为性能去做定点优化。读到的温度值我还会做一层防跳变处理比如中值滤波加滑动平均先取最近5个值去掉最大最小对剩下3个求平均。这个处理在风柜启动、电压波动或者探头线缆被踩的时候非常管用能把偶发的瞬时尖峰吃掉又不会像单纯拉大平均窗口那样把真实温度变化拖迟钝。滤波后把结果存成全局变量PID控制任务直接拿这个值算输出比在中断里做计算要清晰得多。3.3 线性化算法与精度评估PT100的温度-电阻关系不是严格线性的0℃以上用Callendar-Van Dusen方程描述Rt R0 × (1 A×t B×t²)。A3.9083e-3B-5.775e-7R0在0℃时是100Ω。直接解二次方程能得到一个不错的近似温度但对高精度需求我更喜欢用牛顿迭代求反函数把误差压到微乎其微。牛顿迭代在200MHz的MCU上跑几轮也就是纳秒级的事完全不用担心实时性。double pt100_res_to_temp(double R) { double t 100.0; // 迭代初值 double R0 100.0, A 3.9083e-3, B -5.775e-7; for (int i 0; i 5; i) { double f R0 * (1.0 A * t B * t * t) - R; double df R0 * (A 2.0 * B * t); t - f / df; } return t; }精度评估不能只看ADC位数要拉通整条信号链算账。24位ADC理论分辨率可以达到微伏级但实际误差来源于参考电阻容差、PGA失调、零点漂移、IDAC电流温漂和线性化算法误差。我算过一笔账参考电阻用0.1%精度、5ppm温漂的薄膜电阻PGA增益误差按手册典型值0.02%加上IDAC电流在整个工作温度范围内变化的影响整条链累计起来在-20℃到85℃范围内最坏情况下能控制在±0.1℃以内。这意味着HSI系统里常规的±0.2℃需求有足够裕量。调试过程中验证精度的手段也很重要。我会先用精密电阻箱代替RTD接到板子上设置成100Ω、111.67Ω、138.51Ω等标准值分别对应0℃、30℃、100℃看固件读回来的温度偏差是多少。再用高精度数字温度计校准一套验证平台把整板放进恒温箱里跑温度循环记录不同温度点的偏差曲线。做这一步的意义在于把单个器件误差和整机误差区分开如果偏差呈现固定偏移就在固件里做一点两点校准如果偏差随温度区间变化剧烈那就要怀疑元件选型或者布局有问题了。4. HVAC场景落地部署、隔离与控制配合4.1 暖通系统温度点梳理与控制需求HVAC系统里的温度测点看着多其实按用途分类就清楚了。风侧有新风温度、混风温度、送风温度、回风温度水侧有冷冻水供水温度、回水温度、热水供水温度加上冷却塔进出口温度和室外环境温度一台组合式空调机组轻松就能列出十几个点。这些点的测量目的分两类一类参与闭环控制比如送风温度直接进PID调节冷盘管水阀开度另一类用于监测和计量比如冷量计量需要供回水温差加流量来计算实际冷负荷。不同用途对精度的要求差异很大参与控制的一般±0.5℃够用做冷量计量的往往要求±0.1℃以上。ADS122U04IPWR这种4通道单芯片方案在测点密集的场景特别有优势。一台PIC32MZ用4片ADC就能覆盖16个温度点这水平已经能处理绝大多数中小型空调机组的测点规模。如果现场点位更多就再加一片MCU或者用RS-485把多个控制器组网架构上依然清爽。我项目中实际接的是8路PT100、4路4-20mA变送器输出和2路热电偶单板上用3片ADC就覆盖了剩下1个UART口还留给了调试下载。控制策略上PID参数整定需要根据温度滞后特性来调。风管温度响应快一些冷冻水温度受盘管换热系数影响滞后比较明显。我通常的做法是把采样周期设为1秒控制周期设为200ms给PID的微分项加上低通滤波避免温度噪声被微分放大导致水阀反复振荡。这套参数在多个项目里实测下来稳态温度波动基本能控制在±0.2℃以内舒适度方面甲方评价不错。4.2 工业现场的电气隔离与长线对策传感器离控制器几十米在工业现场很常见PT100这种低电平信号长距离传输时最容易受共模干扰。我的对策是区分信号类型RTD信号因为电缆本身是平衡桥结构对共模干扰有一定的天然抑制能力但也要保证屏蔽层单端接地而4-20mA电流环则天然适合长距离传输抗干扰能力强得多所以对距离特别远的测点我会优先考虑后接变送器转成电流环而不是硬拉RTD线。如果板子安装在动力柜里或测点附近有大功率变频器那么MCU和ADC之间的数字信号隔离就非常必要。数字隔离器件选电容耦合或磁耦合的都行关键是隔离前后的供电要彻底分开不能共地。我在一个大型冷站项目里用过带隔离的RS-485转UART方案把ADC板放在现场传感器附近MCU板放在控制柜里中间走RS-485总线。这样模拟信号只走几厘米的局部线路再远距离传输的是数字信号抗干扰能力和维护便利性都上了一个台阶。实际效果很明显原来模拟长线方案在现场偶尔出现的读数漂移和跳变问题基本消失了。加隔离之后要注意UART通信的时序和电平转换延时特别是通信波特率较高时隔离器件的传播延时可能导致位时序错位。我的经验是把波特率降到9600并尽量选用传播延时短的隔离器件。这个细节看起来不起眼但在工业现场是实实在在容易出现通信偶发故障的根源。4.3 故障诊断与自检逻辑温度传感器断线是现场最常见的故障。RTD断线后阻值变成无穷大ADC读到的信号会向满量程方向打程序如果不做判断就会把断线误判成几百上千摄氏度的高温然后控制器直接关阀或开阀场面相当难看。我在固件里加了上下限报警电阻值明显低于传感器量程下限比如RTD短路或者高于量程上限比如断线时直接标记该通道故障温度输出一个安全值并上报报警。这样即使探头坏了系统也能保持稳定运行而不是乱跳。ADC本身和工作状态也需要监控。我定期回读寄存器确认配置没有被干扰改写如果连续多次UART通信失败就判断为通信链路异常自动重新初始化ADC并重新配置寄存器。在暖通这种需要长期连续运行的场合这种自恢复逻辑比单纯报警后等人来处理要可靠得多。有一次在现场调试弱电井里的电磁干扰把UART线上的信号弄乱了如果只做一次性初始化设备就要断电重启才能恢复有了自动重初始化逻辑系统十几秒内就能自行恢复项目验收时对方对这个细节很认可。4-20mA变送器和热电偶通道也各有各的自检方法。变送器信号一般会有一个断线时的特殊电流值通常小于3.6mA或大于21mA这可以当故障标志用。热电偶断掉之后输出电压会变成开路状态读到的码接近正满量程同样需要加边界判断。这些自检逻辑的代码量不大但对整个系统可靠性的提升是数量级的。5. 调试记录与常见问题速查5.1 实测调试中踩过的坑这次项目调试最让我印象深刻的坑是PCB布局阶段参考电阻位置没规划好。首版样品上电后A通道的读数在-100℃和200℃之间疯狂跳动看起来完全不可用。排查了半天最后用热成像仪发现参考电阻旁边的走线正好经过一个磁珠下方电源电流的纹波耦合进了基准电压。调整布局把参考电阻移到远离磁珠的位置再重新铺铜后读数立刻稳定下来。这个案例说明比例测量法里参考电压的“纯净度”有多关键任何数字电流噪声串进去都会直接变成输出端的误差。第二个坑是在三线制RTD接线时踩的。我最初以为三线制的“三根线”随便接就行后来发现ADS122U04的三线制补偿要求两根激励线的电阻必须尽量相等否则补偿算法反而会引入新的不平衡误差。现场有个探头用了一根加长线三根线阻值差异明显读数比实际温度偏了0.3℃左右。后来把三根线换成同规格同长度的线缆误差立刻降了下来。这个细节在现场布线时特别容易忽略但对精度影响很大。第三个坑是关于热电偶冷端补偿的。ADI内部温度传感器离热电偶端子还是有一段距离PCB上电源电路的热量会顺着铜箔传导造成冷端传感器温度和实际冷端温度有几度的差异。我在电路板上加了一个隔热槽把热电偶端子区域和其他电路在铺铜上隔开又把功率器件挪远了冷端补偿误差从原来的将近1℃降到了0.2℃以内。如果你调试热电偶读数总是差一个固定值先别急着怀疑校准多项式优先检查冷端温度梯度和PCB散热路径。5.2 问题排查速查表现象可能原因排查方向读数为0或满码ADC未正确唤醒、命令格式错误用示波器抓DIN/DOUT波形确认上电时序和波特率读数漂移大参考电阻受干扰、IDAC电流不稳定检查参考电阻布局和滤波电容改进比例测量路径UART通信偶发乱码地电位差、波特率小数偏差共地降低波特率检查时钟配置PT100读数偏高导线电阻未补偿检查三线制接法测量线阻并校正热电偶冷端误差大PCB温度梯度、冷端传感器位置不当加隔热槽远离功率器件检查热均衡高温/低温跳变断线或连接器接触不良查看故障自检标志检查接线端子这个表是我在项目调试时随手整理的后来发现它比想象中好用。每次现场反馈异常先对照表格排除常见项多数问题都能在半小时内定位。我建议每位做类似方案的工程师都维护一份自己的排查记录时间长了就是最值钱的经验库。5.3 精度验证方法验证精度这件事最忌讳“看起来差不多就行”。我的做法分三步。第一步用精密电阻箱模拟RTD阻值从90Ω到150Ω每隔5Ω设一个点记录固件读回的温度和标准值比较偏差这一步能排除传感器线缆和探头本身的误差单纯检验板子和软件。第二步用标准探头插入恒温槽从0℃到100℃每隔10℃稳定后记录数据这能反映整条链路包括探头在产品级状态下的真实表现。第三步连续运行72小时以上观察温度读数和参考仪器的偏差随时间的变化趋势这一步主要为了筛掉元器件长期漂移的问题。我在实际验证中遇到过一个问题电阻箱设成精确的100Ω读回来是99.98℃而不是100.00℃差了0.02℃。这个偏差不是部件坏了而是电阻箱端口的接触电阻和内部基准的影响。这个时候要先用四线制的精密数字万用表量一下端口实际输出的阻值以实测值为准而不是以电阻箱面板显示的数字为准。校准这种事设备和仪表之间的参考基准要拉直否则一步一个坑。验证结果记录成表格存档作为项目交付文档的一部分这样甲方检查时拿得出数据后续维护也方便追溯。这套方案的扩展空间也不错。比如用同一颗MCU加一片模拟开关就能把ADC通道进一步扩展或者把板载的加密引擎用起来做Modbus通信的数据加密适合对通信安全有要求的项目。硬件上预留了隔离RS-485接口后续想并接楼宇自控系统或者云平台网关基本就是改固件的事。我在把这个项目收尾的时候最大的体会是温度测量难的不是原理而是把每一个细节都看成影响最终结果的变量然后用工程手段一个个去消除。希望这份实操记录能帮你少走几段弯路。