1. 温度监测方案的选型逻辑与整体架构
1.1 为什么是 PJ85718DM 加 PIC18F4585 这个组合
搞嵌入式温度采集的人都知道,选型这件事往往决定了后面调试是顺风顺水还是天天加班。我这次要聊的方案,核心是两颗芯片:一颗是PJ85718DM,一颗是PIC18F4585。前者负责把温度这个物理量转换成数字信号,后者负责把数据收上来、算清楚、送出去。这个组合在 HVAC(暖通空调)和一般嵌入式温度监测场景里非常常见,原因不复杂——它把"感知"和"处理"两件事分得很干净。
PJ85718DM 是一颗远程温度传感器,它的特点是可以外接一个测温二极管或者三极管(常见的是那颗经典的小信号三极管接成二极管用),把测温点从芯片本体延伸到几米甚至更远的地方。这一点在 HVAC 里太关键了,因为你要测的可能是风管里的温度、水箱里的温度、或者某个远离主控板的房间温度,主控板不可能贴到那些位置去。而 PIC18F4585 是一颗带 CAN 控制器的 8 位单片机,主频能跑到 40MHz,片上资源对于温度采集这种任务来说绰绰有余,更重要的是它自带 CAN 模块,这让"远程"两个字有了真正的落地方式——本地测完,通过总线把数据送到上位机或者别的控制节点。
我个人的判断是,这套组合的性价比和可靠性在中小规模温度监测项目里属于第一梯队。PIC18F4585 的 CAN 外设省掉了一颗独立的 CAN 控制器,PJ85718DM 的远程测温能力省掉了一堆模拟走线和运放调理电路。两颗芯片各司其职,中间用 I2C 或者 SMBus 连起来,整个链路清晰得让人舒服。
1.2 本地与远程温度到底怎么区分
标题里说的"本地与远程温度",很多人第一反应会以为是两种不同的传感器。其实在这套方案里,本地和远程的区分更多是测温点的位置概念,而不是两套完全独立的硬件。
本地温度,指的是主控板附近的温度,通常由 PJ85718DM 芯片自身的管芯温度来代表,或者由板上另一颗本地温度传感器提供。远程温度,指的是通过外接测温二极管测到的、物理位置远离主控板的那个点的温度。PJ85718DM 这类芯片一般能同时给出本地温度和远程温度两个读数,寄存器里分得清清楚楚。
在 HVAC 应用里,这个区分特别有意义。比如一台空气处理机组,控制板装在电控箱里,本地温度反映的是电控箱内的环境温度(用来判断是否需要散热或者做温度补偿),而远程温度测的是送风温度或者回风温度,这才是真正参与控制逻辑的量。两个温度都要采,但用途完全不同。我在实际项目里就遇到过只采远程温度、结果电控箱过热导致芯片工作异常的情况,后来把本地温度也纳入监控才把问题定位出来。
1.3 整体数据流与系统框图思路
把整个链路捋一遍:测温二极管感受到温度变化,产生一个与温度相关的电压,PJ85718DM 内部有一个高分辨率的 ADC 把这个电压数字化,同时芯片自己也有一个本地温度通道。PIC18F4585 通过 I2C 总线周期性地读取 PJ85718DM 的温度寄存器,拿到原始数据后做换算、滤波、越限判断,然后通过 CAN 总线把结果发出去,或者驱动本地的显示、继电器等执行机构。
这个数据流里有两个关键点值得强调。第一,I2C 的读取频率要合理,太快了没必要还增加总线负载,太慢了响应不及时,一般 1 到 4 次每秒是个舒服的区间。第二,CAN 报文的组织要有规划,本地温度和远程温度可以放在同一帧里,也可以分开,取决于上位机怎么解析。我倾向于放在同一帧,因为这两个量在逻辑上是强相关的,一起发出去上位机处理起来更省事。
提示:在画系统框图之前,先把每个测温点的物理位置、线缆长度、干扰源分布想清楚,这比急着画图重要得多。远程测温的走线一旦超过一两米,抗干扰设计就必须提上日程。
2. PJ85718DM 远程测温的核心原理与配置要点
2.1 远程测温二极管的工作原理
要理解 PJ85718DM 为什么能远程测温,得先搞明白测温二极管这件事。半导体 PN 结在恒定电流下,其正向压降会随温度变化,典型系数大约是 -2mV/℃。这个负温度系数是相当稳定的,只要电流恒定,压降和温度之间就有很好的线性关系。PJ85718DM 内部会给外接的测温二极管提供一个精确的恒流源,然后测量它两端的压降,再通过内部算法换算成温度。
这里有个容易被忽略的细节:测温二极管必须用小信号三极管接成二极管的方式,也就是把基极和集电极短接,用基极-发射极结来测温。直接用普通二极管行不行?理论上可以,但普通整流二极管的结特性和小信号管不一样,而且封装热阻大,响应慢,测温精度会打折扣。我试过用 1N4148 凑合,读数能出来,但和标准温度计对比偏差能到两三度,后来老老实实换成小信号三极管,偏差立刻收敛到零点几度以内。
2.2 寄存器配置与温度数据格式
PJ85718DM 这类远程温度传感器的寄存器布局通常遵循一个通用范式:本地温度寄存器、远程温度寄存器、状态寄存器、配置寄存器、上下限阈值寄存器。温度数据一般是 11 位或者更高,高字节是整数部分,低字节的高几位是小数部分,分辨率能到 0.125℃。
读取的时候要注意,温度寄存器通常是只读的,而且有些芯片在读取过程中会锁存数据,保证高低字节的一致性。如果你的代码先读高字节再读低字节,中间隔了太久,可能读到的是两次不同转换的结果,数据就会跳。稳妥的做法是连续读两个字节,或者利用芯片的锁存机制。我在早期项目里就吃过这个亏,温度读数偶尔会跳变零点几度,查了半天才发现是读取时序的问题。
配置寄存器里通常有几个关键位:转换速率、单次/连续转换模式、报警使能、远程通道使能等。转换速率的选择要权衡功耗和响应速度。HVAC 场景对响应速度要求不高,1Hz 到 4Hz 足够了,没必要设太高,设高了功耗上去,自热也会影响精度。
2.3 外接测温管的选型与布线禁忌
外接测温管的选择和布线,是这套方案里最容易翻车的地方。先说选型,优先选TO-92 或者 SOT-23 封装的小信号三极管,比如常见的 2N3904、MMBT3904 这类。它们的基极-发射极结特性一致性好,热响应快。不要选功率管,功率管结面积大,测温点和实际感受点有偏差。
布线方面,几条铁律:
- 测温管到芯片的走线尽量短,超过半米就要考虑屏蔽或者双绞。
- 走线远离电源线、继电器驱动线、电机线这些干扰源,平行走线是大忌。
- 如果测温管在远处,建议用双绞线,一根走恒流,一根走检测,绞在一起能有效抑制共模干扰。
- 测温管的地线要单独回到芯片的地,不要和功率地混在一起。
我做过一个风管温度监测的项目,测温管离主控板大概三米,一开始用普通排线,读数抖得厉害,后来换成屏蔽双绞线,屏蔽层单端接地,抖动立刻小了一个数量级。这个经验值不少钱,希望你能直接抄走。
注意:测温管的基极-集电极短接点一定要焊牢,虚焊会导致读数漂移甚至完全失效,而且这种故障时好时坏,排查起来非常折磨人。
3. PIC18F4585 端的采集、换算与 CAN 上报实现
3.1 I2C 通信的初始化与读取时序
PIC18F4585 这边,第一步是把 I2C 外设配起来。PIC18 系列的 I2C 模块叫 MSSP,配置起来不算复杂,但有几个参数必须算清楚。I2C 的时钟频率由 SSPADD 寄存器决定,公式是:
SSPADD = (Fosc / (4 * Fscl)) - 1假设系统时钟 Fosc 是 40MHz,想要 100kHz 的 I2C 速率,那么 SSPADD = (40000000 / (4 * 100000)) - 1 = 99。如果要 400kHz,SSPADD = 24。这个计算过程一定要自己算一遍,别抄别人的值,因为每个人的晶振和分频设置可能不一样。
初始化流程大致是:设置 SDA 和 SCL 引脚为输入、配置 SSPCON1 和 SSPCON2、设置 SSPADD、使能 MSSP。读取 PJ85718DM 的时候,标准流程是发送起始条件、发送设备地址加写位、发送寄存器指针、发送重复起始条件、发送设备地址加读位、读两个字节、发送 NACK 和停止条件。每一步都要检查 ACK 状态,不然总线出问题了你都不知道。
3.2 温度数据的换算与滤波处理
拿到原始数据后,换算成摄氏度。假设高字节是整数部分,低字节的高四位是小数部分,分辨率 0.0625℃,那么:
// 假设 raw_high 是高字节,raw_low 是低字节 int16_t temp_raw = ((int16_t)raw_high << 8) | raw_low; // 右移四位,得到以 1/16 度为单位的整数 temp_raw >>= 4; // 换算成摄氏度,乘以 0.0625 float temperature = temp_raw * 0.0625f;注意有符号数的处理,负温度的时候高字节是补码形式,直接移位和相乘要小心符号扩展。我建议先把原始值转成有符号 16 位整数,再移位,这样负温度也能正确处理。
滤波这块,最简单的是一阶低通滤波:
filtered = filtered * 0.9f + new_sample * 0.1f;系数根据你的采样率和想要的响应速度调。HVAC 场景温度变化慢,系数可以取小一点,让读数更平滑。但要注意,滤波会引入滞后,如果这个温度参与控制逻辑,滞后太大会影响控制品质。我的经验是,显示用的温度可以滤得狠一点,控制用的温度滤波要克制。
3.3 CAN 报文组织与远程上报策略
PIC18F4585 的 CAN 模块用起来还算顺手,配置好波特率、验收滤波器、发送邮箱就能收发。波特率计算涉及 BRGCON 寄存器,公式稍微绕一点,但手册里写得很清楚,照着算就行。常见的是 125kbps 或者 250kbps,HVAC 里 125k 足够用了。
报文组织我一般这么干:用一个标准帧,ID 里包含节点地址和功能码,数据场里放本地温度、远程温度、状态标志。比如:
| 字节 | 内容 | 说明 |
|---|---|---|
| 0-1 | 本地温度 | 有符号 16 位,单位 0.0625℃ |
| 2-3 | 远程温度 | 有符号 16 位,单位 0.0625℃ |
| 4 | 状态 | bit0 本地越限,bit1 远程越限,bit2 传感器故障 |
| 5-7 | 保留 | 后续扩展 |
上报周期我一般设 500ms 到 1s,太快了总线负载高,太慢了上位机反应迟钝。如果温度有突变,可以加一个事件触发机制,立即补发一帧,这样既保证了常态下的低负载,又保证了异常时的及时性。
提示:CAN 发送失败要有重试机制,但重试次数要限制,不然总线故障时程序会卡死。我一般重试三次,三次都失败就置错误标志,等下一周期再说。
4. 常见问题排查与实战避坑经验
4.1 温度读数异常的问题速查
温度读数出问题,原因五花八门,我整理了一个速查表,按概率从高到低排:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 读数恒定不变 | I2C 通信失败,读到的是默认值 | 用示波器看 SDA/SCL 波形,检查 ACK |
| 读数跳变剧烈 | 读取时序问题或干扰 | 检查高低字节读取间隔,检查布线 |
| 读数整体偏高 | 自热或恒流源异常 | 降低转换速率,测量恒流源电流 |
| 读数整体偏低 | 测温管选型不当或虚焊 | 换小信号三极管,补焊 |
| 负温度显示为正 | 符号扩展处理错误 | 检查数据类型和移位操作 |
| 远程温度无读数 | 远程通道未使能或测温管开路 | 检查配置寄存器,测量测温管通断 |
这张表是我踩了无数坑总结出来的,基本上覆盖了八九成的问题。遇到问题先按表排查,能省很多时间。
4.2 I2C 总线锁死的恢复技巧
I2C 总线锁死是嵌入式开发里的经典难题,表现是 SDA 被某个从机拉低不放,主机发什么都不知道。PJ85718DM 一般不会主动锁死,但如果通信过程中被打断(比如复位、电源波动),从机状态机可能卡住。
恢复的办法是:主机把 SCL 手动翻转九个时钟周期,让从机把剩余的数据位发完,然后发一个停止条件。PIC18F4585 的 I2C 引脚可以配置成普通 IO,用软件模拟这九个时钟。具体做法是把 SCL 配置成输出,拉低、拉高、拉低……循环九次,然后把 SDA 配置成输出拉高,再拉低拉高模拟停止条件,最后重新初始化 I2C 模块。
这个技巧我用了很多次,屡试不爽。代码不复杂,但关键时刻能救命。建议你在项目初期就把这个恢复函数写好,别等出了问题再临时加。
4.3 长线测温的干扰抑制实战
远程测温走线长了,干扰是绕不开的。除了前面说的双绞屏蔽,还有几个实战技巧:
- 在测温管两端并联一个小电容,100nF 左右,能滤掉高频干扰,但电容太大会影响响应速度,要权衡。
- 恒流源的回路上可以串一个小磁珠,抑制高频噪声。
- 如果干扰特别严重,考虑用差分走线,把测温管的两端分别走两根线到芯片,芯片端做差分放大。不过 PJ85718DM 这类芯片通常是单端的,差分方案需要额外的调理电路。
- 软件上可以加中值滤波,连续采三次取中间值,对脉冲干扰特别有效。
我在一个工业现场的项目里,测温线走了将近十米,旁边就是变频器。最后是靠屏蔽双绞加磁珠加中值滤波三管齐下才把读数稳住。单靠任何一种手段都不够,组合拳才是王道。
4.4 电源与地线设计的隐藏陷阱
电源和地线设计,是很多人在原理图阶段容易忽视、在调试阶段追悔莫及的地方。PJ85718DM 和 PIC18F4585 的供电要干净,尤其是模拟部分。建议:
- 数字电源和模拟电源用磁珠或者电感隔离,各自加去耦电容。
- 去耦电容要靠近芯片引脚,100nF 加 10uF 的组合是标配。
- 地平面要完整,不要被走线割得七零八落。
- 测温管的地线单独走回芯片的模拟地,不要和数字地混。
我见过一个案例,温度读数一直有规律地跳动,周期和 CAN 通信周期一致。查了半天,发现是 CAN 收发时的地弹通过共地路径耦合到了测温回路。把测温管的地线单独走一根回到芯片地,问题立刻消失。这个坑很隐蔽,但一旦遇到,记住往地线耦合的方向想。
5. 从原型到产品的工程化考量
5.1 校准与精度验证方法
原型跑通不代表能出货,校准和精度验证是必经环节。PJ85718DM 这类芯片出厂时一般有不错的精度,但外接测温管的个体差异、走线电阻、自热效应都会引入误差。校准的方法是用一个已知精度的参考温度计,把测温管和参考计放在同一个恒温环境里,记录芯片读数和参考读数的差值,然后在软件里做偏移补偿。
如果要做多点校准,可以在几个温度点分别测差值,然后做线性拟合。不过对于大多数 HVAC 应用,单点偏移校准就够了,因为测温管的一致性通常不错,非线性误差很小。我一般会在 25℃ 和 50℃ 两个点验证一下,偏差在 ±0.5℃ 以内就认为合格。
验证的时候要注意,恒温环境要稳定足够长时间,让测温管和参考计都达到热平衡。急着读数往往不准,等个十分钟二十分钟是值得的。
5.2 低功耗与可靠性设计
如果项目是电池供电或者对功耗有要求,PJ85718DM 和 PIC18F4585 都支持低功耗模式。PJ85718DM 可以配置成单次转换模式,需要的时候才转换一次,平时处于关断状态。PIC18F4585 可以进休眠,靠定时器或者外部中断唤醒。
可靠性方面,几个措施值得做:看门狗必须开,防止程序跑飞;温度上下限报警要配置,越限时能及时上报;CAN 总线要有错误处理,总线关闭后能自动恢复;EEPROM 里存一份校准参数和配置,掉电不丢。
我在一个户外机柜的温度监测项目里,用了单次转换加定时唤醒的策略,平均功耗降到了连续转换模式的十分之一,电池寿命从几个月延长到了两年多。这个收益非常可观,值得在低功耗项目里认真设计。
5.3 上位机数据解析与显示建议
数据通过 CAN 送到上位机后,解析和显示也有讲究。解析的时候要严格按照报文定义来,字节序、符号、单位都要对齐,不然显示出来的温度会莫名其妙。显示方面,本地温度和远程温度建议同屏显示,方便对比。如果做趋势图,采样点不要太密,否则图会糊成一片,也不要太疏,否则看不出变化趋势。
上位机还应该能配置温度上下限阈值,并且把阈值下发给下位机。这样现场调试的时候不用重新烧程序,改改上位机配置就行,效率高很多。我一般会在协议里留几个配置报文,专门用来下发阈值和校准参数。
提示:上位机的数据记录功能很重要,尤其是出问题的时候,历史数据是排查的第一手资料。建议至少记录最近一周的数据,滚动覆盖。
6. 一些个人体会与后续扩展方向
这套 PJ85718DM 加 PIC18F4585 的温度监测方案,我从原型到产品完整走过几遍,最大的体会是:难点不在芯片本身,而在细节。芯片的 datasheet 写得再清楚,实际布线和调试中遇到的问题,往往要靠经验去填。测温管的选型、走线的处理、地线的设计、软件的滤波和容错,每一项都值得花时间打磨。
后续如果要扩展,几个方向可以考虑。一是增加测温通道,PJ85718DM 这类芯片有些型号支持多路远程测温,可以同时监测多个点。二是把 CAN 换成其他总线,比如 RS485 或者无线,适应不同的现场条件。三是把数据上云,通过网关把温度数据送到云端做长期分析和远程监控。这些扩展都不难,核心的采集和换算逻辑可以复用。
最后分享一个小技巧:调试温度采集的时候,手边备一个高精度的参考温度计,随时对比。别太相信自己的手感,也别太相信芯片的绝对精度,有个参考基准,心里才有底。这个习惯帮我省了很多来回折腾的时间。