news 2026/10/22 17:02:15

基于PIC18F87J50与PJ85718DM的双通道温度监测方案在HVAC控制器中的应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于PIC18F87J50与PJ85718DM的双通道温度监测方案在HVAC控制器中的应用

做HVAC控制器的朋友都清楚,“测温度”这三个字看着简单,实际上一旦牵扯到多点测量,事情就琐碎得让人头大。我最近在弄一套本地/远端双通道温度监测模块,主控用的PIC18F87J50,传感器用的PJ85718DM,专门解决HVAC里两类典型测点:一类是控制器自己柜内温度、PCB板温这种“本地温度”,另一类是送风管、回风管、冷冻水管表面这种离主板一两米甚至更远的“远端温度”。折腾下来,整块板子用一颗传感器加一颗8位MCU就把两路温度同时拿下了,还顺手留了RS-485上报和USB调试口。这篇文章把整个方案的选型理由、硬件接线、固件流程、校准方法和实测踩坑完整过一遍,适合正在做HVAC控制器、楼宇自控或工业嵌入式温度采集的工程师参考。

1. 这套测温组合盯的是HVAC现场的哪两类温点

1.1 本地温度:控制器自己的“体温”

本地温度说起来不起眼,但在HVAC现场很重要。控制器装进电柜之后,柜内温度往往比车间环境高不少,变频器、接触器线圈、DC-DC电源模块全都是热源。如果控制器自身过热,轻则液晶屏老化加快、电解电容寿命缩短,重则直接触发保护动作甚至误停机。

我最初做原型时,把本地传感器放在MCU旁边,结果柜内环温只有28°C,板面实测35°C,本地读数就贴着35°C跑。这不是传感器不准,而是板上热源把传感器所在的局部环境加热了。所以本地温度通道的真正意义,是监测“控制器的热状态”,而不是“车间气温”。有了这一路,我可以根据板温做风扇调速、过热告警,甚至粗略估算整机寿命。

1.2 远端温度:真正参与工艺控制的测点

真正跟制冷/制热工艺挂钩的是远端测点。送风管里吹出来的是冷风还是热风、回风管吸回去多少度、冷冻水管表面结不结露、室外机进风温度多少,这些数据直接参与PID调节、压缩机启停和防冻保护。

PJ85718DM这类带远端通道的传感器,做法跟常规数字温度传感器不太一样:本地通道测芯片周围的环境温度,远端通道通过一个外部二极管结来测探头端的温度。也就是说,我只需要在远端探头里放一颗小信号三极管,把基极和集电极短接成二极管,就能把温度测量点从PCB表面“搬”到几十厘米甚至几米外的风管、水管上去。这也是“本地与远程温度”这个名字的由来。

1.3 为什么双通道单芯片比两颗传感器划算

一开始我也想过用两颗独立的数字温度传感器,一颗在板上、一颗装远端探头。后来对比了一下,发现双通道单芯片方案优势明显:BOM少一颗器件的钱,PCB少一个封装的位置,I2C总线上少一个节点,而且两路温度在同一个转换周期内完成采样,天然同步,不会出现“先是本地后是远端”的时间差。对HVAC这种需要本地和远端做温差判断的应用来说,同步性很重要。

当然代价也有:远端探头不能直接买现成的NTC封装,得自己定制传感器探头,把三极管接成二极管形式封装进去,这一点在方案规划阶段就要想清楚。

2. 选型逻辑:PJ85718DM和PIC18F87J50各自看中什么

2.1 传感器的远端测温原理与选型要点

选传感器之前,得先搞明白远端通道是怎么测温的。PJ85718DM这类器件不是直接测电阻,而是测二极管结电压随温度的变化:芯片对连接在远端通道上的二极管先后灌两个不同电流,常见的是10µA和100µA,然后测两次Vbe的差值ΔVbe。理论关系是:

T = ΔVbe / (η × (k/q) × ln(N))

