基于STM32F303RE与PJ85718DM的单总线温度监测系统设计

发布时间:2026/10/22 16:58:56
基于STM32F303RE与PJ85718DM的单总线温度监测系统设计 去年做一套风机盘管控制器的升级项目时我第一次把 PJ85718DM 和 STM32F303RE 放在同一块主控板上处理温度监测。当时手里可选方案不少NTC 热敏电阻便宜但一致性让人头疼PT100 精度高却要额外的调理电路I2C 数字传感器布线距离又卡得很死。PJ85718DM 这种单总线数字温度传感器正好绕开了前面几个坑再配合 STM32F303RE 在模拟采集和实时控制上的底子一套方案就把“本地温度 远程多点温度”全包了。这篇文章会把完整的选型逻辑、电路连接、单总线驱动、HVAC 联动控制以及调试阶段踩过的那些坑全部整理出来给准备做嵌入式温控、楼宇自控或环境监测项目的朋友一份能直接照着干的参考。1. 项目全貌拆解这套温度监测系统1.1 标题背后到底对应什么工况很多人第一次看到“本地与远程温度监测”这个说法会下意识把它理解成“传感器测到温度然后上传到云平台”。但在 HVAC 和嵌入式现场这个描述通常更具体指的是一个控制器同时要管两类温度点第一类是本地温度也就是主控板自己周围的温度。比如控制盒内部温度、进风口温度、功率器件附近的温度。这类温度传感器离 MCU 很近走线短干扰小主要用于设备自身保护和控制器工作环境判断。第二类是远程温度指的是分布在远处的温度点。在风机盘管系统里可能是放在房间墙上的回风温度传感器在新风系统里可能是埋在风道里的送风温度传感器在冷库里可能是伸进库体内的测温探头。这类传感器的共性是离控制器有一段物理距离少则几米多则几十米需要线缆连接。PJ85718DM 的单总线结构就特别适合这种场景。它内部自带 64 位唯一序列号一根数据线上可以挂多个传感器主机通过序列号就能区别读取每一个节点。这意味着从控制器引出去到各个房间、风道、水箱的测温线最终可以汇到同一条总线上极大地减少了接线端子数量和布线工作量。真正把这套系统用起来的场景比如一类恒温恒湿机控制器安装在配电柜里柜内要测控制盒温度这是本地机组出风口、回风口、水管的进出水温度都要实时监控这些是远程。如果每个远程点都拉一条 I2C 或 SPI 专用线到 MCU线材成本和抗干扰处理都会让人崩溃。1.2 器件选型的三个关键考量选 STM32F303RE 而不是用更便宜的 8 位单片机是基于三个实际因素。第一个因素是单总线驱动需要精确的微秒级延时。单总线时序对延时窗口要求比较高虽然 8 位单片机也能做但在敲定方案时我们需要预留以后扩展空气品质传感器、流量计、风阀执行器的通信接口资源这时候选择一颗带更多定时器、更多串口和 DMA 的 M4 内核芯片更从容。STM32F303RE 主频 72MHzFlash 512KBRAM 64KB执行单总线时序时误差控制容易得多。第二个因素是 STM32F303RE 的模拟外设在同类 MCU 里属于很扎实的水平快速 ADC、比较器、运算放大器一应俱全。这意味着后续如果想在温度之外增加压力传感器、电流检测或者热电偶冷端补偿硬件上不需要再外挂太多芯片。实际项目中我们后来就用它内部运放做了一个模拟备用温度通道相当于多了一层冗余保护。第三个因素是成本和供货稳定性。在 HVAC 行业控制板的生产周期长器件选型必须考虑多源替代。PJ85718DM 这类芯片因为引脚兼容、命令兼容替换成本极低而 STM32F303RE 作为成熟型号供应链也相对稳定。1.3 系统架构总览整台控制器从功能上可以分成三层采集层由若干 PJ85718DM 温度传感器构成本地总线上挂一颗板载传感器远程总线上挂多颗外部传感器。为了方便故障隔离我在软件上把本地和远程分成了两条逻辑总线物理上使用两个不同的 GPIO 引脚。控制层由 STM32F303RE 完成周期性启动温度转换读回原始寄存器值做滤波和校准然后跑 HVAC 控制逻辑。控制输出可以是继电器开关量也可以是 PWM 驱动风机或无级调节电动阀。通信层主要负责把温度数据和设备状态上报给楼宇上位机。我们用的是 RS485 Modbus RTU寄存器表里开放了温度、设定值、报警状态等参数。这样既方便现场触摸屏直接读取也能无缝对接楼宇自控系统。2. 硬件设计与电路搭建2.1 PJ85718DM 的供电方式与引脚处理PJ85718DM 的典型工作电压是 3.0V 到 5.5V在 HVAC 控制板上一般直接使用 5V 供电。因为系统里可能有继电器、风机、电动阀电源环境相对脏我在传感器供电入口处加了磁珠和 100µF 电解电容再并联一个 0.1µF 高频旁路电容这样电机启停造成的电压跌落对传感器的影响会小很多。这颗芯片支持寄生供电和外部供电两种模式。寄生供电意味着传感器直接从数据线上取电理论上可以少拉一根电源线。但我做过测试在远程线长超过 10 米以后寄生供电在温度转换瞬间会因为电流骤增导致电压崩溃表现出来就是读到 0xFFFF 或者 CRC 校验错。所以我的建议很直接远程节点一律采用外部供电三线制连接分别是 VCC、DQ、GND。本地传感器我一般直接焊接在 PCB 上走线短接线反而没那么多讲究。DQ 引脚通过一个 4.7kΩ 上拉电阻接到 5V然后连接到 MCU 的 GPIO。这里有一点要注意单总线设备在常态下总线是高电平所有通信动作都是主机把总线拉低特定的时间所以 GPIO 必须配置成开漏输出加外部上拉。2.2 本地与远程节点的接线拓扑本地总线和远程总线虽然使用同一套驱动代码但物理拓扑我做了不同设计。本地总线上通常只有一颗传感器甚至可以考虑焊两颗做冗余。板内走线控制在 5 厘米以内上拉电阻用 4.7kΩ时序最稳定。远程总线则由接线端子引出连接多个外部传感器。远程传感器之间采用“菊花链”或者从总线中段分支都行单总线本身对拓扑结构不敏感但要注意不能让信号线形成很长的主干末端悬空末端最好就近放一个上拉电阻。远程线建议使用 3 芯屏蔽线线径至少 0.5mm²屏蔽层在控制器端单点接地。如果你正好把传感器延伸到强电接触器或变频器附近屏蔽层必须接好否则干扰会直接窜进单总线时序。我在项目中远程总线挂了 8 个传感器总长度约 60 米使用 1kΩ 上拉电阻后波形依然干净。上拉电阻阻值怎么选其实是总线长度和功耗的权衡4.7kΩ 适合短距离低功耗长线远距离用 1kΩ 更可靠代价是常态电流稍大。2.3 PCB 布线与线缆端接的几个细节PCB 布局上有一个容易被忽略的地方温度传感器采集引脚不要放在继电器或者开关电源的干扰源正下方尤其是远程总线的 DQ 走线尽量远离高频开关节点。如果板子面积紧张没办法完全避开可以在 DQ 线旁边加一条地线做包地处理。另外虽然 STM32F303RE 的 GPIO 内部有上拉电阻但内部上拉阻值一般偏大对长线单总线来说不够用。所以必须使用外部上拉电阻阻值选择范围我建议总线长度上拉电阻传感器数量说明 1m4.7kΩ1~3 颗板内本地总线1~10m3.3kΩ1~5 颗小范围设备10~60m1kΩ3~8 颗工程现场远程总线 60m1kΩ 末端上拉视情况需注意干扰线缆端接方面远程线进入控制器后我通常会串一个小磁环能有效抑制共模干扰。传感器端如果是防水的接线盒或探头最好做整体灌胶密封防止潮湿环境造成端子氧化和触点接触电阻漂移这个问题在冷冻水系统中特别常见。3. 软件驱动与单总线通信实现3.1 单总线时序与 GPIO 配置单总线通信其实非常像一段“拉低总线不同时间”的编码游戏。主机通过拉低总线的长度来写 0 或写 1传感器通过拉低总线的长度来表示响应或读数。PJ85718DM 沿用单总线体系的标准命令集所以驱动可以直接按这套时序来写。我在 STM32F303RE 上使用 GPIO 的结构体配置方式把 DQ 引脚设置为开漏输出模式输出速度选择中等即可不需要开最高翻转速度。初始化时默认输出高电平总线处于空闲状态。复位时序是最基础也最容易出错的环节。主控先把总线拉低 480µs再释放总线传感器收到复位后会在 60µs 到 240µs 内拉低总线表示存在。主机在释放总线后大约 70µs 时读取电平如果读到低电平就说明有设备在线。uint8_t OW_Reset(void) { uint8_t presence; OW_PIN_LOW(); DelayUs(480); OW_PIN_HIGH(); DelayUs(70); presence OW_PIN_GET() ? 1 : 0; // 0 表示传感器拉低了总线 DelayUs(410); return presence; }这里有个我调过的坑复位脉冲时间如果偏短比如只有 400µs部分传感器会不响应但如果太长超过 960µs总线会进入强上拉状态影响后续时序。所以延时函数的精度非常重要。STM32F303RE 主频 72MHz用 SysTick 做微秒延时是完全够用的不要在驱动里简单嵌套空循环因为编译器优化等级不同会直接改变空循环耗时。3.2 读写位时序与字节收发写时序的基础单位叫“时隙”。写逻辑 0 时主机拉低总线至少 60µs然后释放写逻辑 1 时主机拉低总线 6µs 后立即释放靠上拉电阻把总线拉高。传感器在总线拉低后的 15µs 到 60µs 窗口内采样总线电平从而判断写入的是 0 还是 1。void OW_WriteBit(uint8_t bit) { if (bit) { OW_PIN_LOW(); DelayUs(6); OW_PIN_HIGH(); DelayUs(60); } else { OW_PIN_LOW(); DelayUs(60); OW_PIN_HIGH(); DelayUs(6); } }读时序类似主机拉低总线 6µs 后释放然后需要在 4µs 到 15µs 之间的时间窗口内采样总线电平。传感器如果是逻辑 1总线会保持高电平如果是逻辑 0传感器会继续拉低总线。uint8_t OW_ReadBit(void) { uint8_t bit; OW_PIN_LOW(); DelayUs(6); OW_PIN_HIGH(); DelayUs(4); bit OW_PIN_GET(); DelayUs(55); return bit; }写字节和读字节都是低位先出。实际工程中每次执行完一个完整命令再读数据时我会把延时稍微放宽到接近时序窗口上限因为 MCU 主频高中断如果打断 GPIO 时序会导致采样点偏移。所以我在单总线收发期间会关掉某些非关键中断或者用临界区保护整个字节传输过程。3.3 多设备寻址与 ROM 匹配单总线系统里每个 PJ85718DM 都有 64 位 ROM 序列号其中 8 位是家族码48 位是唯一序列号8 位是 CRC 校验。主机要读取指定传感器必须先发送匹配 ROM 命令把完整 64 位序列号发上总线。第一次使用这套系统时可以采用搜索 ROM 命令来枚举总线上所有传感器序列号。搜索算法本质上是二叉树遍历会反复读写位来判断每个传感器在某一位上的取值和取反情况。实际项目里如果不是特别必要我不建议每次开机都做 ROM 搜索这个流程比较耗时而且一旦遇上干扰容易漏检设备。更稳妥的做法是在生产调试阶段把每个传感器序列号读出来写进配置表烧录到 MCU 的 Flash 里。正式运行时直接按配置表逐一轮询速度快流程简单。如果现场要更换传感器只需要更新配置表即可。这在批量制造里也能简化测试过程每块控制板出厂前烧录一次地址表避免每次上电跑搜索。读取温度时有两种策略。如果总线上有多个传感器建议先广播启动温度转换命令让所有传感器并行工作等待一段时间后再逐个匹配 ROM 读取温度结果。这样做的好处是省掉了串联等待的转换时间。上面这段涉及命令代码我把标准单总线指令整理成表格方便对照命令名称命令字节功能说明搜索 ROM0xF0枚举总线上所有设备序列号读 ROM0x33直接读取唯一设备的序列号匹配 ROM0x55指定某个系列号设备通信跳过 ROM0xCC对总线上所有设备广播命令启动温度转换0x44使传感器开始温度采集读取暂存器0xBE读取温度值和配置字节广播启动转换的命令顺序是复位发送 0xCC发送 0x44。然后主机等待最大转换时间。12 位分辨率下典型转换时间约 750ms如果系统要求响应快也可以配置到 9 位分辨率转换时间大幅缩短但温度分辨率会降到 0.5°C。HVAC 场景一般用 10 位或 11 位就能满足舒适度控制需求我实际测试下来10 位模式配合滤波算法比 12 位模式更省电。3.4 本地与远程温度采集的任务调度整个温度采集任务我写成有限状态机而不是简单的顺序阻塞流程。因为在远程总线比较长时等待温度转换的 750ms 内可以做很多别的事情比如刷新显示、处理 Modbus 通信、巡检报警输入。状态机分为三个状态第一是 IDLE 状态检查距离上一次采样的时间是否超过周期第二是 CONVERT 状态广播启动转换并记录启动时刻然后直接退出让出 CPU第三是 READ 状态等到定时器时间超过转换周期后逐个读取传感器温度。这样设计的好处是 CPU 利用率很高也方便上层控制逻辑随时获取最新的温度数组。在 STM32F303RE 上我用一个软件定时器周期调度基本不占用额外硬件定时器。采集周期方面HVAC 应用不需要很高的频率。传感器 12 位模式典型转换时间 750ms即使每 2 秒采一次控制周期也完全够用。但如果控制对象是电动调节阀或变频风机1 秒以内的高频采样反而会让控制量抖动。我通常把温度采集周期设在 1 到 2 秒PID 调控周期设在 500ms 到 1 秒之间。4. 数据处理、HVAC 联动与应用层设计4.1 温度解析、滤波与校准PJ85718DM 的温度寄存器是 16 位低 4 位为小数部分每 LSB 对应的温度步进是 0.0625°C。解析时要注意负数场景当环境温度低于 0°C 时寄存器值是二进制补码直接除以 16 会得到错误结果需要先判断符号位。我在驱动里统一把原始 16 位值转换成 float 温度值float DecodeTemp(uint16_t raw) { if (raw 0x8000) { raw (~raw) 1; return -((float)raw) * 0.0625f; } return ((float)raw) * 0.0625f; }读回来以后原始数据还要过一道滤波。温度对象的热惯性很大本身不会突变所以我用一阶低通滤波系数 α 取 0.2 到 0.3。这样既能平滑短期扰动又不会让控制回路产生明显滞后。校准是另一个必须做的环节。虽然芯片出厂标称精度不错但 HVAC 现场往往要求整个测温链路与标准温度计一致。我喜欢用两点校准将传感器和标准温度计同时放入冰水混合物得到一个偏移量再放入 50°C 左右的水浴计算增益误差。然后把偏移和增益参数储存在 MCU 的 Flash 里程序里对每个通道独立校准。4.2 PID 控制与开关量迟滞温度监测只是系统的眼睛眼睛看到温度后还要让执行器做动作。在典型 HVAC 温控器中有两条控制路线一条是给压缩机、电加热器用的开关量控制一条是给风机、电动阀用的连续量控制。开关量控制最怕继电器频繁启停。压缩机如果每小时启停次数超过 6 次寿命会急剧下降。所以我用迟滞比较实现开关量控制设定目标温度 24°C允许偏差 ±0.5°C温度高于 24.5°C 开启制冷低于 23.5°C 关闭制冷。这样即使温度轻微波动继电器也不会跟着乱跳。连续量控制我用位置式 PID 算法。由于温度变化慢微分项容易放大噪声我通常把微分系数调得很小甚至直接用 PI 控制。前面的滤波已经滤掉了大部分噪声但积分项还需要做抗饱和限制否则在传感器异常或执行器卡住时积分值会积累到一个离谱的程度恢复时会造成大幅超调。PID 的输入是设定温度和当前测量温度输出经过限幅后映射到 PWM 占空比。对于风机盘管PWM 频率选在 10Hz 左右输出 0% 到 100% 对应风机低、中、高三速和无级调节。4.3 远程通信与数据上报温度数据不仅要在本地显示还要上报给上位系统。我们使用 RS485 总线加 Modbus RTU 协议STM32F303RE 的 USART 配合方向控制引脚实现收发切换。波特率通常配 9600 或 19200楼宇自控系统更偏好低速高稳定性。Modbus 寄存器表设计要清晰我最常开放的寄存器是寄存器地址读写权限内容0x00只读本地温度带一位小数0x01只读远程温度 10x02只读远程温度 20x10读写目标温度设定值0x11读写控制模式开关量0x20只读报警状态字温度数据在寄存器里使用整数表示比如 23.4°C 存为 234。这样上位机解析时不需要处理浮点字节序对大多数触摸屏和组态软件都友好。报警状态字每一位对应一种异常传感器断线、超温、低温防冻、通信丢失等。4.4 扩展与低功耗考虑这套系统如果做物联网网关或者电池供电的采集节点还可以加入低功耗逻辑。PJ85718DM 在空闲态电流很小只有在温度转换时会有一个短暂的电流峰值。远程传感器在非采样时段可以断电采样前再上电这样能显著降低总功耗。STM32F303RE 进入停止模式前需要先完成温度转换并保存结果。因为唤醒后从 Flash 重新初始化到温度稳定可能需要几十毫秒这个时间对于 HVAC 这种秒级控制周期来说完全能接受。5. 调试经验与故障排查实录5.1 常见问题速查表我把调试阶段遇到过的问题直接整理成一张表照着查会比翻手册快得多现象可能原因解决办法总线上搜不到任何设备上拉电阻缺失或复位脉冲太短检查 DQ 上拉拉长复位信号偶尔读到 0xFFFF传感器被干扰或供电跌落改用外部供电加屏蔽线CRC 校验频繁失败线缆过长或采样点偏移换 1kΩ 上拉关中断收发最后一个传感器总无响应分支过长或末端反射末端加上拉或缩短分支温度读数跳变滤波缺失或传感器接触不良软件滤波检查接线端子传感器发热影响精度传感器靠近功率器件或电源重新布置本地传感器位置5.2 远程线过长导致的时序异常在项目现场遇到最典型的问题是远程总线 40 米以上时偶尔有传感器读不到。用示波器看波形后发现总线拉低后的下降沿很陡但释放后的上升沿明显变缓。原因是线缆分布电容太大上拉电阻阻值偏高导致总线电压不能在传感器采样窗口内恢复到高电平。我把上拉电阻从 4.7kΩ 改成 1kΩ 后上升沿明显改善。另外我还在总线末端也加了一颗 1kΩ 上拉电阻相当于并联把等效上拉阻值进一步降低最终 60 米总线完全稳定。但上拉电阻并不是越小越好。阻值太小会让总线常态电流增大如果传感器数量多、供电线长远端传感器供电端电压反而会被拉低。所以长线调试时一定要同时观察 DQ 波形和传感器供电电压两边都不能忽略。5.3 精度校准的具体操作流程校准听起来复杂实际操作一次其实很简单。我把远程传感器和一根精度较高的玻璃温度计一起放到保温杯里等温度稳定后记录芯片读数和标准值。然后在另一个温度点做第二组记录。假设在 0°C 附近芯片读数为 0.4°C在 50°C 时芯片读数为 50.3°C。那么偏移项是 0.4°C增益项是 (50.3 - 0.4) / 50 0.998。最终校准补偿公式为真实温度 (芯片读数 - 偏移) / 增益这个公式和计算过程直接写进上位机调试页面让产线工人根据标准表输入两个点的实际读数MCU 自动计算并存储校准参数不用人为手算减少出错概率。5.4 极端环境下的可靠性验证我在高温和低温两种环境下做了老化测试。高温环境中板载本地传感器靠近 MOS 管散热片整个控制器在 60°C 环境下连续运行本地温度能稳定反映机箱内部温升与热像仪测量结果吻合。低温环境中把远程传感器放入 -20°C 环境箱读数依然稳定没有出现掉线和漂移。需要特别提醒的是远程传感器探头如果用于低温水管防冻监测传感器本身必须做防水密封处理。我见过有现场探头进水后读数异常的情况拆开后发现线缆接口处已经锈蚀。后面全部换成灌胶封闭的防水探头再没出现过这类问题。我自己调试时的体会是单总线温度采集本身不难真正决定系统可靠性的往往是那些跟芯片手册无关的细节电源干净不干净、线缆粗细合不合适、屏蔽层怎么处理、校准参数有没有办法快速写入。把这些基础工作做扎实了PJ85718DM 和 STM32F303RE 这套组合足以在大多数 HVAC 和嵌入式温控场景里长期稳定运行。后面如果你在这个基础上继续扩展湿度传感器、压力传感器通信架构和控制分层依然不用推翻重来。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询