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

嵌入式HVAC温度采集:PJ85718DM与PIC32MX695F512L本地及远程测温方案

嵌入式HVAC温度采集:PJ85718DM与PIC32MX695F512L本地及远程测温方案 ★ FEATURED ARTICLE
1. 从一颗温度传感器说起为什么本地与远程测温在嵌入式 HVAC 里是两回事嵌入式 HVAC 控制板上的温度采集看起来是最没有技术含量的活儿——接个传感器、读个 ADC、换算成摄氏度完事。但真正做过整机项目的人都知道温度采集恰恰是最容易在量产阶段翻车的环节之一。板子上的功率器件发热、风道里的气流分布、远程探头的长线缆引入的噪声任何一个细节没处理好读出来的温度都可能偏离真实值好几度而 HVAC 系统对温度的判断直接决定了压缩机启停、风机转速、阀门开度这些执行动作偏差几度就可能导致能耗飙升或者舒适度崩盘。这次要聊的方案核心是用PJ85718DM这颗温度传感芯片配合PIC32MX695F512L这颗 32 位单片机搭建一套同时覆盖本地板载测温和远程探头测温的采集系统。PJ85718DM 是一颗支持多路远程测温通道的传感器件它最大的特点是能把本地温度和最多几路远端二极管的温度都读出来而且远端通道天生适合接长线缆因为它用的是电流型激励而不是电压型测量线缆电阻带来的误差可以被有效抵消。PIC32MX695F512L 则是 Microchip 经典的 32 位 MIPS 内核 MCU512KB Flash、128KB RAM主频能跑到 80MHz带 I2C、SPI、UART 一大堆外设跑个温度采集加控制逻辑绰绰有余。为什么要把本地和远程分开测因为 HVAC 设备的控制板通常装在电控箱里电控箱内部的温度受功率器件发热影响跟实际送风温度、回风温度、盘管温度完全不是一回事。回风温度要用远程探头伸到风道里测盘管温度要贴在铜管上测而板载温度只用来做冷端补偿或者箱体过温保护。这三类温度物理位置不同、量程不同、精度要求也不同用一颗支持多通道的传感器统一管理比在板子上堆好几颗单点传感器要省事得多布线也干净。提示本地测温和远程测温在电路设计上的思路完全不同。本地测温关注的是芯片自身热耦合和 PCB 布局远程测温关注的是线缆噪声、二极管串联电阻和通道间串扰。把这两件事混在一起设计往往两头都做不好。我见过不少项目本地温度读得挺准一接上两米长的远程探头就开始飘或者远程通道之间互相干扰一路温度变化另一路跟着跳。这些问题的根子往往不在传感器本身而在于对远程测温原理的理解不到位。下面我会从芯片选型逻辑、硬件连接细节、固件读取流程、误差校准方法、以及实际调试中踩过的坑这几个角度把这套方案完整拆一遍。2. PJ85718DM 的通道架构与 PIC32MX695F512L 的接口匹配逻辑2.1 为什么选多通道远程测温芯片而不是多颗单点传感器先说说选型思路。HVAC 控制板通常需要采集的温度点包括回风温度、送风温度、室外温度、盘管温度、板载环境温度少则三四个点多则七八个点。如果每个点都用一颗单点数字温度传感器比如常见的 I2C 接口温度芯片会面临几个问题一是每颗芯片都要单独占一个 I2C 地址地址冲突很麻烦二是每颗芯片都要单独布线PCB 走线复杂度上升三是远程探头如果用数字传感器长线缆上的 I2C 信号完整性很难保证几米长的线缆上 I2C 的上升沿会被线缆电容拖慢通信失败率很高。PJ85718DM 这类多通道远程测温芯片的思路不一样。它把本地测温和远程测温集成在一颗芯片里远程通道接的是二极管接法的三极管通常是 MMBT3904 这类小信号管或者某些 MCU 内部自带的测温二极管芯片通过交替注入不同大小的电流测量二极管在不同电流下的正向压降差再根据这个压差反推出温度。这个方法的妙处在于二极管正向压降差与串联电阻无关所以线缆电阻、接插件接触电阻都不会影响测量结果。这就是为什么远程测温必须用这种电流激励法而不是简单测电压。PIC32MX695F512L 在这套方案里的角色是主控。它通过 I2C 总线读取 PJ85718DM 的寄存器拿到本地和各远程通道的温度数据然后跑控制算法。选这颗 MCU 的理由很实际它有多个 I2C 外设可以同时挂温度传感器、EEPROM、显示驱动等器件而不打架512KB Flash 足够放控制逻辑和通信协议栈128KB RAM 对于温度滤波、历史数据缓存、Modbus 寄存器映射这些需求来说很宽裕。而且 PIC32MX 系列在工业控制领域用了很多年工具链成熟Harmony 框架里 I2C 驱动现成的开发效率高。2.2 I2C 总线上的地址分配与速率取舍PJ85718DM 在 I2C 总线上通常有固定的地址范围具体地址由芯片的地址引脚决定。实际项目里如果板上只有一颗 PJ85718DM地址冲突基本不用担心。但如果板上还有其他 I2C 器件比如 EEPROM 或者 IO 扩展芯片就要提前规划好地址空间避免撞车。I2C 速率的选择是个需要权衡的点。标准模式 100kHz 最稳但读取多个通道的温度寄存器需要多次传输如果控制循环要求 100ms 内完成一轮采集100kHz 可能有点紧。快速模式 400kHz 能明显缩短传输时间但对总线电容和上拉电阻的要求更高。我的经验是如果 I2C 走线总长度不超过 20cm总线电容控制在 200pF 以内400kHz 完全没问题。上拉电阻用 2.2kΩ 到 4.7kΩ 之间具体看总线电容和电源电压。3.3V 系统下 4.7kΩ 是比较稳妥的选择如果走线较长或者挂的器件多可以降到 2.2kΩ 加快上升沿。注意PIC32MX695F512L 的 I2C 外设支持标准和快速模式但配置寄存器时要注意时钟分频的计算。I2C 波特率 外设总线时钟 / (2 × (I2CxBRG 1))其中 I2CxBRG 是分频寄存器值。假设外设总线时钟 40MHz想要 400kHzI2CxBRG 应该设为 49。这个计算在 Harmony 框架里会自动完成但如果你直接操作寄存器一定要自己算清楚。2.3 远程通道的二极管接法与串联电阻计算远程测温通道的二极管接法是硬件设计里最容易出错的地方。PJ85718DM 的远程通道通常有正负两个引脚二极管要接在正负引脚之间基极和集电极短接在一起当阳极用发射极当阴极。这样接的原因是芯片内部要交替注入两个不同大小的电流测量两次正向压降所以二极管必须是一个干净的 PN 结不能有额外的寄生通路。串联电阻的作用是限流和隔离。远程探头线缆上会有寄生电容如果二极管直接接在芯片引脚上长线缆的电容会导致电流注入时产生振铃影响测量精度。通常会在芯片引脚和二极管之间串一个几十欧姆到一百欧姆的电阻具体值要看线缆长度和电容。线缆越长电阻可以适当加大但太大会导致注入电流不足测量信噪比下降。我的经验是两米以内的线缆用 50Ω 左右两米到五米用 100Ω再长就要考虑用屏蔽线并降低 I2C 速率了。还有一个容易被忽略的点是通道间的串扰。如果多个远程通道的线缆捆在一起走通道之间的电容耦合会导致一路的电流注入影响到另一路。解决办法是通道间的地线隔离每个远程通道最好配一根独立的地线回到芯片地不要共用一根地线。如果实在做不到独立地线至少要在 PCB 上把各通道的走线分开不要平行走太长距离。3. 从寄存器到摄氏度固件层的读取流程与数据换算3.1 上电初始化与配置寄存器的关键位PIC32MX695F512L 上电后I2C 外设需要先初始化配置时钟、使能引脚、设置中断优先级。然后对 PJ85718DM 进行配置。PJ85718DM 内部有一组配置寄存器用来设置远程通道的使能、电流大小、转换速率、以及报警阈值等参数。配置寄存器里最关键的几个位是远程通道使能位和电流选择位。远程通道使能位决定了哪些通道参与转换不用的通道关掉可以缩短转换时间。电流选择位决定了注入二极管电流的大小通常有几十微安和上百微安两档可选。电流大一些正向压降大测量信噪比好但芯片自身发热会增加影响本地温度测量。所以如果本地温度精度要求高远程电流就不要选太大如果远程线缆很长信号衰减严重就要选大电流来保证信噪比。这是一个需要根据实际场景权衡的参数。转换速率配置决定了芯片多久完成一轮所有通道的转换。速率越高芯片功耗越大自热越明显。HVAC 应用里温度变化本身很慢没必要追求高速转换通常 1Hz 到 4Hz 的转换速率就足够了。我一般会把转换速率设成 2Hz 左右既保证响应速度又控制自热。3.2 温度寄存器的读取时序与数据格式PJ85718DM 的温度寄存器通常是 16 位格式高字节和低字节分别存储。读取时要注意字节顺序有些芯片是高字节在前有些是低字节在前数据手册上会写清楚。温度值的分辨率通常是 0.0625°C 或者 0.125°C具体看芯片型号和配置。读取流程一般是先发一个写命令把寄存器指针指向温度寄存器地址然后发一个读命令连续读出两个字节。PIC32MX695F512L 的 I2C 外设支持重复起始条件可以在不释放总线的情况下完成写指针加读数据的操作。Harmony 框架里的 I2C 驱动有现成的 API比如DRV_I2C_WriteReadTransfer可以一次性完成写和读用起来很方便。数据换算的公式要看芯片的数据手册。通常温度值是以二进制补码形式存储的正温度直接换算负温度要先取补码再换算。比如 16 位数据高 12 位是温度整数部分低 4 位是小数部分分辨率 0.0625°C。换算时先把 16 位数据右移 4 位得到整数部分再取低 4 位乘以 0.0625 得到小数部分。如果是负温度要先判断符号位然后取补码再按同样方法换算。// 假设 raw_data 是从 PJ85718DM 读出的 16 位原始数据 int16_t raw_temp (int16_t)raw_data; float temperature; if (raw_temp 0) { // 负温度取补码后换算 raw_temp ~raw_temp 1; temperature -(raw_temp 4) - (raw_temp 0x0F) * 0.0625f; } else { temperature (raw_temp 4) (raw_temp 0x0F) * 0.0625f; }这段代码是典型的温度换算逻辑实际项目中我会把它封装成一个函数输入原始数据输出浮点温度值。注意浮点运算在 PIC32MX 上是可以接受的因为它有硬件浮点单元吗PIC32MX695F512L 没有硬件浮点单元浮点运算是软件模拟的比较耗时。如果控制循环对时间敏感可以考虑用定点数运算代替浮点比如把温度值放大 16 倍用整数表示最后显示时再换算。3.3 多通道轮询与数据缓存策略多通道温度采集需要轮询读取。PJ85718DM 内部有多个温度寄存器分别对应本地和各远程通道。读取时依次读取每个通道的寄存器然后存入 MCU 的缓存数组。缓存数组的大小取决于通道数量通常定义一个float temp_buffer[CHANNEL_COUNT]就够了。轮询策略有两种一种是顺序轮询每个控制周期读一遍所有通道另一种是分组轮询把通道分成几组每组在不同的控制周期读取降低单周期 I2C 负载。HVAC 应用里温度变化慢分组轮询完全可行比如本地温度和回风温度每个周期都读盘管温度和室外温度隔几个周期读一次。这样可以减少 I2C 总线占用给其他 I2C 器件留出时间。数据缓存还要考虑滤波。原始温度数据会有噪声直接用来做控制判断会导致执行器频繁动作。常见的滤波方法是滑动平均滤波把最近 N 次采样值求平均。N 的选择要看控制周期和温度变化速率通常 N 取 4 到 8 比较合适。如果温度变化很慢N 可以取大一些滤波效果更好但响应会变慢。我一般会在调试阶段把原始数据和滤波后的数据都打印出来观察噪声水平和响应速度再确定 N 的值。提示滑动平均滤波会引入相位滞后如果控制环路对相位敏感比如 PID 控制滤波带来的滞后可能影响稳定性。这种情况下可以考虑用一阶低通滤波代替滑动平均相位滞后更小参数调整也更直观。4. 本地与远程测温的误差来源与校准实操4.1 本地测温的自热效应与 PCB 布局对策本地测温最大的误差来源是自热效应。PJ85718DM 芯片自身功耗会导致结温高于环境温度读出来的本地温度其实是芯片结温不是真正的环境温度。自热误差的大小取决于芯片功耗和 PCB 散热条件。如果芯片下面铺了铜皮散热好自热误差可能只有 0.1°C 到 0.2°C如果芯片周围是空气散热差自热误差可能达到 1°C 以上。减小自热误差的方法有几个一是降低芯片功耗比如降低转换速率、减小远程通道电流二是改善 PCB 散热在芯片下面铺铜皮多打过孔连接到内层地平面三是把芯片远离功率器件避免被外部热源烘烤。我在实际项目里通常会把温度芯片放在板子边缘远离电源模块和功率开关管下面铺一块 2cm×2cm 的铜皮打十几个过孔到地平面这样自热误差可以控制在 0.3°C 以内。还有一个细节是芯片的安装方式。如果是贴片封装芯片通过引脚和底部焊盘散热PCB 铜皮面积直接影响散热效果。如果是插件封装芯片悬空在板子上散热主要靠引脚自热误差会更大。所以优先选贴片封装并且把底部焊盘焊好不要留空洞。4.2 远程测温的线缆电阻补偿与二极管一致性处理远程测温的误差来源比本地测温复杂得多。虽然电流激励法理论上可以消除线缆电阻的影响但实际电路中还是有一些残余误差。首先是二极管的一致性不同批次的二极管正向压降特性有差异同一批次的不同个体也有差异。如果多个远程通道用不同的二极管通道之间的温度读数会有系统性偏差。处理二极管一致性的方法是校准。在已知温度下比如冰水混合物 0°C 或者恒温槽 25°C读取每个通道的温度值计算与标准值的偏差把这个偏差作为偏移量存在 MCU 的 EEPROM 里运行时从原始读数中减去偏移量。校准一次可以管很久因为二极管的特性漂移很慢。线缆电阻的残余影响主要来自芯片内部电流源的匹配度。如果两个电流源的比值不精确压差测量就会有误差。这个误差通常很小在 0.1°C 量级对于 HVAC 应用来说可以接受。如果对精度要求特别高可以在校准阶段一并修正。还有一个容易被忽略的问题是远程二极管的接法。有些设计为了省事把二极管的基极和集电极短接后当阳极发射极当阴极这是标准接法。但如果二极管封装里有多个 PN 结比如某些带保护二极管的器件就会引入额外的电流通路导致测量错误。所以远程测温用的二极管一定要选纯 PN 结的不要用带保护功能的。4.3 实际校准流程与数据记录方法校准流程我一般分三步走。第一步是单点校准把所有通道放在同一个恒温环境里比如用恒温槽设定 25°C等温度稳定后读取各通道读数计算每个通道与标准值的偏差。第二步是多点校准在 0°C、25°C、50°C 三个温度点分别读取检查偏差是否随温度变化。如果偏差基本恒定单点校准就够了如果偏差随温度变化就要做线性拟合用斜率和截距两个参数来修正。第三步是现场验证把校准后的系统装到实际设备上用标准温度计对比关键测点的读数确认误差在可接受范围内。数据记录方面我会在固件里加一个校准模式通过串口输出各通道的原始数据和校准后的数据方便用电脑记录和分析。校准参数存在 EEPROM 里掉电不丢失。如果现场需要重新校准可以通过串口命令进入校准模式不需要重新烧录固件。校准步骤操作内容记录数据注意事项单点校准恒温槽 25°C读取各通道原始读数、标准值、偏差等温度稳定至少 10 分钟多点校准0°C、25°C、50°C 分别读取各点偏差、拟合斜率截距注意恒温槽温度均匀性现场验证实际设备上对比标准温度计关键测点读数、误差避开气流和热源干扰5. 调试中遇到的真实问题与排查链路5.1 远程通道读数跳变从电源噪声查到地线环路项目调试阶段遇到过一个典型问题远程通道的温度读数每隔几秒跳变一次跳变幅度大概 2°C 到 3°C本地通道却很稳定。一开始怀疑是 I2C 通信误码用逻辑分析仪抓了 I2C 波形发现数据本身没问题读出来的原始数据确实在跳。那就说明是模拟前端的噪声问题。先查电源。用示波器看 PJ85718DM 的电源引脚发现上面有几十毫伏的纹波频率跟开关电源的开关频率一致。在电源引脚旁边加了一个 100nF 加 10uF 的退耦电容纹波明显减小但读数跳变只是稍微好转没有根除。再查地线。发现远程通道的地线和本地地线在 PCB 上汇合点离芯片地引脚比较远形成了一个地环路。把远程通道的地线单独走一根到芯片地引脚跳变幅度降到 1°C 以内。最后在远程通道的二极管两端并联了一个 100nF 电容滤掉高频噪声读数终于稳定在 0.2°C 以内的波动。这个问题的根子是地线布局不合理。远程通道的电流回路和本地数字电路的电流回路共用了一段地线数字电路的开关噪声通过地线耦合到了模拟测量回路。解决办法就是给模拟部分独立的地线回路单点接地避免数字噪声串进来。5.2 I2C 通信偶发失败上拉电阻与总线电容的匹配问题另一个问题是 I2C 通信偶发失败大概每几百次读取会出现一次 NACK。用逻辑分析仪抓波形发现失败时 SDA 线的上升沿明显变缓从低到高用了将近 1 微秒而正常情况应该在 300 纳秒以内。这说明总线电容太大了上拉电阻拉不动。算了一下总线电容PCB 走线大概 10cm按每厘米 1pF 估算走线电容约 10pFPJ85718DM 的 SDA 引脚电容约 10pFPIC32MX695F512L 的 SDA 引脚电容约 10pF再加上一些杂散电容总共约 50pF。原来用的上拉电阻是 10kΩ上升时间 2.2 × R × C 2.2 × 10000 × 50e-12 1.1 微秒确实太慢了。把上拉电阻换成 2.2kΩ上升时间降到 240 纳秒通信失败率降到几乎为零。注意上拉电阻不是越小越好。电阻太小会导致低电平时灌电流过大超过器件的灌电流能力。PIC32MX695F512L 的 I2C 引脚灌电流能力通常是 3mA 左右3.3V 电源下上拉电阻最小不要低于 1kΩ。2.2kΩ 到 4.7kΩ 是比较安全的范围。5.3 本地温度偏高芯片自热与周围热源的叠加影响本地温度读数比实际环境温度高了将近 2°C这个偏差超出了预期。先确认了芯片配置转换速率和远程电流都是正常值没有异常功耗。然后用红外热像仪看板子发现芯片旁边的稳压器温度很高芯片虽然离稳压器有 1cm 距离但 PCB 铜皮把热量传过来了。解决办法是把温度芯片挪到离稳压器更远的位置中间用开槽隔断铜皮减少热传导。同时把芯片下面的铜皮面积减小虽然这样会增加自热但外部热源的影响减小更多总体误差反而降低了。最后本地温度偏差控制在 0.5°C 以内。这个案例说明本地测温的误差来源不只是芯片自身周围热源的影响往往更大。设计阶段就要考虑热布局把温度敏感器件远离发热源必要时用开槽、隔热垫等手段阻断热传导路径。6. 把这套方案用稳的几个工程习惯6.1 上电自检与传感器存在性检测产品化的时候上电自检很重要。PIC32MX695F512L 启动后先对 PJ85718DM 做一次存在性检测发一个读命令看能不能收到 ACK。如果收不到 ACK说明传感器没焊好或者 I2C 总线有问题固件进入故障模式点亮故障指示灯同时通过通信接口上报故障码。存在性检测之后还要做寄存器回读校验。写一个已知值到配置寄存器再读回来对比确认寄存器读写正常。这一步可以排除寄存器损坏或者通信干扰导致的配置错误。远程通道还要做开路检测。如果远程二极管没接或者线缆断了远程通道的读数会是一个异常值通常是满量程或者负满量程。固件里要判断这个异常值如果连续多次读到异常值就判定该通道故障上报故障码同时把该通道的温度用于控制逻辑时要做特殊处理比如用其他通道的平均值代替或者直接禁用该通道相关的控制功能。6.2 温度数据的异常值过滤与故障降级策略温度数据在运行过程中也可能出现异常值比如电磁干扰导致的单次跳变。固件里要有异常值过滤逻辑常见的方法是限幅滤波如果本次读数与上次读数的差值超过一个阈值比如 5°C就认为本次读数是异常值丢弃不用沿用上次的有效值。如果连续多次出现异常值就判定传感器故障进入降级模式。降级模式的策略要看具体应用。对于 HVAC 控制如果回风温度传感器故障可以暂时用送风温度或者室外温度来估算维持基本控制功能同时上报故障提醒维护。如果盘管温度传感器故障可能就要停止压缩机防止冻结或者过热。降级策略的设计要结合具体设备的安全要求不能一概而论。6.3 长期运行的数据漂移监测与预防性维护温度传感器长期运行会有漂移虽然漂移量通常很小但对于需要长期无人值守的 HVAC 设备来说漂移累积起来也可能导致控制偏差。固件里可以加一个漂移监测逻辑定期把本地温度和远程通道中安装在同一个热环境里的通道做对比如果偏差超过阈值就上报漂移警告。预防性维护方面可以在设备维护手册里写明温度传感器的校准周期通常建议每年校准一次。如果设备有远程通信功能可以把温度数据上传到云端做长期趋势分析发现异常漂移提前预警。这些工程习惯看起来不起眼但真正到了现场运行阶段能省下大量排查时间。我在实际项目里还养成了一个习惯把每次调试过程中遇到的温度异常现象、排查过程、解决办法都记在一个调试日志里包括当时的波形截图、寄存器配置、环境条件。这个日志在后续项目里参考价值极大很多问题其实是重复出现的有日志就能快速定位。温度采集这件事原理不复杂但细节特别多把细节都记录下来下次就能少走弯路。
阅读完成 · 觉得有帮助?
咨询建站