其中η是二极管的理想系数,大约在1.0几;k/q约等于86.7µV/K;N是两个电流的比值。按N=20、η=1.004算,大概每260µV的ΔVbe变化对应1K温度。正因为测的是电压差而不是绝对电压,这种方案对环境温度、芯片自身温漂都不敏感,精度能做上去。

选型时除了双通道这个核心需求,我主要看几点:I2C地址是否可通过引脚配置、温度分辨率、精度等级、转换速率、远端通道的开短路检测、是否有ALERT输出引脚、供电电压和工业级温度范围。PJ85718DM在这几项上都能对上,尤其是远端通道带开路/短路检测,这对现场线缆连接可靠性非常重要。

提醒一下:具体到PJ85718DM某一批次的寄存器地址、位域定义、精度参数,务必以你手上那版DataSheet为准。下面讲的流程是按这类双通道温度传感器的通用做法展开的,拿到芯片后第一件事就是把寄存器一章通读一遍。

2.2 主控选型:PIC18F87J50为什么够用且好用

选PIC18F87J50不是因为它性能多炸裂,而是这个8位MCU在一个封装里把HVAC控制器最常用的外设备齐了。128KB Flash和约4KB SRAM,跑温度采集逻辑加Modbus协议绰绰有余;1KB EEPROM正好存校准系数和设备参数;最高48MHz运行、16MIPS,3.3V供电;两个MSSP模块,一路I2C挂温度传感器,另一路还能挂外部EEPROM或者SPI显示屏;两个EUSART,一路走RS-485接上位机或楼宇管理系统,另一路留作调试打印;USB 2.0全速设备控制器可以做本地配置和数据导出;10位ADC多通道留着接NTC备份或者干接点检测。工业级温度范围-40~+85°C,做HVAC控制器绰绰有余。

很多人问,这种应用为什么不上32位?我的回答是,HVAC控制逻辑为主,不需要跑操作系统,16MIPS做每秒几十次的温度采样和轮询式Modbus通信完全够用,8位MCU开发快、价格稳定、工具链成熟,供货周期也好把控。设备选型不是选参数最高的,而是选刚刚好能覆盖需求并且留有余量的。

2.3 和常见替代方案的取舍对比

方案本地+远端实现方式主要痛点
NTC + MCU内部ADC板载一颗NTC,远端再拉一颗NTC线性化、分压电阻精度、自热、线阻、长期漂移,逐台校准成本高
两颗独立I2C数字传感器板载一颗,远端探头一颗BOM增加、地址可能冲突、两路采样时间不同步
一棵总线挂多颗单总线数字传感器多颗器件挂在一条单总线上时序要求苛刻、连线电容影响大、多节点管理和供电问题
PJ85718DM双通道方案一颗芯片测本地+远端二极管通道远端探头需要自行制作或采购,手册细节要捂清楚

对这个项目来说,双通道方案的综合成本、精度和抗干扰能力最均衡,所以我最终定了这条线。

3. 硬件连接与布线:远端精度在第一道关口

3.1 供电、去耦和VCAP电容

整个系统用3.3V单电源。如果前端是DC-DC输出,建议后面再加一颗LDO,温飘小,纹波也干净。传感器供电我加了RC滤波,10Ω串联电阻加0.1µF对地电容,把数字IO耦合过来的毛刺滤一滤。MCU每个VDD/VSS对都要就近放0.1µF去耦电容,不要为了省位置共用。

这里有个非常容易漏的细节:PIC18F87J50内部有稳压器,VCAP管脚必须按手册接一颗电容,典型值通常是10µF。这颗电容没焊或者虚焊,MCU上电后电流偏大、程序就是不跑。我后面排查坑的时候第一个遇到的就是它,后面专门讲。

传感器SDA、SCL上拉电阻接到3.3V,具体阻值按总线电容算,下面小节细说。远端探头连接器附近要加TVS管,防止现场线缆引入的静电和浪涌打坏传感器。

