
1. 先说我为什么想做这个温度监测项目搞嵌入式温度监测的人应该都遇到过这种尴尬设备里想同时知道控制板附近的温度和风道、管道里的温度但市面上常见的数字温度传感器大多只支持本地测温想测远端就得拉一堆模拟线回来自己做调理电路成本和抗干扰问题都很头疼。前阵子我在一个HVAC电控盒改造项目里用 PJ85718DM 配 STM32F732IE 把这个问题解决了。这套方案的核心价值在于一颗 PJ85718DM 就能同时采集本地温度和远程温度本地节点测电控盒内部温度远程感温头拉到风管或水管里测介质温度主控端通过 I2C 总线挂载扩展测温点基本不需要改硬件。STM32F732IE 作为主控有足够的性能和多余外设来处理 PID 调节、风机启停和上位机通信温度采集只是它一个小任务。适合做暖通空调控制器、工业设备监控、嵌入式机箱散热管理这类项目的人参考尤其是那种既要看板级温度又要看远端介质温度的场景。我实际做完后最大的体会是软硬件配合必须一起设计传感器那一端的驱动、滤波、长线补偿、异常上报每一项都比单纯“读个温度”要细得多。这篇文章就按我真实折腾的顺序来写从器件选型到硬件要点再到软件实现和现场踩坑尽量把我自己的实测数据和教训都放进来。2. 方案选型PJ85718DM 和 STM32F732IE 凭什么搭在一起2.1 PJ85718DM 的本地与远程测温原理PJ85718DM 是一颗数字温度传感器内部集成了本地温度测量单元和一个远程温度测量通道。本地测温靠的是片内 PN 结随温度变化的电压特性精度可以做到 ±0.5°C 以内远程测温的原理是芯片对外输出一路恒定的激励电流流过外部接在远端的一颗二极管通常是三极管 BE 结芯片通过采集二极管正向压降随温度的变化来计算温度。这种方式最大的好处是远端只需要两根线中间传输的是电流驱动信号抗干扰能力比模拟电压长线传输好得多。电阻温度检测器和热电偶虽然也能做远程测温但后者要么需要恒定电流或电桥要么需要冷端补偿和热电偶电压放大电路复杂度和成本都上去了。PJ85718DM 把这一整套模拟前端的活都集成到片内我只要在外面接一个测温二极管剩下的校准和数字化都由芯片完成对嵌入式开发来说省了非常多事。这颗传感器的接口是 I2C支持标准模式和快速模式分辨率可配置。我最常用的配置是 12 位转换模式温度寄存器为 16 位低 4 位表示小数部分LSB 对应 0.0625°C。它还有两个可编程温度报警输出引脚可以挂在主控的外部中断上温度越限时主控不用轮询也能立刻知道。2.2 STM32F732IE 的资源评估STM32F732IE 是 Cortex-M7 内核的设备主频能跑到 216MHz带硬件双精度浮点单元和 DSP 指令。可能有人会说你拿一个 216MHz 的 M7 就为了读几路温度是不是太浪费了实际项目里这个主控不光是采温度它还要跑通信协议栈、设备控制逻辑经常还要跑简单的滤波和故障诊断算法。选 M7 不是为了温度采集本身而是留下足够裕量避免后期功能膨胀导致换平台重写。F732 系列自带多个 I2C 外设支持 DMA 传输这让它在多传感器挂载场景下很舒服。我这次在一条 I2C 总线上挂了四颗 PJ85718DM每颗通过地址线配置不同地址主控用 400kHz 快速模式轮询。温度采样本来就是周期任务DMA 搬运数据的话CPU 的占用率可以压得非常低。F732 还有丰富的中断控制器四路传感器告警引脚可以分别接引脚通过 EXTI 唤醒处理这个特性在多路报警场景里太好用了。另外 HVAC 设备通常需要支持 Modbus、CAN 或者以太网协议栈中的至少一种STM32F732IE 自带以太网 MAC需要的话可以直接跑 TCP/IP。温度数据最终要上传到上位机或者楼宇自控系统有这个外设扩展空间后期集成起来不需要换芯片。2.3 系统框架为什么HVAC设备里要同时测本地和远程先说一个典型的 HVAC 应用场景。电控盒安装在机组内部里面有变频器、继电器、开关电源这些都是发热大户本地温度传感器紧贴主控板测的是电控盒内的环境温度用来判断电气部分是否过热远程感温头放在风管出风口或者冷水盘管的回风段测的是被控对象的实际温度这个值直接参与 PID 调节。如果只测远端介质温度电控盒内部过热的隐患就发现不了反过来只测本地温度又控制不了送风温度所以本地加远程至少要两路。在通用嵌入式场景下也一样机箱内部温度反映的是芯片、电源模块的散热状态远程温度测的是机箱进风口或者外部热源附近的环境值两者对比可以发现风道设计是否合理。这种双通道测温需求非常多而 PJ85718DM 一颗芯片就把两路都覆盖了一块板上放两到三颗六个测温点就有了再用一个主控统一处理整体物料清单非常干净。3. 硬件设计画板、接线与布线的坑3.1 最小系统与传感器供电STM32F732IE 的最小系统没什么特别的供电、晶振、复位、调试接口按手册来就行。关键问题在传感器的供电设计和 I2C 上拉电阻选择。PJ85718DM 的供电范围比较宽我为了简化电源树直接用了 3.3V 电源轨。需要注意传感器和主控最好用同一个电源轨如果现场分离供电I2C 器件之间可能出现电平不匹配的隐患。I2C 上拉电阻要根据总线上挂载的器件数量和总线电容来取值。我在四颗传感器的场景里总线上拉电阻用了 2.2kΩ实测在 400kHz 模式下的上升沿还够快。如果总线拉得非常长比如超过 30cm建议降到 1kΩ 并实测波形。这里有一条经验不要偷懒直接把开发板上常见的 10kΩ 上拉拿来用多颗器件挂载时高阻上拉会导致通信偶发失败。传感器去耦电容我用的是 0.1μF 放在 VDD 和 GND 之间位置尽量贴近芯片电源引脚。如果传感器离主控比较远建议在电源入口再加一个 10μF 钽电容防止瞬时压降导致传感器复位。这个问题在 HVAC 现场特别突出因为风机启动瞬间电流变化很大电源波动会传导到传感器。3.2 远程感温头接线规范远程测温看起来简单实际是最容易出问题的地方。PJ85718DM 的远程通道有两根引出线一个接二极管正极一个接二极管负极。我先说结论远程线用双绞线长度尽量控制在 1 米以内最长不要超过 2 米。线越长寄生电容越大芯片内部对二极管电压的采样越容易受干扰。连线方向不要搞反这是我最开始踩的坑。远程二极管的正极要接到传感器对应正端负极接负端如果接反了读数会完全不正常。我用的是常见小信号三极管的 BE 结当作感温二极管比如把基极和集电极短接只留发射极这样封装起来非常方便。如果需要更稳定的长期精度也可以买封装好的测温二极管但成本会高不少。远程走线尽量不要和电机驱动线、继电器控制线走同一个线槽高频开关噪声会耦合进测量回路。如果结构上实在避不开远程线外面加屏蔽层并单端接地能有效减少共模干扰。我试过在同一个线槽内并行 20cm 的交流接触器控制线温度读数最多能偏 2°C 左右这个误差在 HVAC 控制里是没法接受的。3.3 现场噪音与电磁兼容处理HVAC 设备里最大的干扰源是变频器和接触器它们的开关动作会产生强烈的电磁脉冲通过空间和电源传导两条路径影响传感器。除了 PCB 布线和远程线规范之外还有几个实用手段能显著提升稳定性。传感器电源入口加磁珠和电容组成 LC 滤波能滤掉电源线上的高频噪声。ST 官方在评估板里对模拟器件供电也是这么处理的磁珠选 600Ω100MHz 的规格就够。另一个点是 I2C 数据线如果一定要引出到外部端子最好串联一个小电阻比如 33Ω吸收反射和过冲否则长线连接时波形振铃很严重。接地策略也要注意。传感器和主控之间的地线不能形成环流点对点连接最好地线截面尽量粗短不要依赖外壳作为地回路。我之前犯过一个错远程导线没接回流地只靠屏蔽层接地结果读数在风机启动瞬间直接跳变后来改成四线制两线信号、两线电源地才压住。3.4 保护电路与接口设计温度传感器最终要进到产品里不能只在实验室室温环境下工作。HVAC 设备可能遇到现场接线错误、传感器端子拔插、静电放电等情况所以接口端要加保护。我的做法是在远程感温头两端并联一个小电容比如 1nF 左右滤掉射频干扰同时串入 1kΩ 电阻限流。如果出现外部误接电源的情况串阻和保护二极管能挡一挡。传感器输出到主控的 I2C 信号如果不做隔离建议在接口处加 ESD 保护器件晶闸管型或二极管阵列都可以成本不高但可靠性提升明显。主控板上的传感器焊盘要留好四种封装兼容位置我这次用了铝电解电容和陶瓷电容能兼容的封装不同的批次可以灵活换件。这类小细节在量产时非常关键前期画板时多考虑一步后面调试能少焊很多线。4. 软件架构与关键实现4.1 驱动层设计与寄存器映射软件部分我采用“寄存器级驱动 中间层复用”的结构。寄存器级驱动只做底层访问不带上层逻辑。PJ85718DM 的读写逻辑和大多数 I2C 传感器类似读温度寄存器前需要设置合适的转换精度和报警阈值。驱动初始化流程按照这样的顺序先复位传感器如果可以把配置寄存器设置为连续转换模式转换分辨率设为 12 位等待第一次转换完成然后读取状态寄存器确认没有报警。之后在主循环或 RTOS 任务里周期性读取温度寄存器即可。上层应用完全不关心寄存器的具体地址只调用类似pjt85718_read_local()和pjt85718_read_remote()的函数。这样做好处是后期换传感器芯片时只要重写底层驱动应用层代码几乎不用动。我在多个项目里都用这个套路省过不少返工时间。4.2 读取温度与换算细节读取本地温度和远程温度时传感器会返回两个字节的原始值里面是带符号的定点数。以 12 位精度为例温度寄存器的低 4 位是小数部分高 12 位是整数部分负温度用二进制补码表示。换算公式非常直接温度值°C 原始有符号整数 × 0.0625。举个例子如果寄存器读到的原始值是 0x0190对应十进制 400那么温度就是 400 × 0.0625 25°C。如果读到 0xFE70因为是补码先转换成 -400再乘 0.0625 就是 -25°C。我在代码里写了一个统一的换算函数先判断最高位是不是 1如果是就减掉 65536 得到负数然后再乘 0.0625。由于 STM32F732IE 带硬件浮点直接用浮点计算没有任何性能压力代码可读性更好。下面是读取远程温度的核心代码片段本地温度的读取完全一样只是寄存器地址不同float pjt85718_read_remote_temperature(void) { uint8_t buf[2]; int16_t raw; pjt85718_read_regs(PJT85718_REMOTE_TEMP_H, buf, 2); raw (int16_t)((buf[0] 8) | buf[1]); raw (int16_t)(raw 4); return (float)raw * 0.0625f; }这里有一个容易忽略的细节右移操作对负数在 C 语言中的行为是实现定义的我为了稳妥直接先把两字节拼成有符号数再整体右移Cortex-M7 上算术右移是符号扩展结果符合预期。如果自己的编译器行为不确定智能点的方法是先判断符号位再做绝对值换算。4.3 滤波、标定与报警阈值HVAC 现场的温度变化通常比较缓慢但风机启停、开门关门都会造成短时突变。直接拿原始读数参与 PID 调节会导致执行机构频繁动作。我在传感器采样之后加了一层一阶低通滤波系数取 0.2 到 0.3 比较合适。滤波公式是当前滤波值 上次滤波值 × 0.8 本次原始值 × 0.2。这个系数下时间常数大约几秒既能跟踪缓慢变化又能压住风机突变带来的尖峰。温度标定我建议至少做两个点一个冰水混合物0°C一个恒温槽比如 50°C。把传感器放进去等读数稳定后记录偏差然后在软件里做两点线性补偿。PJ85718DM 的绝对精度本身不错但长线、焊点差异仍可能带来小偏移用软件修正成本最低。上面滤波和标定都做完了还要设置报警阈值。报警逻辑我用了传感器自带的阈值寄存器。通常设置一个高温报警比如设备内部 75°C远程风管 60°C。超过阈值后传感器的 ALERT 引脚会拉低接在主控的外部中断脚上进入中断处理函数后立刻读取报警状态寄存器识别是哪一路报警然后执行风扇加速或者显示器提示。不用中断、只靠主循环轮询虽然也能实现但响应延迟会受主循环周期影响所以我最终选了中断方案。4.4 通讯上报与主循环集成温度数据读回来后不能只自己看在 HVAC 系统里要上报给触摸屏或者楼宇网关。我这里用了 UART 转 Modbus 协议周期是 500ms 一次把本地温度、远程温度、报警状态打包成标准寄存器表。多路传感器轮询时需要注意不上报时效性差。如果四颗传感器每颗转换时间 100ms 左右串行读取一圈可能要 400ms 以上这在暖通控制里勉强够用但会拖慢整机响应。我的处理方式是把传感器转换配置成主动连续模式每颗传感器的转换完成时间错开主控按固定时间片读取已经更新的数据相当于微小的时分复用。这样配合使用后CPU 的负载率很低主循环里还能跑风阀控制、键盘扫描和其他业务系统性比把全部功能堆在温度读取上强太多。5. 实测数据与标定过程5.1 本地温度通道的标定在这次调试中我先把本地温度通道和一块高精度的参考温度计一起放在恒温箱里从 0°C 到 80°C 每隔 10°C 取一个点。实测 PJ85718DM 的原始读数整体偏差在 ±0.4°C 以内这个精度对 HVAC 控制完全够用。但我在低温段发现了一个约 0.2°C 的固定正偏移应该是芯片本身的非线性。两点校准做完以后软件里存储了偏移量并做了线性插值校准后最大偏差降到 ±0.15°C 以内。需要注意的是校准过程对参考温度计的依赖非常大如果参考源不准后面全白搭。一定要用经过计量过的温度计或者至少用两支互相验证过的一致性。5.2 远程感温头的长线误差远程通道用三极管 BE 结做感温头一开始直连板上时读数和本地通道非常接近。换上 1 米双绞线之后读数整体偏高了约 0.6°C原因主要有两个线阻导致二极管压降测量偏差还有寄生电容影响采样建立时间。我在软件里对远程通道单独做了偏移校准1 米线方向补偿 0.6°C 后读数又回到 0.2°C 以内。平时项目里如果远程线长度固定可以直接用这个软校准如果线长会变化就得考虑在不同长度下分别校准或者干脆把感温头前置放大电路改动一下用恒流源加缓冲器方式消除线阻影响。5.3 现场长时间运行的稳定性系统在实验室里跑了两天数据曲线很稳定然后我把它装到一台模拟风机组上连续运行。第一次通电时发现风机全速启动瞬间远程温度读数会突然跳高大约 1.5°C过几秒才恢复。重新检查后确认是远程线距离风机动力线太近加上没有屏蔽。后来我把远程线改走另一侧的线槽并且在软件里增加了抗尖峰滤波逻辑连续读到两次以上超过 3°C 的差值才认为是真突变否则丢弃。这个逻辑上线后再也没出现误报而且对真实过热响应速度没有任何影响。现场环境的电磁干扰比芯片文档里写的那些理论数据复杂得多一定要实际装上去跑一套抑制流程。6. 常见问题与排查技巧6.1 远程温度读数异常偏大或偏小这是远程温度通道最经典的问题。偏大的常见原因依次是反接、线阻太大、寄生电容太大、外部二极管漏电太大。排查的时候先用短的导线把感温头直接焊到传感器端子附近看读数是否恢复正常。如果短接后正常说明问题出在长线环节如果短接后仍然偏大就要换一个合格的测温二极管。远程感温头不要随便用普通整流二极管代替因为漏电流和正向压降一致性差普通二极管在不同温度下的特性没有那么理想读数误差会随温度变化。用三极管 BE 结时型号也尽量固定不同型号的 BE 结电压特性有差异校准时也要通盘考虑。6.2 I2C 总线挂死与通信故障在 HVAC 现场I2C 总线偶尔会因为接地干扰或时序冲突而挂住尤其是有热插拔或接触不良的情况。挂死的典型表现是 SCL 正常但 SDA 一直被拉低主控发数据永远得不到 ACK。解决办法是驱动里加上总线恢复逻辑检测到 NACK 一直重复时将 SCL 先手动切换成 GPIO 输出连续发出 9 个时钟脉冲迫使总线上的从设备释放 SDA。实测这在大多数场合都能救回来。另外一个诱因是上拉电阻太小导致总线拉低时电流过大。我之前在四颗传感器时直接用了 1kΩ 上拉结果传感器从设备输出能力不够出现偶发 NACK。换回 2.2kΩ 后故障消失。这里没有绝对的标准阻值必须根据仿真示波器实测上升沿时间和信号完整度来权衡。6.3 数据抖动与滤波参数调整温度数据并不是一个恒定不变的值在正常运行时通常会在当前温度上下波动 0.1°C 到 0.3°C。如果直接拿去控制可能会让输出量在小范围内反复调节。根据不同场景选择合适的滤波系数不要一上来就用很重的滤波。风管温度响应用轻滤波就可以因为介质温度变化本来就慢电控盒温度反而需要稍强的滤波因为受散热风扇影响波动更明显。滤波系数调好后需要对比滤波前后数据参与控制时的执行机构动作频率看到频率明显下降且温度跟随速度还能接受说明参数合适。6.4 常见问题速查表现象可能原因处理思路远程读数一直为 127°C 或极大值感温头开路或未接检查线路连接重新焊接感温头远程读数异常偏低感温头短路检查 D/D- 之间是否意外搭接本地读数正常远程读数周期性波动大干扰耦合到远程线远程线远离强电增加屏蔽降低采样周期I2C 通信偶发 NACK上拉电阻不合适或总线过长调整上拉阻值缩短总线检查波形报警误触发阈值寄存器配置重叠检查本地/远程报警阈值分别配置不要共用数据长时间不更新传感器处于关断模式或配置写入失败重新初始化并读取状态寄存器确认传感器地址冲突多颗传感器地址配置重复检查地址引脚的电平设置确保每颗地址唯一7. 我个人最后的几点经验这套 PJ85718DM 加 STM32F732IE 的组合整体上很平滑地解决了我那个HVAC项目的双通道温度采集需求。回顾整个过程最想强调的并不是芯片本身的参数有多好而是软件和硬件要放在一起考虑。远程测温看起来只是“外接一个二极管”实际上走线、接头方式、滤波策略、标定方法都会影响最终精度任何一环松掉都会让最后的数据失真。我自己的习惯是画板之前先把传感器 datasheet 里的时序图和远程线特征要求读一遍把寄存器配置和工作模式汇报清楚再去定 PCB 布局。上电之后永远不要急着整合全部逻辑先把单路温度读出来、滤波看到波形、报警触发验证通过再慢慢挂载其他传感器和外设。这样做虽然前期节奏慢一点但后面调试省的时间远大于前期多花的时间。这个内容如果后续要扩展我可能会做两件事一是把远程感温头的线长检测脚本写出来上电自动检测线阻并写入补偿参数减少现场人工校准二是把数据整理成 MQTT 报文配合板载以太网直接上云这样风机盘管、空调机组的运行状态就能统一在监控平台看到了。核心逻辑不变的话新增功能基本都是在应用层叠加底层温度采集这一块不会再折腾。