嵌入式设备本身要监测自己热不热暖通空调系统还要监测风管里热不热这两种温度需求在同一个项目里同时出现的时候处理起来比想象中麻烦。最近我在整理一个HVAC控制板方案MCU用的是R7FA4E2B93CFM温度采样芯片用的是PJ85718DM要解决的正是嵌入式和暖通场景里的本地温度与远程温度同时监测问题。整套方案做下来两路温度走同一条I2C总线就能读回本地通道测板温或回风温度远程通道接一个外置测温二极管测风管远端温度硬件链路短、抗干扰也好。这套东西做完以后板子上可以同时拿到两个相互独立的温度值而且不需要额外搭运放和分压电路。对做风机盘管控制器、制冷机组电控、楼宇自控网关的开发者或者只是想在嵌入式项目里找一个省心的双温采样方案的朋友这篇总结都值得看一下。做嵌入式时间长了你会发现温度这种参数最容易被低估。它看起来简单一个ADC加一个热敏电阻就能测但真正要做到准确且稳定方案里需要考虑的细节其实非常多。接下来我把这套基于PJ85718DM和R7FA4E2B93CFM的方案完整拆开讲从选型理由、硬件接线、驱动代码到HVAC控制逻辑和调试踩坑一次讲透。1. 这套方案到底解决了什么问题1.1 嵌入式和HVAC场景下温度监测为什么难嵌入式系统和HVAC设备对温度测量的需求表面上看都是“读个温度”实际差异非常大。嵌入式设备自身的温度监测关心的是芯片结温、电源板温度和机箱内部温升这个温度点通常就在主控板附近走线短、信号强测起来相对容易。但HVAC系统的温度监测完全不是一回事回风温度、送风温度、管道温度、室外环境温度这些温度点分布在设备的不同位置有些离主控板远有些在强电区域附近走线一长模拟小信号马上就会出问题。以前做HVAC控制板常规做法是每个温度点放一个NTC热敏电阻用模拟线直接拉到MCU的ADC引脚。NTC方案本身不复杂但在实际项目里很容易踩坑线缆长了之后电阻值会发生漂移接插件接触不良会导致读数跳变压缩机启动和变频风机运行时产生的电磁干扰会叠加在模拟小信号上分压电阻的温漂也需要一并进行校准。每次做整机测试总会花不少时间在排查“温度怎么又飘了”这个问题上而且这类问题往往是多个因素叠加导致不太好定位。更麻烦的是HVAC控制逻辑需要同时看到好几个温度。比如判断风机是否正常工作要看送风温度和回风温度的差值判断是否需要防冷风要看盘管温度判断主控板是否过热要看板内温度。如果每个温度点都用独立的模拟传感器物料成本是一方面主控板的接口资源、PCB走线空间、后续校准工作量都会成倍增加。这个时候就会觉得如果有一颗芯片能同时测两路温度并且用数字接口跟MCU通信整个系统的复杂度能降下来不少。1.2 用一颗双通道传感器搭配MCU思路是什么PJ85718DM这颗芯片正好就是把“本地测温”和“远程测温”做在了一起的数字温度传感器。本地通道测量的是芯片自身所在位置的温度也就是PCB板面附近的实际温度远程通道则是通过芯片上两个专用引脚连接一个外置的测温二极管用来测远端位置的温度。这样一颗芯片就能当两颗用两路温度数据通过I2C或SMBus接口读回来MCU只需要写寄存器、读寄存器不需要关心模拟信号的调理细节。R7FA4E2B93CFM这颗MCU的选择主要是看中了它的cortex-m33内核、丰富的外设接口和低功耗能力。这颗MCU的处理性能对HVAC控制器来说绰绰有余I2C、SPI、UART、CAN FD这些接口都有未来扩展Modbus网关、CAN总线通讯都很方便。而且从开发体验来说配套的开发环境和代码库比较完善从零开始上手的速度明显比一些冷门MCU快。特别是在实际项目中这类MCU往往有多个引脚能复用为I2C功能布线时灵活性好不会因为封装引脚分配受限而被迫加长走线。这套组合的逻辑其实很清晰PJ85718DM负责把两路温度信号在传感器内部完成数字化MCU负责通过数字总线读取数据并参与后续的控制逻辑。数字总线传输的信号是电平高低不是微弱的模拟电压所以抗干扰能力天然强于NTC直连ADC的方案。走线稍微长一点只要没有破坏I2C的电气规范温度数据依然能准确读回这个特性在HVAC设备里非常实用。2. 硬件设计与接线把两路温度可靠地接进来2.1 PJ85718DM 与 MCU 之间的通信接口PJ85718DM和R7FA4E2B93CFM之间走的是标准的I2C总线所以硬件连接的第一步是把SCL和SDA接对。这里基本的接法是传感器SCL接到MCU的一个I2C时钟引脚传感器SDA接到对应数据引脚然后VDD接3.3V供电GND接数字地。I2C总线是漏极开路的SCL和SDA上都需要接上拉电阻阻值一般在4.7kΩ到10kΩ之间具体取决于总线长度和挂载设备数量。提示如果主控板上PJ85718DM距MCU比较近走线不超过10厘米用10kΩ上拉电阻就可以如果传感器装到风管位置走线拉长建议用4.7kΩ并适当降低I2C通信速率保证信号边沿满足时序要求。PJ85718DM通常还会提供一个报警输出引脚也就是ALERT引脚。这个引脚可以配置成超温报警输出当本地或远程温度超过设定阈值时主动拉低建议接到MCU的中断输入引脚。HVAC控制板里把这个引脚用起来意义很大比如回风温度过高或者管道温度过低MCU可以在中断里第一时间进入保护逻辑不用轮询等温度数据刷新。因为这个引脚是可选功能如果当前项目不需要可以悬空或者通过电阻上拉到VDD。另外还要注意电平匹配问题。PJ85718DM通常在1.8V到3.6V范围内工作R7FA4E2B93CFM的IO口大多兼容3.3V输出所以这个组合直接连接问题不大。但在HVAC设备里如果系统里还有5V的传感器或者其他总线设备就要小心电平冲突必要时加电平转换芯片或者在I2C上做电平匹配处理。我建议在画原理图的时候先把这个3.3V电平关系确认清楚再整体布线避免后期飞线。2.2 本地通道与远程通道的具体分工PJ85718DM的本地通道负责测温芯片自己所在位置的温度。在HVAC控制板里这个通道最常见用途是测回风温度或者电控箱内部温度。如果传感器直接贴在电控板上测到的就是板温可以用来做主板过热保护如果传感器通过排线引到回风口附近测到的就是回风温度作为空调控制策略的温度输入。实际怎么用取决于产品结构但本地通道的精度放在那里读取代码是一样的灵活性很高。远程通道则是通过芯片引脚外接一个测温二极管去测离主控板较远位置的温度。这个测温二极管一般用三极管的PN结来替代也就是把普通小信号三极管的集电极和基极短接当作二极管使用。PJ85718DM内部通过给二极管施加不同大小的偏置电流测量前后两次正向压降变化用ΔVBE的方式计算出温度值。这里多说一句原理二极管PN结正向压降VBE本身会随温度变化大约就是-2mV/℃左右如果只测一次压降很容易受二极管本身工艺参数差异影响一致性不好。PJ85718DM内部用两种不同电流分别测一次VBE取差值ΔVBE来计算温度因为ΔVBE主要受温度影响二极管自身的饱和电流参数会被抵消掉测量精度和可重复性明显更好。这也是远程通道能够做到±1℃级别误差的原因。HVAC应用里这个远程通道可以直接测风管送风温度或者盘管温度不需要在远端再放一块带ADC或I2C接口的从站板省了成本和安装空间。2.3 PCB布局与接线避坑硬件设计里还有一个关键环节就是PCB布局。PJ85718DM这颗芯片本身对布局有一定要求尤其是远程通道的走线。远程测温二极管需要连接到芯片的两个输入引脚走线越长受到的干扰就越大读数也就越容易抖动。在实际项目里建议远程二极管的走线长度控制在50厘米以内并且尽量采用双绞线形式让两根线受到的干扰尽量对称。如果不得不走长线在靠近PJ85718DM引脚的地方并一个0.1μF的电容能滤掉一部分高频干扰但这个电容值不能太大太大会影响测温速度。本地通道因为测温点就在芯片附近走线问题不明显但要注意不要让传感器紧贴大功率发热器件。我之前遇到过一块板子温度芯片放在离电源电感只有几毫米的位置测出来的板温比实际环境温度高了十几度读数倒是很稳定就是一直偏高。后来把传感器挪到板边数据才正常。做嵌入式设计时这个细节往往会决定温度监测到底是在测环境温度还是测旁边的发热源。另外MCU的I2C引脚布局也要考虑。R7FA4E2B93CFM同一个I2C外设通常有多个引脚映射可选选引脚的时候优先选择靠近传感器接口那一侧的引脚组缩短PCB走线减少总线电容。如果I2C总线上还需要挂EEPROM、RTC这类设备就把它们按地址顺序排好上拉电阻放在总线物理末端。这样既方便调试波形也降低了信号反射的概率。3. 驱动代码与数据解析把温度值从寄存器里抠出来3.1 初始化流程与关键寄存器配置拿到PJ85718DM之后第一件事就是看手册确认寄存器地址和初始状态。虽然我下面写的是基于这类双通道数字温度传感器的通用配置示例具体寄存器地址一定要对照你手上那批物料的手册确认不同批次和型号定义可能有差异。初始化流程大体是这样的先复位芯片等待芯片内部完成上电自检然后配置温度转换分辨率和转换周期最后确认芯片进入正常工作模式。// PJ85718DM 初始化寄存器地址为示例以实际手册为准 #define PJ_I2C_ADDR 0x48 uint8_t pj_write_reg(uint8_t reg, uint8_t val); void pj_read_reg(uint8_t reg, uint8_t *buf, uint8_t len); void pj85718_init(void) { // 1. 软件复位让芯片寄存器回到默认状态 pj_write_reg(0x01, 0x00); delay_ms(20); // 2. 配置本地/远程分辨率典型12bit // 这里0x60为示例值具体含义查寄存器说明 pj_write_reg(0x02, 0x60); // 3. 进入正常工作不关断、不打开ALERT pj_write_reg(0x03, 0x00); }这里有一个比较容易被忽略的点为什么要先软件复位因为芯片在出厂或者上次运行结束后寄存器里的配置可能不是默认值。尤其是ALERT阈值寄存器、偏移校准寄存器这类带有记忆功能的寄存器如果不复位上电后会沿用上一次的值导致第一次温度采集行为不符合预期。先写一次复位命令让所有寄存器回到出厂状态后续读写才可控。分辨率配置也很关键。PJ85718DM这类传感器通常支持9到12bit几种分辨率分辨率越高转换时间越长。HVAC应用里温度变化本来就慢12bit分辨率对应的转换时间一般几百毫秒完全能接受。但如果项目要求快速轮询比如每秒更新多次温度可以适当降到11bit或10bit换取更快的转换周期。这个取舍要根据实际控制周期来定没有绝对的最优值。3.2 温度数据读取与补码转换初始化完成之后读取温度就是常规的寄存器操作了。本地温度寄存器和远程温度寄存器通常是两个独立的数据寄存器每个寄存器分高字节和低字节。读取流程一般是先判断转换完成标志位然后读高字节再读低字节最后拼接成原始值。// 读取本地温度原始值示例寄存器地址 int16_t pj85718_read_local_raw(void) { uint8_t hi 0, lo 0; pj_read_reg(0x04, hi, 1); pj_read_reg(0x05, lo, 1); return (int16_t)(((uint16_t)hi 8) | lo); } // 读取远程温度原始值示例寄存器地址 int16_t pj85718_read_remote_raw(void) { uint8_t hi 0, lo 0; pj_read_reg(0x06, hi, 1); pj_read_reg(0x07, lo, 1); return (int16_t)(((uint16_t)hi 8) | lo); }拿到原始值之后关键的一步是换算成实际摄氏温度。PJ85718DM这类芯片的温度寄存器一般用二进制补码表示温度正温度时高位为0负温度时高位为1。如果直接忽略符号位负温度会被当成很大的正数控制逻辑会完全错乱。实际换算的时候第一步是把高字节和低字节拼成一个16位整数第二步根据分辨率确定LSB对应多少摄氏度第三步乘以LSB得到温度值。float pj_raw_to_temp(int16_t raw, float lsb) { return (float)raw * lsb; }这里最容易出问题的地方是分辨率对应的LSB。12bit分辨率下常见LSB是0.0625℃11bit是0.125℃10bit是0.25℃9bit是0.5℃。有些芯片为了提高字节利用率会把有效数据放在寄存器的高位低几位固定为0。读取后需要先进行算术右移才能正确解释成补码温度。比如12bit数据存放在高12位时要先右移4位再乘LSB。这一点非常值得写代码前仔细看手册中的寄存器定义我见过不少人在这一步踩坑读出来的数据要么全是整数不变化要么在零度附近跳变。3.3 远程通道校准与软件滤波远程通道因为走线距离较长加上外部二极管本身的离散性读到的温度往往会和实际温度存在一到两度的固定偏差。这种偏差不一定会影响HVAC控制逻辑的正确性但如果产品对精度要求高比如需要将温差信号用于风机盘管控制或者能耗计量就要做偏移校准。PJ85718DM一般会提供偏移校准寄存器做法是把系统放到已知温度环境中用高精度温度计读取标准值减去PJ85718DM当前读数得到偏差量再把偏差量写入偏移寄存器。软件层面温度信号本身变化慢但会受到干扰脉冲影响表现就是偶尔跳出几个异常大值。对这种信号不建议上太复杂的滤波算法一阶低通滤波已经够用。所谓一阶低通就是当前滤波后的温度取新采样值和旧滤波值之间的加权和。#define TEMP_FILTER_ALPHA 0.2f typedef struct { float filtered_local; float filtered_remote; uint8_t inited; } temp_filter_t; void temp_filter_update(temp_filter_t *f, float local, float remote) { if (!f-inited) { f-filtered_local local; f-filtered_remote remote; f-inited 1; return; } f-filtered_local TEMP_FILTER_ALPHA * (local - f-filtered_local); f-filtered_remote TEMP_FILTER_ALPHA * (remote - f-filtered_remote); }滤波系数α表示新值在滤波结果中的权重。α越小滤波越平滑但响应越慢α越大响应越快但平滑效果差。HVAC场景建议从0.1到0.3之间取一个值先用0.2试跑观察数据曲线。如果远程通道受风管气流波动影响明显可以适当调小α。这里要注意的是如果控制逻辑中需要快速响应送风温度突变比如盘管结冰保护就不该让滤波掩盖真实的快速降温趋势这种情况下应该同时保留一个未滤波的原始值用于保护判断滤波值用于常规PID控制。4. 在HVAC控制逻辑里怎么用这两路温度4.1 回风温度与送风温度的控制配合HVAC控制逻辑中PJ85718DM的本地通道和远程通道可以分别对应回风温度和送风温度这是用得最多的一种分配方式。回风温度代表了室内或者被控区域的平均温度送风温度代表了风柜送出空气的温度两者一起代入控制策略整个空调控制就变得立体了。最常见的一个应用是风机工作状态诊断。正常情况下制冷模式下送风温度应该低于回风温度制热模式下送风温度应该高于回风温度。如果PJ85718DM读到的本地温度和远程温度温差一直小于某个阈值比如0.5℃以内那就很可能是风机没有转起来、风路阻塞或者盘管没有正常工作。这种诊断用两路独立的温度做差值比只看单路温度可靠得多。另一个典型是防冷风保护。冬季制热启动时如果盘管温度还没上来就开风机吹出来的是冷风人会很不舒服。用远程通道测量盘管或者送风温度当送风温度低于设定下限时风机保持低速或者停机等待温度升高再送风。等到远程温度稳定超过阈值再逐步恢复风机转速。这个过程如果只靠本地板温控制完全无法实现。控制策略上HVAC一般不需要严格的PID用滞回控制就能取得很好的效果。例如制冷模式目标温度为22℃当回风温度持续高于23.5℃时启动制冷当回风温度低于20.5℃时停止制冷。这个上下限之差就是滞回带宽防止压缩机频繁启停。PJ85718DM两路温度分别作为回风输入和保护输入数据维度足够支撑这样的策略。控制场景本地通道用途远程通道用途典型动作制冷运行回风温度参与启停判断送风温度做防过热保护回风高于23.5℃启动低于20.5℃停止制热运行回风温度参与启停判断送风温度做防冷风保护送风低于25℃限制风机转速风机诊断回风温度做基准送风温度做温差比较温差小于0.5℃报故障主板保护板温过高报警管道温度参与降载板温超75℃关闭加热输出4.2 嵌入式低功耗与定时采集策略虽然HVAC设备大多常年通电但嵌入式侧的低功耗设计依然值得考虑尤其是一些带电池供电的无线温度采集节点或者楼宇自控系统的边缘设备。R7FA4E2B93CFM支持多种低功耗模式可以结合LPTIM或者RTC定时唤醒MCU让系统大部分时间处于睡眠状态只在需要采集温度的时候唤醒。采集频率的选择要看控制周期。HVAC温度对象的时间常数一般以分钟为单位每秒采集一次已经足够更高的频率不仅浪费功耗还会让控制输出频繁变化。实际项目中我用1秒作为默认采样周期在远程温度出现快速变化时通过ALERT中断或者差值判断临时加快采样频率。这种动态采样策略需要在工程实现时平衡好实时性和MCU资源占用。R7FA4E2B93CFM在唤醒后执行PJ85718DM的读取操作整个流程很短。典型做法是唤醒初始化I2C访问读取本地原始值和远程原始值转换成温度做一次滤波更新将结果存入全局变量然后重新进入睡眠。如果I2C总线上还有其他设备可以一次性读回所有数据再做处理避免反复唤醒。低功耗设计里有几个细节比较容易忽略一个是I2C总线上拉电阻在MCU睡眠时的电流消耗另一个是传感器在等待转换期间是否可以进入低功耗状态。PJ85718DM如果有关断模式可以在不测温时关闭内部ADC和参考源只保留I2C接口待机。不过这种模式是否适用于HVAC控制器看具体需求。常供电的控制器不需要过分关注这部分电流但电池供电的节点一定要把唤醒间隔拉长并确认传感器关断模式下的电流数值。5. 调试记录踩过的坑和排查套路5.1 常见问题速查表设备调试过程中我把遇到的问题整理成了一个速查表。这些场景不是理论假设都是实际调试中真实出现并排查过的针对性很强。现象可能原因排查方法与解决办法I2C读寄存器全部返回0xFF设备地址错误、总线无上拉、芯片未供电用逻辑分析仪抓波形确认SCL和SDA是否正常再核对芯片A0/A1地址引脚本地温度正常远程温度固定为25℃左右远程引脚悬空没有接测温二极管检查远程二极管是否焊好用万用表二极管档测量两个引脚之间压降约0.5V远程温度跳变幅度超过3℃远程走线太长或受到干扰接触不良缩短走线改为双绞线在芯片引脚端并联0.1μF电容温度读数整体偏高传感器贴近发热元件或本地通道受到了PCB热传导用热成像仪看板面温升把传感器挪到远离散热器件的位置温度长时间不更新芯片进入了关断模式或配置寄存器写错重新初始化并检查配置寄存器确认没有把持续转换位清零偶发I2C通信超时总线负载电容过大上拉电阻偏大把上拉电阻从10kΩ降到4.7kΩ适当降低I2C时钟频率5.2 几个值得记住的实操建议第一远程通道的测温二极管不要随便拿一个型号就用。虽然原理上PN结都能测温但不同厂家、不同封装的三极管结电容和工艺参数有差异会直接影响测温精度。定项目时直接把某个二极管的型号固定下来并且要求现场批次保持一致不要今天换一种明天又换一种不然温度一致性会很难看。第二逻辑分析仪是调试I2C的好工具。PJ85718DM的寄存器读写时序不复杂但一旦出现通信问题拿眼睛看代码基本看不出原因。把逻辑分析仪挂在SCL和SDA上一次抓完读时序看一眼波形就知道是地址不对、应答缺失还是时序太慢。这个习惯帮我省了很多时间。第三温度校准一定要在整机状态下做不是在开发板上做完就完事。整机里风道结构、风机热量、电源模块温升都会影响实际温度值。我的做法是先在开发板上验证代码逻辑再把系统装进样机在恒温或已知温度环境下做偏移校准最后把偏移量写进产品的校准流程。这里还要提醒一句如果HVAC设备有多个工作模式比如制冷制热切换传感器周围的空气流动会变化校准点最好覆盖到不同温区。第四PJ85718DM的ALERT中断不要浪费。在HVAC控制板里超温和低温保护属于关键功能。与其在应用代码里每100毫秒扫描一次温度是否越限不如把阈值写进PJ85718DM的寄存器让芯片自己在越限时通过ALERT引脚通知MCU。这样做既降低了MCU负担也避免了扫描周期造成的保护响应延迟。写在最后的体会这块板子做完之后最明显的感觉是本地和远程温度监测这套组合真正把HVAC里最常用的两路温度采集合到了一个简单清晰的硬件架构里。PJ85718DM负责采集R7FA4E2B93CFM负责解析和逻辑处理从驱动代码到控制策略都不需要引入太多中间环节。后续如果项目需要接楼宇自控总线直接在这个基础上扩展Modbus或者CAN FD协议栈就能把温度数据送出去。如果你也在做类似的嵌入式或者HVAC温度监测项目我的建议是不要一上来就调控制参数先把传感器两路温度读准、读稳。温度数据可信了后续什么PID、滞回控制都建立在可靠的地基上。反过来如果温度本身在跳控制策略再复杂也是白搭。最后分享一个小技巧我去现场调试的时候习惯先在PJ85718DM的远程通道上故意用一个50厘米长的普通杜邦线接二极管如果在这种恶劣条件下温度跳变都能压住那整机环境的抗干扰基本就没什么大问题了。这个测试方法很简单但对评估方案余量非常有效。