首页 / 资讯中心 / 文章详情

嵌入式双路温度监测实战:PJ85718DM与PIC18F8520方案解析

嵌入式双路温度监测实战:PJ85718DM与PIC18F8520方案解析 ★ FEATURED ARTICLE
PJ85718DM 这颗芯片我拿到样片第一反应是“这不就是给嵌入式系统省一路传感器的货吗”。做嵌入式温度监测的人都知道很多项目要求同时看板卡本身的环境温度和远端某个测量点的温度传统做法是两颗传感器、两套采集电路麻烦不说线一长误差就出来了。PJ85718DM 加 PIC18F8520 这个组合一颗传感器解决本地和远程两路测温一颗 8 位 MCU 负责读取、判断和上报整个系统做下来非常干净。这篇文章我把从器件选型、硬件设计、固件开发到远程通信的完整过程捋一遍重点讲讲在 HVAC 这种电磁环境恶劣的场合哪些坑必须提前避开希望给正在做类似项目的朋友一个能直接抄作业的参考。这套方案适合谁如果你在搞嵌入式控制板、暖通空调控制器、机房环境监控、冷冻水系统测点或者任何需要“本地温度 远端温度”双点监控的产品都可以往下看。我会把涉及到的寄存器操作、温度换算、通信协议和排查手段都展开说保证新手能照着做老手也能找到几个值得注意的细节。1. 项目整体设计思路本地与远程测温到底怎么拆1.1 先分清“本地温度”和“远程温度”这两个概念在嵌入式温度监控里“本地”和“远程”这两个词最容易把人绕晕。PJ85718DM 这类数字温度芯片里本地温度指的是芯片内部温度传感器测量的、芯片周围 PCB 上的环境温度。而远程温度指的是通过芯片的专用引脚外接一个普通二极管测量那个二极管所在位置的温度。这里的“远程”不是网络上传数据到服务器的远程而是“传感器本体之外、通过引线接到别处去测的那个点”的远程。我举个例子你就明白了。HVAC 冷冻水系统中主控板上放着 PJ85718DM它测的是控制板电气舱内的空气温度这叫本地温度。同时我们把一个二极管贴在冷冻水回水管外壁上用两根线引回芯片的远程测温引脚测的是管壁温度这叫远程温度。电气舱温度可能有 40°C而回水温度只有 12°C两路温差很大。如果用两颗普通热敏电阻ADC 采样、线性校准、引线压降补偿全都要自己做而 PJ85718DM 这种二合一芯片把这些脏活全包了直接读寄存器拿温度值这就是选它的首要原因。1.2 为什么选 PJ85718DM 和 PIC18F8520 这个组合先说传感器。PJ85718DM 集成了本地测温通道和一个或两个外部二极管测温通道通道切换和温度数据转换都在芯片内部完成。它通过 I2C/SMBus 接口输出温度结果12 位分辨率下能到 0.0625°C 的刻度做 HVAC 这种控制级监测绰绰有余。更重要的是远程二极管测温不用额外做冷端补偿也不怕引线电阻因为芯片内部有串联电阻补偿机制这个特性在探头线比较长的场合特别值钱。再说主控。PIC18F8520 是一颗片内外设非常齐全的 8 位 MCU自带 MSSP 模块可以配置成 I2C 主机、多个 UART、内置 EEPROM、看门狗甚至还有 CAN 模块。选它不单是因为能读写温度芯片更重要的是系统还要承担报警逻辑、通信协议解析、参数保存这些任务。如果你只是测个温度用 8 脚单片机就够了但这套方案面向的是 HVAC 控制器这种要长时间稳定运行、可能要对接上位机或 PLC 的产品ROM/RAM 和外设冗余必须够PIC18F8520 刚好满足。1.3 系统整体数据流整套系统的数据流并不复杂。PJ85718DM 通过 I2C 总线把本地温度和远程温度寄存器暴露给 PIC18F8520MCU 定时读取、滤波、换算成摄氏温度然后根据预设的高低温阈值判断是否报警。需要远程监控时MCU 用串口接 RS485 收发器以 Modbus RTU 从机的身份把温度数据和状态字上报给上位机。如果现场有多台控制板就在同一条 RS485 总线上挂多个节点每个节点分配不同的地址由上位机轮询数据。这里有个容易被忽略的点PJ85718DM 的 ALERT 引脚可以直接接 PIC18F8520 的外部中断输入温度越限时芯片主动拉低引脚MCU 不需要一直轮询温度值大大降低了软件负担。报警响应速度可以从秒级降到毫秒级HVAC 系统里如果要做保护停机这个接口很重要。2. 硬件电路搭建HVAC 现场的抗干扰设计比想象中更重要HVAC 现场环境一点都不干净变频器、接触器、大功率电机随时在制造干扰。很多方案在实验室运行良好一到现场就出现温度读数乱跳、通信超时、设备无故复位十有八九是硬件设计没把干扰当回事。这一节我把几个关键环节逐个说明。2.1 PJ85718DM 的外围电路与引脚连接PJ85718DM 的供电我建议用 3.3VVDD 引脚旁边必须要加 0.1uF 陶瓷电容和 10uF 电解电容陶瓷电容离电源脚越近越好。I2C 总线的 SDA 和 SCL 各接一个 4.7kΩ 上拉电阻到 3.3V这个阻值在 100kHz 到 400kHz 下都稳。远程测温引脚 DP/DN 直接接外接二极管。实际项目中我推荐使用小信号三极管的 BE 结作为测温二极管比如把常见 NPN 三极管的基极和集电极短接用发射极和集电极之间当作二极管使用。注意极性不能接反接反了读数会严重偏离。为了抑制长线引入的干扰我习惯在 DP/DN 上各串联一个 1kΩ 到 10kΩ 的电阻再在靠近传感器端加上一个 10nF 到 100nF 的电容具体容值要参考芯片手册里的远程测温输入阻抗要求。电容加太大远程测温的建立时间会变长读数刷新会变慢。2.2 PIC18F8520 与传感器的接口设计PIC18F8520 的 MSSP 模块配置成 I2C 主机模式后SCL 和 SDA 引脚可以直连 PJ85718DM。但我必须提醒一句先确认两边的电平。PJ85718DM 工作在 3.3VPIC18F8520 如果用 5V 供电那么 SCL/SDA 不能直连必须做电平转换。最简单的做法是用双 MOS 管 I2C 电平转换电路或者干脆让 PIC18F8520 也跑 3.3V整板统一供电省去一堆麻烦。我在这个项目里选择 3.3V 单电源MCU、传感器、RS485 收发器全部由 3.3V 供电电平匹配问题直接消失。MCU 内部和 EEPROM 操作都正常I/O 驱动能力也够。如果你非要用 5V 系统记得在 I2C 线上加转换芯片不要用电阻分压因为 I2C 是开漏总线分压会影响逻辑电平。2.3 电源与通信接口的抗干扰处理HVAC 设备最常见的供电是 24VAC 或 24VDC。24VAC 进来以后第一级我建议加 TVS 管和共模电感再接整流和 DC-DC 降压。TVS 管要选钳位电压合适的共模电感能有效抑制变频器带来的共模噪声。DC-DC 输出后再加一级 LDO 给 MCU 和传感器供电虽然牺牲一点效率但纹波小很多温度读数也稳定。RS485 通信电路更要注意。我用的是带隔离的 RS485 收发器隔离电源用独立的 DC-DC 模块这样总线侧和主控侧没有电气连接现场共地干扰就不会串进 MCU。总线 A/B 两端要加 120Ω 终端电阻注意是总线物理两端各一个不是每个节点都加。总线引脚还需要接 TVS 管防止雷击和静电损坏。另外A/B 总线空闲时不能是高阻状态要加偏置电阻把总线的空闲电平拉到确定状态否则收发器会误判数据。2.4 PCB 布线远程测温走线要当作模拟信号对待远程测温虽然是芯片内部 ADC 在做转换但外部引线信号非常微弱极容易被干扰。布线时DP/DN 走线要尽量靠近、等长远离开关电源的开关节点和大电流走线。如果实在避免不了平行相邻中间要加一根地线隔离或者采用包地处理。测温二极管放在真正要测温度的位置通常用导热胶贴在管道外壁或散热器表面贴之前要确认被测表面温度和芯片远程测温范围匹配。还有一个细节很多人忽略不要把远程测温的走线和 RS485 差分走线平行长距离同向走线高频串扰会让温度读数周期性跳动。必须交叉时要垂直跨越。如果探头引线是屏蔽线屏蔽层要在传感器端单点接地不要在两头都接避免形成地环路。3. 固件开发从 I2C 时序到温度数据换算硬件搞定以后就进入固件开发。PIC18F8520 开发我用的是 C 语言配合厂商提供的编译器整体流程并不复杂但有几个容易出错的地方需要特别小心。3.1 初始化 I2C 主机模式PIC18F8520 的 MSSP 模块初始化成 I2C 主机模式挺直接。关键点是计算 SSPADD 寄存器的值它决定 I2C 时钟频率。公式是Fosc / (4 * SCL频率) - 1。如果主频用 10MHz想跑 100kHzSSPADD 10MHz / (4 * 100kHz) - 1 24也就是 0x18。初始化代码如下void I2C_Init(void) { SSPCON1 0x28; // 0b00101000: I2C 主机模式 SSPCON2 0x00; SSPADD 0x18; // 100kHz 10MHz SSPSTAT 0x80; // 标准 I2C 电平使能 slew rate }初始化以后每次通信前要等待 MSSP 模块不忙用while (SSPSTAT 0x04);判断总线状态。I2C 时序标准启动条件、发送地址、写寄存器、读数据都按常见流程走。需要留意的是一旦总线上出现异常MSSP 模块有可能会进入总线冲突状态这种情况要从头重新给总线发停止条件并且重新初始化模块。3.2 本地温度数据读取和解析PJ85718DM 的温度寄存器通常由高字节和低字节组成低字节只有高几位有效。我以 12 位分辨率为例温度数据是补码格式每个 LSB 代表 0.0625°C。读取过程是先写寄存器地址再连续读两个字节。假设用 I2C 读函数拿到 16 位原始值raw换算代码可以这样写int16_t raw; float temp_c; raw I2C_ReadTempReg(); // 伪代码实际是从芯片读出的 16 位值 if (raw 0x8000) { raw | 0xF000; // 符号扩展 } temp_c (float)raw * 0.0625;注意符号扩展这步很容易漏。如果直接用 16 位整数去乘 0.0625负温度会变成很大的正数。我在调试时就踩过这个坑明明室温 15°C 显示出来却是 370°C后来发现是低字节扩展方式写错了。处理好符号位以后温度显示就正常了。另外本地温度芯片本身有自热如果你的板子发热元件多本地温度会略微偏高可以考虑在传感器下方铺一个小的铜皮接地辅助散热但不能完全消除。3.3 远程温度测量过程与补偿远程温度的读取流程跟本地温度类似但多了一步通道选择。PJ85718DM 如果支持多个远程通道需要先写配置寄存器选择当前要读哪个通道。远程通道的测温精度和本地通道有差别而且受外接二极管特性和引线电阻影响更大。芯片手册通常会提供一个串联电阻补偿机制允许你写入一个估算的引线电阻值来修正读数。我在现场遇到过这样的情况远程探头线长两米实测线阻大概 4Ω读出来的管壁温度比用热电偶实测值低 0.8°C。后来把串联电阻补偿寄存器写成 4 后误差缩小到 0.2°C 以内。所以如果你的探头线比较长最好提前用万用表量一下正反向电阻然后按手册公式把补偿值写进去。远程测温二极管本身的特性也会有偏差正规做法是在出厂校准时做一次两点校准在低温点和高温点各记一个偏移量然后写进 EEPROM 做软件修正。3.4 阈值报警与 MCU 中断处理温度监测系统的核心功能不只是读数越限报警同样重要。PJ85718DM 提供高低温报警寄存器你可以在 MCU 上电时把阈值写进去。当温度超过上限或低于下限时芯片会拉低 ALERT 引脚。我把 ALERT 接到 PIC18F8520 的 INT0 外部中断输入中断服务程序里读取状态寄存器确认是高温还是低温报警然后执行对应的动作比如置位继电器、发送报警帧、点亮 LED。阈值设置一定要加滞回否则温度在阈值附近抖动时报警信号会频繁跳变。我的做法是高温报警设为 45°C恢复值设为 44.5°C低温报警设为 5°C恢复值设为 5.5°C。写进芯片的报警寄存器时需要把恢复阈值也一起更新。这样在实际控制中不会出现反复触发。4. 远程监控与数据上报RS485 Modbus 从机实现嵌入式温度监测很多时候不是自己看而是要把数据交给上位机、PLC 或者楼宇自控系统。HVAC 行业最常见的通信方式就是 RS485 Modbus RTU成本低、抗干扰好不用折腾以太网。4.1 为什么 HVAC 现场偏爱 RS485 而不是以太网RS485 是差分信号两根线就能支持几十个节点布线距离可以到 1200 米对现场施工特别友好。HVAC 设备分布范围广一个冷站可能有几十台风机盘管和机组用 RS485 手拉手就能组网。以太网虽然带宽大但是需要交换机、需要配置 IP普通设备维护人员搞不定。Modbus 协议又公开简单上位机组态软件基本都支持所以我们把 RS485 作为默认选项。4.2 Modbus 寄存器表设计用 Modbus 从机上报温度时寄存器地址表最好固定下来方便上位机工程师对接。我设计了一张简洁的寄存器映射表实际项目中你可以扩展。寄存器地址功能读写属性数据格式0x0000本地温度只读int160.0625°C0x0001远程温度只读int160.0625°C0x0010高温报警阈值读写uint160x0011低温报警阈值读写uint160x0012状态字只读bit0: 本地高温bit1: 本地低温bit2: 远程高温bit3: 远程低温上位机只需要用 Modbus 功能码 0x03 读保持寄存器就能同时拿到两路温度和状态字。如果需要在线修改报警阈值就用功能码 0x06 往 0x0010 和 0x0011 写数据。写进去以后MCU 再把它同步写入 PJ85718DM 的报警寄存器实现远程调参。4.3 Modbus RTU CRC16 计算与收发状态机Modbus RTU 协议是半双工MCU 作为从机时要正确解析接收到的请求帧计算并校验 CRC。CRC16 算法看起来复杂实际写起来就是查表或者逐位移位。我贴一个常用的逐位法函数供参考uint16_t Modbus_CRC16(uint8_t *buf, uint16_t len) { uint16_t crc 0xFFFF; while (len--) { crc ^ *buf; for (uint8_t i 0; i 8; i) { if (crc 0x0001) { crc 1; crc ^ 0xA001; } else { crc 1; } } } return crc; }串口接收建议用中断加状态机把字节放到环形缓冲区然后在一个定时中断里判断 3.5 个字符时间内有没有新数据到来如果超时则认为一帧结束。这个“帧超时”是 Modbus RTU 的关键点不能用简单的串口空闲中断代替否则一帧数据中间稍微停顿一下就会被拆成两帧。发送完成以后别忘了把 RS485 收发器的方向引脚切回接收态通常控制引脚在发送开始时拉高发送完毕拉低。4.4 多节点设备地址管理当系统里有多台设备时每个 Modbus 从机必须有唯一地址。我通常用 4 位拨码开关加 PIC18F8520 的 EEPROM 配合处理。上电时先读拨码开关状态如果为非零值就作为节点地址如果为零则读取 EEPROM 中保存的地址这样既方便现场调整又能在面板上显示当前地址。需要注意EEPROM 里保存的地址要写在初始化代码的最前面而且掉电时要立即保存关键参数防止丢失。4.5 别忘了 PIC18F8520 还有 CAN 模块如果现场总线要求更高实时性或者需要多个主节点同时发送数据PIC18F8520 自带的 CAN 模块可以发挥优势。CAN 总线错误检测强、仲裁机制好在车载和高端工业设备里很常见。不过 HVAC 行业目前还是 RS485 占主流所以我在板子上预留了 CAN 收发器接口默认不焊器件需要的场合焊接后改固件即可。两种总线软件上不要同时初始化驱动避免引脚冲突。5. 常见问题与排查技巧实录做这套系统时我踩了不少坑下边把最容易遇到的几个现象和排查思路整理出来给你省点时间。问题现象可能原因解决方法本地温度读数偏高芯片自热靠近发热器件调整布局避开 LDO传感器下铺接地铜皮远程温度读数严重偏移测温二极管接反或引线电阻过大确认极性测量线阻设置串联电阻补偿远程温度读数不稳定走线受开关电源干扰DP/DN 线加滤波走线包地远离 PWM 走线I2C 总线卡死SDA 一直为低从机拉死总线或总线冲突未恢复复位 MCU 后发送时钟脉冲释放总线重新初始化 MSSPRS485 通信超时或乱码终端电阻不对偏置电阻缺失波特率误差总线两端接 120Ω加偏置电阻校准主频和波特率温度读数周期性跳变远程测温线与 RS485 线平行走线走线分开垂直交叉屏蔽层单端接地现场强干扰后设备复位电源瞬变或接地不良加 TVS、共模电感隔离 RS485开启看门狗5.1 远程温度读数异常先检查接线远程测温二极管接反是我见过最多的问题没有之一。很多开发者想当然地以为二极管是无极性元件实际上它的 PN 结极性完全影响芯片内部偏置电路的工作状态。如果你发现远程温度显示成负几十度或者超过 150°C第一件事就是测量远程探头两端的电压极性确认和芯片手册中 DP/DN 的定义一致。其次再用示波器看 DP/DN 波形正常工作时应该有稳定的偏置直流电平如果叠加了大量毛刺就是布线干扰。5.2 I2C 总线锁死的现场自救I2C 是从机拉死总线的经典故障。PIC18F8520 复位后PJ85718DM 可能还在等待主机的停止条件一直把 SDA 拉低不放。这时候程序怎么初始化都没有用。解决办法是在启动通信之前用 GPIO 把 SCL 翻转 9 次让从机误以为收到 9 个时钟周期从而释放 SDA。这个“软件释放总线”的小技巧一定要写进 I2C 初始化流程里。另外MSSP 模块的冲突检测位要实时读取一旦检测到冲突需要重新初始化模块不能继续正常发送数据。5.3 温度数值抖动不要立刻加大滤波有时候温度值抖得厉害很多人上来就写一个很重的平均值滤波结果系统反应变迟钝报警也变慢。我的建议是先看硬件问题远程测温线的滤波电容是否太大、走线是否靠近变频器、传感器电源纹波是否超标。用示波器测量 DP/DN 和 VDD 波形通常能找到原因。软件滤波只做轻度的滑动平均比如取最近 4 次到 8 次采样做平均响应速度仍然够快。5.4 RS485 通信不稳定排查顺序RS485 出现通信不稳定时按这个顺序检查先确认总线上只有两个终端电阻而不是每个节点都挂了再看 A/B 线的偏置电阻是否把空闲电平拉出了超过 200mV 的差分电压然后用示波器看发送端和接收端波形波特率是否准确边沿是否有明显振铃最后检查屏蔽层接地是否只在一点接地。排查完这四步90% 的通信问题都能解决。5.5 现场干扰导致 MCU 复位的应对HVAC 现场最讨厌的问题之一就是设备莫名其妙复位。温度数据突然掉电重启但电源明明没断多半是强干扰耦合到复位引脚或电源上。对策是在复位引脚加 100nF 电容降低复位灵敏度开启低压检测模块电压跌落时给出稳定复位更重要的是增加看门狗即使程序被干扰冲飞也能 300ms 内恢复。看门狗不能解决所有问题但是能把故障恢复时间压到很短。这套系统做完以后我最大的体会是硬件上把远程测温走线当成模拟信号对待远比花大量精力做软件滤波重要。PJ85718DM 和 PIC18F8520 的组合确实省事双路测温、本地报警、Modbus 上报一步到位但任何芯片都不是万能的。实际产品应用时抗干扰设计、探头选型、报警阈值校准这些杂活必须亲自做一遍才能放心。最后建议一句如果你要做 HVAC 产品上市千万别跳过高温高湿和电快速瞬变脉冲群测试温度监控系统最怕的不是读数不准而是在现场突然失灵。
阅读完成 · 觉得有帮助?
咨询建站