3.2 I2C上拉电阻怎么算

I2C上拉阻值不是拍脑袋选的。总线上升时间约等于2.2 × Rp × Cbus,Cbus包括PCB走线电容(约0.5~1pF/cm)、传感器引脚的输入电容和MCU引脚电容。假设总线电容150pF,用4.7k上拉,上升时间约1.55µs;100kHz标准模式要求上升时间在1µs以内,这个配置就偏慢了。换成2.2k上拉,上升时间约0.73µs,余量就出来了。

所以我的建议是:HVAC控制板里走线不长、附近又有变频器这类干扰源,直接用100kHz速率加2.2k上拉,稳字当头。别为了数据手册上写着支持400kHz就硬上高速,现场电柜里电缆一绕、电容一大,400kHz的时序余量会被吃掉一大截,偶发NACK和死锁就来了。

3.3 远端二极管的接法与走线原则

远端探头端的小信号三极管,必须按二极管接法接:基极和集电极短接,发射极接传感器的D-。三极管型号选择上,用常见的通用小信号三极管就好,B极和C极短接后等效为一个PN结。有些传感器的远端通道也可以直接接二极管,但三极管接法的一致性更好,精度更高。

走线方面,远端测量线尽量用双绞线,或者一左一右贴着地线走。绝对不要跟继电器线圈、PWM电机驱动线、压缩机启停线并行走长距离。非要并行的话,加屏蔽层并且屏蔽层单端接地,别两端都接地,否则会形成地环流。

信号线长短也很关键。30cm以内两线制没问题;超过1米建议用四线开尔文接法,用独立的导线承载电流和测量电压。原因在于,远端测量靠的是两个电流之间的ΔVbe,线阻会直接叠进去。简单估算:如果两个电流分别是10µA和100µA,差值是90µA,线阻每增加1Ω,等效温度误差就是90µV除以260µV/K,大约0.35K。5米长0.15Ω/m的双绞线,一去一回就是1.5Ω,误差接近0.5K,足够影响HVAC的温差判断了。如果你要拉几十米,那就别硬拉二极管线了,在探头端放一个小变送器,转成RS-485或4-20mA再传回来,比什么都靠谱。

3.4 探头安装的现场细节

风管里测温度,探头插入深度至少要达到风管断面的三分之一,否则测到的是贴壁的边界层温度,不是主流区温度。探头要迎着气流方向,固定牢靠,开孔处做好密封,防止漏风。水管表面测温度,表面一定要清理干净,涂导热硅脂,再用金属卡箍压紧。最容易被忽略的一步是加保温棉:如果不把探头和管壁的接触点整体包起来,环境温度会沿着探头外壳漏进去,测出来的“管壁温度”其实是管壁和环境温度的混合值。

这些安装细节,对精度的影响往往比芯片本身的误差大得多。

4. 固件实现:读时序、换算、滤波与失败处理

4.1 一次完整的I2C读取流程

温度采集的固件核心就是I2C读取。流程分四步:发开始条件,写器件地址加写位,写寄存器指针;然后发重复开始条件,写器件地址加读位;读温度和状态字节,最后一个字节回NACK;最后发停止条件。

这里用重复开始而不用“停止-开始”的方式,是因为有些传感器对断开后的连续访问很敏感,重复开始最稳妥。代码骨架如下:

