基于PJ85718DM与PIC18F85K90的HVAC双通道温度监测方案 1. 项目背景与核心需求拆解温度监测这件事看起来简单真要做到工业级可靠、本地远程双通道、还要在HVAC这种电磁环境复杂的场景里稳定跑上几年里面的门道比想象中多得多。我这次要聊的是一个基于PJ85718DM和PIC18F85K90两颗芯片搭建的温度监测方案目标场景很明确嵌入式设备内部的板级温度监控以及HVAC系统里本地与远程温度的同步采集。先说清楚这个方案到底解决什么问题。HVAC系统也就是暖通空调它的核心任务之一是维持空间温度在设定范围内。传统做法是在温控器或者主控板上放一颗温度传感器测的是控制板附近的温度而不是人真正感受到的温度。这两者之间的差距在风道布局复杂、设备发热量大的场合可能达到好几度。所以一个靠谱的HVAC温度监测方案必须同时具备两个能力本地温度采集设备自身工作环境和远程温度采集实际被控空间的温度。本地温度用来做设备自我保护、补偿校准远程温度才是控制算法的输入。那为什么选这两颗芯片PJ85718DM 是一颗远程温度传感器接口芯片支持通过二极管连接的晶体管通常是低成本的三极管接成二极管形式进行远距离测温适合把传感器放在几米甚至十几米外的测量点。PIC18F85K90 则是Microchip旗下PIC18系列的一款8位MCU自带LCD驱动、多路ADC、丰富的通信外设在HVAC控制器里属于老黄牛级别的存在。两者搭配一个负责远程感知一个负责本地处理与系统控制分工清晰。这个方案适合谁参考如果你正在做暖通控制板、工业温控器、机柜环境监控、或者任何需要板内板外双温度通道的嵌入式项目这套组合的选型逻辑和实操细节都能直接借鉴。哪怕你用的是别的MCU或传感器背后的设计思路——比如远程测温的抗干扰处理、本地与远程数据的融合策略——也是通用的。我先把整体架构讲清楚再往下拆每一块的具体实现。整个系统的数据流是这样的远程测温二极管产生的电压信号由 PJ85718DM 采集并转换成数字量通过串行接口送给 PIC18F85K90同时 MCU 自己通过内部或外接的本地温度传感器获取板级温度MCU 对两路数据做校准、滤波、融合再驱动 LCD 显示、执行控制逻辑、或者通过通信接口上报给上位机。这个链条里任何一个环节出问题最终温度读数都会失真所以每一段都值得细抠。2. 核心器件选型与工作原理剖析2.1 PJ85718DM 远程测温的底层逻辑远程测温这件事核心难点在于信号在长线上传输会劣化。如果用模拟传感器直接拉长线线上的压降、噪声耦合、地电位差都会把信号搞脏。PJ85718DM 这类芯片的思路是把敏感的前端放在芯片内部外部只留一个二极管结作为感温元件芯片通过强制电流、测量结电压的方式反推温度。具体原理是这样的半导体PN结的正向压降与温度呈近似线性关系典型值约为 -2mV/°C。芯片内部用两个不同的电流比如10μA和100μA轮流激励外部二极管测量两次压降的差值ΔVbe。这个差值和绝对温度成正比而且与二极管本身的饱和电流、串联电阻等个体差异无关这就解决了不同三极管一致性差的问题。这也是为什么远程测温芯片能支持普通三极管而不用精密传感器。PJ85718DM 在这个基础上做了工程化增强内置多路输入通道可以轮流监测多个远程测温点提供可编程的电流源和ADC适应不同长度的走线还带有开路、短路检测传感器掉了或者线断了能报出来而不是给一个看似正常的错误温度。这几点在HVAC场景里特别关键因为传感器往往装在风道里、墙面上维护人员不可能天天去检查。注意远程测温二极管必须用基极和集电极短接的方式接成二极管发射极作为正端基极-集电极作为负端。接反了读数会完全不对而且不会报错这是新手最容易踩的坑。2.2 PIC18F85K90 在系统中的角色定位PIC18F85K90 是一颗资源相当均衡的8位MCU。它在这个方案里承担的角色远不止读个温度这么简单。我梳理了一下它需要干的活本地温度采集通过内部温度指示模块或者外接模拟传感器获取MCU自身及周边电路的温度。远程数据接收通过I2C或SPI接口读取PJ85718DM的转换结果。数据融合与校准把本地和远程温度做交叉补偿比如用本地温度修正远程测温的冷端误差。人机交互驱动段式LCD显示当前温度、设定值、运行状态。控制输出根据温度偏差驱动继电器、可控硅或者通信指令控制风机、阀门。通信上报通过UART、CAN或者无线模块把数据传给上位机或云端。选它的理由很实在自带LCD驱动省了一颗驱动芯片多路ADC和比较器方便做模拟量处理增强型USART和SPI/I2C外设齐全而且PIC18系列的开发工具链成熟代码移植方便。对于成本敏感的HVAC控制器来说这种一颗芯片尽量多干活的思路是主流。2.3 本地与远程温度的协同关系很多人会问既然有远程测温了本地温度还有必要吗答案是非常有必要而且两者不是简单的冗余关系。本地温度的第一个作用是设备自保护。HVAC控制器本身装在配电箱或者设备间里如果环境温度超过70°CMCU和周边器件可能已经超出工作范围这时候系统应该降额运行或者报警而不是继续按远程温度去调节。第二个作用是远程测温的冷端补偿。远程测温二极管测的是结温但芯片内部的电流源、ADC参考电压都会随芯片自身温度漂移。PJ85718DM 内部通常有冷端补偿机制但如果MCU和传感器芯片不在同一温度环境就需要用本地温度做二次修正。第三个作用是故障判别。如果远程温度突然跳到-40°C或者125°C这种极端值而本地温度正常大概率是远程传感器或线路出了问题如果本地和远程同时异常那可能是系统级故障。这种交叉验证能大幅降低误报。3. 硬件设计与实操要点3.1 远程测温通道的布线规范远程测温的精度七分靠布线。我见过太多项目芯片选得没问题代码也写得对就是读数跳得厉害最后查出来是走线没处理好。走线长度与线材选择PJ85718DM 支持几十米级别的远程测温但前提是线材要选对。推荐使用屏蔽双绞线一对线走激励电流和回采屏蔽层单端接地。普通排线在几米内勉强能用超过5米噪声就明显了。线径方面0.2mm²到0.5mm²都行太细了线阻大太粗了成本高且不好布线。滤波与保护远程测温引脚前面建议加RC低通滤波典型值100Ω串联电阻加100nF对地电容截止频率约16kHz能滤掉大部分高频干扰又不影响测温响应。如果传感器在户外或者长线场景还要加TVS管做浪涌保护防止雷击或静电损坏芯片。接地处理远程测温的地线要和MCU的模拟地单点连接不要形成地环路。如果传感器端和控制器端距离很远两地之间的地电位差可能达到几百毫伏这个差值会直接叠加到测温信号上。解决办法是用差分输入方式或者确保两端共地良好。实操心得我在一个风道测温项目里最初用普通杜邦线拉了3米读数波动±2°C。换成屏蔽双绞线并把屏蔽层接到控制器地之后波动降到±0.3°C以内。线材的钱真不能省。3.2 本地温度采集的实现方式PIC18F85K90 获取本地温度有几种路子各有适用场景。内部温度指示模块部分PIC18型号带这个功能通过测量内部二极管的压降来估算芯片结温。优点是零成本、零外围缺点是精度一般±3°C左右而且测的是芯片结温不是环境温度。适合做粗略的设备自保护。外接模拟温度传感器比如常见的MCP9700系列输出与温度成正比的模拟电压接到MCU的ADC通道。精度能到±1°C成本低响应快。缺点是模拟信号容易受干扰走线要短。外接数字温度传感器比如通过I2C接口的传感器精度高、抗干扰好但成本略高而且占用通信总线。我的建议是如果只是做设备自保护用内部模块就够了如果本地温度要参与控制算法或者补偿计算至少用外接模拟传感器条件允许就上数字传感器。3.3 电源与参考电压的稳定性设计温度测量的精度最终都归结到电压测量的精度。PIC18F85K90 的ADC参考电压如果直接用VDD那VDD的波动会直接变成温度误差。比如VDD从3.3V波动到3.25V1.5%的变化对应温度误差可能就有零点几度。推荐做法使用外部基准电压芯片比如2.5V或4.096V的精密基准给ADC提供参考。这样VDD波动不影响测量结果。如果成本实在紧张至少要在VDD上加足够的去耦电容并且用LDO而不是开关电源直接供电。电源去耦每颗芯片的电源引脚旁边都要放100nF陶瓷电容距离越近越好。PJ85718DM 的模拟电源引脚还要额外加10μF钽电容或者陶瓷电容滤低频纹波。这些电容不是有就行布局位置不对效果差很多。4. 软件实现与数据处理4.1 远程温度数据的读取与转换PJ85718DM 通过串行接口输出转换结果通常是16位或者更高精度的数据。以常见的格式为例温度值可能以0.0625°C/LSB的分辨率输出读取到的原始码值需要做两步转换先转成电压再转成温度。假设读到的原始码值是raw参考电压是VrefADC位数是N那么V raw * Vref / (2^N)然后根据测温二极管的特性温度与电压的关系近似为T (V - V0) / k T0其中V0是参考温度T0下的电压k是斜率约 -2mV/°C。实际工程中芯片手册会给出更精确的转换公式或者查找表直接套用即可。代码实现上要注意读取操作要放在定时中断里保证采样周期稳定。如果采样周期抖动大后续的滤波算法效果会打折扣。我一般用10Hz到100Hz的采样率具体看被测对象的温度变化速度。HVAC场景温度变化慢10Hz足够了。4.2 数字滤波与异常值处理原始温度数据一定会有噪声直接拿去控制会导致执行机构频繁动作。滤波是必须的但滤波方法要选对。滑动平均滤波最简单取最近N个采样值的平均。N越大越平滑但响应越慢。HVAC场景推荐N8到16对应0.8到1.6秒的响应延迟完全可接受。中值滤波取最近N个值的中位数对脉冲噪声特别有效。比如偶尔一个采样点因为干扰跳到100°C中值滤波能直接把它剔除。我通常把中值滤波和滑动平均结合使用先中值滤波去脉冲再滑动平均去随机噪声。异常值判别设定合理的温度范围比如-40°C到125°C超出范围的值直接丢弃并计数。如果连续多次超范围才判定为故障。这样能避免单次干扰触发误报警。// 简化的滤波实现示例 #define FILTER_SIZE 8 float temp_buffer[FILTER_SIZE]; int buffer_index 0; float filter_temperature(float new_temp) { // 异常值检查 if (new_temp -40.0 || new_temp 125.0) { return get_last_valid_temp(); } temp_buffer[buffer_index] new_temp; buffer_index (buffer_index 1) % FILTER_SIZE; // 滑动平均 float sum 0; for (int i 0; i FILTER_SIZE; i) { sum temp_buffer[i]; } return sum / FILTER_SIZE; }4.3 本地与远程数据的融合策略两路温度数据拿到之后怎么用是个策略问题。我总结了三种常见模式模式一独立使用。本地温度只做设备保护远程温度只做控制输入两者互不干扰。逻辑最简单适合大多数场景。模式二本地补偿远程。用本地温度修正远程测温的系统误差。具体做法是在已知环境温度下标定远程测温的偏差建立偏差与本地温度的关系曲线运行时根据本地温度查表补偿。这能提升远程测温的绝对精度。模式三交叉验证。设定一个合理的温差范围比如本地和远程温度差不超过30°C。如果超出判定为异常触发报警或者切换到安全模式。这在长线远程测温场景里特别有用能及时发现线路故障。注意融合策略没有绝对优劣要根据具体应用选。HVAC控制一般用模式一加模式三的组合既简单又可靠。5. 常见问题与排查技巧实录5.1 温度读数跳变或漂移这是最常见的投诉。排查思路按以下顺序来现象可能原因排查方法解决措施读数无规律跳变电源纹波大示波器看VDD纹波加去耦电容换LDO读数随环境变化漂移参考电压不稳测Vref是否随温度变化换精密基准读数随负载变化地线压降测模拟地和数字地压差单点接地加粗地线特定频率干扰开关电源或电机噪声频谱分析加屏蔽改布线加滤波缓慢漂移传感器老化或自热对比标准温度计更换传感器降低激励电流我遇到过一个典型案例客户反映温度读数每隔几秒跳一次幅度约1°C。查了半天最后发现是旁边继电器动作时产生的干扰通过电源耦合进来。解决办法是在继电器线圈两端加续流二极管同时在MCU电源入口加π型滤波。问题解决。5.2 远程传感器检测不到如果PJ85718DM报传感器开路或者读数固定在极端值按这个流程查万用表测二极管断电状态下用万用表二极管档测远程测温二极管正向应该有0.5V到0.7V的压降反向不通。如果正反向都不通二极管坏了或者线断了。检查接线极性确认发射极接正端基极-集电极接负端。接反了读数会异常但不一定报错。测线阻长线场景下线阻过大会导致激励电流不足。一般要求单线电阻小于几十欧姆。查配置寄存器确认芯片的通道选择、激励电流设置正确。有时候是软件配置错了硬件没问题。5.3 本地与远程温度差异过大如果两路温度差了几十度先别急着改代码按这个逻辑判断差异恒定且合理比如本地35°C远程25°C设备发热导致本地偏高正常。差异恒定但离谱比如本地25°C远程80°C大概率是远程通道有系统误差需要重新标定。差异变化无规律可能是远程线路接触不良或者本地传感器受某热源影响。标定方法把远程传感器和标准温度计放在同一环境记录多个温度点下的读数做线性拟合把斜率和截距写入补偿参数。5.4 通信接口不稳定PIC18F85K90 和 PJ85718DM 之间的I2C或SPI通信出问题通常表现为读不到数据或者数据错乱。排查要点上拉电阻I2C必须加上拉典型值4.7kΩ。阻值太大会导致上升沿变缓太小会增加功耗。时钟频率长线或者高干扰环境下降低通信速率。I2C从400kHz降到100kHz稳定性会明显提升。地线连接两颗芯片必须共地而且地线要短要粗。软件重试通信失败时不要直接报错先重试几次。我一般重试3次都失败才判定故障。6. 系统集成与长期运行考量6.1 校准流程的工程化温度监测系统出厂前必须校准否则每台设备的读数都可能不一样。校准流程我建议这样设计单点校准在25°C环境下记录本地和远程的读数计算偏差写入EEPROM。这是最基本的能消除大部分系统误差。多点校准如果精度要求高在0°C、25°C、50°C三个点分别校准做分段线性补偿。成本高一些但精度能到±0.5°C以内。自动校准有些高端方案会在系统启动时利用已知的参考温度比如芯片内部基准做自校准。这需要芯片支持PJ85718DM 的部分型号有这个功能。校准数据要存在非易失存储器里掉电不丢。PIC18F85K90 自带EEPROM写进去就行。注意EEPROM有擦写次数限制不要频繁写校准一次存一次即可。6.2 低功耗设计要点如果设备是电池供电或者对功耗有要求温度监测部分的功耗要控制。几个关键点间歇采样不需要连续测温的场景可以每隔几秒唤醒一次测完就睡。PIC18F85K90 有休眠模式功耗能降到微安级。降低激励电流远程测温的激励电流越大功耗越高但抗干扰越好。要在功耗和稳定性之间找平衡。一般10μA到100μA之间选。关闭未用外设ADC、LCD驱动、通信模块不用的时候就关掉。传感器供电控制如果外接传感器有独立供电不用的时候可以切断。我做过一个电池供电的温控器采用间歇采样策略平均功耗做到50μA左右两节AA电池能用两年以上。6.3 电磁兼容性设计HVAC设备里有大功率电机、继电器、接触器电磁环境恶劣。温度监测部分要做好防护PCB布局模拟部分和数字部分分区布局地平面分割单点连接。滤波所有对外接口加RC滤波或者磁珠。屏蔽远程测温线用屏蔽线屏蔽层接机壳地。隔离如果干扰特别严重考虑用隔离器或者光耦把测温部分和主控部分隔开。这些措施看起来麻烦但能省掉后期大量的现场故障处理。我见过一个项目因为没做隔离每次空调压缩机启动温度读数就跳一下最后不得不改板。7. 方案扩展与个人经验总结这套 PJ85718DM 加 PIC18F85K90 的组合基础功能是双通道温度监测但扩展空间很大。比如多路远程测温PJ85718DM 支持多通道可以接多个远程二极管监测不同位置的温度。在大型HVAC系统里可以同时监测回风、送风、室外等多个点。无线上报PIC18F85K90 的UART接一个无线模块就能把温度数据传到网关或者云端。适合分布式温控系统。本地逻辑控制利用MCU的剩余资源实现简单的PID控制直接驱动执行机构不依赖上位机。这样即使通信断了系统也能自主运行。数据记录加一颗EEPROM或者Flash定期记录温度数据方便事后分析。对于诊断系统问题很有帮助。最后分享几个我在实际项目中总结的小技巧第一远程测温二极管尽量选同一批次。不同批次的二极管特性有差异虽然芯片能补偿大部分但一致性好的批次能让校准更简单。第二采样周期不要追求快。HVAC温度变化慢采样太快只会增加噪声和功耗。10Hz到100Hz足够了。第三滤波参数要可配置。不同现场干扰程度不一样把滤波窗口大小做成可配置参数现场调试时能灵活调整。第四保留原始数据接口。调试阶段把滤波前的原始温度也输出出来方便判断是传感器问题还是滤波问题。第五长期运行要定期自检。系统跑几个月后传感器可能老化线路可能松动。定期做一次自检比如对比本地和远程的合理性能提前发现隐患。这套方案我在几个项目里用过稳定性没问题成本也控制得住。如果你正在做类似的东西希望这些细节能帮你少走点弯路。温度监测这事原理不复杂但工程细节决定成败多花点时间在硬件设计和数据处理上后面会省很多事。