搞嵌入式和 HVAC 控制的人很多都遇到过同一个问题板上要测温度外部功率器件也要测温度但主控的 ADC 资源紧张、电源环境又差用普通热敏电阻拉长线很容易被干扰带偏。最近在做一个电控盒监测项目时我用“PJ85718DM 配合 R7FA4L1BD4CFP”这套组合把本地温度和远程温度一起采集算是把嵌入式与 HVAC 常碰到的两个测温场景都覆盖到了。这篇文章不打算写产品手册式复读而是把我从硬件接法、固件换算到现场校准这一路的实际操作和经验坑都梳理一遍给后面想照做的朋友省点时间。1. 先搞清楚“本地温度”和“远程温度”到底在测什么很多人第一次拿到类似的双通道温度监控芯片都会有两个误区一是以为本地温度就等于环境温度二是以为远程通道可以直接挂热敏电阻。先把这两个概念掰清楚后面所有电路和代码才说得通。1.1 本地通道测量的是芯片附近不是房间温度PJ85718DM 这类芯片的本地通道严格来说测的是传感器芯片自身的结温它在物理上非常靠近芯片封装所以读到的数值更接近“芯片附近那一片 PCB 和空气的温度”。它适合判断电路板有没有过热、电控盒内温度是否超限但不能代替一个挂在回风口的 NTC。如果你把板子装在密闭电控盒里盒内因为继电器和变压器发热本地通道跑出来的温度通常比真实环境温度高 5~10°C这点在 HVAC 场景里要提前想清楚。实际项目中我更看重本地通道的两个优点一是线性度好数字输出直接从 I²C 总线读不用再经过 ADC、基准源和分压电阻二是稳定不像 NTC 那样引脚一长就受线阻影响。很多主机厂在出厂测试时会把电控盒放恒温箱里做温度验证这时候本地通道做板温参考非常方便因为它不需要额外校准电路只要把读取值换算成温度就行。不过要记住本地通道测不到“别处”。如果系统里有一个出风口温度、一个回风温度、一个盘管温度那还是得老老实实布置对应的测温元件。PJ85718DM 的本地通道更适合当一个稳定的板温参考点或者用来做环境温度的近距离近似。1.2 远程通道测量的是外部二极管不是热敏电阻远程通道的原理和热敏电阻完全不一样。它需要在传感器外部接一个 PN 结工程上最常见的做法是拿一个小信号三极管比如常见的 2N3904当二极管用把集电极和基极短接作为正极发射极作为负极接到传感器的 D 和 D- 引脚上。传感器内部会依次注入两个不同大小的电流去测量 PN 结正向压降的变化量再根据压差和温度的物理关系换算出结温。之所以能用两根线就把温度测回来是因为传感器测量的是二极管结电压的差值变化而不是绝对值所以线缆上的串联电阻影响相对小很多芯片还有内置的串联电阻抵消功能。但这里有个关键前提你必须在 D/D- 上接二极管而不是接一个普通电阻或者 NTC。很多第一次用的人想当然地把热敏电阻接上去结果读数要么是乱码要么是 0这是因为芯片内部已经按二极管的指数伏安特性做了建模热敏电阻的电阻-温度曲线和它完全对不上。还有一个工程细节容易被忽略远程二极管测到的温度永远只是“你放二极管那一个点”的温度。把它贴在功率管外壳上读到的就是外壳那个点的温度把它悬空放在柜子里读到的就是柜内空气温度。选择安装位置比选择器件本身更影响测量结果。1.3 这两路温度组合起来能做什么R7FA4L1BD4CFP 是一颗 32 位微控制器基于 Cortex-M33 内核带多个串行接口、定时器和中断资源本身就很适合做 HVAC 或嵌入式设备的主控。它通过 I²C/SMBus 总线去读 PJ85718DM一次就能拿到本地和远程两路温度数据不需要额外占用 ADC。这套组合典型能做的事大概有三种嵌入式电源模组本地通道看板温远程通道贴在功率 MOSFET 或电感表面做热点保护HVAC 电控板本地通道补偿电控盒内的温升远程通道贴在电机绕组或散热器上做超温报警小型变频器把远程二极管靠近 IGBT 安装温度超过阈值时提前降频避免炸管。所以这篇文章的落地路径也很清楚先把硬件连接说清楚然后讲固件怎么读数和换算再聊到实际控制逻辑最后把我在测试中踩过的坑和校准方法列出来。2. PJ85718DM 和 R7FA4L1BD4CFP 的分工与选型逻辑选器件不能只看型号列表得先看谁干什么活。PJ85718DM 负责把温度变成数字R7FA4L1BD4CFP 负责读数字、算逻辑和对外通信。两者分工明确但选型时有几个点需要想透。2.1 PJ85718DM 的关键能力从应用角度讲选温度监控芯片我一般只关注四件事通道数、接口、分辨率和报警引脚。PJ85718DM 做了双通道本地通道内置传感器远程通道通过 D/D- 接外部二极管接口是 I²C/SMBus数据可以直接被 MCU 读取。它还带一个可编程报警输出温度越限时可以主动拉低报警引脚不一定要主控一直轮询。分辨率方面这类芯片一般能到 12 位左右典型 LSB 是 0.0625°C。不过说实话工程上很少有人真的去抠 0.06 和 0.125 的区别因为最终读数准不准更多取决于远程二极管的工艺一致性、现场干扰和传感器摆放位置。你花大价钱把传感器精度提到很高结果二极管随便拿一颗不同批次的三极管顶上整体误差照样拉大。所以我的看法是分辨率够用就行别在纸面参数上使劲。报警功能要重点说。HVAC 电控板里电机绕组温度一旦超限最好能在几毫秒内触发硬件中断而不是等主控从几十条指令里轮询发现。PJ85718DM 的报警引脚可以接 MCU 的外部中断同时硬件上直接把报警信号引到继电器或驱动芯片的使能端相当于上了一道物理保险。这个用法比单纯软件判断可靠得多。2.2 R7FA4L1BD4CFP 为什么够用R7FA4L1BD4CFP 的主频不需要很高因为温度监控这个任务本质上是“低频采集、高可靠性判断”。温度变化本身很慢250ms 采集一次已经算快的了主控真正忙的是风机调速、串口上报和人机交互这类逻辑。Cortex-M33 内核跑这些绰绰有余而且它支持低功耗模式如果设备在待机状态下只需要定时测温报警可以让 MCU 大部分时间休眠定时唤醒读一次温度再睡回去。接口配置上它至少有一路 I²C、多路定时器、外部中断和看门狗足够承担整套控制逻辑。工作电压 3.3V 这一点也很重要PJ85718DM 同样工作在这个电压域两侧可以直接相连不需要电平转换。如果项目里还挂了 5V 的外设比如 LCD 或继电器驱动那只需要在外设侧做单向转换就行主链路的信号完整性会好处理很多。封装也是选型时我会考虑的因素。CFP 这类封装引脚间距适中样板阶段用普通风枪和烙铁就能手工焊接不用非得找 BGA 返修台。研发打样和中小批量生产都很方便。当然如果后续产品要压缩 PCB 面积可以再评估更小封装的变体但如果只是先跑通功能和验证算法这个封装很合适。2.3 选型时容易被忽略的三个问题第一I²C 地址配置。PJ85718DM 的地址通常由地址引脚的电平决定原理图上不能把这几个引脚随便接地或悬空一定要在布局阶段确定好地址避免和板上其他 I²C 设备冲突。第二报警输出是开漏结构。开漏输出意味着必须要加上拉电阻才能输出高电平否则报警引脚只能拉低、不能主动拉高MCU 外部中断可能误触发。很多人在这上面栽跟头原理图看着没问题实际报警引脚浮空乱跳。第三远程二极管不是随便选的。芯片手册通常会给出推荐的三极管型号和连接方式比如某些型号要求用特定 β 值的管子或者要求 BC 端短接。选型阶段就得确定下来并写进 BOM 备注别让采购随便替换成不同厂家型号。3. 硬件连接I²C 总线、远程二极管和电源处理原理图上看着只是几根线实际布局走线才是决定稳不稳定的关键。HVAC 环境里到处是继电器、接触器和电机这些设备动作瞬间会产生很强的电磁干扰所以硬件连接要按“抗干扰优先”的思路来做。3.1 I²C/SMBus 总线的基本接法PJ85718DM 与 R7FA4L1BD4CFP 之间只需要两根线SDA 和 SCL。因为是开漏结构两根线都需要上拉电阻。3.3V 供电时上拉电阻取 4.7kΩ 是比较稳妥的起步值如果总线长度短、速度快也可以换成 2.2kΩ。上拉电阻太小会加重 MCU 引脚驱动负担太大在长线上又会让上升沿太缓所以一般不要小于 1kΩ也不要大于 10kΩ。连接方式如下SDA → MCU 的 SDA 引脚SCL → MCU 的 SCL 引脚VCC → 3.3V 电源GND → 数字地ALERT如果有→ MCU 外部中断引脚HVAC 板上主控和传感器通常就在一块板子上距离不超过 10cm这种场景 I²C 跑 100kHz 或 400kHz 都很稳。但如果你想把温度传感器放在压缩机仓这种强干扰区域线拉长了就千万不要再用 I²C 直连最好换成 RS-485 或者改用独立测温模块否则一次继电器动作就可能让整个总线卡死。现场电磁环境不好的时候宁可多花点成本做隔离通信也别赌 I²C 能在长线上扛住干扰。3.2 远程二极管的布线与抗干扰远程二极管只有两根信号线进传感器看起来简单实际上最容易出问题的就是这里。布线时 D 和 D- 要尽量平行、等长、靠近走不要一个走顶层一个走底层绕一大圈。两根线构成的是一个微弱信号回路回路面积越大越容易耦合进去干扰温度读数就越不稳。如果现场干扰特别大可以在 D 和 D- 之间放一个小电容滤除高频噪声但这个电容的容值不能乱选。几百 pF 以内问题不大一旦超过 1nF会影响传感器注入电流后信号建立时间造成读数偏差甚至震荡。我见过有人放了一个 10nF 的电容想滤波结果远程温度比实际偏高好几度就是这个原因。远程二极管本身也建议统一型号、统一批次。用 2N3904 这种普通三极管完全可以但不同厂家、不同批次之间的工艺差异会导致正向压降特性不完全一致最终换算出来的温度有几度偏差。工程上要批量生产时要么按手册推荐的二极管型号锁定 BOM要么在成品测试阶段每台设备做一次单点校准把偏差修正掉。3.3 电源去耦与地线PJ85718DM 的 VCC 和 GND 之间需要放一颗 0.1μF 陶瓷电容位置尽量靠近电源引脚这是数字芯片的基本要求。很多双通道温度传感器内部还带有 ADC供电纹波会直接影响转换结果所以在 HVAc 主板上尤其要注意别让传感器和继电器驱动共用一个脏电源。更讲究一点的做法是采用星形接地传感器、MCU、继电器驱动各自的地线先回到电源入口的公共地上而不是在板上串成一长条。这样继电器吸合瞬间的大电流不会在地线上产生明显的电位差传感器的地参考点也能保持稳定。我做过一个板子最初把传感器地就近接到了电机驱动的地线上结果本地温度读数在风扇启动时会突然跳高 2~3°C。后来把传感器地单独拉回电源地跳变基本消失。HVAC 应用里继电器和电机频繁启停电源地上的噪声非常大这点怎么强调都不为过。4. 固件实现把总线上的数据变成可用的温度硬件焊好了接下来就是固件。这一节我不会粘贴完整工程代码而是把关键步骤和最容易搞错的部分拆开讲。代码框架对任何带 I²C 外设的 MCU 都适用只要替换成对应平台的库函数就行。4.1 I²C 控制器初始化与设备寻址先用一个简单的示例说明初始化思路。R7FA4L1BD4CFP 上I²C 引脚是多路复用的所以要先配置引脚的复用功能再使能外设时钟最后设置通信速率。标准模式 100kHz 足够用如果系统里还有其他高速 I²C 设备可以统一到 400kHz。/* 以常见 SDK 写法为例具体函数名以实际平台为准 */ void i2c_master_init(void) { /* 1. 配置 SDA 和 SCL 引脚为 I2C 复用功能 */ /* 2. 打开 I2C 外设时钟 */ /* 3. 设置主机模式 */ /* 4. 设置速率 400kHz */ }寻址时要注意 PJ85718DM 的 7 位地址由硬件引脚决定。比如地址引脚接低电平时地址是 0b1001100完整字节会带上读写位。代码里写设备地址时要么明确区分 7 位地址和 8 位读地址要么直接用带移位的形式避免差一位导致 I²C 应答一直不出来。好多人调 I²C 调不通不是时序不对而是地址没对上。建议初始化完成后先回读芯片的“制造商 ID”或“版本寄存器”能读到预期值再往下走不能读回来就先查地址配置和上拉电阻。4.2 读取温度寄存器的代码示例PJ85718DM 这类双通道芯片寄存器布局通常是一个地址对应一个通道。比如本地温度寄存器、远程温度寄存器、配置寄存器、上下限报警寄存器。温度数据一般占两个字节读取时需要先指定寄存器地址再连续读两个字节。uint16_t read_temp_register(uint8_t i2c_addr, uint8_t reg_addr) { uint8_t buf[2] {0}; /* 先发送寄存器地址 */ i2c_write(i2c_addr, reg_addr, 1); /* 再连续读取两个字节 */ i2c_read(i2c_addr, buf, 2); return (uint16_t)((buf[0] 8) | buf[1]); }这两字节里不只是普通二进制数通常包含符号位和小数位。远程通道和本地通道的分辨率可能不一样直接拿整型去运算肯定出错。最好的办法是写一个专门的数据类型去接收原始值再用统一的换算函数处理。4.3 代数换算、负温度与分辨率处理温度寄存器里常见的是二进制补码形式。12 位分辨率时最高位是符号位低 12 位是数据每个 LSB 等于 0.0625°C。换算成浮点温度很简单但必须先做符号扩展否则负温度会变成很大的正数。float decode_temperature(uint16_t raw, uint8_t resolution_bits, float lsb_value) { int16_t val (int16_t)raw; /* 假设数据左对齐在 16 位寄存器的高位 */ val (int16_t)(raw (16 - resolution_bits)); val (int16_t)(val (16 - resolution_bits)); return (float)val * lsb_value; }实际上很多芯片的原始寄存器已经是左对齐的也可能只有 11 位或 10 位有效位所以不同数据手册写出来的 LSB 值会不一样。我一般不看网上直接抄的代码而是老老实实打开手册找到“Temperature Data Format”那张表按表里的分辨率来写。这个环节多花十分钟后面能少很多糊涂账。换算之后还要考虑是否有校准偏移。传感器本身会有一个出厂精度指标但系统装进电控盒后PCB 布局、风道和功率器件都会引入系统性偏差。这些偏差最适合在固件里留一个 offset 变量在产线校准时写进非易失存储。4.4 平均值滤波与坏值剔除远程温度读数在现场干扰下偶尔会跳一下。一次读取跳到 200°C如果直接拿来控制风扇可能马上触发报警甚至把设备误判成故障停机。所以固件里要做两件事平均值滤波和坏值剔除。平均值可以用移动平均也可以一阶低通滤波。我习惯用一阶低通代码量小响应也平滑float temp_filtered 25.0f; /* 初始值可以根据常温设定 */ float alpha 0.2f; /* 滤波系数越小越平滑 */ float update_temperature_filter(float temp_new) { temp_filtered alpha * (temp_new - temp_filtered); return temp_filtered; }坏值剔除要先定义“坏值”的标准。传感器的量程一般在 -55°C 到 150°C如果读到的原始值换算成温度后完全超出这个范围或者数值是手册里定义的错误标志比如 0x7FFF就要丢弃并计数。连续读到多个坏值时可以判定温度通道故障进入降级模式而不是继续用最后一个正常值顶着跑。5. 嵌入式和 HVAC 场景中的工程化整合温度读出来了最终要落到控制逻辑里。这里最忌讳的就是把温度当摆设只显示不上控制。一套好的温度监测系统应该把本地温度和远程温度放在不同策略位置上各司其职。5.1 本地温度用于环境补偿远程温度用于热点保护在 HVAC 电控盒里本地通道适合做“环境趋势参考”远程通道适合做“关键热点保护”。本地温度虽然容易受板内发热影响但它体现的是整机热负荷的累积趋势。你可以用本地温度与远程温度的差值来判断散热条件好不好如果远程温度正常、本地温度却很高说明盒内空气流通不畅如果两者都高说明负载确实很大。一种实用的控制逻辑是监测点使用的通道主要用途典型动作电控盒内板温本地通道机箱散热判断、环境补偿超过 60°C 提高风机基础转速电机绕组或 IGBT远程通道热点保护、超温降额超过 85°C 进入降频超过 95°C 停机进出风温差本地远程系统效率判断差值异常时提示滤网堵塞或风机故障这套逻辑核心是把“保护”绑定在远程通道上把“舒适性和效率”绑定在本地通道上。远程二极管在功率器件附近响应快能第一时间感知热点本地通道慢一点但趋势稳定适合做长周期判断。5.2 风扇与报警控制的实际逻辑风扇要滞后控制不能温度一超过阈值就全速转降下来就停。否则温度在阈值附近抖动时风扇会频繁启停噪声和功耗都很糟糕。我一般会加一个 2~3°C 的滞回区间比如 80°C 开始加速、75°C 才降速这样风扇动作很少。报警控制这块除了软件逻辑硬件报警也要接到 MCU 中断上。PJ85718DM 的报警输出只有在温度恢复正常且状态寄存器被清除后才会释放所以固件里要记得在读状态寄存器后做一次“清除报警”操作否则报警信号可能一直锁住现场看现象就像设备在反复重启。远程通道做超温保护时我还会加一种“快速响应”机制连续 3 次读取到超阈值立即执行保护动作单次超阈值但后续正常只记录日志不动作。这样既不会被单次干扰骗到也不会因为滤波太慢而错过真正的过热。5.3 故障降级与自恢复温度传感器迟早会遇到异常二极管开路、线缆断开、I²C 通信卡死、报警引脚被误接。固件必须提前想好“测不到温度时怎么办”。我的做法是分等级降级轻度异常单次坏值丢弃后继续用滤波值中度异常连续多次坏值切换到保守控制模式比如强制风扇中速运行不依赖温度闭环调转速严重异常本地或远程通道持续无有效数据立即停机并显示故障码。自恢复也很重要。I²C 卡死在总线上时MCU 可以对传感器做一次总线复位或者先让 I²C 控制器进入复位状态再把总线重新初始化一遍。比硬件复位更彻底的是直接把传感器的电源用 MOS 管开关控制异常时断电 1 秒再重新上电。很多现场“偶发故障”都是总线锁死造成的一颗电源开关就能救回来。6. 实测中的坑与校准手记最后这部分是我最想写的因为大部分问题不是看手册能看出来的是真的要在板子上测、拿示波器看波形、反复对比温度计才能找到原因。6.1 温度偏高、乱跳的最常见原因如果远程温度读数始终偏高几度先查三件事远程二极管型号是否正确、D 和 D- 是否接反、串联电阻是否太大。二极管 BC 短接的方向反了一般会发生读不到温度或读成乱码串联电阻太大会造成远程温度偏高或读数非线性。如果本地温度读数乱跳大概率是电源问题。可以拿示波器看 PJ85718DM 的 VCC 引脚在继电器吸合瞬间有没有明显跌落如果 VCC 纹波超过 50mV就要加强去耦。还有一种情况是 I²C 上拉电阻过大、总线电容又高导致 SCL 上升沿太慢偶尔出现应答错误表现为温度读数隔几秒就跳一次 0 或满量程。远程通道读数“看起来正常但实际不准”多半是二极管位置没放对。它贴在功率管外壳表面和外壳之间有氧化层或导热硅脂太厚测到的是硅脂的温度而不是器件内部结温。这时候红外测温枪对比也未必完全一致因为红外测的是表面辐射温度发射率不同也会差几度。最笨但最可靠的方法是拿一根很细的热电偶埋到二极管附近和传感器读数做对比。6.2 快速校准流程温度传感器的校准不需要多复杂但至少要做两个温度点。我常用的流程是这样的在 25°C 左右的室温环境中稳定 30 分钟记录本地和远程通道的读数作为基准把远程二极管放到恒温箱里设定 60°C 或 80°C稳定后再读一次计算本地和远程各自的偏差和增益误差写入固件校准参数如果远程二极管要放在不同位置就按实际安装位置重新标定不要用厂家给的“典型误差”直接替代。校准要记录原始值和校后值两组数据。现场如果看到校后值还偏先看是不是环境温度没有稳定。温度校准最忌讳手一放上去就开始读热容需要时间平衡至少等 5 到 10 分钟让整个传导路径到稳定状态。6.3 几个心得和建议最后分享几个我在实际项目中养成的习惯。第一远程二极管的位置要留到原理图阶段就定好并且要设计成可调整的。比如在 D 和 D- 上预留 0Ω 电阻位如果现场验证发现串联电阻偏大可以直接替换成贴片电阻调整。这个设计几乎不占成本但能让你在现场调试时多出很多选择。第二PCB 上把本地温度传感器放在发热源以外的位置。很多人习惯把传感器放在 MCU 附近结果 MCU 发热直接影响了本地通道读数。HVAC 板上温度传感器最好放在电控盒的中部、远离大功率器件这样读出来的值更有代表性。第三固件里所有温度阈值都做成可配置参数。控制逻辑写死在代码里等现场发现阈值不合理重新刷固件或者改参数都很麻烦。我在项目里会把报警阈值、滞回值、滤波系数全部放到参数区通过串口或者 Modbus 指令在线修改。生产也不用把所有型号的板子用同一个固件现场改参数就能适配。第四别忽视日志。温度异常往往不是突然来的而是慢慢漂上去的。如果系统里能记录每 5 分钟的本地温度和远程温度曲线很多故障一眼就能看出来。我在做这套方案时把温度历史放在 MCU 内部的一块 Flash 区域里容量不大但足够排查大多数现场问题。整体做下来我对 PJ85718DM 配 R7FA4L1BD4CFP 这套方案的体会是它最适合对成本敏感、又要同时兼顾板温和热点保护的工控场景。硬件设计不复杂固件逻辑也不难真正需要花心思的是把远程二极管装对地方、把总线抗干扰做好、把报警和降级策略想清楚。按这个思路做下来这套测温方案在嵌入式设备和 HVAC 控制器上都能站得住。