uint8_t i2c_read_reg(uint8_t dev_addr, uint8_t reg, uint8_t *data, uint8_t n) { if (I2C1_Start() != I2C_OK) return I2C_ERR_BUS; I2C1_Write(dev_addr << 1); // 器件地址 + 写位 I2C1_Write(reg); // 寄存器指针 I2C1_Restart(); I2C1_Write((dev_addr << 1) | 1); // 器件地址 + 读位 for (uint8_t i = 0; i < n; i++) data[i] = I2C1_Read(i == (n - 1) ? I2C_NACK : I2C_ACK); I2C1_Stop(); return I2C_OK; }

读温度寄存器的调用方式:

uint8_t buf[2]; if (i2c_read_reg(TEMP_ADDR, REG_TEMP_LOCAL, buf, 2) == I2C_OK) { int16_t raw = ((int16_t)(int8_t)buf[0] << 4) | (buf[1] >> 4); float degC = raw * 0.0625f; }

这段代码是按“12位数据左对齐存放在16位寄存器中”的常见布局写的,如果你的器件是高字节只存整数、低字节高4位存小数,右移量要相应调整。寄存器位域和分辨率务必以手册为准。

4.2 补码换算与字节序的坑

温度寄存器在负温下以补码存放,这里有个非常典型的坑:如果高字节是0xFE,直接按无符号处理会变成254,再乘分辨率就会得出一个正得离谱的温度。必须在移位之前把高字节转成int8_t,让符号位正确扩展。

举例:buf[0]=0x1A,buf[1]=0x90,按上面的公式raw=(26<<4)|9=425,乘0.0625就是26.5625°C。如果buf[0]=0xFE,先转换成-2,再左移4位得到-32,乘0.0625就是-2.0°C。很多刚上手的人在这里踩坑,读负温时怎么都对不上。

远端通道的读法和本地通道完全一样,只是寄存器地址不同。注意有些芯片的远端温度寄存器在未配置时会返回默认值,而不是实时测量值,这一点我后面讲坑的时候会具体说。

4.3 滤波策略与坏值上报

HVAC现场温度信号本身变化不快,但容易叠加干扰尖峰。我用的是“三取中值+16次滑动平均”的组合,先去掉毛刺,再平滑输出。对控制环路输出滤波后的值,但诊断用原始值,这样即使滤波滞后一点,也不影响故障判断。

坏值处理更要命。远端二极管一旦开路或者短路,读回来的温度会瞬间跳到异常值。我的做法是:每轮读取都先看状态寄存器里的开短路标志,有问题就直接让上层拿到错误码,而不是继续用上一次的好值。因为在HVAC应用里,拿旧值撑着会让PID误判,可能导致压缩机持续运行或者防冻保护失效,这是安全隐患。

4.4 I2C超时与总线恢复

再稳定的总线也有抽风的时候,特别是电柜里变频器一启动,近场辐射把SDA上抖出毛刺,就会偶尔卡死。我在主循环里记录最近一次I2C成功的时间,超过500ms就认为总线异常,执行恢复流程:

void i2c_recover(void) { // SCL连续给9个脉冲,让挂在总线上的从机释放时钟 GPIO_SCL = 0; for (uint8_t i = 0; i < 9; i++) { GPIO_SCL = 1; delay_5us(); GPIO_SCL = 0; delay_5us(); } I2C1_Init(); // 重新初始化主模式 }

这个恢复函数要在主循环里调用,不能在中断里做,因为它依赖毫秒级延时。另外,整个I2C通信尽量统一放在主循环的定时器里触发,不要在PWM中断或者电机控制中断里去发I2C,否则高优先级中断一嵌套,时序就乱了。

5. 校准与HVAC工况下容易忽略的误差源

5.1 自热误差的识别与处理

板载本地传感器必然受板上发热元件影响,这个误差不是芯片能解决的。我习惯在第一次上电时做一次“静置测试”:板子放在已知温度的恒温箱里,通电但不加载任何外部负载,等半小时,看本地读数比箱温高多少。高出部分就是自热+周边热源导致的固定偏差。

这个偏差在软件里做一个负偏移补偿掉。但要注意,固定偏移只在通风条件不变时成立。如果实际装在风道里,气流会带走一部分热量,同一块板子的自热偏移会变小。所以更稳妥的做法是,把本地传感器放在气流入口附近,并且只补偿那部分不受气流影响的基础自热。

5.2 两点校准的完整步骤

校准时我按下面几步走:

  1. 把整个测温模块放进冰水槽,槽里放足量碎冰和水的混合物,稳定10分钟,记录本地和远端读数M1。
  2. 把模块移到恒温箱,设定60°C(或你系统的主要工作温度附近),稳定后记录读数M2。
  3. 用精密温度计读参考值T1、T2(参考温度计精度至少±0.1°C),计算增益和偏移:k=(T2-T1)/(M2-M1),b=T1-k×M1。
  4. 把k、b存进PIC18F87J50的内置EEPROM,开机加载后对原始读数做y=k×x+b修正。
  5. 再用第三个点(比如室温25°C)验证修正后的误差。

校准系数最好限制在±2°C以内的修正量,如果算出来要修3°C以上,别急着写补偿,先回头查探头安装热阻和线阻,大概率是系统问题而不是传感器问题。

5.3 线阻与二极管理想系数的修正

远端通道的线阻误差前面已经量化过:大约每1Ω线阻引入0.35K的偏差。在软件里可以做一个固定补偿,但前提是线缆长度固定。如果现场线缆长度不固定,最好采购时把线长也固定下来,比如统一用2米探头线,这样补偿值就是确定的。

另外一类误差来自二极管理想系数η。不同批次的二极管,η会在1.0到1.02之间波动,影响大约0.5~1K。有些传感器寄存器里提供了理想系数配置项,出厂校准过的探头可以把这个系数写进去;没有的话,就在两点校准时一起吃掉这个误差。

5.4 时间常数、气流和“系统误差”

温度传感器还有一个躲不开的指标叫时间常数。风管里的气流速度快,探头响应能到数十秒级别;贴在水管表面的探头,热阻大,响应可能要好几分钟。这意味着校准时不能拿刚落稳的温度读数就做计算,必须等探头和介质充分热平衡。

还有个很容易翻车的点:风管里测回来的温度跟水系统管壁温度,两者的“热历史”完全不同。管壁探头如果不加保温,环境温度变化会让读数跟着漂。所以我在现场一直坚持的规矩是:固定好探头之后,至少等5~10分钟热稳定再开机校准。别让工人一装上就催你调零,那时候测出来的偏移跟实际工况对不上。

6. 实测数据与现场踩坑记录

6.1 一组有代表性的实测结果

我把这套测温模块做了三个温度点的验证,远端探头用2米双绞屏蔽线,探头贴在恒温箱内的金属导热块上,精密温度计做参考。校准点选在0°C和60°C,验证点在室温25°C附近。

基准温度校准前本地读数校准前远端读数校准后本地误差校准后远端误差
0.0°C+0.4°C+0.9°C-0.1°C+0.1°C
25.0°C+0.5°C+0.7°C+0.1°C-0.2°C
60.0°C+0.6°C+0.8°C+0.2°C+0.3°C

校准前远端整体偏高,主要原因就是2米线缆的线路电阻和探头热阻。两点校准之后,本地和远端误差都压到了±0.3°C以内,满足HVAC通常要求的±0.5°C指标。

6.2 踩过的三个具体坑

第一个坑就是VCAP电容。样机第一次上电,现象是MCU复位脚电平正常、晶振有波形、电源电压正常,但程序就是不跑,量功耗还偏高。排查了两小时,最后翻手册看到内置稳压器需要对VCAP管脚接外部电容,补上一颗10µF之后立刻恢复正常。这个坑太经典了,用这颗MCU的朋友一定先把VCAP搞定。

第二个坑是I2C偶发死锁。实验室样机上一切正常,装进电柜靠近变频器走线之后,温度读数偶尔变成0xFF或者读超时。最后把速率从400kHz降到100kHz、上拉改成2.2k、SDA和SCL各串33Ω电阻,再加上9脉冲恢复函数,之后连续通电一周没再死锁。我的结论是,工业现场别迷信高速I2C。

第三个坑是远端读数“跟着本地跑”。一开始我远端读回来的温度跟本地几乎一样,我还以为探头没插好。后来查配置寄存器才发现,芯片默认情况下远端通道处于关闭状态,我初始化的时候没有把远端使能和转换模式配置到位,读回来的只是默认填充值。按手册重新配置之后,远端读数才真正反映探头端温度。

6.3 排查速查表

现象可能原因解决办法
本地温度比柜内温度高3°C以上板上热源耦合、自热严重优化布局、加挡风板、补偿固定偏移
远端读数随线缆长度明显漂移线路电阻引入ΔVbe误差四线开尔文接法,或软件补偿线阻
I2C偶发超时或读到0xFF上拉过大、总线电容大、速率过高换2.2k上拉、降到100kHz、串电阻、加总线恢复
远端读数为固定值或跟着本地变远端通道未使能、二极管开路/短路检查配置寄存器、状态寄存器、探头接线
MCU上电不工作且电流偏大VCAP电容缺失或容值不对按手册补接VCAP电容
校准后温度仍然非线性偏差探头安装热阻大、气流不稳、参考点未平衡改善接触、包保温棉、延长热稳定时间

6.4 如果要推向量产,还得补几件事

原型跑通只是第一步。真到量产,我会再补三样东西:一是一台简易自动校准工装,用恒温槽加精密温度计对每块板子做两点校准,把k、b烧进EEPROM;二是把出厂抽检改成-20°C、25°C、60°C三点验证,每台保留校准记录,方便追溯;三是在固件里加看门狗和上电自检,确保传感器故障时控制器能安全退守到预设值,而不是带着错误温度继续运行。

最后聊点个人体会。这类测温模块真正决定精度的,往往不在芯片,而在安装和线缆。芯片手册里写的±0.5°C都是理想条件,探头松松垮垮顶在金属管壁上、风管里半悬空、线缆沿着强电桥架绕一圈,误差翻倍是常有的事。所以我做这类项目总是把校准接口、测温备份通道和探头安装余量留足,固件里把坏值标志做得干净利落,剩下的就是现场调试的耐心。这套双通道方案跑下来,冷热源两路管温、柜内温度和送风温度都能稳定上报,整体误差控制在±0.5°C以内,对我这边的HVAC应用来说已经够用了。后面如果再把RS-485走Modbus和USB调试那部分单独整理出来,我再写一篇续文。

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

Spark推荐系统实战:从离线统计到在线内容推荐的架构与实现

/* 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 17:01:58

HVAC温控节点设计:PJ85718DM+PIC18F4515硬核选型与抗干扰实践

/* 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 17:01:04

STM32F107VC单总线温度传感器多点监测设计与LwIP远程上报

/* 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 16:57:20

【SLAM】ORB-SLAM2的源码阅读(七):KeyFrame类

/* 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 16:56:16

AI日报制作方法论:信息筛选、结构化记录与长期维护实践

1. 一份“AI 日报”到底在记录什么每天早上九点&#xff0c;我习惯先花二十分钟把过去二十四小时里跟人工智能相关的动态过一遍。这个动作坚持了快两年&#xff0c;慢慢就形成了一份固定格式的“AI 日报”。很多人以为日报就是新闻搬运&#xff0c;把标题复制粘贴、配个链接就完…

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

AI Agent框架选型:OpenClaw vs Hermes Agent实战对比与避坑指南

2026 年聊 AI Agent 框架&#xff0c;已经过了“能跑通一个 Demo 就了不起”的阶段。现在大家问的问题通常变成&#xff1a;我想让 Agent 稳定干活、能接业务系统、团队里不同水平的人都能维护&#xff0c;应该选哪个底座&#xff1f;过去半年&#xff0c;OpenClaw 和 Hermes A…

作者头像 李华