资讯详情

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

📅 2026/10/22 1:10:56 | 华诺云谱 👁 阅读
基于PJ85718DM与PIC18F85J50的双路温度采集HVAC温控方案
做温度采集这么多年我最大的感受是硬件工程师平常最容易低估的就是“现场”两个字。控制器放在配电柜里柜内温度比环境高十几度是常态远程探头挂在风道口或者室外机旁边线要拉十来米还得躲开变频器的干扰。我最近完成的这块温控板就是用 PJ85718DM 这颗单总线数字温度传感器配合 PIC18F85J50 主控同时采集本地温度和远程温度从硬件搭出来到固件跑通只用了一个多星期。这篇东西没有高深理论全部是我踩过的坑和最后稳定运行的方案包含完整电路思路、1-Wire 驱动代码和 HVAC 现场的部署细节适合正在做嵌入式温控、HVAC 控制板或者类似多点测温项目的朋友直接参考。1. 这套组合要解决的真实问题机柜内与风管外的两路温度1.1 本地温度不是给显示屏看的是给系统安全用的本地温度我一开始也觉得没多大用反正控制逻辑按工艺温度走就行。直到有一次样机在配电柜里连续运行一个晚上后第二天直接没反应打开柜门一摸散热片手都不敢放上去。单独量环境温度完全正常问题就出在机柜内部空气流通太差线性稳压、继电器线圈和 MCU 自身的热量叠在一起局部温度比环境高出去十几度。从那以后我在每块主控板上都保留一路本地测温传感器装在板上靠近 MCU 但避开功率器件和稳压器。这一路数据的价值主要是两件事一是判断机柜散热是否异常比如风扇堵转、滤网灰尘过多二是给系统软件提供降额保护比如本地温度超过 55°C 就降低继电器动作频率超过 65°C 直接关断加热输出。你可以把它理解成给控制板装了一个体温计系统病了先从这个数值上反映出来。1.2 远程温度数字化之后线才敢拉得远另一路远程温度要解决的是风管里或室外机旁边的测温。我见过很多项目用 NTC 热敏电阻做远程探头两三米内还行线一旦拉到十米以上问题就全出来了端子氧化、线阻漂移、地环路干扰读数忽高忽低。换用 PJ85718DM 之后情况完全不一样它输出的就是数字量温度数据经过单总线传输线阻不会直接改变温度值只要通信能成功读数就是稳定的。而且一条总线可以挂多颗传感器每颗都有唯一的 ROM 码主机可以用地址精确区分。我这块板子把本地和远程两颗都挂在同一条 1-Wire 总线上远程那颗通过可插拔探头引出最长拉到 15 米也正常工作。后续真要再加一路温度不用加 MCU 引脚只要总线上多挂一颗传感器固件里重新做一次搜索就能识别。1.3 为什么没有继续沿用 NTC 加 ADC 的老方案不是说 NTC 不能用而是在这个项目里它的综合成本更高。NTC 本身便宜但要在 HVAC 现场标定一个可信的温控区间得考虑 B 值分散性、分压电阻精度、ADC 参考电压漂移还要做查表插值。远程探头如果安装后端子氧化导致线阻变化你根本分不清是真实的温度变化还是线路阻抗变化。一颗 PJ85718DM 价格比 NTC 高一点但省掉了 ADC 通道资源、查表固件和一大批标定工序。对比项NTC 两线制模拟方案PJ85718DM 单总线方案线缆电阻影响直接叠加进测量回路读数偏移只影响通信电平不影响温度数值多探头扩展每个探头一路 ADC还要单独处理一条总线多设备靠 ROM 码区分现场更换探头需要重新标定或换取同批次插上后总线搜索自动识别抗干扰能力模拟信号容易受共模干扰数字传输CRC 校验失败可重试软件工作量查表、滤波、多路通道处理1-Wire 驱动加 CRC 校验MCU 用的是 PIC18F85J50本身资源也不算紧张但在产品上保留 GPIO 和 ADC 通道给别的地方用总比全耗在温度上划算。另一个原因是可维护性现场换探头时新的 PJ85718DM 自带唯一 ROM 码插上去系统重新做一次总线搜索就能自动识别不像 NTC 探头还要逐台对应标定曲线。所以最后拍板用数字方案本质上是拿一点物料成本换开发效率和长期维护成本这笔账在 HVAC 产品上是划算的。2. 硬件连接PJ85718DM 与 PIC18F85J50 的接口与现场防护设计2.1 最小电路上拉电阻、电源去耦与引脚选择先给出最核心的连接方式。PJ85718DM 三个引脚分别是 VDD、DQ、GND我把 VDD 直接接到系统 3.3VDQ 通过一只 4.7kΩ 上拉电阻到 3.3V再走短跳线到 PIC18F85J50 的 RB0。为什么统一用 3.3V因为这颗 MCU 工作于 3.3V 逻辑传感器也按 3.3V 供电省掉了电平转换的麻烦。VDD 和 GND 之间就近放一颗 0.1μF 陶瓷电容放在传感器引脚旁边MCU 端 DQ 和地之间再加一颗 10pF 的小电容和 100Ω 串联电阻主要用来抑制远端进来的高频干扰不至于让内部寄生振荡把数据边沿搞坏。RB0 本身配置成普通数字输入/输出1-Wire 协议要求 DQ 线空闲时保持高电平写入时通过拉低和释放产生时序槽所以操作方式就是先把引脚置为输出并拉低等时序槽完成再把引脚切回输入让上拉电阻把电平拉高。引脚选择上要避免和其他外设复用太多中断资源我选 RB0 纯粹是因为这在板子上布线最顺而且检修时探头插头拔走后不会影响别的功能。2.2 远程探头怎么拉线才安全远程探头不是直接把传感器焊在裸线上丢出去。我用的是一根带屏蔽的双绞线长度 15 米信号走其中一根另一根接地屏蔽层只在控制器端单点接地。这样做的理由是避免形成地环路高频共模干扰有泄放路径又不会在屏蔽层里产生电流。探头插件的电路上做了三层防护靠近控制器的插座侧并联一颗 TVS 管到 GND浪涌从接口进来到不了 MCU在 TVS 后面串一只 100Ω 电阻到 DQ 总线限制异常灌入的电流传感器端的 VDD 上再串一只小功率自恢复保险丝防止现场误把电源线短路。很多人忽略的是极性防反远程探头是现场拆装件插反一次传感器就烧了所以连接器我强制用带防误插的 XH 座并且把传感器端的电源脚和信号脚标得很明显。整套接插件的规格最好在打样前就定下来不然后面换连接器型号保护电路参数也要跟着调。2.3 布线布局上几个容易踩的细节板内布局也有讲究。本地那颗传感器不能放在发热元件正上方也不要放在大面积地平面上让铜皮把热量导过来我在传感器封装下方挖了一块空铜区减少 PCB 导热带来的测量偏移。远程探头接口放在板子边缘远离继电器和变压器高压区到探头连接器的走线尽量不走平行长线。如果板上有变频器或继电器频繁动作建议 DQ 走线两侧预留地线保护别让一根 1-Wire 线横穿整块板。最后是连接器焊接HVAC 产品常有振动环境探头插座要选带锁扣的型号量产时还要对焊点做检查我第一批样机就吃过虚焊的亏温度偶发读不到查了半天是插座引脚和板子脱焊。这类问题在样板阶段只要用力按压插头就能复现重点不在芯片选型而在结构件和工艺。3. 固件实现从 1-Wire 时序到两颗传感器的可靠轮询3.1 1-Wire 基本原语与 XC8 实现先写底层原语。1-Wire 总线上所有操作都是从复位开始主机把 DQ 拉低 480μs 然后释放传感器在释放后 60μs 内会把总线拉低一段时间作为存在脉冲。写时序槽分两种写 0 是拉低整个 60μs写 1 是拉低 1~15μs 然后释放读时序则是主机拉低 1~6μs 后释放在 15μs 左右采样总线电平。这里最重要的忠告是别在普通延时函数里用死循环做几十毫秒的阻塞等待把整个传输做完可能占掉主循环一大半时间HVAC 系统里还要处理显示、继电器和安全逻辑。我的做法是用 Timer0 做 1μs 时基底层操作全部改为精确延时保证总线时序误差控制在 2μs 以内。PIC18F85J50 的 Timer0 是 16 位定时器时钟配成 1MHz每次计数就是 1μs非常顺手。#define DQ_OUT() TRISBbits.TRISB0 0 #define DQ_IN() TRISBbits.TRISB0 1 #define DQ_LAT LATBbits.LATB0 #define DQ_RD() PORTBbits.RB0 static void ow_delay_us(uint16_t us) { uint16_t start TMR0; while ((uint16_t)(TMR0 - start) us) ; } uint8_t ow_reset(void) { uint8_t presence; DQ_OUT(); DQ_LAT 0; ow_delay_us(480); DQ_IN(); ow_delay_us(70); presence DQ_RD(); ow_delay_us(430); return presence; // 返回 0 表示有设备应答 }写 read_bit 和 write_bit 时要注意采样窗口读位函数必须在时序槽开始后 15μs 附近读uint8_t ow_read_bit(void) { uint8_t val; DQ_OUT(); DQ_LAT 0; ow_delay_us(3); DQ_IN(); ow_delay_us(10); val DQ_RD() ? 1 : 0; ow_delay_us(50); return val; }有了这三个原语读写任意字节、发任意命令就只是循环拼接而已。真正花时间的是把所有命令和响应组合成一个能重试、能容错的状态机。3.2 ROM 搜索与广播转换两路温度怎么读最快如果总线上只有一颗传感器Skip ROM0xCC之后直接发 Convert T 再读回数据就行。但本地和远程是两颗每次读之前必须先 Match ROM0x55加设备地址。我在上电初始化和每次探头插拔后都会做一次完整的 ROM 搜索不依赖出厂时记录的 ROM 码这样现场更换探头后系统照样能认识新设备。ROM 搜索的算法说起来也简单从最低位开始每一位先读两次第一次读到晶体管内部逻辑的补码第二次读到反码两者组合能判断当前位是 0、1 还是冲突位冲突位采用深度优先遍历最终就能把总线上所有设备的唯一 48 位序列号找出来。实现一遍之后建议用一个已知的地址表做自测确保遍历逻辑没写反。两路温度轮询的优化顺序是先发 Skip ROM 广播 Convert T让两颗传感器同时开始转换等待约 800ms 后再按照 ROM 索引一次读回两颗的 Scratchpad。这样比一先一后转换省了整整一次转换周期。转换完成判断可以不做固定延时用一个小技巧Convert T 之后复位再读一个位如果总线被拉低说明还在转换拉高则转换完成。这个特性在协议兼容的器件上普遍存在实际用了大半年非常稳。每颗传感器返回 9 字节最后 1 字节是 CRC多项式是 x^8x^5x^41。我固件里实现了 Dallas 标准 CRC8本地和远程两路数据都必须过了 CRC 才准用不合格的直接丢弃并对该传感器做一个失败计数连续三次失败就认为离线。uint8_t ow_crc8(uint8_t crc, uint8_t data) { uint8_t i; crc ^ data; for (i 0; i 8; i) { if (crc 0x01) crc (crc 1) ^ 0x8C; else crc 1; } return crc; }读取 Scratchpad 并解析温度时原始值是 [MSB8 | LSB]12 位分辨率下低位是 0.0625°C所以温度值就是把原始值带符号右移四位。判断负温度要把高字节补位做对否则冬天测到零下会整段逻辑崩掉。我建议用 int16_t 保存原始值最后除以 16 用定点数算不要在浮点环境里裸奔。3.3 传感器离线与坏值保护对 HVAC 控制系统来说读不到温度比读到错误温度更危险。如果直接把离线传感器的返回值当成 0°C 传给温控逻辑冬天可能会把加热器全功率打开造成安全事故。我的处理方式是每次读到的数据先过 CRC再由合法性检查测量值超出 -55°C 到 125°C 直接丢弃传感器连续读取失败时系统保留最后一次有效值并把该路标志位置为无效温控逻辑按最保守策略走。比如远程温度无效时禁止制热输出本地温度无效时强制打开散热风扇直到数值恢复为止。还要注意总线上如果有一颗传感器把总线长时间拉低整条总线都会被拖死本地和远程谁都读不了。远程探头线被老鼠咬断短路时就会发生这种情况。所以量产设计里我建议不要把本地和远程放在同一条物理总线上各用各的 GPIO 和上拉电阻如果为省引脚必须共线就在远程探头路径上加隔离开关总线上出现持续低电平超过 500ms 时先把远端点断开等总线恢复空闲再尝试重新接入。4. 温度准不准标定、自发热与温控联动的那些事4.1 分辨率与器件精度要分开看PJ85718DM 在协议兼容器件的典型参数下12 位分辨率的量化间隔是 0.0625°C这是数字显示上能看到的分辨率不等于绝对精度。实际器件在中温区比如 -10°C 到 85°C 区间通常能做到 ±0.5°C 级别的准确度到了高温段或低温段会有明显偏差工业级产品如果全温段按 ±1.5°C 设计会比较稳妥。我上一块板子犯过一个错误显示界面做到 0.1°C 小数位客户拿标准水银温度计一比就找你麻烦说读数差 0.3°C 是质量问题。后来我在说明书和技术文档里都明确把精度等级写在产品规格里不在显示小数位上承诺绝对精度。固件层面还留了每台设备的温度偏移补偿值出厂前在 25°C 标准温场里做一次两点标定把补偿值写进 MCU 的 EEPROM这样读取值加上补偿就能修正模块本身的离散性。这个补偿值在更换传感器后必须重新标定否则冲着漂亮小数位去的设计反而会掩盖真实误差。4.2 转换时间与自发热传感器也是热源12 位分辨率下一次温度转换大概需要 750ms这个数字会直接影响采样周期的选择。我建议控制器的温度采样周期不要小于 1s否则传感器持续高频转换会产生自身发热读数会比周边真实温度高。实测连续转换 10 分钟后同一环境下比另一颗轮询周期 1s 的传感器高出 0.2~0.3°C。单独看不算大但本地传感器装在控制板上本来就处在有自发热的机柜里再叠加传感器自身发热很容易让系统误判散热风扇故障或者过早触发保护降额。所以固件里我做了强制约束任何情况下对同一颗传感器的转换命令间隔不低于 1s哪怕现场调试需要快速刷新也只在测试模式下临时放开。远程探头那边自发热影响反而小因为探头通常悬在风管流场中风速会带走热量但导热硅胶的填充厚度和探针接触面积也会引入热阻封装越厚响应越慢别只看响应时间参数。4.3 温控逻辑怎么正确使用两路温度本地温度和远程温度在控制逻辑里的角色要分清楚。远程温度反映的是被控对象比如送风、回风、室外环境工艺控制全部以它为准本地温度只用来保护控制板自身两者不要混用。我写的温控逻辑是典型的滞回控制制热时当远程温度低于目标值减 1.5°C 开启高于目标值加 0.5°C 关闭本地温度超过 55°C 时强制打开散热风扇超过 65°C 时无条件关断加热输出并报故障。这样设计的好处是工艺控制回路的响应不受机柜环境温度波动影响安全回路又能在极端情况下独立兜底。调试现场遇到过一种典型问题柜门打开时本地温度瞬间降下来安全阈值不触发空调运行正常柜门一关运行一段时间本地温度飙升导致设备停机保护。客户以为是探头的锅实际上是因为散热风道被柜门挡住。这种情况只有两路温度同时存在配合日志里的温度曲线才能快速定位原因。5. HVAC 现场部署从样机到量产的一点实战记录5.1 主循环流程与任务调度我把主循环设计成三个任务1s 温度采集任务、100ms 显示刷新任务、50ms 按键和安全逻辑任务。温度采集任务采用状态机不是一次函数读完整个总线就返回。状态机的状态包括 IDLE、SEND_CONVERT、WAIT_CONVERT、READ_LOCAL、READ_REMOTE、CHECK_CRC 和 OFFLINE_RETRY。每次进入 IDLE 先检查上次失败计数失败多就切换成扫描模式避免一条总线上穿过一个坏探头就把整个系统卡住。上电的时候不要急着读温度先延时 2s等传感器稳定和总线电平安定再做一次完整 ROM 搜索最后才进入正常轮询。这个过程在出厂测试时看得很清楚如果上电瞬间母线电压还在抖动就发复位脉冲偶尔会把传感器的内部状态搞乱需要额外恢复时间。5.2 探头的现场安装位置比探头本身更关键远程探头装在哪直接决定你控制的是哪一路温度。同一个空调箱探头放在回风口和送风口出来的运行策略完全不同。我现在的习惯是在图纸上标清楚主控温度放在回风口因为回风温度代表整体区域的平均状态室外补偿温度放在室外机组背阴侧避免阳光直接照射。风管里安装时至少距离盘管 30cm探头要悬在气流中心而不是贴在金属壁上否则测到的是管壁温度而不是空气温度。有条件的话给探头套一个辐射防护罩防止附近的盘管辐射热直接加热传感器外壳。室外侧的探头要做防水处理接线盒的进线孔用带胶的热缩管或防爆格兰头传感器自身也要装进带 IP 防护等级的探头外壳里。还有一个很容易忽略的问题探头线别和 220V 动力线平行走线至少间隔 30cm如果避免不了就穿金属管并把金属管两端都可靠接地。5.3 量产测试与老化环节量产阶段只测主控板不测探头线等于没有测。温度采样在工程上往往不是芯片的问题而是端子、线束、连接器三者接触不良的问题。我产线最终测试流程是把主控板和配套的远程探头接好放进恒温箱做 5°C、25°C、55°C 三个点的读数比对同时对探头线做弯折和插拔测试。恒温箱用的参考温度计每年要按时溯源校准不然产线上的“合格标准”本身就在漂移。板子在老化柜里跑 24 小时期间每 10 分钟记录一次本地和远程温度绘制漂移曲线任何一路温度跳动超过 0.5°C 就要排查。老化测试里最常见的问题不是传感器失效而是板子上的继电器动作瞬间产生的电磁干扰把 1-Wire 总线打乱偶尔出现 CRC 错误。解决了这类干扰之后总线时序稳定性会好很多批量不良率能控制在两位数以下。调试阶段我还有个习惯DDQ 线上挂一个串联 1kΩ 的调试 LED任何一次复位脉冲和存在应答都能直接看出来。上电时 LED 闪一下说明传感器应答正常调试代码时不用每次接逻辑分析仪。真正测时序还是要用示波器或者逻辑分析仪看波形千别只凭 LED 判断时序细节。把这个工具保留在产品里现场维护人员排查线路问题时能省下不少时间。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