资讯动态

STM32F302VC与PJ85718DM温度传感器:本地与远程监测系统设计

发布时间:2026/10/22 6:40:39 来源:尧图企业网站定制
搞嵌入式的朋友应该都有过这种经历一个设备跑着跑着突然过热死机或者空调系统明明显示温度正常现场却冷得受不了。温度监测这件事单独看每个环节都不难——读传感器、算温度、传数据但真正落地到项目里会发现全是细节。这篇文章想梳理一套我实际整理过的方案用 PJ85718DM 数字温度传感器配合 STM32F302VC做一个既能测本地温度、又能采集远程温度的监测系统覆盖嵌入式设备散热监控和 HVAC 风管、房间温度采集两类场景。我最近刚好在整理这套方案从芯片选型、硬件连接、驱动代码到现场调试都过了一遍过程中踩了不少坑。现在把这套思路完整写出来供做嵌入式开发或者暖通现场集成的朋友参考。哪怕你手上用的不是这个型号里面关于 I2C 传感器读取、RS485 组网、滤波处理和故障排查的思路也一样能用。1. 项目设计思路先搞清楚“本地”和“远程”到底怎么划分1.1 为什么要把温度监测拆成两路温度监测听起来很简单就是读一个数而已。但一进到实际项目就会发现“本地”和“远程”是两个完全不同的技术问题。本地温度指的是离 MCU 很近的地方比如设备内部 PCB 附近的空气温度、功率管散热器表面温度、机箱内热点温度。这种场景下传感器和主控之间的物理距离一般不超过几十厘米直接走 I2C 总线读就行实时性好、成本低、布线也简单。远程温度就麻烦多了。在 HVAC 项目里风管温度传感器可能装在十几米甚至几十米外的空调箱、末端风口、冷水管道上主控制器和传感器之间隔了好几道墙、几个强电桥架。如果强行用 I2C 把线拉过去总线电容会变大、波形会畸变信号很容易受变频器、压缩机的电磁干扰最后读到的是上下乱跳的数。所以我在设计这方案时第一件事不是选芯片而是把测温架构拆开本地点位用 I2C 直连远程点位走带隔离的通信总线组网。这样本地和远程互不拖累本地响应快远程够稳定。1.2 器件的选型逻辑确定架构之后才进入选型。温度传感器这一侧我用的 PJ85718DM 是一颗数字输出的 I2C 温度传感器低功耗、体积小温度数据直接通过寄存器读出来不必像 NTC 那样先做 ADC 采集、再查表或跑公式换算。它最吸引我的是省事I2C 读两字节按分辨率换算就是温度免掉了模拟链路里关于基准、放大、滤波、校准的一大堆事情。有人会问为什么不用 NTC 或者 PT100我也对比过原因很直接。NTC 便宜但非线性强而且必须依赖 ADC 精度在 HVAC 这种环境温度变化范围不大、但对稳定性有要求的场景NTC 的标定和查表工作是纯增量负担。PT100 精度确实高但要配恒流源、精密运放、冷端补偿PCB 面积和物料成本都上去一截。PJ85718DM 这种数字传感器相当于把标定和线性化都做进芯片里了对嵌入式产品来说少一个需要人工介入的环节就少一个现场出问题的点。MCU 这颗选了 STM32F302VC。它属于 STM32F3 系列Cortex-M4F 内核带硬件浮点单元主频 72MHz。温度监测本身不需要很强的算力但 VC 后缀这颗芯片的封装是 LQFP100引脚数量充裕I2C、USART、SPI、CAN 这些外设基本都齐了。更关键的是F3 系列的特色在于工业控制相关的模拟外设比较丰富后续如果要把温度数据和电机、风阀、水泵联动不用重新换平台。我实际用下来的体会F3 相比 F1 多出来的那点计算性能和 FPU在处理滑动平均、温度曲线平滑这类需求时很舒服不需要做定点换算。我把三个常见方案放在一起对比一下方便各位根据自己的场景核对传感器方案精度表现成本接口复杂度适合场景NTC 热敏电阻中等依赖 ADC 与标定低需要 ADC 和查表大批量消费类、成本敏感PT100/PT1000高高需要运放、恒流源实验室、高精度工业测点PJ85718DM 数字传感器中高出厂标定中I2C 直接读数嵌入式设备、HVAC 监测这个表只是参考不是说 NTC 一无是处。如果做的是极低成本、大批量的消费产品NTC 依然有它的位置。但如果你和我一样需要快速、稳定地把测温链路跑起来数字传感器确实是最省心的起点。1.3 整体通信拓扑规划整体拓扑我采用了“主机 本地传感器 RS485 远程节点”的结构。STM32F302VC 作为主节点板载直接挂 1 到 2 颗 PJ85718DM负责本地温度采集同时通过 USART 外接一个 RS485 收发器接到外面的远程传感器节点总线上。每个远程节点也可以是一颗 PJ85718DM 加一颗小 MCU负责把温度转换成 Modbus 寄存器供主节点轮询读取。这样设计的核心好处是解耦。本地 I2C 链路非常短不受远距离干扰影响远程链路使用 RS485 差分信号抗共模干扰强传输距离可以到几百米而且天然支持多点组网。后续要增加测点只需要在总线上挂一个新的节点主节点代码里加一条配置不用重新布线、不用改硬件。如果现场只需要 1 到 2 个远程测点、距离也不超过几米那确实没必要上 RS485直接 I2C 加总线缓冲器也能跑。但从长期维护的角度看用 RS485 组网之后每个测点都是独立节点故障隔离会清晰很多。这个选择看你对自己项目的判断没有绝对正确只有适合不适合。2. 硬件连接与关键参数2.1 PJ85718DM 的接口与典型电路PJ85718DM 这类 I2C 温度传感器的外围电路非常简洁。基本引脚就是电源、地、SDA、SCL另外可能有一到两个地址配置引脚有的型号还有报警输出引脚。实际使用中我习惯在 VDD 和 GND 之间放一个 100nF 去耦电容靠近芯片引脚放置不要拉到很远否则电源噪声会直接耦合到温度读数上。I2C 总线需要上拉电阻这个位置很容易被忽略。上拉电阻的大小取决于总线电容和通信速率标准模式100kHz下常用 4.7kΩ快速模式400kHz下多用 2.2kΩ。如果板上有多个 I2C 设备总线电容变大上拉电阻就要适当调小否则信号上升沿会变缓严重时直接导致通信不稳定。我用示波器看过一个案例上升沿缓得像一条斜线就是上拉电阻选太大导致的。地址配置引脚要提前规划。如果板子上要放两颗以上的传感器需要把它们配置成不同地址。PJ85718DM 具体有几个地址引脚做硬件前最好翻一下数据手册确认不要像我第一次那样直接默认只有一颗结果第二颗传感器焊上去发现地址冲突还要飞线改电平。2.2 STM32F302VC 外设配置要点STM32F302VC 这边我主要用到了两组外设一组 I2C 用于读本地 PJ85718DM一组 USART 用于接 RS485 收发器。I2C 引脚要查芯片的引脚复用表避免想当然。比如 I2C1 可能映射到 PB6/PB7也可能是 PB8/PB9具体取决于封装和复用配置。做 PCB 的时候就要把 I2C 引脚确定下来再配合代码里的 GPIO 配置。RS485 方向控制也有讲究收发器通常有 DE 和 RE 两个引脚一般会在硬件上并在一起由 MCU 的 GPIO 控制。发送数据时拉高接收时拉低。方向切换时序要留够余量发送完最后一字节之后不能立刻切到接收否则最后一两个字节可能就丢了。时钟方面STM32F302VC 支持外部晶振和内部时钟。RS485 波特率要准建议用外部晶振避免内部 HSI 温漂导致长时间运行后通信错位。我曾经为了省两颗电容用内部时钟结果现场温度一上来RS485 偶发乱码排查了很久才发现是时钟精度问题。2.3 供电与抗干扰设计要点温度和干扰是分不开的尤其在 HVAC 现场变频器、接触器、压缩机的启停都会带来强烈的电磁干扰。我总结下来供电和布线方面有几点值得注意。传感器电源最好经过 RC 滤波一个小电阻加一个电容就能挡住不少高频毛刺。远程节点的供电要单独隔离不要和现场强电设备共用开关电源否则地线上的一点噪声就可能把通信链路打乱。RS485 总线在施工时用屏蔽双绞线屏蔽层单点接地不要两端都接地否则屏蔽层会变成地环路的一部分反而引入更大的干扰。关于终端电阻总线上最远的两端各接一个 120Ω 电阻。很多人只在主机端接漏掉远端节点导致波形反射高速率下数据错乱。我建议在硬件设计时就把终端电阻的焊盘预留出来现场通过跳线或拨码决定是否接入这样可以适应不同长度的总线。3. 软件驱动STM32F302VC 读取 PJ85718DM 的完整流程3.1 I2C 寄存器读取流程PJ85718DM 一类的 I2C 数字温度传感器寄存器结构大同小异温度寄存器是 16 位其中高 12 位是有效数据低 4 位一般不用。读取流程分成两步先写一次寄存器指针把片内地址指向温度寄存器然后再连续读两个字节。这样做是为了避免在多次轮询时传感器内部寄存器指针跑到别的位置。代码看起来是这样float read_pj85718dm(uint8_t dev_addr) { uint8_t reg 0x00; // 温度寄存器地址以实际数据手册为准 uint8_t buf[2]; uint16_t raw; int16_t val; // 写指针寄存器 i2c_write_reg(dev_addr, reg, 1); // 连续读两个字节 i2c_read_bytes(dev_addr, buf, 2); raw (buf[0] 8) | buf[1]; val (int16_t)(raw 4); // 低 4 位无效先右移 return val * 0.0625f; // 12 位分辨率LSB 为 0.0625°C }这段代码里有几个细节要特别注意。一个是右移之前先要按有符号数处理否则负温度会变成很大的正数另一个是低 4 位必须屏蔽或右移掉不然读数会在低位反复跳动看起来像信号噪声其实是数据处理不到位。如果芯片的实际分辨率不是 12 位换算系数也要跟着改比如 14 位分辨率时 LSB 就是 0.0078125°C。具体的位数和寄存器地址以数据手册为准这行字值得印在代码注释里。3.2 滤波算法怎么选读出来的温度值不能直接用。嵌入式设备里风扇启动、功率变化都会让测温点温度小幅度波动HVAC 现场更明显压缩机一启一停气流方向变化温度读数能瞬间跳 0.5°C 以上。直接把这个数显示给用户大概率会被投诉。滤波不是越强越好关键看响应速度要求。嵌入式设备做散热保护需要尽快发现温度上升滤波窗口太大会把过温信号平滑掉等你看到数值已经晚了。HVAC 场景则刚好相反房间温度本来就变化慢稍微平滑一点完全不影响体验反而更稳定。我当时实际用的是滑动平均法维护一个环形缓冲区嵌入式设备取 4 到 8 次平均值HVAC 测点取 16 次采样间隔统一设 1 秒。如果现场对响应速度有更高要求可以改成一阶低通滤波用一个加权系数调节平滑程度。系数取 0.8 表示偏向新值取 0.2 表示偏向历史值这个系数比用固定窗口灵活但调试时更依赖手感。3.3 温度数据的异常判定除了滤波我还加了两层异常判定。第一层是范围检查PJ85718DM 的测量范围通常在某个区间内如果读到的值超出合理范围比如远远超过工作温度上限那基本可以判断传感器故障或者通信异常。第二层是变化率检查温度不会在 1 秒内突变 10°C如果出现这种数据大概率是读取错位或者总线干扰。这两层检查配合一个简单的异常计数可以避免把了一次偶发错误当成真实温度。我的处理逻辑是连续 3 次读到异常值才上报传感器故障中间只要恢复正常就重新计数。这样既不会漏报又不会因为一次抖动误报。4. 远程温度采集的工程实现4.1 RS485 与 Modbus RTU 组网远程采集我选择了 RS485 物理层加 Modbus RTU 协议。这个组合在工业现场和 HVAC 行业太常见了几乎所有上位机、触摸屏、楼宇控制器都支持 Modbus 协议后续接入第三方系统不需要单独开发。主从结构很简单STM32F302VC 作为 Modbus 主站按地址轮询远程节点。远程节点则是从站每个节点配置一个地址把本地采集到的 PJ85718DM 温度放到保持寄存器里。主站发 03 功能码读寄存器从站返回温度值再加上 CRC16 校验。轮询周期要算一下别拍脑袋。以 9600bps 波特率为例一个标准 RTU 帧大约是 8 个字节加上帧间隔一帧约 12ms 左右。挂 16 个节点一轮完整轮询就是 200ms 上下扩展 32 个节点也就 400ms 到 500ms。如果每轮之间再留一点余量整体刷新周期 1 秒完全够用。实际项目中温度不像电机转速那样需要毫秒级刷新9600bps 的稳定性比高速率更好。4.2 远程节点设计要点远程节点是颗小系统不复杂但有几个容易忽略的点。第一从站要处理总线空闲时的数据接收和超时机制。如果主机因为异常停止轮询从站应该能够在一段时间后自行恢复等待状态而不是死等。第二从站的温度寄存器要增加 CRC 校验防止瞬时干扰导致寄存器值被改写。第三远程节点的电源最好用隔离电源至少也要用 DC-DC 与强电侧隔开否则 RS485 的共模电压会漂移严重时烧毁收发器。我见过有些项目为了省成本远程节点直接用一个简易稳压器连着现场 24V 电源结果电机一启动RS485 就乱码最后拆开一看收发器芯片损坏的也不少见。PJ85718DM 在远程节点上的读法和本地完全一样只是数据最终通过 Modbus 寄存器对外暴露。如果远程节点用的是低功耗 MCU还可以在两次采样之间让传感器进入低功耗模式不过一般 HVAC 现场不差这点功耗我就没有做太多优化。4.3 主机汇总与对外接口主机侧的逻辑有些像是“温度数据的中转站”。STM32F302VC 定时读本地 PJ85718DM同时通过 RS485 轮询远程节点把得到的所有温度保存在一个统一的数据数组里。这个数组再通过另一路串口或者以太网模组提供给触摸屏、上位机或者楼宇控制器读取。我在做对外接口时直接了当地采用 Modbus RTU 从站模式。也就是说主机对上是一个从站对外提供一组保持寄存器寄存器 0 到 3 放本地温度寄存器 4 到 35 放远程节点温度。这样无论是接触摸屏还是接组态软件都只需要配置一张点表不需要写私有协议后期维护成本低很多。数据帧格式也建议在头文件里集中定义不要散落在各处后面加测点的时候改一处就可以了。5. HVAC 场景适配与现场经验5.1 温度测点选型与安装HVAC 场景里的温度测点不能一概而论风管温度、回风温度、冷水管温度和房间温度安装方式完全不同。风管温度传感器要保证探头插入气流中间位置不能贴管壁否则测的是管壁温度不是空气温度。安装孔要做好密封防止漏风。回风温度测点要避开新风直吹的位置否则测到的是混合不均的气流。冷水管表面温度测量需要良好的导热耦合用导热硅脂填充探头和管壁之间的缝隙再用保温棉覆盖否则环境温度会直接影响读数。嵌入式设备里则相反传感器要尽量贴近热源比如功率器件旁边但不要紧贴会产生高频干扰的开关节点。PJ85718DM 如果直接用裸芯片布置在 PCB 上适合测板级环境温度。如果要做成风管探头需要把芯片放进防水探头壳里引线出来接主板。这类封装变化会影响热响应时间实测下来裸芯片响应可能只要几秒套上外壳之后可能要几十秒才能稳定程序里的滤波窗口也要跟着调整。5.2 现场测量误差的常见来源凡是做过现场调试的人都知道仪表显示温度与实际温度不一样是最常见的投诉。其实大多数测量误差不是传感器精度不够而是安装和传热方式的问题。传感器放在气流死角风吹不到温度自然和主流温度差别大。传感器壳体和热源之间没有导热介质中间是空气热阻大响应慢。传感器自身发热虽然数字传感器功耗很低但在密闭壳体内长时间工作壳体内部温度会高于环境温度形成自热误差。遇到这种情况我一般拿红外测温枪和接触式温度计做对比确认误差来源后再做补偿而不是盲目改软件偏移量。5.3 监测与控制联动温度监测系统不是拿来欣赏的最终要联动控制。嵌入式设备里温度超过设定阈值要触发报警或者调速散热HVAC 系统里风管温度要参与冷热水阀的开度调节。只采集不上报这套系统的价值就少了一大半。我在做联动时用的是滞回控制避免继电器频繁吸合。以散热风扇为例设备温度高于 55°C 开启风扇低于 45°C 关闭中间这 10°C 是滞回区间。如果精确到单点控制现场会听到风扇不停地启动停止人也受不了。HVAC 的电动阀控制同理温度上下限之间留缓冲阀门调节频率会低很多。6. 调试实录与问题速查表6.1 I2C 总线无应答排查发 I2C 地址之后没等到 ACK这是最常遇到的现象。排查顺序其实很固定先用万用表量芯片供电电压确认 VDD 和 GND 没有接反再用示波器抓 SCL 和 SDA 波形确认有没有时钟、数据波形是否完整之后检查地址引脚电平是否和代码里的设备地址一致最后看上拉电阻是否焊上、阻值是否合适。我实际碰到过一次特别隐蔽的问题原因是 PCB 上芯片的 SDA 和 SCL 印反了照着丝网印接上去波形始终是乱的。所以遇到 I2C 不通先不要怀疑代码拿放大镜看芯片本体引脚和 PCB 封装是否一一对应很多低级错误都藏在这种地方。6.2 读数跳变或者长时间不变读数跳变先看低 4 位有没有屏蔽再看滤波窗口够不够。很多“噪声”其实是软件问题。读数长时间不变多半是寄存器指针没有正常切换每次读的都停留在同一个位置。I2C 连续读操作一定要记得先写地址指针不然就可能出现这个现象。6.3 RS485 链路通信异常RS485 问题排查时先看 A/B 是否接反这是现场接线的头号问题。A、B 反接之后差分信号倒置整个总线上都是乱码。再看终端电阻距离较长的现场少了远端电阻波形反射会让数据偶发出错。然后是 DE/RE 方向控制时序方向切换太快会吃掉发送末尾的数据。最后检查屏蔽地是否单点接地地环路是隐藏杀手排查难度远高于前面几个问题。6.4 常见问题速查表现象可能原因解决办法I2C 无应答引脚接反、地址错误、上拉缺失核对封装与丝印、按地址引脚电平配置、补上拉电阻温度读数跳变低 4 位未屏蔽、滤波窗口太小右移处理、增加平均次数温度长时间不变寄存器指针未写读前写温度寄存器地址RS485 乱码A/B 接反、无终端电阻交换 A/B、两端加 120Ω 电阻RS485 偶发错误波特率偏差、方向切换太快检查晶振、延后方向切换时间远程节点经常掉线共模电压过高、无隔离使用隔离电源与隔离收发器6.5 几条独家避坑心得做一个比较完整的固件方案时有一点很重要温度采集参数不要一上来就定死尤其是滤波窗口长度。现场环境千差万别我建议先在目标现场跑几个小时用串口把原始滤波前后数据都打出来再决定要不要加大平滑力度。不要觉得这是浪费时间现场数据和实验室数据往往差很多。还有就是远程节点的地址分配要在硬件上留好拨码开关或者跳线焊盘。如果地址靠程序固化后期临时增加节点就要重新烧录很麻烦。我在第二版就改了设计把地址引脚引出来接到拨码现场想换节点、换地址都很方便。这个小改动后来帮我省了不少去现场跑腿的时间。做这套方案的过程中我自己最大的感触是温度监测系统最后出问题的地方往往不是算法复杂不复杂而是传感器装得准不准、通信链路稳不稳。PJ85718DM 和 STM32F302VC 的组合胜在简单和稳定数字传感器免标定配上 RS485 组网又能把本地和远程清晰地分开后期维护思路非常直观。如果你也在搭类似的系统我的建议是先打通一条链路把一本地一远程两个测点调稳定再去扩展更多节点。链路通了后面的工作就只是复制和参数微调了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