
1. 从一颗温度传感器说起为什么HVAC场景需要本地远程双路测温做嵌入式暖通空调HVAC控制器的朋友大概率都遇到过这种需求机组既要感知本地的送风/回风温度又要通过总线读取远程房间或管路的温度然后综合两路数据去调节压缩机、风机或水阀。听起来简单但真到选型和布板阶段问题就来了——本地测温要够准、够快远程测温要能抗干扰、能拉远距离而且两路数据还得在同一个MCU里被统一调度。我最近在做一个模拟的HVAC温控节点项目核心就是用一颗PJ85718DM温度传感芯片配合STM32F413RH主控把本地和远程两路温度采集跑通。PJ85718DM是一颗支持多路远程测温的传感器它最大的特点是能外接分立三极管比如常见的MMBT3904作为远程测温探头把测温点从芯片本体延伸到几米甚至十几米外的目标位置而STM32F413RH属于STM32F4系列里偏高性能的一档带FPU、主频能跑到100MHz、外设资源丰富拿来跑温度采集、滤波、控制逻辑绰绰有余。这篇文章不是芯片手册的复述而是把我从选型、硬件设计、寄存器配置到实测踩坑的完整链路摊开讲。适合正在做HVAC控制器、工业温度采集、或者任何需要“本地远程”双路测温方案的嵌入式开发者参考。哪怕你用的是别的传感器或别的MCU这里面的思路——比如远程测温的二极管接法、串联电阻的取值、滤波策略、总线读取的时序——都是通用的。先说结论这套组合能稳定做到本地测温±0.5℃、远程测温±1℃以内的精度采样周期控制在100ms级别完全没问题。但前提是几个关键细节不能错后面会一个个拆。2. PJ85718DM的测温原理本地二极管与远程三极管到底怎么工作2.1 本地测温芯片内部寄生二极管的正温漂特性PJ85718DM的本地测温通道本质上测的是芯片内部一个寄生PN结的正向压降。这个压降和温度是负相关的——温度升高同样的电流下正向压降会下降大约每升高1℃下降2mV左右。芯片内部会用一个已知的偏置电流去驱动这个PN结然后测量压降再通过内部逻辑换算成温度值。这里有个容易被忽略的点本地测温测的是芯片自身的结温不是环境温度。如果你把芯片贴在PCB上而PCB附近有发热元件比如LDO、功率MOS那读出来的温度会明显偏高。我在第一版板子上就吃了这个亏——把PJ85718DM放在了DC-DC旁边结果本地温度比实际环境高了将近8℃。后来把传感器挪到板边、远离热源并且铺铜做了热隔离才把偏差压到1℃以内。所以本地测温的硬件布局原则很简单传感器要放在你真正想测的那个温度点上并且和热源保持距离。如果测的是机箱内空气温度那就让芯片尽量悬空或只通过细走线连接如果测的是某个金属面的温度那就用导热胶把芯片背面贴上去。2.2 远程测温外接三极管的ΔVBE测量法远程测温是PJ85718DM的亮点。它支持外接一个NPN三极管把集电极和基极短接当成二极管用通过测量这个三极管在不同电流下的基极-发射极压降差ΔVBE来算温度。为什么要用两个电流因为单个PN结的压降受工艺分散性影响很大但两个不同电流下的压降差只和温度、电流比有关跟工艺关系不大这样就能做到高精度且一致性好。具体来说芯片会交替输出两个不同大小的电流比如10μA和100μA流过远程三极管然后分别测量VBE得到ΔVBE。根据公式ΔVBE (kT/q) × ln(N)其中k是玻尔兹曼常数T是绝对温度q是电子电荷N是两个电流的比值。反推就能得到T。这个方法的精度可以做到±1℃以内而且远程探头可以拉很远——只要走线合理几米甚至十几米都没问题。但远程测温有几个硬性约束远程三极管的基极和发射极走线必须成对、等长、靠近最好用地线包围做屏蔽串联电阻不能太大否则会影响电流源的建立三极管要选低噪声、一致性好的型号比如MMBT3904就是很常见的选择。我在实测中试过用长排线拉3米不加屏蔽时读数跳动能达到±3℃加了屏蔽和滤波电容后稳定在±0.8℃。2.3 为什么不用热敏电阻或数字传感器有人会问远程测温为什么不用NTC热敏电阻或者DS18B20这类数字传感器NTC便宜但精度差、非线性严重长距离走线时引线电阻会直接影响读数DS18B20是数字输出抗干扰好但每个探头都要单独走线多点测温时布线复杂而且响应速度偏慢。PJ85718DM的远程测温方案优势在于一个芯片可以轮询多个远程通道具体通道数看型号共用一组电流源和ADC成本低、布线简洁而且ΔVBE法本身精度高、温漂小。对于HVAC这种需要多点测温但成本敏感的场景这个方案很合适。3. STM32F413RH这边的活接口、时序与数据读取的完整链路3.1 硬件接口I2C还是SPI怎么选PJ85718DM通常提供I2C或SPI接口具体看后缀和配置。STM32F413RH两者都支持那选哪个我的建议是如果采样率要求不高比如每秒几次I2C足够如果要高速连续采样或者总线上挂了很多设备SPI更稳。I2C的好处是引脚少两根线可以挂多个从设备缺点是速率受限长走线时容易受容性负载影响而且多主机仲裁逻辑复杂。SPI的好处是全双工、速率高、时序简单缺点是多一根片选线设备多了片选线也多。我这个项目里温度采样周期是100ms一次I2C完全够用所以选了I2C。STM32F413RH的I2C外设支持标准模式100kHz和快速模式400kHz我跑在400kHz读一次温度包括写寄存器地址、读两个字节数据大概几十微秒对CPU占用极低。配置I2C的时候有几个参数要注意时钟频率、上升时间、滤波系数。上升时间要根据总线上拉电阻和总线电容来算公式是tr ≈ 0.847 × R_pullup × C_bus比如上拉电阻4.7kΩ、总线电容200pF那tr大约是0.8μs对应400kHz快速模式是够的快速模式要求tr300ns这里要查手册实际上400kHz下tr最大300ns所以4.7k可能偏大得用2.2k甚至1k。我实测用2.2k上拉400kHz跑得很稳。3.2 寄存器配置从复位到连续转换模式PJ85718DM上电后需要先配置几个关键寄存器配置寄存器设置测温通道、分辨率、转换速率、状态寄存器查看转换完成标志、温度数据寄存器读取结果。具体寄存器地址和位定义要看数据手册这里说通用逻辑。第一步是软复位确保芯片处于已知状态。第二步是写配置寄存器选择本地通道和远程通道、设置ADC分辨率比如16位还是12位、设置转换模式单次还是连续。第三步是启动转换然后轮询状态寄存器或等中断转换完成后读温度数据。这里有个坑连续转换模式下两次读取之间要留够转换时间。如果配置成最快转换速率但MCU读得太快可能读到旧数据。我的做法是配置成100ms一次的连续转换然后用定时器每100ms触发一次读取读之前先查状态寄存器的“转换完成”位确保数据是新的。3.3 温度换算原始码到摄氏度的计算读出来的温度数据通常是16位有符号数格式可能是二进制补码分辨率比如0.0625℃/LSB。换算公式温度(℃) 原始码 × 分辨率比如原始码是0x06401600分辨率0.0625那温度就是100℃。如果是负数要先转成有符号数再算。有些芯片还会提供高低温报警阈值寄存器可以设置过温报警这样MCU不用一直轮询等报警中断就行。HVAC场景里这个功能很有用——比如回风温度超过设定值就触发中断MCU再去处理。4. 本地与远程双路测温的实测数据与精度分析4.1 测试环境搭建恒温槽与参考温度计为了验证精度我用了一个模拟的恒温测试环境一个带加热和制冷的恒温槽里面放参考温度计精度±0.1℃然后把本地传感器和远程三极管都放进去等温度稳定后对比读数。测试点选了-10℃、0℃、25℃、50℃、80℃五个温度点每个点稳定15分钟后记录。本地测温的读数直接来自PJ85718DM内部通道远程测温用的是外接MMBT3904走线长度1米带屏蔽。4.2 本地通道实测偏差来源与修正方法实测下来本地通道在25℃时偏差0.3℃50℃时0.5℃80℃时0.8℃。偏差随温度升高而增大这主要是芯片自发热和PCB热耦合导致的。修正方法有两种一是做单点偏移校准比如在25℃时减去0.3℃二是做两点校准用两个温度点拟合一条直线。我用了两点校准在0℃和80℃各测一次算出斜率和截距然后写进MCU的校准参数里。校准后本地通道在-10℃到80℃范围内的偏差压到了±0.4℃以内。4.3 远程通道实测走线长度对读数的影响远程通道的测试更有意思。我用1米、3米、5米三种走线长度分别测结果如下走线长度无屏蔽偏差有屏蔽偏差加滤波电容后偏差1米±0.5℃±0.3℃±0.2℃3米±1.8℃±0.6℃±0.4℃5米±3.5℃±1.2℃±0.8℃可以看到屏蔽和滤波电容对长走线的改善非常明显。屏蔽用的是双绞线加铜网屏蔽层屏蔽层单端接地滤波电容是在远程三极管的基极-发射极之间并一个100nF陶瓷电容滤掉高频干扰。另外串联电阻也很关键。PJ85718DM的远程测温通道通常要求在基极和发射极走线上各串一个小电阻比如几十欧姆用来限流和抑制振荡。我试过不串电阻读数跳动明显增大串了100Ω后稳定很多。4.4 双路数据的融合与滤波策略本地和远程两路数据都拿到后怎么用HVAC控制里通常需要的是“代表温度”比如回风温度用本地、房间温度用远程然后取加权平均或者取最大值。我的做法是先各自做滑动平均滤波窗口长度8再做加权融合。滑动平均滤波能有效抑制随机噪声但会引入滞后。窗口长度8在100ms采样周期下滞后大约0.8秒对HVAC这种慢过程完全够用。如果对响应速度要求高可以用一阶低通滤波截止频率设1Hz左右。融合权重根据实际场景调如果本地测的是机组内部温度远程测的是房间温度那房间温度的权重应该更高比如0.7因为用户关心的是房间舒适度。5. 踩过的坑与排查链路从读数跳动到通信失败5.1 读数周期性跳动电源纹波在作怪第一版板子调试时发现远程温度读数每隔几秒就跳一下幅度大概±2℃。一开始怀疑是传感器问题换了芯片还是一样。后来用示波器看电源发现3.3V电源上有大约50mV的纹波频率和开关电源的开关频率一致。根因PJ85718DM的电流源对电源纹波敏感纹波会调制到测量结果上。解决在传感器电源引脚旁边加一个10μF钽电容加一个100nF陶瓷电容并且把传感器电源和数字电源用磁珠隔开。改完后跳动降到±0.3℃以内。这个坑的排查链路是读数跳动→怀疑传感器→换芯片无效→怀疑电源→示波器测电源→发现纹波→加滤波→解决。关键是要有示波器光靠万用表看平均电压是发现不了纹波的。5.2 I2C通信失败上拉电阻和总线电容的匹配第二版板子把传感器挪远了I2C走线长了大约15cm结果通信时好时坏。用逻辑分析仪抓波形发现SCL上升沿明显变缓有些周期甚至没到高电平阈值。根因走线变长导致总线电容增大原来的4.7k上拉电阻太大上升时间超过了I2C快速模式的要求。解决把上拉电阻换成2.2k上升时间从1.2μs降到0.5μs通信恢复稳定。这里有个经验公式上拉电阻最小值受限于器件的灌电流能力。I2C标准规定灌电流最大3mA3.3V下最小电阻约1.1k。所以2.2k是安全的1k就有点冒险了。5.3 远程三极管读数恒为负值基极-发射极接反了有一次焊了一块新板子远程温度读数一直是-40℃左右明显不对。检查电路发现三极管的基极和发射极焊反了。虽然三极管反过来接也能当二极管用但ΔVBE的特性完全变了所以读数错误。解决重新焊接确保基极接芯片的远程基极引脚发射极接远程发射极引脚集电极悬空或短接到基极。这个坑很低级但批量生产时如果贴片方向搞错就会整批出问题。所以PCB上一定要有清晰的丝印标记并且首件要仔细核对。5.4 温度数据偶尔跳变到0xFFFF转换未完成就读取调试连续转换模式时偶尔会读到0xFFFF对应-1℃或无效值。查状态寄存器发现“转换完成”位是0说明数据还没准备好就被读了。根因MCU的读取定时器和传感器的转换周期没有严格同步偶尔会提前触发。解决读之前先查状态位如果没完成就等一个短延时再读或者改用中断方式转换完成触发中断在中断里读。我改成了中断方式问题彻底消失。6. 把方案落地PCB布局、校准与量产注意事项6.1 PCB布局的几条硬规矩做温度采集板布局比原理图更重要。我总结了几条传感器远离热源DC-DC、LDO、功率电阻至少离2cm以上实在避不开就开槽或铺铜隔离。远程走线成对等长基极和发射极走线要并行走长度差控制在5mm以内最好用地线包围。模拟地和数字地分开传感器下面的地要干净不要和数字信号地混在一起最后单点接地。滤波电容就近放电源引脚旁的100nF电容离引脚不超过2mm否则滤波效果大打折扣。6.2 校准流程从单点到多点量产时每块板子都要校准吗看精度要求。如果要求±1℃可以只做单点校准比如25℃如果要求±0.5℃建议做两点校准。校准方法很简单把板子放到恒温箱里设定两个温度点记录读数算出偏移和斜率写进MCU的Flash。校准参数可以存在STM32F413RH的Flash里上电时读出来用。注意Flash的擦写次数有限不要频繁写校准一次就够了。6.3 量产测试怎么快速筛出不良品量产测试不可能每块板都放恒温箱。我的做法是用一颗已知温度的参考传感器贴在板子上同时读本地和远程通道对比偏差。如果偏差超过阈值比如±2℃就标记为不良。这个方法能筛出焊接不良、元件贴错、走线短路等问题速度快、成本低。另外远程通道可以接一个固定的模拟负载比如一个已知特性的三极管测出来的温度应该在合理范围内。如果读数离谱说明远程通道有问题。7. 这套方案还能怎么扩展PJ85718DM加STM32F413RH的组合基础功能是双路测温但扩展空间很大。比如多路远程测温如果芯片支持多个远程通道可以轮询多个房间或管路实现多点监控。总线组网STM32F413RH带CAN或RS485可以把多个温控节点组网上传到上位机。本地控制逻辑利用STM32的FPU和定时器直接跑PID控制风机或水阀不用外挂控制器。数据记录加一片SPI Flash或SD卡记录温度曲线方便事后分析。我在实际项目里还试过用STM32的DMA来搬I2C数据进一步降低CPU占用效果不错。如果你也在做类似的东西建议先把本地和远程两路跑通再逐步加功能别一上来就堆太多否则出了问题很难定位。最后分享一个小技巧调试温度采集时一定要用逻辑分析仪抓一次完整的通信波形看看时序、电平、上升沿是否正常。很多问题光看代码是看不出来的波形一抓就清楚了。这个习惯帮我省了大量排查时间。