news 2026/10/22 1:12:15

HVAC温度监测方案:本地+远程双通道测温与SMBus实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HVAC温度监测方案:本地+远程双通道测温与SMBus实现

HVAC控制器里的温度监测,很多人一开始的思路很简单:控制板上放一颗温度传感器,读到一个数就往PID送。可真到了现场就会发现,风道出口、回风口、冷媒管路、机箱内部,每个点的温度都不一样,而你只有一对线缆从主板上引出来。我做过类似的暖通项目,最后用的方案是:一颗支持本地与远程双通道测量的温度芯片——PJ85718DM,负责把板内温度和远端探头温度变成数字量;一颗低功耗的STM32L031K6,负责通过SMBus总线把两路温度读回来,做处理、做报警、做上报。这套架构不算复杂,但把“本地+远程”测温一次解决,测出来的数据在HVAC这种干扰大、温差大的环境里也比想象中稳。

这篇文章写给正在做嵌入式监测板、HVAC控制器,或者只是想把多路温度监测做简单的工程师。我会把测温芯片的原理、主控选型、硬件连接、SMBus读取、校准补偿和现场部署的坑从头到尾讲一遍,落地的细节尽量给全。

1. 为什么“本地+远程”双通道结构比一路一个传感器更适合HVAC现场

1.1 板内温度和工况温度必须分开看

做HVAC控制器,最容易犯的错就是把PCB板上的温度当成环境温度。主控板上有一堆功率器件、线性电源、通讯电路,板内温度通常比真实空气温度高出好几度。风道里的温度、盘管翅片上的温度、压缩机回气管的温度,才是系统真正需要的控制参量。

这几个测温点在物理位置上和主控板离得远,少则几十厘米,多则两米以上。如果每个点单独拉一套传感器加接线端子,占用IO资源不说,PCB面积、线缆、安装工时都会翻倍。而双通道测温芯片的思路是:芯片贴在主控板上测本地温度,同时把一路远程测温探头甩到远端去测工况温度。一颗芯片,两条路,全解决了。

1.2 远程通道接的不是热敏电阻,而是二极管结

很多同事第一次看到“远程温度”通道,第一反应是:那是不是接个NTC或者PT100进去?不是。PJ85718DM这类芯片的远程通道,接的是一个二极管结构,工程上最常用的就是小信号三极管把基极和集电极短接,然后把BE结当二极管用。

为什么不用NTC?NTC的阻值和温度是非线性关系,每一个探头的一致性都有偏差,而且线缆长度不同,串联电阻的影响完全无法自动消除。二极管结则不一样:只要给PN结施加两个不同大小的电流,测两次正向压降,从两次压降的差值就能推出绝对温度。差值测量天然把线缆电阻、接触电阻这类共模误差消掉了,抗干扰能力比直接测电压强很多。这也是为什么远程测温芯片几乎都走这条技术路线。

1.3 一套完整系统需要哪些部分

整个系统摊开来看,其实只有五个部分:

  • PJ85718DM测温芯片,放在主控板上,负责本地温度测量和远程二极管探头激励与采集
  • 远程二极管探头,放在风道或盘管位置,TO-92封装的小信号三极管就能干这活
  • STM32L031K6主控MCU,通过SMBus读取芯片里的温度寄存器
  • 电源和总线电路,3.3V供电、SMBus上拉电阻、中断引脚
  • 上层逻辑:显示、报警、通讯上报,由MCU的固件具体实现

这套结构最大的好处是:真正的传感器在远端,但信号处理在主板上的专用芯片里完成,MCU不用自己做模拟信号调理,也不用额外买一路ADC采样电路。后面你会看到,这个分工让代码和硬件都清爽不少。

2. 两个核心器件的工作原理与选型理由

2.1 PJ85718DM的两路温度各是怎么测出来的

先看本地通道。PJ85718DM内部有一个带隙基准式温度传感器,通过测量硅材料PN结在不同温度下的电压特性,换算成芯片自身的温度。这个测量是完全数字化的,芯片自己完成模数转换,MCU只需要读寄存器。本地温度的读数代表的是芯片所在PCB位置的温度,也就是主控板附近的板温。

远程通道则完全换了一套原理。芯片会在D+和D-两个引脚上,给外接的二极管结构施加两个不同幅度的激励电流。两次电流下的正向压降分别为V1和V2,而两个PN结电压的差值ΔV与绝对温度呈严格的线性关系,具体公式不展开,但要理解核心点在于:温度信息藏在两次电压的差值里,而不是某个绝对电压值里。这带来两个好处:线电阻和接触电阻被抵消,长期漂移被抵消。

