搞嵌入式的朋友应该都有这种感觉:每天和温度打交道,但温度这东西从来都不是简简单单读个数就完事。早两年我在一个暖通项目里接过一个需求:既要盯着控制器电路板自身的本地温度,防止功率器件过热,又要同时测量空调风管远端送风口的温度,两路温度得一起参与风机和阀门的启停。当时手边没有太多现成方案,最后我用了一颗 PJ85718DM 数字温度传感器,搭配一颗 PIC18F65K40 单片机,把本地和远程温度监测一次性做了下来。这个组合在嵌入式的板级测温场景和 HVAC 的风管/设备测温场景里都挺实用,成本不高,代码量也可控。这篇文章把我的选型过程、硬件连接、固件思路、现场踩坑完整写出来,正在做风机盘管、恒温箱、设备柜温控这类项目的朋友可以参考。
1. 项目整体设计与方案选型
1.1 需求拆解:本地与远程温度监测到底要什么
要设计一个温度监测系统,第一步不是选芯片,而是把“本地”和“远程”这两个概念讲清楚。在嵌入式设备里,本地温度通常指控制板上处理器、电源模块、功率管附近的温度,作用很直接:让系统知道自己有没有过热,需不需要降载,风扇要不要加速。远程温度则指离主板有一段距离的热源,比如散热器表面、电池包、电机外壳,甚至是通过长线引出去的独立探头。HVAC 场景更直白:本地温度可能是回风温度、控制面板附近室温;远程温度是送风管温度、表冷器管壁温度、室外机冷凝器温度。不同场景对采样周期、测量精度、走线距离和抗干扰能力的要求完全不一样。
搞项目最忌讳的就是需求不清就上手。我一开始以为只要测两路温度就行,后来发现还牵扯到探头位置、线缆长度、防护等级、控制逻辑等多个维度。比如风管里的探头积灰之后响应会变慢,室外探头夏天受阳光照射会偏高,这些不是靠传感器芯片精度能解决的。所以方案设计阶段,我强烈建议先列一份测温点清单:每个点叫什么、量程多少、响应要多快、探头离主板多远、环境有没有灰尘和水汽、需要不需要电隔离。这份清单直接决定传感器类型和传输方式。我这次的清单很明确:板内温度一路,风管远端一路,量程都在 -20 到 +85°C 左右,线缆最长五米,室外部分需要防潮。
1.2 为什么选 PJ85718DM + PIC18F65K40
很多工程师遇到多路测温,会条件反射想到多颗 DS18B20 串在单总线上,或者每路搞一个 NTC 分压电路接 ADC。这些方案不是不行,但在这个项目里我有几个顾虑:单总线时序对实时性要求高,长线寄生电容一大,总线时序就会飘;NTC 方案虽然简单,但每一路都要单独校准,且长线传输时分压值容易被干扰。这时我看到 PJ85718DM 这类带双测量通道的数字温度传感器,思路一下就顺了。
所谓双通道,就是一颗芯片内部同时集成了本地测温单元和远程测温通道。本地通道直接测量传感器芯片自身附近的温度;远程通道则通过外接一个 PN 结二极管(常用小信号三极管把基极和集电极短接来当二极管用)来测量远端目标的温度。这样一颗芯片干了两颗芯片的活,I2C 总线上只占一个地址,代码也只需要维护一套。PIC18F65K40 是 8 位单片机里外设相当齐全的型号:硬件 I2C/SPI、UART、10 位 ADC、定时器、PWM 模块都有。对我这个项目来说,一个硬件 I2C 读传感器,一个 UART 做调试和远程通信,一个 PWM 驱动风扇,资源刚刚好,不用外扩其他芯片。
成本也是实际考虑因素。8 位单片机比 Cortex-M 系列便宜,开发起来又不复杂,对 HVAC 温控器这种“逻辑简单、量又大”的场合非常合适。PIC18F65K40 官方资料里明确给出了内部振荡器方案,我可以省掉外部晶振,板上少两个元件,BOM 更简单,故障点也更少。当然,如果你手头已经有 STM32 或者 ESP32 的模块,也可以沿用这套逻辑,只是代码风格和引脚配置会有差异。本文后面主要围绕 PIC18F65K40 讲,但思路是通用的。
1.3 系统架构:传感器、控制器、通信、执行器分层
架构上我习惯把系统分成四层。最底下是测温层,PJ85718DM 的本地通道负责测板温,远程通道通过双绞线接到风管里的二极管探头,负责测送风温度。再往上是控制层,PIC18F65K40 每秒钟通过 I2C 读一次这两个温度,做完滤波、比较和故障判断后,输出控制量。第三层是执行层,单片机用 PWM 驱动直流无刷风扇,用普通 IO 控制继电器去切换加热器或者水阀。最上面是通信层,用 UART 接 RS-485 收发器,把本地温度、远程温度、PWM 占空比、故障码打包成 Modbus-RTU 协议发给触摸屏或楼宇自控网关。
分层的好处是调试时不用所有东西搅在一起。温度读数异常,先怀疑传感器和接线;PWM 输出不对,再查控制逻辑。我在项目里把远程通道外接二极管就用一颗普通三极管,封装是 SOT-23,成本不到一毛钱,却能覆盖 -40 到 +125°C 的测量范围,线性度也够用。如果你不想做远程测温,只做本地单路测温,同样可以只用本地通道,远程通道悬空不接,代码里不发起远程转换就行。这个灵活性让同一个硬件可以派生出多个产品型号。
整套系统的核心判断逻辑都放在 MCU 侧,传感器只负责把温度变成数字。这样的分工在项目交付后期很重要:客户如果只需要单路温度,我不用改硬件,只刷一个不同的固件版本就能出货。
1.4 与其他温控方案的横向对比
选型阶段我也对比过几种常见做法。最经典的是每路温度用一个 NTC 热敏电阻加一个分压电阻,接到单片机的 ADC 引脚上。优点是成本极低、电路直观,缺点是 ADC 参考电压波动会影响精度,长线传输时线阻和干扰很难处理,而且每个探头都要单独标定,批间一致性差。第二种是单总线数字传感器,比如一些常见的可编程分辨率温度传感器,连线少,代码也不算复杂,但在五米长线上,单总线的上拉电阻和寄生电容要反复调,现场维护起来比较头疼。第三种就是本文方案:PJ85718DM 这样的双通道数字传感器。
我把几个关键指标列了个表,实际选型时一眼就能看清差异:
| 方案 | 总线资源 | 本地/远程支持 | 精度表现 | 长线抗干扰 | 成本 |
|---|---|---|---|---|---|
| NTC 分压 | 每路占一个 ADC 通道 | 需要多路独立电路 | 中,依赖电阻精度和基准源 | 差,信号易被干扰 | 低 |
| 单总线数字传感器 | 一根总线可挂多个 | 每颗传感器只测一路 | 中高,受时序影响 | 中,长线时序易漂移 | 中 |
| 双通道 I2C 传感器 | 一个 I2C 地址 | 一颗芯片覆盖两路 | 高,远程需外部PN结 | 较好,差分走线加屏蔽 | 中 |
这个表帮我在方案评审时省了很多嘴皮子。对于 HVAC 这种要跑五年十年的产品,稳定性和可维护性比省几毛钱重要。当然,如果你的应用只有一厘米板内测温、没有远程需求,那直接上 NTC 或者普通数字传感器完全够了,不一定非要用双通道方案。
2. 核心硬件细节与设计要点
2.1 PJ85718DM 传感器的工作原理与引脚连接
PJ85718DM 的工作原理和绝大多数数字温度传感器一样,内部有带隙基准源和 Sigma-Delta 型 ADC,温度变化最终被转换成数字量存在寄存器里。不一样的地方在于,它内部的测温结构同时服务本地和远程两个通道。本地温度直接由芯片封装附近的热量决定;远程温度则是通过测量外部 PN 结正向压降随温度变化的特性来推算的。这个远程测温方式和很多电脑主板上的 CPU 二极管测温是同一类原理,所以我们可以把测温点从芯片本体延伸到几米外的风管里。
引脚连接上,通常 VCC 接 3.3V,GND 接数字地,SDA 和 SCL 分别接单片机的 I2C 引脚。远程通道有两个引脚,分别接外部二极管的阳极和阴极。我用的是普通小信号三极管,把基极和集电极短接后作为阳极,发射极作为阴极,接法简单,而且因为三极管封装很成熟,探头可以做得非常小。如果芯片数据手册里要求远程引脚之间加滤波电容,一定要加,通常 100pF 到 1nF。加电容可以过滤高频干扰,但也不能太大,否则远程温度的响应速度会被拖慢。
我实际画板时,把 PJ85718DM 放在了 PCB 的角落,和继电器、变压器这些发热源尽可能拉开距离。因为本地通道测的是芯片附近的温度,如果旁边正好是大功率电阻,读出来的“板温”就会虚高。远程通道的走线我尽量做成差分形式,两条线贴着走,减小环路面积。要是实在绕不开继电器或者高压线,就在远程引脚上并一个 1nF 电容,实测对几百兆的干扰有明显抑制效果。
2.2 PIC18F65K40 的资源配置
PIC18F65K40 的资源在这个项目里怎么分配,我列一下。I2C 外设配置为主机模式,速率 100kHz 标准模式。100kHz 对 PJ85718DM 来说完全够用,而且低速意味着更稳的边沿,抗干扰能力更强。定时器方面,我用一个定时器做 1ms 时基,用来产生温度采样周期;另一个定时器做 PWM 时基,输出 10kHz 的 PWM 给风扇。ADC 我保留下来,用来检测供电电压和面板电位器设定的目标温度。虽然 8 位机做 PID 需求不高,但要监控电压、读电位器,ADC 必不可少。
I/O 分配上,I2C 占用两个引脚,UART 占用两个引脚,再加上风扇 PWM、继电器控制、状态 LED、故障输入,总共用掉不到十个 IO,64 引脚封装的余量很充裕。PIC18F65K40 有引脚选择功能,外设不一定固定在某一个引脚上,所以画原理图的时候要先确定引脚映射,再在代码里配置 PPS 寄存器。很多第一次用这类芯片的朋友会在这一步卡住:明明外设打开了,引脚却没有输出,多半就是 PPS 没配。
我建议把 I2C、UART 和 PWM 功能分别映射到方便布线的引脚,避开高压和继电器驱动区域。PIC18F65K40 的数据手册里会有完整的映射表,照着填就行。如果不想用它的内部上拉,就在外部给 I2C 总线加上 4.7kΩ 上拉电阻。外部上拉的好处是阻值可控、驱动能力强,能更好地配合长线。内部上拉我一般只用于和传感器芯片距离很短的情况。
2.3 供电、滤波与PCB布局的注意事项
温度监测系统最容易出的问题不是代码,而是电源不干净。继电器一吸合,24V 转 5V 的电源模块输出经常会有几十毫伏的毛刺,如果 PJ85718DM 直接和单片机共用这个电源,读数就会跳。我的做法是给传感器单独加一颗低噪声 LDO,输入 5V,输出 3.3V,LDO 前后各放一个 10uF 电解电容和 0.1uF 瓷片电容。这样数字部分和模拟供电部分尽量隔开,传感器得到的参考基准就稳得多。
PIC18F65K40 的电源我也按常规做了处理:数字电源和模拟电源分别接,用磁珠或 0 欧电阻做单点连接;数字地和模拟地在单片机下方汇合。如果系统里同时有高压驱动电路,还要在电源输入口加 TVS 管和自恢复保险丝,防止接错线或浪涌损坏整板。HVAC 设备的接线端子往往在强电驱动旁边,尤其要注意爬电距离。
PCB 布局上,PJ85718DM 和远程二极管探头之间如果走线超过 20 厘米,我建议把线做成差分对,并且在终端加一个小电容。长线传输时,屏蔽层不要两端都接地,我习惯在现场把屏蔽层单端接地,另一端悬空。这样能避免地环路电流在屏蔽层上产生压降,反而干扰信号。PWM 输出线也要尽量避开远程测温线,如果必须在同一层平行走线,间距至少三倍线宽,或者中间加一条地线隔离。
3. 固件开发与实操流程
3.1 初始化代码:时钟、I2C、GPIO、UART
固件开发的第一步是把单片机“唤醒”:配时钟、配引脚、配外设。PIC18F65K40 支持内部振荡器,我选了 12MHz 作为系统时钟。省掉外部晶振的好处不言而喻,板子更简约,少了一个可能失效的元件。在初始化代码里,我把 I2C 配成主模式,速率 100kHz;把 UART 配成 9600 8N1,用于调试和 Modbus 通信;把 PWM 通道配置为 10kHz 固定频率,占空比由控制逻辑动态修改。
下面是一段示意代码,如果你用的是其他 C 编译器,寄存器名可能会有点出入,但流程是通用的。重点要记得配置 PPS 引脚映射,否则 UART 和 PWM 可能会没有任何输出。
void System_Init(void) { // 配置内部振荡器为 12MHz OSCCON1 = 0x60; // 初始化I2C引脚,设为开漏 TRISCbits.TRISC4 = 1; TRISCbits.TRISC5 = 1; ANSELCbits.ANSC4 = 0; ANSELCbits.ANSC5 = 0; // I2C 主模式,100kHz SSP1STAT = 0x80; SSP1CON1 = 0x28; SSP1ADD = 0x1D; // 12MHz 下配置为 100kHz // UART 初始化 9600 8N1 TXSTA1 = 0x20; RCSTA1 = 0x90; BAUD1CON = 0x08; SPBRGH1 = 0x00; SPBRGL1 = 0x4E; }这里稍微解释一下 I2C 的波特率计算。PIC18F65K40 的主模式波特率公式大致是 Fosc / (4 * (SSP1ADD + 1))。内部振荡器 12MHz,Fosc/4 就是 3MHz。要让总线跑 100kHz,那么 3MHz / 100kHz = 30,所以 SSP1ADD = 30 - 1 = 29,也就是 0x1D。代码里的 0x1D 就是这么来的。UART 的 SPBRG 值也类似,先算好再填,不要拍脑袋随便写。
3.2 读取本地/远程温度:寄存器时序与数据换算
PJ85718DM 的寄存器读写跟标准 I2C 从机一样:通过地址选择寄存器,然后读数据。我习惯在每次读取前都发送一次启动转换命令,等一小段时间再读结果。这样能避免上电后寄存器里还是无效数据的问题。延时长度要参考传感器数据手册,一般 10ms 到 100ms 都常见。我的循环周期是 1s,这个延时完全不影响整体性能。
温度数据通常是一个 12 位二进制补码,放在 16 位寄存器里,低位可能有没有用的 bit。读出来之后要把数据右移 3 位,再乘上分辨率。很多这类传感器的分辨率是 0.0625°C/LSB,也就是 1/16。如果你读到原始值 0x1A9,右移后是 0x35,保留小数后就是 5.3125°C?等一下,0x35 是十进制 53,乘以 0.0625 就是 3.3125°C。不管具体数值多少,公式就是这个思路,按你的数据手册来。远程通道和本地通道往往是两个不同的寄存器,换算方法一致,但地址不要搞混。
我封装了两个函数,一个读本地,一个读远程。为了不让调用方拿到一个异常值还当正常值用,我在函数里加了范围判断和超时重试:
float ReadLocalTemp(void) { uint16_t raw = ReadSensorReg(0x00); if (raw == 0xFFFF || raw == 0x0000) { return INVALID_TEMP; } return (float)raw * 0.0625f; } float ReadRemoteTemp(void) { uint16_t raw = ReadSensorReg(0x01); if (raw == 0xFFFF || raw == 0x0000) { return INVALID_TEMP; } return (float)raw * 0.0625f; }这里有一个容易忽略的点:0x0000 在某些芯片上可能是合法的 0°C,不一定是错误。所以更稳妥的做法是检查之前配置好的状态寄存器里的有效标志位,而不是凭读取值猜。我最后是在代码里同时检查状态位和物理范围,两者都通过才认为数据有效。毕竟温度监测这东西,一个“看起来正常”的坏数据比一个明显的错误数据更可怕。
3.3 温度控制逻辑:滞回控制与故障处理
读数拿到手之后,要让系统动起来,不能只是显示。HVAC 里最经典的控制是滞回控制,也就是设置一个上下限区间,避免继电器频繁吸合。比如目标 25°C,回差 2°C,那就是高于 27°C 启动制冷,低于 23°C 停止制冷。这样一来,系统不会在目标温度附近来回抖,压缩机和阀门的寿命都会好很多。
滞回控制在代码里实现非常简单,维护当前状态机的状态就行。我把控制状态分成 Stop、Cooling、Heating、Fault 四个状态。每个循环里根据有效温度更新状态。如果温度超过上限,进入冷却状态;低到下限以下,退出冷却状态。为了让温度控制更平滑,我还在启停之外加了 PWM 调速:温差大的时候风扇高速跑,温差小的时候降到低速。这个用比例区间映射就能实现,不需要完整 PID,但对大部分风机盘管应用已经够用。
故障处理一定要放在控制逻辑前面。我的原则是:本地温度读取失败,直接停止一切控制,输出报警;远程温度读取失败,如果本地温度还正常,就先用本地温度后台控制,同时把故障码通过 Modbus 发出去。这样不会因为风管探头坏了就导致整个系统停机。实际项目里远程探头被老鼠咬断线是常有的事,这个设计非常实用。
3.4 一个完整的控制循环示例
把前面说的内容串起来,主循环大概长这样。1ms 定时器置位一个标志,主循环每累计到 1 秒就执行一次采样、滤波、控制、输出。这样保证系统的操作周期是稳定的,不会因为某个 I2C 忙等而抖动。
void MainLoop(void) { if (timer_tick) { sample_count++; if (sample_count >= 1000) { sample_count = 0; local = ReadLocalTemp(); remote = ReadRemoteTemp(); if (IsTempValid(local) && IsTempValid(remote)) { temp_used = remote; // HVAC 用风管温度控制 duty = FanCurve(temp_used, setpoint); PWM_SetDuty(duty); UpdateStatusLED(STATUS_OK); } else { FaultHandler(); } SendModbusStatus(local, remote, duty, fault_code); } } }实际的代码里还要处理断电保护和看门狗。PIC18F65K40 有硬件看门狗,一定记得开启。看门狗超时尽量设长一点,比如 1 秒或 2 秒,避免主循环偶发 I2C 重试超时导致整机复位。很多项目在调试阶段不开看门狗,刷进去之后现场跑了几天突然死机,最后发现是软件卡死在某个 I2C 等待循环里。开了看门狗,这个问题就能自动恢复。
3.5 通信与显示:本地状态与远程监控
数据不送出去,前面的工作就少了一半价值。我在这个项目里把 UART 直接接到一个 RS-485 收发器上,跑 Modbus-RTU 协议。把本地温度、远程温度、PWM 占空比和故障码分别放到保持寄存器地址里。上位机和触摸屏通过 Modbus 轮询就能看到所有数据,也能远程调整设定温度。Modbus-RTU 的代码量不大,CRC 校验网上到处都是,但要注意 485 芯片的方向控制。
RS-485 的 DE/RE 引脚必须用单片机 IO 控制,而且在发送完最后一个字节后,一定要延时一段时间再把方向切换到接收。延时太短,最后一个字节可能只发了一半就变向,远端会收到坏帧。我见过有人在这里省了几毫秒,结果整条总线上老是间歇性丢包,最后查了一个下午,就是方向切换太快。这个细节我后面还会再提一次,因为太常见了。
如果现场需要看本地状态,我会在板上加两颗 LED。绿灯表示正常,黄灯表示远程探头告警,红灯表示故障。没有显示面板的时候,这几颗 LED 对现场维护非常关键。拿万用表测电压远不如看灯光颜色来得快。
4. 常见问题与排查技巧
4.1 温度读数跳变或漂移
读数跳变是这类系统最容易被客户投诉的问题。跳变的原因无外乎两个:供电不稳和远程线缆干扰。供电不稳会导致传感器内部基准波动,表现为本地和远程温度同时跳。解决办法是给传感器一个干净的电源,前面说的独立 LDO 加去耦电容是最有效的。继电器吸合瞬间的尖峰,还可以用共模电感隔离。
远程线缆干扰导致的跳变通常是某一路跳,另一路正常。我在现场遇到过一排继电器同时吸合,远程温度瞬间从 25°C 跳到 -30°C。把远程引脚上的滤波电容从 100pF 加大到 1nF 之后,跳变基本消失。如果还跳,那就要检查远程线是不是和强电线在同一个线槽里走了很长距离。这种物理上拉开比什么滤波都管用。
漂移问题则更多是传感器老化、探头氧化和电路板本身发热引起的。PJ85718DM 靠近发热器件,本地温度会慢慢升高,漂移方向是正向。如果板子布局已经固定了,可以在软件里做静态补偿,比如开机后空载记录一个基准偏移,后续读数减掉这个偏移。但这属于补救,最好还是在布局阶段就把传感器放远一点。
4.2 远程传感器断线与短路检测
远程 PN 结测温的断线和短路症状非常明显。断线时读数往往会跑到量程下限,比如 -127°C;短路时读数通常接近 0°C,或者在一个不合理的范围内来回跑。PJ85718DM 芯片本身可能有断路/短路状态位,但不同版本差异很大,所以我在代码里始终保留一道物理范围守卫。
我的做法是设定一个合理的物理区间,比如 -40°C 到 +125°C。只要本地或远程温度超出这个区间,立即判断传感器异常,不参与控制。同时,我连续读三次温度,取中值作为本次有效值。三次中如果有一次读取失败,本次循环就不输出控制量。这个“多数表决”是个土办法,但对随机干扰非常有效。它的代价是响应变慢了一个周期,对 HVAC 这种秒级控制的应用完全可以接受。
还有一个实用技巧:远程二极管反接时,读数也会异常,通常是很大的负温度。我在故障码里专门加了一个类别,当时温度低于 -50°C 的时候,告警信息直接显示“请检查远程探头接线”,而不是生硬地显示 -127°C。现场维护的人看到这个提示,基本不用翻图纸就能处理。
4.3 校准与误差分析
PJ85718DM 出厂精度再高,系统级误差总归会有。探头的引线电阻、供电误差、PN 结的一致性都会影响最终读数。做产品,尤其做 HVAC 设备,出货前最好都做一次校准。我用过最简单的办法是:拿一支铂电阻温度计或者经过检定的水银温度计做参考,把传感器探头和参考探头放进同一个恒温块里,分别做 0°C、25°C、50°C 三个点的测试,记录偏差,然后在软件里做两点校正。
校准公式很简单:
T_corrected = T_raw * gain + offset
gain 和 offset 根据两个温度点的实测偏差算出来。比如 25°C 点读高了 0.3°C,50°C 点读低了 0.1°C,通过线性拟合就能得出修正参数。把这些参数存在单片机 Flash 里,生产校准完写入即可。要注意的是,校准过程中恒温块必须等温度完全稳定,每个点至少静置十分钟,否则测出来的偏差根本没有意义。我赶进度试过一次只等了两分钟,后来发现校准出来的曲线在高低温段都是斜的,白忙一下午。
远程测温的误差来源还要加上线缆电阻。线缆越长,压降越大,PN 结上的实际电流就会减小,读数会偏高。降低误差的办法是使用屏蔽双绞线,线径不要太细。如果现场环境潮湿,端子接触不良也会导致电阻变化,出现缓慢漂移。这种问题校准解决不了,必须更换端子或重新压接。
4.4 HVAC 场景中的特殊坑
HVAC 环境比普通嵌入式环境更脏、更湿、温差更大,有些问题只在现场才会暴露。风管里的探头积灰后会变得迟钝,因为灰尘层阻碍了热量传递。远程二极管探头最好是装在百叶风口的迎风面,不要紧贴管壁。室外侧的探头还要考虑太阳辐射,白天阳光直射时读数可能偏高好几度。我给室外探头加了一个铝箔反射罩,实测偏斜量下降很明显。
热泵除霜循环是另一个经典坑。冬季除霜时四通阀切换,风道温度会出现剧烈波动,如果控制逻辑只看瞬时温度,很容易误启动风机或者压缩机。解决办法是给控制逻辑加时间过滤:连续五次采样都超过阈值才执行状态切换,单次跳变不改变状态机。虽然这样响应会慢一些,但对 HVAC 这种惯性很大的系统来说,稳定永远比速度重要。
最后是防雷和浪涌。远程探头如果从室内拉到室外,进线口一定要加 TVS 管和气体放电管。一次雷击感应浪涌就可能把传感器甚至单片机引脚击穿。PIC18F65K40 引脚自带一定 ESD 能力,但针对几米长的室外线远远不够。我们在这上面吃过亏,后来所有外部接口都加了保护器件,再没烧过传感器。
5. 现场联调的经验与实测数据
5.1 调试工具和初始上电步骤
现场调试和实验室不一样,工具要选对。我一般会准备一个 USB 转串口模块、一台带曲线的万用表、一个热风枪和几卷屏蔽线。先把程序烧进 PIC18F65K40,再单独给板子上电,先不要接执行器,只接传感器。上电后第一步看 UART 输出,确认 I2C 能读到本地温度。如果输出的是 -127 或者 0,先别急着查传感器,先看 I2C 地址对不对。PJ85718DM 的地址通常和引脚电平有关,原理图上有没有接错地址引脚要确认。
调试阶段我建议在代码里加一个自检模式:上电后把本地温度、远程原始值、电源电压、I2C 错误计数全部从 UART 打印出来。这样现场人员只需把串口接上,就能立刻判断问题出在哪一层。我见过不少项目,现场工程师没有串口,只能靠万用表摸黑猜,效率特别低。串口调试口在最终产品上可以保留,哪怕不焊排针,也要留下测试焊盘。
确认温度读取正常后,再接风扇和继电器。接执行器时一定要先把控制逻辑里的输出值改成固定值测试,不要直接跑完整控制。比如先强制 PWM 占空比为 50%,看风扇转速是否正常,再强制继电器吸合几次,确认没有接线错误。全部正常后再切回自动控制。这种循序渐进的方式能避免把线接错导致烧板的风险。
5.2 实测数据对照表
我在一个暖通实验平台上做了几组对比测试,把 PJ85718DM 的本地和远程读数与标准铂电阻参考做了对照。实验工况分别取室温 15°C、25°C、35°C 三档。远程探头放在风管里,参考探头贴在旁边。结果如下:
| 工况 | 本地读数 | 远程读数 | 参考温度 | 偏差 |
|---|---|---|---|---|
| 低温工况 | 15.2°C | 15.1°C | 15.0°C | +0.1~+0.2°C |
| 常温工况 | 25.3°C | 25.2°C | 25.0°C | +0.2~+0.3°C |
| 高温工况 | 35.4°C | 35.3°C | 35.0°C | +0.3~+0.4°C |
这个数据是在探头短线、屏蔽良好、稳定十分钟后测的。偏差主要来自系统误差和校准参数没有精细调整。如果做完两点校准,常温段偏差可以压到 ±0.1°C 以内。不过对 HVAC 控制来说,±0.5°C 已经绰绰有余,毕竟风管温度本身波动都比这个大。
实测里还有一个现象:当继电器频繁吸合时,远程读数会出现约 0.2°C 的跳变,但加大滤波电容和独立 LDO 后,跳变范围缩小到 0.05°C 以内,基本可以忽略。这说明电源和布线的整改是有效的,也验证了前面说的设计要点。
5.3 远程线缆走线与安装细节
远程探头的走线是整个系统里最容易返工的地方。我的经验是:布线之前先画一条线缆路径图,注明哪些地方和强电交叉、哪些地方会被水淋、哪些地方会频繁弯折。线缆长度余量不要留太多,长了反而容易盘起来形成电感,但也不能拉得太紧,热胀冷缩容易拽断端子。
室内走线用普通屏蔽双绞线就可以,室外建议穿管,并在管口做防水弯。远程二极管探头本身很小,我一般把它焊在小 PCB 板上,再灌环氧树脂密封,只留两条线出来。这样既防潮又耐弯折。如果探头要装在金属风管上,注意二极管和风管之间要绝缘,否则等于给 PN 结并联了一个大面积的金属体,响应和精度都会受影响。
最后再分享一个经验:所有远程测温线缆的接头都别用那种常见的压线帽,HVAC 现场振动大、温湿度变化大,接头非常容易氧化。我后来统一改用带锁紧功能的可插拔端子,现场维护也方便。这个细节看起来不起眼,但能避免掉大量售后问题。