首页 / 资讯中心 / 文章详情

基于PJ85718DM与PIC32MZ的HVAC本地/远程测温方案

基于PJ85718DM与PIC32MZ的HVAC本地/远程测温方案 ★ FEATURED ARTICLE
做过HVAC控制器和嵌入式整机设计的朋友应该都有体会板子上的温度好测贴着PCB放一颗NTC就行但真正要控的那一路温度——风道里的回风温度、盘管表面温度、几米外的压缩机排气温度——往往离主控板有一段距离。距离一拉长模拟传感器的毛病就全出来了线阻引入误差、长线感应噪声、不同批次NTC的一致性还得逐个校准。我最近把一个测温方案整体迁移到了“PJ85718DM PIC32MZ1024EFE144”的组合上一块板子同时解决本地板温监测和最多三路远程通道测温整体精度稳定在±0.5℃以内。这篇文章就把这套方案的硬件接线、固件要点、校准方法以及实际调试中踩过的坑完整梳理一遍给正在选型或者准备从模拟测温切到数字测温的朋友做个参考。1. 为什么HVAC和嵌入式系统需要“本地远程”双视角测温1.1 本地温度的真正用途不只是“看个温度”很多设计把板载温度当成一个“锦上添花”的监测项其实搞反了。在HVAC控制器里本地温度承载的是设备生存逻辑柜内环境温度高到某个阈值需要主动降频或者启动散热风扇电源模块附近温度持续走高说明散热风道可能被堵住了得提前报警。在嵌入式系统里本地温度直接关系到可靠性高速MCU周围环境每升高10℃内部寿命和时序裕量都会有可见的恶化。所以本地温度不是“测着玩”的它的采样精度和响应速度决定了保护逻辑是不是会误动、会不会漏动。过去用NTC加ADC分压的方案粗看精度还行但一旦温度范围拉宽HVAC设备经常要覆盖-20℃到85℃NTC的B值误差、分压电阻温漂、参考电压抖动全都会叠加进来标称±1%的系统实测经常跑到±3℃以上。换成数字温度芯片以后ADC比较、修正和温度换算全部在芯片内部完成外围只负责把数字结果读出来误差来源直接被砍掉一大截。也是因为要在HVAC现场长期运行我倾向于把本地和远程测温合并到一颗芯片上而不是分别用两个器件。减少一颗外设、少一路I2C地址状态管理对批量生产的物料管理来说是实打实的成本差异。1.2 远程通道的价值把测量探头从PCB上解放出来远程测温是整个方案里最有意思的部分。PJ85718DM这类芯片支持通过外部晶体管或者二极管测量“远处”的温度——注意这里说的是pn结器件不是热敏电阻。这样测温探头可以物理上被拉到板外几米甚至十几米的位置同时信号处理仍然由主控板上的芯片完成。HVAC里典型的远程测温点我列几个实际场景风道回风温度探头放在回风口离控制板经常有三五米。蒸发器盘管表面温度制冷剂在盘管内蒸发换热盘管表面的温度梯度直接反映蒸发压力是否正常。压缩机排气温度这是压缩机保护的核心参数探头要贴到排气管路上。冷凝器进出口温度判断换热器脏堵或者风机转速是否匹配。这些点如果都用NTC拉长线每路都要做线阻补偿而且NTC是非线性器件长线上串入的任何感应电压都会被直接当作温度变化。使用远程二极管测温通道则没那么敏感因为芯片测量的是pn结在两档不同电流下的正向压降差增益和绝对电压值被整体校正掉了一大部分对线路压降和串阻的容忍度远高于模拟方案。1.3 选型思路为什么是PJ85718DM搭配PIC32MZ1024EFE144先交代一下PJ85718DM的定位一颗I2C/SMBus接口的数字测温芯片自带片内本地温度传感器同时支持多个外部通道的远程二极管测温。片内传感器管本地环境温度远程通道则通过一对导线连接到板外的分离式晶体管利用pn结在不同偏置电流下的电压差推算温度。这款芯片能覆盖HVAC控制器对“本地一到两路、远程两到三路”的典型需求而且报警阈值寄存器可以在芯片内部直接判温配ERR引脚主动通知主控不让MCU每时每刻去轮询。PIC32MZ1024EFE144这边核心优势是资源充裕。MIPS内核、200MHz主频、1MB Flash、512KB RAM还有单精度FPU。硬件上自带多路I2C和UART外设资源完全够跑温度采集逻辑加Modbus协议栈再加一个PID控制循环。选144引脚封装主要是看中了引脚自由度三路远程测温的走线可以单独规划不跟高速信号挤在一起后续扩展以太网或者CAN也不至于没引脚可用。这套组合最打动我的一点是“把本征误差做小”模拟链路几乎全部被数字化替代剩下需要操心的就是PCB布局和软件校准可控程度高多了。2. 硬件搭建从引脚分配到布线的完整接线逻辑2.1 PJ85718DM的供电与I2C接入PJ85718DM的供电范围比较宽常见的3.3V系统可以直接用不必额外做电源。这里我想提醒一个容易被忽略的点数字温度芯片本来功耗很低但因为它是高精度模拟前端电源纹波对测温结果的影响比想象中大。我实测在同一个电源轨上如果带着继电器吸合的大电流跳变远程通道的读数会跳0.2℃到0.4℃。后来我在芯片电源引脚边上单独加了一颗1μF和一颗0.1μF电容并且把I2C的上拉电阻电源独立接在干净的基准轨上跳变才被压下去。I2C接入方面PIC32MZ1024EFE144有多个I2C外设给PJ85718DM单独分配一条总线比较合适。温度采集对实时性要求不高但它不希望跟Flash读写、EEPROM擦写这种可能长时间占用总线的设备共享同一条I2C。点对点总线上只要一颗芯片速度和时序都好管控。硬件引脚分配上我会把SCL和SDA分别引出然后在总线上放4.7kΩ上拉电阻。这个值不是随便定的要结合总线实际电容看总线短、器件少4.7kΩ没问题如果板内走线很长可以降到2.2kΩ加快上升沿。上拉太小会导致低电平拉不下去太大会让通信速率上不去需要按实际示波器波形微调。2.2 远程测温传感器端的接法远程测温的核心就是一颗小信号晶体管常见的选型是三极管2N3904或者2N3906。这里有个细节芯片会周期性地改变引脚极性来抵消热电偶效应所以发射极和集电极往往可以互换使用不影响功能。但PCB上最好还是按照发射极接一个方向、集电极接另一个方向的推荐接法来做别去赌“反正能互换”。实际接线中远程晶体管到芯片之间就是两根走线。如果探头要拉出板外推荐用双绞线或者带屏蔽层的双芯线屏蔽层单端接地。我曾经在项目里图省事用普通平行排线拉了3米结果一开变频器就跳字后来换成双绞线问题立刻消失。原因不难理解变频器输出侧的dv/dt噪声会通过线间电容耦合进测温小信号而远程测温的有效信号本质上是两个大电压之间的微小差值噪声一叠上去芯片内部虽然有能力抑制一部分但超过限度照样会在读数上表现出来。温度探头安装位置同样决定可靠性。测风道温度时要把晶体管放进一个导热套管或者贴片式感温头里再用导热硅胶固定测盘管表面温度时要用卡箍把感温头压在管壁上尽量让整个封装底面贴合管道曲面。不要直接拿二极管裸露在气流里气流温度不均匀会导致读数来回飘。2.3 布线规则兼顾EMC和长线信号完整性PCB上PJ85718DM跟PIC32MZ1024EFE144之间的I2C走线要短这点不用多说。真正需要动脑子的是远程通道走线。远程通道本质上是高阻抗小信号输入走线应该尽量远离继电器驱动线、PWM驱动线以及变压器区域。我习惯把这些测温线走在PCB底层上下都用完整的地平面包住相当于给它们做了个天然屏蔽实践下来效果比后加屏蔽罩还直观。温度信号线过长的另一个麻烦是输入电容增大。芯片对远程通道通常允许一定容值的输入电容因为电容会影响测量转换期间的建立时间但容值太大会拖慢内部ADC的采样稳定。现场要用多长的线最好在选型阶段就估算一次宁可留20%到30%的余量也不要贴着数据手册的极限值设计。3. 固件实现寄存器配置、温度计算与数据平滑3.1 初始化与工作模式选择上电后第一步不是直接读数而是把PJ85718DM设置为已知状态。初始化序列一般是先复位芯片等待转换完成再写配置寄存器最后确认读取一次ID。配置寄存器里常见的关键选项包括转换模式、温度分辨率、报警极性等。HVAC场景建议用连续转换模式让芯片一直保持最新温度在寄存器里主控随时来读都是有效数据如果是为了省电可以改成单次转换模式但HVAC设备多数自带电源用连续转换简单得多。报警阈值寄存器值得好好利用。PIC32MZ1024EFE144不必自己写判断逻辑去实时比对温度可以把本地高温和远程通道的低温阈值直接写进PJ85718DM内部然后让ERR引脚作为中断输入接到MCU。温度越限时芯片主动拉低该引脚固件进中断读取状态寄存器、判断是哪个通道触发了报警处理完再写状态寄存器清标志。这样温度监控的实时性不依靠调度器即使主循环被Modbus阻塞了异常仍然能第一时间被捕获。配置完成后最好做一次自检读数读取全部通道的原始值确认没有读到FFFF这种明显异常的值顺便打印出来作为后续排查的基线。3.2 从原始寄存器到真实温度的换算PJ85718DM的温度寄存器一般是16位其中高位字节是整数部分低位字节是小数部分。不同芯片的格式有差别常见的是高字节带符号位低字节表示0.5℃、0.25℃或0.0625℃的小数位。实际项目中我遇到过把数据格式搞错导致整板温度全部偏移的情况所以每次换型号后的第一件事就是拿手头精密温度计做一次对比确认单位和小数位宽度是对的。代码里换算逻辑大致是这样int16_t raw (int16_t)(regValue 0xFFFC); // 去掉低两位无用标志位 float temp_c raw * 0.0625f; // 假设LSB为0.0625℃注意raw要转成有符号数再乘系数。有些芯片的低位包含错误标志读取后要把这些位掩掉再计算。温度可能是负值比如蒸发器防冻保护就要测到0℃以下无符号处理会直接变成一个大数后续控制逻辑全乱掉。我在代码里总是用int16_t做中间变量就算现在调试的工况全在正温度范围也得保证负温下的行为正确。多路远程通道的寄存器各自独立读取顺序没有强制要求。为了让一个时间切片内的数据一致性更好我通常一口气连续读完全部通道的原始值而不是读一路、处理一路、再读下一路。哪怕不同通道之间相差几十毫秒在温度变化缓慢的HVAC场景里也可以忽略不计。3.3 滤波与采样节奏别让噪声骗了控制逻辑温度信号本身变化慢但现场噪声会让读数出现“毛刺”。控制逻辑对温度毛刺特别敏感一个突然跳高的排气温度如果没过滤就直接进保护判断可能造成误停机。我的经验是两级处理先做中值滤波去除孤立异常点再做移动平均平滑曲线。中值滤波窗口取5就够对单点脉冲干扰有很强的抑制作用。接着做16次采样的移动平均效果已经非常平滑。如果控制周期要求快可以把移动平均窗口缩到8次如果纯粹做趋势监测16次乃至32次都行。采样周期本身我设在1秒对HVAC系统足够了采样太频繁反而会把噪声更完整地送进滤波器。滤波系数不要走极端。窗口太大虽然读数稳但真实温度变化时响应会滞后排气温度快速攀升时你看到的还是几秒前的旧值保护动作就慢半拍。平衡点是让滤波后的数据在全量程范围内延迟不超过1到2个采样周期。4. 校准与误差处理把测温精度从1℃压到0.5℃4.1 为什么远程测温会有系统误差远程测温并不是“插上就能用”的完美方案。它的基本原理是测量pn结在不同偏置电流下的正向压降差ΔVBE这个差值理论上只和绝对温度以及电流比有关工艺参数的影响被大幅抵消。但具体的晶体管型号差异、引脚串联电阻、内部电流源精度还是会引入零点偏移和增益误差。实践上这个问题表现为“同一颗传感器在不同温度点偏差不完全一样”可能0℃时偏0.3℃50℃时偏-0.2℃。这是因为芯片内部电流比是固定的而实际晶体管的发射结面积和串联电阻与芯片预设的理想模型有偏差。所以校准时不能只看单点要至少取两个间距够大的温度点做校准。本地通道同样需要校准。PCB热源、芯片自热、回流焊造成的微小应力都会让片内传感器读数跟真实环境温度有几毛钱的差距。虽然绝对值不大但在要求严格的HVAC验证流程里可能就卡在一条精度限值上。4.2 两点法校准完整步骤我在产线上用过的校准流程直接分享出来。准备一个恒温槽或者高精度温控设备外加一支经过计量溯源的参考温度计精度要优于0.1℃不然校准完自己都不知道基准对不对。第一步把被测板装进恒温槽温度设定在25℃附近稳定至少15分钟对比PJ85718DM本地通道读数与参考温度计记录差值offset_local。第二步远程通道把温度探头和参考温度计绑在一起放进恒温槽。温度同样设在25℃稳定记录芯片读数T1与参考值R1。第三步把温度设定改到50℃或者一个接近工作范围的位置再次稳定记录T2与R2。第四步计算出每路远程通道的增益修正系数和零偏gain (R2 - R1) / (T2 - T1); offset R1 - T1 * gain; corrected_temp measured_temp * gain offset;第五步把校准结果存到PIC32MZ1024EFE144的Flash或外部EEPROM里而不是存在PJ85718DM的寄存器中。因为校准参数掉电不能丢而且Flash在量产阶段可以用测试工装写进去刷程序时也不容易误删。校准过程里最容易出错的是没等温度稳定就开始记录。恒温槽设定到目标温度后槽内液体温度很快到了但探头、外壳和控制板的热时间常数不一样可能要再等十分钟才能真正平衡。我的经验是以参考温度计连续五分钟读数变化不超过0.05℃作为“稳定”的判据。4.3 实测数据记录下面是校准完成后一组实际测试数据参考温度计和PJ85718DM读数之间的偏差已经控制得很小设定状态参考温度(℃)芯片读数(℃)偏差(℃)低温点4.984.91-0.07常温点24.9225.030.11高温点54.8754.75-0.12环路测试9.9610.120.16环路测试34.8334.70-0.13这个精度在HVAC场景里已经相当够用。要注意校准只能在出厂前消除批次性偏差当现场环境变化极大、线缆长度每次安装都不同时两端的连接器和线缆压降会引入新的误差这也是为什么远程通道的线材和接头要指定品牌型号不能随便换。5. 从测温到控温数据融合与控制联动5.1 哪些温度参与控制哪些只做保护有了一路本地和几路远程温度后怎么用它们才是真正的设计功力所在。我的做法是对每条温度通路做角色定义写在需求文档里参与闭环控制的温度必须经过滤波而且要有故障剔除机制做保护的温度则允许更快的响应和更宽的毛刺容忍度。送风温度控制是典型的闭环场景。目标是让回风或送风温度稳定在设定值PID输出控制三速风机或者调节水阀开度。此时送风温度传感器如果闪了一下PID会立刻做一次错误调节等读数恢复又反向调一次阀门反复抖动。所以参与PID的温度必须走完整的中值滤波加移动平均必要时再加一阶低通。排气温度这类保护参数则相反。它不需要滤波得多干净重点是能快速发现温度真的在往危险区跑。保护逻辑会设置两个阈值预警阈值和停机阈值并且使用滞回区间防止温度在阈值边缘来回跳动时反复启停。比如排气温度超过120℃预警、超过125℃停机重新允许启动要等降到110℃以下。这些阈值我建议也放进PJ85718DM的报警寄存器用硬件中断触发可靠性比主控软件判断高一个量级。5.2 通过Modbus把温度数据交出去嵌入式HVAC设备通常需要把温度数据上送给楼宇自控系统或者触摸屏。PIC32MZ1024EFE144上有大量UART资源配一颗RS485收发器就能跑Modbus RTU。保持寄存器的映射建议固定下来方便上位机开发40001本地温度有符号整数单位0.1℃40002远程通道1温度单位0.1℃40003远程通道2温度单位0.1℃40004远程通道3温度单位0.1℃40005系统报警状态字按位表示各通道超限状态用0.1℃作单位是因为0.01℃分辨率在HVAC现场意义不大16位寄存器能表示的范围还更大负温也好处理。我见过不少人把所有温度原始值直接丢给Modbus这是不对的。上位机拿到的应该是经过校准、滤波、单位换算后的最终温度工程值。固件内部是浮点运算但往寄存器里写之前要按乘10转成整型统一好四舍五入规则。6. 现场调试最容易翻车的几个环节与排查链路6.1 I2C总线读不到设备先照这三步走PJ85718DM上电后I2C读不到是最常见的第一道坎。不要急着怀疑芯片坏了按顺序排查第一步示波器看SDA和SCL波形。通信时SCL应该有干净的低电平拉低动作SDA在SCL高电平期间必须保持稳定如果有抖动或者信号一直浮空先确认上拉电阻有没有焊接好。第二步量供电电压。芯片供电要稳定在数据手册范围里我用万用表量过没问题但还是读不到后来发现是电源轨上瞬间掉电芯片在上电时序没有完成初始化。给MCU和传感器统一上电时要在主控延时几百毫秒后做一次软复位重新初始化芯片。第三步核对I2C地址。有些型号的地址引脚不接是高地址、接地是低地址地址选错的话扫描总线就是死活无应答。读一下器件ID寄存器确认返回的ID号和芯片型号一致基本就稳了。6.2 远程通道数据跳变锁定噪声源头远程通道跳变我经历过三种根因排查次序很重要。第一种是线缆问题特征是跳变幅度大且无规律靠近变频器时加剧。解决办法是换成双绞屏蔽线并把屏蔽层单端接地同时让测温线远离动力线。第二种是传感器本身焊接不好特征是轻轻拨动探头线读数就变重新焊接感温头和线缆后恢复正常。第三种是芯片周边EMC环境太恶劣特征是跳变周期和继电器开关动作强相关这时候要给远程通道输入加RC滤波或者在主控软件里加深中值滤波窗口。值得强调的是不要把软件滤波当成万能药。滤波只能压制噪声的显示效果不能消除物理层面的噪声耦合。源头问题不解决哪天噪声幅度大到超过芯片能容忍的输入范围读数会直接错成不可信的值。先治硬件再补软件。6.3 本地温度读数偏高先看自热和热耦合本地通道读数比现场实际环境温度高1℃甚至更多先怀疑PCB自热。PIC32MZ1024EFE144跑在200MHz周围电源电路和功率驱动都有明显的发热点PJ85718DM如果离这些发热源太近片内传感器测到的就是板级温度而不是环境温度。我就踩过这个坑元器件布局时把测温芯片放在了电源芯片下风口结果本地温度始终比机箱内实际温度高2℃。解决方法是把测温芯片挪到远离发热器件的位置并保证它周围有足够的铺铜散热连接而不是被四周器件包围。如果挪位置不方便可以在软件里做一个固定的offset补偿。但这样做隐患明显板子功耗变化时自热程度也跟着变固定offset就不准了。作为替代还可以用远程通道外接一颗晶体管放在机箱内的通风处把“环境温度”这个任务交给远程通道本地通道当成辅助参考来用。处理完以上问题再回头看整个系统温度数据从采集到上传的链路已经非常清晰了。我个人做完这套方案的一个强烈体会是PJ85718DM这类数字测温芯片真正的价值不只是省了几个ADC通道而是把“测量”这个环节的不确定性压缩到了极小让后续所有控制逻辑都建立在可靠数据上。最后分享一个小细节远程通道的线缆和接头在量产时一定要锁定供应商我遇到过不同批次线缆绝缘层材质不同导致高温高湿环境下读数漂移的怪问题查到最后是线材漏电流在作怪。按数据手册要求留足设计裕量现场能省掉非常多麻烦。
阅读完成 · 觉得有帮助?
咨询建站