远程通道里还有一个关键处理是“理想因子”补偿。不同型号的三极管或二极管的结特性略有差异,芯片里一般有配置位可以设置理想因子系数,常见的约等于1.008的补偿值能让多数小信号三极管测得更准。这个细节在第五章校准部分还会专门说。

2.2 STM32L031K6为什么能压住这个场景

主控的选择逻辑并不复杂:不需要跑复杂的算法,不需要大容量存储,但要低功耗、小封装、价格合适,还要有稳定的I2C/SMBus接口。STM32L031K6属于低功耗系列里的入门款,Cortex-M0+内核,最高主频32MHz,Flash有64KB,SRAM有8KB,做温度采集加RS485透传完全够用。

它的I2C控制器天生支持SMBus时序,包括PEC(包错误校验)和超时检测,直接对接PJ85718DM这类SMBus接口的温度芯片很顺手。另外还有独立的低功耗定时器和多种Stop模式,系统在两次温度采样之间可以睡得很深,实测整套采集节点的平均功耗能做到很低,这对从HVAC主板上取电的应用非常重要——很多面板供电本身就没多少余量。

2.3 为什么不直接用MCU内置ADC测二极管

这是我会被反复问到的问题,答案很直接:精度和校准成本都兜不住。MCU内置ADC通常只有12位,直接测0.6V左右的正向压降,0.1℃的温度变化对应的电压变化只有零点几毫伏,ADC噪声和基准漂移就足以淹没信号。更麻烦的是,不同MCU的ADC通道阻抗、采样电容差异很大,采集探头的线缆阻抗稍一变,读数就飘。

PJ85718DM这种专用温度芯片等于把整个模拟前端做完了:可编程激励电流、斩波放大器、高分辨率ADC、非线性校正、数字滤波,全部封装在里面,MCU只拿数字结果。这套分工比用万用表去测压降再查表,精准省事至少一个数量级。用一句话总结:模拟的脏活累活交给专用芯片,MCU只做数字层面的搬运和判断。

3. 硬件连接与PCB布置:远程探头、布线和电源分配

3.1 远程探头的正确接法

远程二极管的接法看着简单,但细节决定成败。最标准的做法:找一颗小信号NPN三极管,例如常见的通用型号,把基极和集电极短接,剩下的BE结就是一个二极管。D+引脚接三极管的基极/集电极短接端,D-引脚接发射极,极性绝对不能反。反接的后果通常是远程温度读出固定的无效值,比如0xFF之类。

探头和主板之间的连线,我建议用双绞线或者屏蔽线,长度尽量控制在2米以内。线越长,分布电容越大,芯片在切换激励电流时建立波形需要的时间越长,可能引起读数偏差甚至通讯异常。如果非要走长线,要么降低总线速度,要么在芯片配置里把输入滤波器打开,或者换更强的驱动态档位——具体以PJ85718DM手册里的远程输入驱动设置说明为准。

D+和D-之间要不要加电容,一直是讨论点。很多人习惯加一个几纳法的电容滤波,但电容太大不行。激励电流是快速变化的信号,大电容会让电压建立变慢,激励还没稳定就开始采样,读出来的温度自然不准。我实践的结论是:如果必须加,选100pF以内的聚酯电容或C0G电容,最好先不加,测基线,再决定要不要补。

3.2 布线环节最容易被忽略的事

  • 远程线在PCB上要走差分对,两根线紧贴走,中间不要穿过多孔、不要跨分割区
  • 不要和12V开关电源的驱动走线并行,更不要贴着继电器或风机驱动走线走一大段
  • 板的边缘铺一圈保护性地,远程线走内层,两侧有地平面包裹效果最好
  • PJ85718DM本体在PCB上,如果它测的板温希望代表“机箱内部环境温度”,就要远离大功率MOS管和开关电感;但如果你想监控主板发热点,那反过来,贴片靠近发热源
  • SMBus上拉电阻通常在2k到10k之间选择,具体根据总线长度和电容决定,长线用低阻值,以往经验3.3V总线上用4.7k比较均衡

有一个我自己踩过的细节:远程二极管引线如果在PCB上刚好压在钻孔旁边,焊接时助焊剂残留会造成漏电流,远程温度在湿度大的环境里会出现周期性偏大。后来处理办法是清洗助焊剂,并且在走线底层铺地屏蔽,问题基本消失。

