资讯动态

PJ85718DM+STM32F303RC多点温度监测系统设计与HVAC部署复盘

发布时间:2026/10/22 12:21:37 来源:尧图企业网站定制
前阵子接了一套暖通空调的温度监测改造现场情况是主控板放在电控柜里要测柜内温度、回风温度还要把风管末端、室外机附近几个点的温度远程汇聚到同一块板子上。开始我也想图省事直接上NTC加ADC后来算完精度和布线成本还是定了PJ85718DM加STM32F303RC这套方案。整套做下来从选型、硬件链路、固件处理到现场调校里面有不少东西值得记下来这篇就当作一次完整复盘。1. 项目为什么盯上PJ85718DM STM32F303RC选型逻辑与系统定位1.1 温度监测看起来很简单为什么还要专用方案很多嵌入式项目里测温度最简单粗暴的做法是NTC热敏电阻加ADC采样便宜、电路简单几毛钱就能搞定。但HVAC现场和桌面实验不太一样一是温度点分散控制柜、风管、回风口、冷媒管可能隔了几十米模拟信号长距离拉线会被电机启停的干扰带着跑ADC读数跳来跳去二是空调系统对稳定性和一致性要求高温差一两度可能直接影响到压缩机启停策略和舒适度判断三是现场维护的人不一定懂电路传感器坏了最好能直接上报而不是让调试人员拿万用表去量分压电阻。所以这个案子从一开始就不打算走模拟量方案。数字温度传感器天然带总线地址多个传感器能挂一条总线上数据直接给到MCU省掉一堆运放和校准电阻。PJ85718DM就是一颗很典型的I2C/SMBus接口数字温度传感器工业级精度能覆盖-40℃到125℃的量程对HVAC来说绰绰有余。配上STM32F303RC整套系统就脱离了“搭个电路试试”的阶段往产品化的方向走了。1.2 PJ85718DM这类总线式数字温度传感器能解决什么PJ85718DM这类芯片最核心的价值是把温度变成数字量而且这颗芯片是有SMBus兼容能力的意味着它不只给MCU读还能被其他主机设备查询。芯片内部自带ADC和温度寄存器主机只需要通过I2C时序去读寄存器不用管模拟前端怎么处理。对这个项目来说它解决了三个具体问题。第一一致性问题每颗芯片出厂前做过校准芯片间偏差可以压到很小不像NTC还要逐路做分压电阻匹配和查表校准。第二抗干扰问题温度信号在芯片内部就完成数字化总线上传输的是电平翻转的时钟和数据不是缓慢变化的模拟电压对电机、变频器产生的共模干扰没那么敏感。第三地址扩展问题PJ85718DM这类芯片一般有多个地址引脚通过硬件上拉或下拉可以配置出多个可用地址一条I2C总线上挂几颗、十几颗不是问题正好符合这个项目“本地加远程多点测温”的需求。我也看到有人问为什么不用MCU内部温度传感器这里要说清楚内部传感器测的是芯片结温不是环境温度。电机驱动板上的MCU本身发热加上功率器件热传导结温和真实室温能差出好几度拿来估环境温度根本不合格。真要省掉外部传感器除非你只做芯片过热保护不做HVAC温度控制。1.3 主控为什么选STM32F303RC而不是更常见的F103选主控的时候有人提过用F103便宜量大资料多。但我最后还是定了F303RC理由有三。第一F303是Cortex-M4内核带FPU。HVAC系统里除了读温度往往还要跑PID控制、做风量计算、处理电机电流反馈F4内核的单精度浮点运算能力比M3强不少后面想加逻辑控制和故障诊断算法不用换平台。第二F303的定时器和模拟外设配置很丰富尤其是电机控制相关的资源。暖通系统里压缩机和风机的控制是重头戏这次只做测温但板子后续要往一控多路电机、变频调速方向扩展F303这套外设组合能省下重新选型的功夫。第三F303RC的供电和引脚兼容性也友好3.3V单电源就能工作I2C外设引脚可以做重映射方便我在布线的时候把I2C和RS-485的引脚分开避开电机驱动的强干扰区。当然选型不是为了堆料而是让系统在“当前够用、后续有扩展空间”这个平衡点上。如果只做单点测温、纯实验室环境F103甚至8位单片机都够但凡是跟暖通设备凑在一起我建议主控选的时候还是多留点余量。2. 从“感温点”到“控制板”本地与远程测温的硬件链路设计2.1 本地测温I2C短距直连的几个布局要点本地测温指的是传感器就在主控板附近距离在几十厘米以内。这个场景我直接用PJ85718DM的I2C接口做主控和传感器之间的物理连接板内走线传感器可以放在板子上也可以引一小段排线到机壳表面。这里有三个实际经验想分享。第一I2C的上拉电阻不能照搬开发板。开发板上通常用4.7kΩ但如果你把传感器通过排线引出线间电容变大4.7kΩ的上拉会拖慢上升沿导致通信不稳定。我实测在30cm排线下上拉改成2.2kΩ通信稳很多。如果传感器离主控更远上拉还要继续减小但也不能太小否则灌电流变大接口电平容易出问题。第二传感器底下别铺完整的地铜皮。很多画板习惯是打满地过孔、铺地铜来抗干扰但PJ85718DM这类传感器对自身发热很敏感铺地铜等于把整个板子的热量导到传感器附近读数会偏高。我给传感器底下做了镂空处理留一个小的热隔离岛让它只感知空气温度。第三传感器旁边不要放电源稳压芯片或功率电阻。电源芯片本身烫加上PCB导热几十秒就能让传感器读数往上升1℃到2℃这个误差在HVAC控制里非常致命。2.2 远程测温RS-485总线汇聚与传感器节点组织方式远程测温是这个项目的重头戏。风管末端、室外机附近、水泵房这些点离主控板动辄几十米甚至上百米直接用I2C拉长线是不现实的。一是SDA/SCL的容性负载太大时序根本跑不起来二是长线本身就是天线电机启动的瞬态干扰能直接打穿电平阈值。我的做法是远端传感器各自组成小节点每个节点用PJ85718DM就近感知温度然后通过UART转RS-485收发器把数据送回主控板。RS-485是差分信号抗共模干扰能力强布线用双绞线最远距离做到几百米没压力完全覆盖暖通现场。节点内部结构很简单一片MCU负责读PJ85718DM或者直接把PJ85718DM挂到485节点板上由节点MCU读回温度后再通过RS-485协议上报。我这里采用了后者每个节点板上都有独立的MCU好处是传感器数据处理和总线通信解耦单个节点出问题不会拖垮整条总线。总线上用主从模式主控板做主机每个节点分配一个地址比如01、02、03...主机定时轮询。波特率选9600或19200这个档位在长线上更稳虽然看起来慢但温度数据本身变化慢一秒轮询一轮几十个点根本用不完带宽。RS-485布线还有个老生常谈的细节总线两端要加120Ω终端电阻而且只在物理首尾两端加中间节点不要加。很多人图省事在每个节点都焊上电阻结果阻抗不匹配反射信号叠加数据错乱排查起来头疼。2.3 供电、线与接地的细节容易翻车的三个地方远程节点的供电我踩过坑。最初图简单直接从主控板拉5V到远端结果压降严重距离一长传感器工作电压掉到4V以下读数开始漂。后来给每个节点用独立的24V转5V DC-DC再在节点板上做LDO滤波稳定多了。如果项目允许尽量就近取电电压等级统一用24V暖通现场很多执行器本来就用24V取电方便。RS-485的A、B线要用双绞线屏蔽层单端接地。屏蔽层千万别两端都接地否则屏蔽层和大地之间形成环路感应电流窜进来比不接地还糟。我走线时让双绞线远离变频器输出线至少保持30cm以上的间距交叉的地方垂直穿过不平行走线。还有地电位差的问题。控制柜里的地和远端风机基坑里的地并不一定是等电位两端的参考地可能差十几伏。RS-485收发器通常能承受-7V到12V的共模电压但如果设备接地做得很差这个电压也能被突破。稳妥起见我给板子上的485部分做了隔离用隔离电源和数字隔离器把信号和主控侧分开实测在电柜和远端风机之间电压差明显的情况下通信依然稳定。隔离的成本高一点但在工业现场值得。3. 固件侧的关键实现从寄存器读取到数据可靠化3.1 基础读取流程与寄存器理解PJ85718DM这类数字温度传感器的固件操作看起来简单就是读寄存器但有几个细节决定稳不稳。先看基础流程初始化时配置I2C外设时钟设到100kHz或400kHz。400kHz通常没问题但如果PCB走线质量一般、线比较长我建议降到100kHz宁可慢一点也要稳。配置芯片的工作模式、报警阈值等参数然后周期性读取温度寄存器。读取代码大致是这个样子#define TEMP_SENSOR_ADDR 0x48 // 具体地址依硬件配置而定 /* * 读取16位温度寄存器原始值 */ uint8_t temp_sensor_read_reg(uint8_t reg, uint16_t *raw) { uint8_t tx[1] {reg}; uint8_t rx[2] {0}; // 发送寄存器地址 HAL_I2C_Master_Transmit(hi2c1, TEMP_SENSOR_ADDR 1, tx, 1, 50); // 连续读2字节 HAL_I2C_Master_Receive(hi2c1, TEMP_SENSOR_ADDR 1, rx, 2, 50); if (raw) { *raw (rx[0] 8) | rx[1]; } return 0; } /* * 原始值转换为温度保留小数 */ float temp_sensor_to_celsius(uint16_t raw) { int16_t s_raw (int16_t)raw; return (float)s_raw * 0.0078125f; // 16位 / 7.8125m℃ }这里最需要留意的是高低字节的顺序。不同厂家的芯片有的先高字节后低字节有的反过来不查手册直接用示例代码读出来的温度会是一个极其离谱的“负数”这个我遇到过不止一次。另外芯片默认寄存器可能有“未启动转换”的状态上电后要给一点时间等首次转换完成再读否则第一次采样值为空或为0。3.2 滑动平均滤波与异常值剔除温度传感器读出来的原始值就算本身精度没问题在暖通现场也会出现毛刺。尤其当风机变频器启动时瞬间电流冲击大到足以干扰传感器内部ADC。我一开始直接拿原始值去控制逻辑结果温度曲线上经常出现单点跳变PID控制器跟着一抖一抖压缩机频繁加卸载。解决办法是老生常谈的滑动平均滤波但要注意窗口大小。温度变化本来就慢我用每秒采一次、窗口取16个点也就是16秒内的平均值。这个窗口既能滤掉突发干扰又不会把真实变化拖得太过分。如果窗口取64甚至更长空调温度已经明显变化了显示和控制还钝钝的用户体验很差。代码很简单typedef struct { float buf[16]; uint8_t idx; float sum; } sliding_filter_t; float sliding_filter_push(sliding_filter_t *f, float v) { f-sum - f-buf[f-idx]; f-buf[f-idx] v; f-sum v; f-idx (f-idx 1) % 16; return f-sum / 16; }除了滤波还要做异常值剔除。我参照了近三年采样值的统计特征温度跳变超过5℃且下一秒又跳回基本可以判定是干扰或通信错误。我用一个计数器记录连续异常次数超过阈值就进入传感器故障状态而不是把脏数据送进控制链。这个逻辑是很多教程里不会提的但在现场极其重要否则一个干扰脉冲就可能让机组错误动作。3.3 故障识别与看门狗保护保证系统不死机HVAC设备通常连续运行没人隔三差五盯着控制板。所以固件里必须自带诊断能力。我实现了三类故障判断传感器通信失败、温度值越界、温度变化速率异常。通信失败是I2C从机无响应连续5次读取超时直接上报“传感器离线”。温度值越界是指读出来的温度超过合理物理范围比如低于-50℃或高于130℃肯定是数据链路出问题了。跳跃过大就进入“传感器恶化”预警状态提醒现场人员检查探头。看门狗层面用了IWDG独立看门狗主循环里喂狗。RS-485总线偶尔被异常帧占住、程序卡在某个阻塞等待里看门狗能在1秒内把系统拉回来。同时每轮读完所有温度点后把最新数据快照存到备份寄存器重启后能直接恢复上次的数据状态不会让上层控制器拿到一组初始化默认温度。#define IWDG_RELOAD_VALUE 4095 void watchdog_init(void) { // 使能独立看门狗预分频 /64约1秒超时 IWDG-KR 0x5555; IWDG-PR 0x04; IWDG-RLR IWDG_RELOAD_VALUE; IWDG-KR 0xAAAA; IWDG-KR 0xCCCC; } void main_loop(void) { while (1) { // 主逻辑处理各个传感器数据 temp_sensor_process_all(); comm_rs485_process(); // 一切正常后喂狗 IWDG-KR 0xAAAA; } }4. 现场实测与调校复盘误差、串扰与经验教训4.1 实测数据与误差分析系统做完后我拿了标准温度计在几个测温点上做了对比。在室温25℃左右的环境中PJ85718DM读数与标准温度计偏差在±0.3℃以内这个精度对HVAC控制完全够用。但是在风管上、电机附近的点位偏差明显变大最大到过1.2℃。挨个查原因发现主要不是芯片问题而是安装方式造成的一是传感器探头直接贴在风管金属壁上风管本身温度受冷冻水影响测出来的其实是管壁温度不是空气温度这是“测点错了”不是“测不准”二是探头线束和电机电源线绑在一起走了半米虽然传感器抗干扰能力强但线束耦合的噪声还是会在I2C时序上造成毛刺偶尔出现一个跳变点。针对这两类误差的解决办法我总结成一个表误差来源现象对策传感器贴金属壁读数迟缓、偏差大探头悬空安装保持2cm以上空气隙线束与动力线平行偶发数据跳变重新走线强弱电分开供电电压偏低读数整体偏高且漂移独立供电加LDO稳压传感器自发热静态温度偏高PCB挖空隔热降低转换频率4.2 两个现场典型问题解决过程第一个问题出在RS-485总线上。刚装完时轮询到第6个节点返回的数据偶尔会丢帧但重新上电又恢复正常过一会又出现非常隐蔽。我折腾了很久换了好几套线后来发现是节点地址配置问题有两个传感器节点被拨码开关设成了同一个地址虽然我设计时允许多个地址但现场有人把拨码拨错了。两台设备同时应答总线瞬间冲突产生乱帧。排查出来以后我把地址映射表和拨码关系打印出来贴在控制柜门上这个问题才算彻底根除。这件事给我最大的教训硬件故障排除前先把配置检查三遍接口层的软件问题往往比硬件问题多得多。第二个问题在本地I2C上。运行一段时间后主控读取传感器偶发超时用示波器抓SDA波形发现波形边沿很缓上升时间明显超限。原因是传感器通过长排线引出后线间电容变大上拉电阻还是最初板上的4.7kΩ。我把上拉改成2.2kΩ后波形立刻变干净超时问题消失了。后来这块布局上也多了一版优化把传感器的位置直接挪到接线端子附近缩短排线长度治标治本。4.3 标定与出厂校准的思路PJ85718DM这类芯片出厂前已经做了校准正常情况下不需要用户再做两点标定但对精度有更高要求或者现场有系统偏差时可以通过软件做补正。我的做法是在恒温环境中记录芯片读数和参考值的偏差得到零点偏差offset然后在另一个温度点再测一次得到增益偏差gain。之后每帧温度都用这个线性公式补偿float temp_corrected(float temp_raw) { // offset 和 gain 在标定时写入Flash return (temp_raw - offset) * gain; }标定流程没有想象中复杂拿一个已知准的温度计放在探头旁边静置15分钟热平衡后记录两组数据就能算出offset和gain。如果项目采购批次稳定一组标定参数可以复用到整批设备上。要注意的是传感器探头材质不同贴装方式不同标定参数会有一定出入追求极致精度时每个通道单独标定更稳妥。5. 在HVAC场景里部署这套系统的维护经验5.1 传感器布点与探头封装的选择现场布点对最终效果的影响比选哪颗芯片更大。风管测温探头要插到风管中心不能贴着管壁管壁温度受外界环境影响严重。回风口的探头要避开新风直接吹到的位置否则测的是新风温度而不是回风温度。室外机附近的探头要加防辐射罩防止太阳直射导致读数偏高。探头封装有几种形式裸芯片适合PCB板载测温带不锈钢套管的适合插风管带防水头的适合水管表面。HVAC现场灰尘大、湿度高我推荐优先使用带护套的封装既保护芯片又方便现场固定。裸芯片直接裸露在湿空气中引脚容易氧化腐蚀时间一长读数飘得厉害。5.2 长期运行的漂移判断与巡检方式数字传感器虽然不像模拟电路那样容易老化漂移但长期运行在潮湿、温差大的环境里可能会因为引脚氧化或探头内部进水导致数据异常。我给系统加了巡检机制每隔一段时间自动对比传感器读数和设备启动前的基准值如果差值越来越大就提示“校准维护”。现场的巡检方式也很简单拿一个手持温度计贴近传感器探头位置待读数稳定后和后台数据对比偏差超过1℃就触发标定流程。这个工作建议每季度做一次尤其在空调换季启停频繁的时候传感器受冷凝水影响概率最大。5.3 扩展思路接入楼宇自控或云端这套系统的数据链路是现成的后期扩展不用推翻重来。RS-485总线可以接上协议网关把温度数据转发到楼宇自控系统让上位机统一管理。如果想上云端加一块带以太网或Wi-Fi的模块把主控采集到的温度打包成JSON上报就能做远程监控和历史趋势分析。STM32F303RC的资源比纯测温应用要求的富余很多我后来还在同一个主控上接了风机的启停控制和电流监测实现了温度与风机联动的闭环整套系统的价值比单纯“看温度”高了一个档次。如果你也在做类似的嵌入式测温项目建议一开始就给主控留点升级空间别把代码写得太“省”后面加功能会舒服很多。最后再分享一个小建议这种多节点测温系统做固件时一定要把各个传感器通道的原始值、滤波值、故障状态用日志或调试串口输出出来现场排查时能省一半的时间。数据和现象对不上时先怀疑物理链路再怀疑软件逻辑顺序别搞反。

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

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

免费获取报价 →
↑