news 2026/10/22 1:10:55

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于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.3V,DQ 通过一只 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 ROM(0xCC)之后直接发 Convert T 再读回数据就行。但本地和远程是两颗,每次读之前必须先 Match ROM(0x55)加设备地址。我在上电初始化和每次探头插拔后都会做一次完整的 ROM 搜索,不依赖出厂时记录的 ROM 码,这样现场更换探头后系统照样能认识新设备。ROM 搜索的算法说起来也简单:从最低位开始,每一位先读两次,第一次读到晶体管内部逻辑的补码,第二次读到反码,两者组合能判断当前位是 0、1 还是冲突位;冲突位采用深度优先遍历,最终就能把总线上所有设备的唯一 48 位序列号找出来。实现一遍之后建议用一个已知的地址表做自测,确保遍历逻辑没写反。

两路温度轮询的优化顺序是:先发 Skip ROM 广播 Convert T,让两颗传感器同时开始转换,等待约 800ms 后,再按照 ROM 索引一次读回两颗的 Scratchpad。这样比一先一后转换省了整整一次转换周期。转换完成判断可以不做固定延时,用一个小技巧:Convert T 之后复位再读一个位,如果总线被拉低说明还在转换,拉高则转换完成。这个特性在协议兼容的器件上普遍存在,实际用了大半年非常稳。每颗传感器返回 9 字节,最后 1 字节是 CRC,多项式是 x^8+x^5+x^4+1。我固件里实现了 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 并解析温度时,原始值是 [MSB<<8 | 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 判断时序细节。把这个工具保留在产品里,现场维护人员排查线路问题时能省下不少时间。

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

CAD辅助CATIA三维文字制作:从文字分解到凸台拉伸的完整流程

/* 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 1:08:30

嵌入式温度监测实战:PJ85718DM+STM32F723IE双通道测温方案

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

基于STM32F373VC与PJ85718DM的HVAC温度监测系统方案

/* 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 1:07:52

PJ85718DM单总线温度传感器与PIC18F55K42的本地远程测温方案

/* 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 1:06:30

工业级热电偶温度采集系统:STM32+F303K8+PJ85718DM裸机实现

/* 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 1:06:30

PJ85718DM+STM32F103RB双模温控节点设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华