3.3 与STM32L031K6的引脚连接示意

PJ85718DM和STM32L031K6之间的连接相当简洁,一张表就能说清:

信号PJ85718DM引脚STM32L031K6引脚说明
SCLSCLI2C1_SCLSMBus时钟,接上拉电阻
SDASDAI2C1_SDASMBus数据,接上拉电阻
ALERT/THERMALERT/THERM任意带外部中断的GPIO温度超限或SMBus告警触发
VCCVCC3.3V电源就近100nF去耦电容
远程探头D+/D--双绞线接到远端三极管探头

STM32L031K6的外设资源做这个任务余量充足,ADDR引脚可以硬接线选择不同从机地址,如果系统里有多个温度采集节点,一片主控还能挂好几颗温度芯片。中断引脚也值得接,因为远程温度超限事件可以中断唤醒睡眠中的MCU,比轮询效率高得多。

4. SMBus协议读取与数据解析

4.1 SMBus和I2C的差异,很多人直接忽略

SMBus本质上是以I2C为基础的通信协议,但两者不是完全等同。SMBus规定总线时钟范围在10kHz到100kHz之间,比I2C快速模式约400kHz慢不少,同时它要求从机必须有超时保护——如果总线电平卡住超过35ms,设备要自动复位释放总线。

温度芯片这类面向系统管理场景的器件,默认走SMBus。我们用STM32L031K6的I2C外设对接时,只要把通信速率配置在100kHz标准模式,基本兼容;如果芯片数据手册特别要求SMBus的时序,则打开MCU外设的SMBus模式选项。另一个需要知道的是PEC(Packet Error Checking),SMBus协议可以在报文末尾追加一个CRC字节,用于校验整帧数据是否被干扰。HVAC现场有风机变频器、继电器这类强干扰源,能开PEC就尽量开,后面会看到我的惨痛教训。

4.2 典型寄存器布局与读取时序

温度芯片的寄存器布局大同小异。PJ85718DM这类产品,通常会有本地温度寄存器、远程温度寄存器、配置寄存器、上限报警寄存器、下限报警寄存器和偏移校准寄存器。具体地址必须对照手册,但读取时序套路一致:

  1. 主控发送从机地址加写位,写入要读取的寄存器地址
  2. 发送重复起始信号,主机再发地址加读位
  3. 从机返回两个字节,高字节在前低字节在后
  4. 可选读PEC字节做校验

温度数据格式一般是将11位或12位ADC结果扩展成16位。以常见的0.125℃分辨率为例子:读取到两个字节比如0x19和0xA0,拼成16位后左移去除低位无效位,再乘以分辨率系数就得到带符号温度。下面这段C代码是我常用的解析思路,按通用格式写,实际位宽请对着手册调整。

int32_t raw = (buf[0] << 8) | buf[1]; // 假设温度数据左对齐,低字节只高4位有效,分辨率0.125℃ raw = (int16_t)(raw & 0xFFF0); float temp = (float)raw / 64.0f; // 右移4位后每LSB对应0.125℃

需要特别提醒:有的芯片带符号位处理容易踩坑,尤其是低温场景下,比如零下10℃读出的原始值如果被当成无符号整数解析,会变成几十度的高温值。所以解析时先用int16_t做一次带符号转换,再按分辨率换算,顺序不能乱。

4.3 STM32端的具体读取流程

用HAL库跑起来很直白,读单字节寄存器和读多字节寄存器都可以走I2C的内存接口函数。实测下来,PJ85718DM这类SMBus设备对主控的START/STOP时序不会太挑剔,标准STM32的I2C控制器完全能覆盖。下面给一个简化例程:

