作为常年和暖通控制、嵌入式电路打交道的人,拿到这个题目会习惯性先问三个问题:测哪里、隔多远、精度要多少。PJ85718DM 和 PIC18F86J11 这套组合,恰好可以回答这三个问题——前者负责温度感知,后者负责数据处理和控制调度。这篇文章就围绕这套组合,把本地与远程温度监测从硬件连接、软件驱动、现场标定到问题排查的完整过程,掰开揉碎讲清楚。
无论你是做 HVAC 系统集成,还是在嵌入式项目里需要多点测温,这篇内容都适合。我会先讲清楚为什么这个方案能落地,再给出一套可以照着画的电路和能直接用的代码片段,最后聊一聊只有实际跑过现场才会注意到的坑。
1. 项目拆解:从需求到器件选型的核心逻辑
1.1 嵌入式与HVAC场景中的温度监测需求
HVAC 系统里看起来是“测个温度”,真正落地时却要面对不少麻烦。本地温度通常指控制柜内部或者回风口附近的空气温度,芯片直接贴在 PCB 上或者放在机箱内就能感知;远程温度则是室外机盘管、送风管道深处、冷却水管壁面这类远离主控板的测量点。测量点分布范围从几十厘米到几十米都有,中间可能还要穿过强电走线槽和金属桥架,这对传感器前端和通信链路都有很实际的要求。
嵌入式侧的核心需求是“读得准、反应快、不拖后腿”。PIC18F86J11 这种大容量、多外设的 8 位单片机很适合作为主控,PWM 输出可以驱动风机调速,外部中断可以捕捉告警信号,多个串口和 I2C 口还能把采集到的数据分享给人机界面或者上位机。它不追求极高主频,胜在资源匹配和控制逻辑稳定,这在工业 HVAC 设备里比什么都重要。
远程测温如果做成独立节点,每个节点都要有 MCU、通信芯片和电源,成本直接翻倍。更常见的做法是选一款带“远程通道”的传感器芯片,用一对差分线把远端探头接回来。PJ85718DM 这类器件可以在同一颗芯片内同时完成本地 NTC 或硅带隙测温,以及远端二极管结电压采样,恰好贴合 HVAC 的多点测温场景。一颗芯片加两根延长线,就把“本地和远程”变成了一个很经济的方案。
1.2 为什么选择 PJ85718DM + PIC18F86J11
选型不是看谁参数好看,而是看谁能在现场长期稳定工作。PJ85718DM 采用数字接口,直接把模拟量就近数字化,抗干扰能力比模拟电压输出方案强不少;芯片内部可以完成冷端补偿和线性化,软件不用再去查非线性表。对于单片机工程师来说,最直观的价值是省掉了运放和 ADC 校准环节,把温度读数变成连续几个字节,交给 I2C 总线读回来即可。
PIC18F86J11 这侧,最大的吸引力在于外设密度。I2C 主控制器、定时器、PWM、UART 都有,单颗芯片就能承接传感器读取、阈值判断、继电器控制和通信上报。和常见的 8 位 MCU 不同,它还提供了足够的程序空间和 RAM 来放调试代码和运行日志。对于 HAVC 控制器这种需要长时间不断电的设备,成熟稳定的架构比新颖的架构更让人放心。
我不是说这套组合是唯一答案,但它在中小批量的 HVAC 控制器里很常见。项目周期紧时,我优先选自己熟悉的、驱动代码现成的器件;这颗传感器和单片机都有成熟寄存器定义,拿到数据手册就能在两天内把原型跑起来。相比用分立元件搭模拟测温电路,这套方案的开发和调试成本低得多。
1.3 系统的总体架构
整套系统可以画成一条很清晰的数据流:远端探头通过屏蔽双绞线连到 PJ85718DM 的远程测温输入;PJ85718DM 通过 I2C 总线把本地温度、远端温度、报警状态交给 PIC18F86J11;MCU 处理完数据后,一路用 PWM 控制风机或加热设备,一路通过继电器输出告警,还有一路通过 RS485 或者以太网上传给楼宇监控平台。
值得注意的是远程温度有“就近数字化”和“远端探头直接进芯片”两种实现方式。就近数字化适合探头和主控距离特别远或者环境电磁干扰大的情况;直接用 PJ85718DM 的远程通道连接探头则更适合 5~10 米内、走线规整的 HVAC 设备。单片机侧尽量把 I2C 上拉电阻靠近传感器放置,测温 IC 的电源引脚旁边加 0.1uF 和 10uF 电容,这两条细节对读数稳定性影响非常大。
2. 硬件设计与连接:本地与远程通道的搭建
2.1 PJ85718DM 的引脚与工作模式
PJ85718DM 可以说是一颗“麻雀虽小五脏俱全”的温度传感器。典型封装下会引出电源、接地、I2C 时钟、I2C 数据、报警输出和远程测温正负端口。电源电压常见为 3.3V 或 5V,I2C 电平跟着供电走,要是主控是 3.3V,传感器也统一用 3.3V,避免电平不匹配。
芯片内部有多个配置寄存器,可以设置转换分辨率、报警阈值和工作模式。我们通常在初始化时把分辨率设为 12 位,对应约 0.0625°C 的 LSB;报警阈值根据项目需求写死,比如超过 70°C 触发高温告警,低于 0°C 触发低温提示。器件还支持比较模式和中断模式两种告警输出方式,我习惯用中断模式,这样 MCU 可以通过外部引脚及时感知异常,而不是轮询寄存器。
给传感器供电时不能忽视启动瞬间的电流尖峰。HVAC 现场常有压缩机启动,浪涌会沿着电源线灌进来。我会在 LDO 输出端并一个 220uF 电解电容和两个高频瓷片电容,避免传感器电源被拉低。如果主控和传感器距离超过 5 厘米,电源和地线最好单独走一对,而不是共用长走线。
2.2 本地测温与远程测温的连接方式
本地测温相对简单:把传感器芯片放在需要监测空气温度的区域,不要让大功率电阻和散热片直接对着芯片,不然读到的是“局部热点”而不是环境温度。有些板卡把传感器放在靠近接线端子的位置,结果热量顺着铜箔传上来,实测偏高 3~5°C,这就是布局不合理。
远程测温通道要理解成一对差分输入,典型接法是接一个二极管或三极管。测温的原理是利用半导体 PN 结正向压降随温度变化的特性,远端探头的二极管必须配对合适,通常选 2N3906 这类小信号三极管,把基极和集电极短接后只留两个引脚。接线时 V+ 和 V- 不要反接,否则读到的温度会明显异常。
远程探头线材的选择是个容易被低估的环节。普通杜邦线平行拉开,稍微一靠近变频器线路就能读到噪声。远程通道线长建议控制在 10 米以内并使用屏蔽双绞线,屏蔽层一端接单片机地。实测下来,用双绞线并加磁环后,读数波动能从 ±1.2°C 降到 ±0.2°C 以内,效果非常明显。
2.3 主控电路与 I2C 总线的设计细节
PIC18F86J11 的 I2C 模块工作在主模式,需要外接上拉电阻。电阻阻值由总线电容和通信速率决定,100kHz 标准模式常用 4.7kΩ,400kHz 快速模式则用 2.2kΩ。若总线上同时挂了多个器件,上拉电阻要适当减小。我习惯在硬件调试阶段预留不同阻值的焊盘,现场根据示波器波形微调。
主控的 I/O 口还要特别注意:I2C 引脚必须配置成开漏输出,否则总线会被钳位。很多新人会踩这个坑,初始化时把引脚设成普通推挽输出,结果 SDA 拉不低,通信怎么都不通。一定要读一遍单片机数据手册关于 MSSP 模块的说明,把 PMOS 关断,只留 NMOS 负责拉低。
总线上如果同时有传感器和 EEPROM,地址冲突要提前规划。PJ85718DM 一般有两个地址引脚,通过接高接低可以组合出多个地址。用两颗传感器时,地址可以分别设为 0x48 和 0x49,然后 MCU 依次读取。注意代码里算地址时要包含读写位,0x48 的写地址是 0x90,读地址是 0x91,这种位运算的错误在调试时非常隐蔽。
2.4 电源、滤波与接地的注意事项
HVAC 现场最让人头疼的是变频器和继电器引起的电源噪声。如果传感器直接从一个没有隔离的开关电源取电,温度读数会出现周期性的毛刺。我采取的方案是:整块控制板先接一个低噪声 LDO,LDO 输出 3.3V 单独给传感器和 MCU 模拟区供电;大功率执行机构尽量单独用继电器驱动,不要从 3.3V 上取电。
接地方面,远程探头屏蔽层应该单点接地,一般接在主控板的地平面边缘。屏蔽层如果两端接地,会在屏蔽层上形成地环路,反而把共模噪声引进来。某项目现场一开始把屏蔽层两头都接机壳,结果面板温度跳得厉害,改成单端接后问题立刻消失。
电源和信号线走向也要遵守基本规则:I2C 数据线远离继电器触点输出线和 PWM 驱动线,PCB 上最好用地线包围隔离。如果控制柜空间有限实在避不开,就加一层屏蔽板或者用排线屏蔽罩。这些看起来是细节,却决定了产品在客户现场能不能稳定跑一年。
3. 软件实现:从驱动到控制逻辑
3.1 I2C 驱动的底层实现
PIC18F86J11 使用 MSSP 模块做 I2C 主设备,用 C 语言写起来不算复杂。初始化时设置时钟速率、使能 I2C 模式并配置引脚开漏。下面这段是基于 MPLAB XC8 的初始化思路:
void i2c_init(void) { TRISCbits.TRISC3 = 1; // SCL 输入 TRISCbits.TRISC4 = 1; // SDA 输入 SSPCON1 = 0x28; // 使能主模式, 时钟 Fosc/4 SSPCON2 = 0x00; SSPADD = ((_XTAL_FREQ/4) / 100000) - 1; // 100kHz }写入一个字节时,要等待总线空闲并检查 ACK。I2C 最讲究时序状态,每步都要看SSPSTATbits.BF和SSPCON2bits.ACKSTAT。读温度一般要发送器件地址、寄存器地址,再产生重复起始信号读取两个字节。省略任何一步,数据错位是常见的现象。
3.2 读取本地与远程温度数据
PJ85718DM 的典型读取流程是:配置好转换周期,等待转换完成,读取本地温度寄存器两个字节,再读取远程温度寄存器两个字节。转换完成标志位通常在状态寄存器里,连续读时要注意判断。温度数据高位和低位拼接成 12 位带符号数,乘以 0.0625 就能得到摄氏温度。
int16_t raw = (reg_high << 8) | reg_low; float celsius = raw * 0.0625f;远程温度读数和本地类似,但寄存器地址不同。某些型号的远程通道在低于 0°C 时会有符号扩展问题,需要把 12 位数先左移 4 位再右移 4 位,保证符号位正确。我在一个项目里曾因为没有做符号扩展,-5°C 被读成了 4091°C,差点触发加热器疯狂工作。
数据读取频率也要控制。HVAC 系统热惯性大,没必要 1ms 读一次。通常 100ms 读一次就足够,每次读完后做一次滑动滤波,取当前值和前次值的加权平均。这样既能快速响应温度变化,又能滤掉电源抖动引起的单次跳变。
3.3 HVAC 控制逻辑与告警处理
有了温度数据,接下来才是控制逻辑的发挥空间。最基础的双位控制是:温度低于下限时开启加热,高于上限时关闭加热;中间设置 2°C 的回差,防止继电器频繁吸合。回差太小会缩短继电器寿命,太大又会让温度波动明显,需要根据现场实际调节。
PIC18F86J11 的 PWM 模块可以做更平滑的比例控制。读取本地和远程温度后,取最大值或按偏差加权,然后映射到 PWM 占空比。比如加热偏差从 0 到 10°C,占空比从 0% 线性增加到 80%。再加上一个简单 PID 环节,就能把温度稳定在目标值附近,比继电器通断的舒适度好很多。
告警处理要用到 PJ85718DM 的 ALERT 引脚。初始化时把高低温报警阈值写入寄存器,并配置为中断模式,当温度越限时芯片自动拉低 ALERT 引脚。PIC18 的外部中断响应后,先读状态寄存器确认是哪种事件,然后执行对应的保护动作。注意 ALERT 引脚是开漏输出,必须接上拉电阻,不然中断检测不到低电平。
4. 标定、精度与可靠性调整
4.1 误差从哪里来
温度误差来源可以分成三类:传感器本底误差、远端探头误差和电路引入误差。PJ85718DM 这类数字传感器在 0~70°C 范围内能做到 ±0.5°C,但超出这个范围误差会变大。远端 PN 结的一致性也很重要,同一型号不同批次的二极管,在 100°C 时压差能达到 2~3°C,标定时必须使用实际探头。
电路引入的误差最隐蔽。传感器附近如果有强辐射源,读到的温度会周期性跳动;I2C 线过长导致信号边沿变差,会造成读数偶尔错位。更常见的是供电电压不稳导致芯片内部基准漂移,表现为温度读数随压缩机启动出现瞬态尖峰。
要真正控制误差,得从源头入手:传感器装在通风处但避开直吹气流,远程探头用导热硅脂与被测面贴合,线缆固定牢靠避免振动。否则后续做再复杂的补偿算法,也很难抵消物理层面的测量偏差。
4.2 现场标定与补偿
现场标定是 HVAC 项目绕不开的步骤。上电后把系统置于恒温环境,比如在 0°C 的冰水混合物和 50°C 的恒温槽里各放一段时间,记录实际温度和读取值的差。通常只需要在两个温度点做偏移校准,中间温度用线性插值即可。
如果把校准结果写进 PICC18 的 EEPROM,批量生产时就能避免给每台设备手动改代码。具体做法是:保留两个变量cal_offset_low和cal_offset_high,在读取温度后按当前温度区间选择对应补偿值。多台设备用同一套固件,只是 EEPROM 内容不同,维护起来很方便。
某项目的经验是,标定时不要把手放在传感器旁边,人体热辐射会影响远端探头读数,导致校准结果偏离真实值。校准前要等设备充分热机 30 分钟,让电路板自身温度达到稳定,否则后续实际运行时会一直偏高。
4.3 远程探头走向与干扰抑制
远程探头走线很考验现场经验。必须避开变频器输出线和继电器控制线,至少保持 20 厘米距离。如果迫不得已要并行走线,中间要加屏蔽隔板。双绞线绞距越密,抗噪声能力越强,现场临时用直通线代替绞线,往往会在设备满载时暴露问题。
探头本身的接地也很讲究。远端探头外壳如果直接接触金属风管,建议用绝缘套管隔离。否则风管电位与主控地不一致,会在测温回路形成共模电压。我在做室外机盘管测温时,就把探头套了一个热缩管再扎到管壁上,既保证热接触,又消除了接地环路,读数稳定多了。
如果远程距离超过 10 米,单纯靠传感器远程通道可能力不从心。可以考虑在远端加一个小型信号变送器,用 4-20mA 电流环把温度送回来。PIC18F86J11 的 ADC 输入加一个 250Ω 采样电阻就能读电流信号,这种方案虽然多了器件,但长距离抗干扰能力显著提升。
5. 现场问题排查与经验速查表
5.1 典型故障与定位思路
跑现场最怕的是温度读数“神游”。常见现象、可能原因和处理办法我整理成了速查表,遇到问题时按顺序排查,通常十分钟内能定位。
| 故障现象 | 可能原因 | 检查与处理办法 |
|---|---|---|
| 本地温度读数显零 | 传感器电源没通或 I2C 地址错误 | 用万用表量 VCC,用 I2C 扫描程序确认地址 |
| 远程温度读数异常偏高 | 远程探头开路或接反 | 检查 D+/D- 线路,替换标准二极管测试 |
| 读数周期性跳动 | 电源纹波或变频器干扰 | 增加滤波电容,远程线改用屏蔽双绞线 |
| I2C 通信偶发失败 | SDA/SCL 上拉电阻不合适 | 示波器看边沿,调整上拉阻值或降通信速率 |
| 温度变化反应迟缓 | 滤波过度或探头热耦合不良 | 检查滤波系数,重新涂导热硅脂 |
其中远程探头开路导致读数偏高的原因很多人不理解:传感器内部会把远程通道的测量电流倒灌给开路引脚,开路状态下压差极大,换算温度自然飞到上限。遇到这种读数,先怀疑接线断或者探头坏,别急着怀疑算法。
5.2 调试工具与操作细节
现场调试我习惯带三种工具:万用表、示波器和带 I2C 扫描功能的逻辑分析仪。先用万用表确认供电和接线,再用逻辑分析仪抓取总线波形,最后对着波形看 ACK 位和寄存器地址。调试时别直接上满负荷控制,可以先用一个小功率加热器模拟测试,确保温度控制闭环正确再接到真实设备上。
还有一个容易忽略的操作细节:用 ICSP 烧录程序时,如果调试器供电能力不足,PIC18F86J11 和传感器会同时欠压。表现出来的现象是程序能烧进去,但运行后传感器偶尔通信失败。这时应该用外部电源单独给目标板供电,调试器只接地线和数据线,立即会稳定很多。
修改固件时,要留意 MCU 的看门狗是否开启。HVAC 设备常年运行,一旦程序跑飞,看门狗能自动复位。但看门狗超时时间要大于温度采集周期的几倍,否则正常流程中被误复位,现场会出现设备无规律的断电重启,很难排查。
5.3 长期运行的一些改动建议
项目正式交付前,我会做两个改动:一是把温度采样结果定期写入 EEPROM,便于追踪历史趋势;二是给 MCU 增加一个运行计数,累计通电时间达到一定阈值后主动刷新传感器配置。这两个功能可以帮助现场人员判断故障是瞬时干扰还是趋势性老化。
针对 HVAC 设备长期运行,传感器远程探头属于易损件。建议在结构上设计成可插拔端子,而不是焊死在板子上。客户更换探头时无需重新校准,因为远端探头的一致性在标定时已经覆盖,只要选用同一型号即可。
最后再分享一个在多个项目里验证过的小习惯:给每一台设备在出厂前做一次 24 小时高低温循环测试,读数稳定后再发货。这比在客户现场发现问题再处理要节省大量成本,尤其对于季节性强、设备分散的 HVAC 项目,前期多花一天,后期能少跑好几趟。
这个东西后续还可以扩展成多区域温度监测,只要把相同传感器挂到同一根 I2C 总线上,PIC18F86J11 仍然有足够的资源去处理。加上 RS485 接口,就能把本地与远程温度数据统一上传到集中监控平台。无论项目规模怎么变,这套架构的核心思路——数字传感器就近采集、MCU 统一处理、控制与告警分离——始终可以复用。