float read_local_temperature(void) { uint8_t reg = LOCAL_TEMP_REG; // 本地温度寄存器地址 uint8_t buf[2] = {0}; HAL_I2C_Master_Transmit(&hi2c1, DEV_ADDR<<1, &reg, 1, 100); HAL_I2C_Master_Receive(&hi2c1, DEV_ADDR<<1, buf, 2, 100); int16_t raw = (int16_t)((buf[0] << 8) | buf[1]); return (float)(raw >> 4) * 0.125f; }

同样方式把寄存器换成远程温度寄存器,就能拿到远程读数值。关于PEC校验,实际产品中我更推荐自己实现,算好CRC后和从机返回的PEC字节比对,不匹配就丢弃本次数据,等下一次采样。不要怕多这一点代码,和现场偶发乱码比起来,它非常值。

4.4 读数据异常的快速判断

我最初调SMBus的时候,遇到不少“读出来是0xFF”“总线卡死”的情况。排查思路是有序的:

  • 读回来全是0xFF:要么地址选错,要么芯片没正常上电,要么SCL/SDA没接上拉
  • 发送地址后无ACK:地址线配置错误,或者芯片在复位状态
  • 温度值忽高忽低:远程线受干扰,检查屏蔽和滤波电容,同时确认PEC校验是否打开
  • 固定读出0x7F或负数:字节序或符号位解析错误,仔细对一下手册里的数据格式示例

这些现象和排查顺序我是吃过亏才记住的。每次都先量硬件时序,不要一上来就改软件。

5. 误差来源与校准补偿:把“能读”变成“测得准”

5.1 哪些因素会拖精度后腿

裸读回来的温度值,直接拿去控制HVAC设备,长期运行能不能稳,取决于你有没有认真处理下面几个误差源。

第一个是传感器自热。PJ85718DM在远程通道会持续给二极管施加激励电流,探头本身会有一点自热,在气流静止的环境里尤其明显。解决办法是尽量用低占空比测量,芯片支持单次转换模式就单次转换,不要一直连续跑。

第二个是远程线电阻。虽然差分测量抵消了大部分共模电阻,但D+线上的串联电阻会在激励电流下产生额外压降,让芯片误以为二极管的压降更大、温度更高。现象是:线越长,读出的温度越高。这个误差不是固定值,和电流大小、线阻大小都有关系,必须靠校准寄存器补偿。

第三个是二极管理想因子。不同批次的三极管,BE结加工特性会有离散,典型芯片可以在配置寄存器里写理想因子补偿位。如果你用手头的通用三极管,默认值通常已经合适;如果用了比较特殊的二极管,校准的时候最好三种补偿档位都试一下,看读数收敛情况。

5.2 校准流程:单点法还是两点法

对大多数HVAC应用来说,单点偏移校准就够用了。拿一支计量过的铂电阻温度计作基准,把远程探头和铂电阻绑在同一个导热块上,等温度稳定到目标值附近,读出PJ85718DM的远程温度和基准温度的差值,把这个差值写到偏移寄存器里。

单点校准的局限性在于它只平移误差曲线,不纠正斜率误差。如果本地和远程测温范围很大,比如从零下20℃到80℃,建议做两点校准。比如在0℃附近做一次,在60℃附近做一次,计算出偏移量和增益修正量,分别写入对应的校准寄存器和理想因子配置位。这样曲线两端都会被拉正。

实际操作里,我很推荐用冰水混合物做0℃基准点。把探头插进碎冰和水的混合物里,等读数稳定,此时参考温度就是0℃附近。又便宜又准,比恒温槽省事太多。

5.3 线阻补偿的一次实测

在某项目中我们把远程探头的连线从0.3米加到3米,发现远程温度读数明显偏高了将近1度。为了量化这个问题,我在D+线上串了一个可调电阻箱,从0.5Ω一直加到5Ω,每次记录远程温度增量。结果基本上是线性的,大约每串1Ω线阻,温度偏高0.5℃附近。这个具体比例和芯片激励电流有关,但“串线阻导致温度偏高”这个方向是一致的。

知道这个规律后,现场就可以不猜了:先用万用表实测D+和D-到探头的回路电阻,按线阻比例算出需要补偿的偏移量,写入偏移寄存器。关键在于要知道这个测试的时机:D+和D-的线缆直接到探头,万用表量到的串联电阻是两个方向的叠加,取一半就是单线电阻的影响估计,校准过程可以先半量试测,再微调。

实际操作中,我们当时没有用理论比例直接写寄存器,而是做了分段测试选值,最终用电阻箱标定曲线来拟合偏移代码。这样做的好处是可以把线材的分布电容、端子接触电阻等因素一起包括进来。

5.4 校准做完必须验证

校准不是写入参数就算完。验证时要看动态响应和静态误差两个指标:静态误差是用基准温度计同点位比对,误差落在预期范围内;动态响应是把探头从室温徒手捂热,观察温度变化的上升时间,确认探头导热好、没有被塑料壳或导热硅脂隔住。

这里有一个容易翻车的点:远程探头贴在盘管翅片上测量冷媒温度,如果探头只是压在翅片表面没有良好接触,测到的温度更多是接触点附近空气的温度,响应慢还抖动。正确做法是探头和翅片之间涂少量导热硅脂,再用卡扣压紧,尽量让整个探头的导热路径指向翅片。

6. HVAC现场部署踩过的坑与处理建议

6.1 探头放错位置,再准的芯片也白搭

判断一个测温点位放得不对,有个很明显的特征:温度读数看起来“合理”,但控制效果始终不对。比如风道温度探头离加热器出风口太近,那读到的基本是热风温度,而不是风道内部静压段的平均温度。

我现在的习惯是,每个测温点在定方案之前先问三个问题:这个位置的气流代表什么状态?探头会不会受到辐射热影响?维护时探头能不能够得着?辐射热是经常被忽略的一项,太阳晒到的风管壁、排热风扇附近的空气,都会让探头的读数偏离真实值。给探头做一个小隔热罩,遮住来自热源方向的辐射,往往比换传感器更有效。

6.2 变频器、继电器和PWM风机把总线搞乱

现场最让我头疼的干扰源,是变频器和PWM风机。只要这些设备动作,SMBus总线上就能看到一簇一簇的毛刺,严重的时候温度读数会瞬间跳几度,再突然恢复。

处理这种问题的层次是这样:先硬件隔离,远程线的屏蔽层单端接地,导线尽量短,SMBus上拉电阻适当降低到2.2k左右增强驱动能力;再软件加固,MCU开启PEC校验、连续读两次一致性判断、丢弃异常跳变数据。我们最终是把远程线换成了带屏蔽的双绞线,布线和动力线保持30cm以上距离,配合PEC校验,问题基本绝迹。

这里必须说一句:不要指望靠软件滤波把一切脏数据洗白。如果硬件上干扰耦合严重,软件里加再多重采样也只是治标,回到布线源头解决才是治本。

6.3 低温结露和长期可靠性

HVAC环境对温度探头最不友好的是换热器附近的高湿低湿交替。低温时探头表面结露,水膜改变了二极管引脚之间的绝缘阻抗,远程温度读数可能出现异常偏移。我们的处理是在探头区域做简单的防水处理:用热缩管把三极管封装部分和引线根部包好,再灌少量环氧或是点胶固定。注意不要整个探头厚厚包一层,否则热阻太大,测温响应时间会变得很难看。

另外一个长期可靠性问题是端子氧化。工业现场端子压接久了,接触电阻上升,远程通道的线阻补偿就会失效。建议运维周期里加一个自检项目:定期用“远程温度异常”标志位检查一下探头有没有开路或短路,不要等到温度数据出偏差了再去现场。

6.4 批量一致性和量产校准

做了三个样板测得很准,不代表一百台都能准。批量生产时,不同批次的三极管探头的理想因子可能差一点,线缆长度也会不一样,这些都是校准参数需要覆盖的。

我们量产时的做法是:调试产线阶段先跑一台完整的两点标定,把偏移寄存器和理想因子配置默认值写进固件;然后每台整机出厂前跑一次单点快速校验,只测风道探头在常温附近的读数,偏差超过阈值就重新校准。校准参数可以直接存在STM32L031K6的Flash中,掉电不丢,方便追溯。

还有一个小技巧,批量烧录时把芯片序列和校准参数绑定,远程维护的时候可以通过读取校准区的标识判断这台设备用的是哪一批探头,排查起来快很多。

最后分享一个小技巧

整个过程走下来,最想提醒后来者的一点是:远程通道的线阻补偿一定要趁早做,不要等现场出了问题再回来补。新画板子时,就应当在D+/D-回路上留出可测的测试点,也尽量在固件层面对外暴露偏移寄存器接口,这样标定时不需要重新编译固件就能现场调校。另一个是我每次复盘必提的:哪怕你当前项目里SMBus总线上只有一颗温度芯片,PEC校验也一定要开起来,HVAC现场的干扰防不胜防,多一字节校验,等于给数据多了一道护身符。温度监测这种环节看起来简单,但一旦数据源不可信,上游PID控制逻辑再漂亮都是在错误的地基上盖楼。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/22 1:11:07

PJ85718DM+PIC24EP温控方案:抗干扰数字传感与硬件滤波实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/22 1:10:59

STM32L432KC 与 PJ85718DM 双路温度采集设计与实现细节

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/22 1:10:58

PJ85718DM+ATmega1280工业温度监测系统设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/22 1:10:55

基于PJ85718DM与PIC18F85J50的双路温度采集HVAC温控方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/22 1:09:19

CAD辅助CATIA三维文字制作:从文字分解到凸台拉伸的完整流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/22 1:08:30

嵌入式温度监测实战:PJ85718DM+STM32F723IE双通道测温方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华