首页 / 资讯中心 / 文章详情

32位单片机与温度传感器模块:本地与远程双路测温方案

32位单片机与温度传感器模块:本地与远程双路测温方案 ★ FEATURED ARTICLE
一块 32 位单片机 一个温度传感器模块怎么把“本地”和“远程”两套测温需求一起做完做嵌入式温度监测的人迟早会遇到同一个问题本地要用 ADC 实时采集、驱动显示远程又要通过总线把温度送上去两边还要求尽量少加硬件。我最近在整理一套 HVAC 控制器方案时用的就是标题里的两个器件——温度采集前端 PJ85718DM和主控 PIC32MX534F064H。整套方案核心就一句话本地温度靠传感器直连 MCU 的 ADC远程温度靠串口/RS-485 总线转发中间用一套统一的标定和滤波逻辑把两类数据打通。这套方案不挑行业嵌入式和暖通空调都能直接套用。它的好处是PIC32MX534F064H 的 12 位 ADC 精度足够主频 80MHz 跑数据滤波和协议栈都不吃力PJ85718DM 作为经过校准的温度采集前端直接省掉了自己搭桥式放大器和冷端补偿的麻烦。适合正在做控制器开发、网关采集、楼宇自控或环境监测的工程师参考也适合那些想把单个设备温度“既显示又上报”的嵌入式新手。1. 项目到底要做什么先拆题目再定方案1.1 两个核心器件分别扮演什么角色PIC32MX534F064H 是 32 位 MIPS 内核的 MCU带 512KB Flash、64KB RAM属于 PIC32MX5xx 系列的中坚型号。这类芯片在工业控制里很常见不是因为性能多极致而是外设齐全多路 12 位 ADC、多个 UART、SPI、I2C、定时器、比较器、DMA 都有跑 80MHz 主频对温度采集这种任务绰绰有余。PJ85718DM 从型号命名和工程定位来看是一个集成了信号调理和线性化处理的温度采集前端模块。它把敏感元件常见方案里是 NTC 热敏电阻或铂电阻的电阻/电压变化转换成 MCU 方便直接采样的输出信号。实际使用中最省事的设法定为“模拟电压输出型”即量程 0~100℃对应输出电压 0~3.0V 或 4~20mA 电流环。后续所有换算逻辑都基于这种线性输出。选用这类模块化前端而不是自己用分压电阻加运放搭采样电路主要原因有两个。第一温度传感器本身的非线性尤其是 NTC需要做多项式校正模块出厂前已经校准过代码里只需要做简单的比例换算省掉了一大段标定逻辑。第二HVAC 现场经常有长导线、变频器干扰、地电位差模块本身的滤波和驱动能力比裸传感器强得多。1.2 嵌入式与 HVAC 场景的差异决定了设计方向很多人以为“测温度”哪儿都一样实际差别很大。嵌入式场景往往是设备内部测温比如电源模块过热保护、电机绕组温度监测线缆短、环境相对干净但要求响应快、采样频率高并且温度数据要参与实时控制逻辑。HVAC 场景则相反测的是水管温度、风管温度、室内外环境温度线缆长、现场干扰大更看重长期稳定性和通信可靠性对响应速度要求反而不高。这套方案的设计方向是让同一个 MCU 同时服务两类场景PJ85718DM 的本地模拟输出直接进 ADC用于快速闭环控制同时通过 UART 转 RS-485 总线把温度数据打包成 Modbus RTU 帧发给远程上位机或网关。本地和远程的数据源指向同一个传感器只是面向不同消费者。这种“一端采集双路输出”的架构是 HVAC 控制器里最实用的结构因为现场运维人员要看本地数码管或触摸屏中控室又要看远程监控画面两边数据必须一致。1.3 方案选型时为什么不用更便宜的 8 位单片机这是我在方案评审时被问得最多的问题。8 位单片机的 ADC 通常只有 10 位做 0.1℃级别的显示够用但做 0.05℃级别的温差判断就很吃力。更关键的是HVAC 项目通常不止一路温度可能同时采集供水温度、回水温度、室外温度三路8 位机的多通道扫描加数字滤波加 Modbus 协议栈跑起来比较紧张。PIC32MX534F064H 的 12 位 ADC 配合 DMA可以做到连续扫描多通道而几乎不占用 CPU。Modbus RTU 协议栈、CRC 校验、超时重传这些逻辑在 80MHz 主频下完全是小菜一碟。再加上这款芯片的引脚兼容性后续如果想升级到带以太网 MAC 的型号比如同系列的其它型号硬件改动很小这给产品迭代留了余地。一句话总结不是杀鸡用牛刀而是为后续可能增加的传感器路数和通信协议提前留余量。2. 硬件设计的关键选择从传感器接线到 MCU 外设分配2.1 PJ85718DM 的接线方式与信号调理PJ85718DM 在实际项目里常见有三种接法取决于模块输出类型。第一如果是电压输出型0~3.0V三根线分别是电源、地、信号直接接 MCU 的 ADC 通道。第二如果是 4~20mA 电流环型需要在 MCU 侧并联一个 250Ω 精密电阻把电流变成 1~5V 电压再进 ADC。第三种是数字输出型比如单总线协议可以直接接 MCU 的数字 I/O代码走时序读取。我推荐 HVAC 场景优先选 4~20mA 电流环版本因为电流环在长距离传输时不会像电压信号那样受线阻影响。100 米导线下电压信号会因为导线电阻产生明显压降而电流环只要供电电压足够末端采集到的电流几乎不变。嵌入式近距离场景则选电压输出型更划算省掉取样电阻和隔离成本。供电方面要注意一点PJ85718DM 模块内部有基准源和调理电路对电源质量比较敏感。电源纹波直接耦合进输出信号会导致 ADC 读数抖动。我的做法是用一颗低压差线性稳压器单独给传感器供电不要跟电机驱动、继电器驱动共用同一路电源。HVAC 控制器里继电器吸合的瞬间电流冲击很大如果没有单独供电温度读数会周期性跳动。2.2 MCU 外设分配的具体规划PIC32MX534F064H 的引脚资源很充足做温度监测项目时外设分配要提前规划好避免后期改板。我常用的分配方案是ADC 通道 0接 PJ85718DM 本地温度电压型ADC 通道 1预留第二路温度输入比如回水温度UART1RS-485 远程通信接 Modbus RTUUART2调试串口接 PC 看日志定时器 11ms 系统节拍用于软件定时和传感器供电控制定时器 2Modbus 通信超时定时看门狗独立看门狗防止固件跑飞导致温度失控这里特别强调 RS-485 收发器的方向控制引脚。很多新手会把 DE/RE 引脚固定拉高或拉低导致只能收或只能发。正确做法是用一个 GPIO 控制方向发送前置高发送完成拉低自动切回接收。方向切换的时机要掐准我习惯在最后一个发送字节的发送完成中断里拉低方向引脚这样不会截断最后一个字节也不会过早接收导致回环误判。2.3 ADC 基准源的选择思路PIC32MX534F064H 的 ADC 支持内部基准和外部基准。对温度采集这种需要长期稳定性的应用我强烈建议用外部基准而不是内部基准。内部基准的温漂可能达到几十 ppm/℃当机箱内温度从 25℃ 升到 60℃ 时ADC 的满量程电压在漂读数的绝对值自然会跟着漂。外部基准我常用 2.5V 或 3.0V 的精密基准芯片温漂选 5ppm/℃ 以内。PJ85718DM 输出电压范围是 0~3.0V如果基准用 2.5V0~100℃ 量程会有一部分超出量程这时候要么改传感器量程要么分压。稳妥的做法是把传感器量程配到 0~2.5V 对应 0~100℃这样 ADC 满量程利用率高每 1℃ 对应的 ADC 码位约为 10000 左右做到 0.01℃ 分辨率的理论值。3. 本地温度监测的软件实现从原始码到稳定温度值3.1 ADC 采样与数字滤波的工程组合ADC 原始采出来的数不能直接用。PJ85718DM 输出虽然是线性电压但现场干扰会让单次采样值上下跳动尤其附近有变频器时跳动能达到十几二十个 LSB。所以我用的是“中值滤波 滑动平均”的组合每 10ms 采样一次攒 5 个原始值先取中间值去掉突发毛刺再把中间值送入 16 级 FIFO 做滑动平均。这个组合对 HVAC 场景很合适。中值滤波处理脉冲干扰比如电机启停产生的尖峰滑动平均处理随机噪声。温度本身的惯性很大16 级滑动平均带来的响应延迟大约 160ms完全在可接受范围内。写过热的嵌入式场景要注意如果温度是用于立刻切断电源的过温保护滤波等级要降低比如只做 4 级平均避免温度已经超标但因为滤波而延迟触发保护。代码里还要注意 ADC 采样时间的设置。PIC32MX534F064H 的 ADC 采样时间可以配置为多个 Tad采样时间太短会采不准高阻抗源的电压。PJ85718DM 输出阻抗一般不高但我依然把采样时间设为 2 个 Tad确保每次采样前采样保持电容充分充电到输入电压。这个细节如果不注意读数会系统性偏低而且通道间的读数会互相干扰。3.2 电压到温度的换算查表与公式的取舍PJ85718DM 如果标定为线性输出换算很简单温度 电压 / 斜率 偏移量。这里的斜率通常在出厂说明里给出比如 0.025V/℃偏移量是 O℃ 对应的电压 0V。但在实际项目里模块个体之间会有偏差说明书上的斜率只能作为设计初值。我的做法是两点标定用精密恒温槽或干井炉分别把传感器放在 0℃ 和 100℃ 两个标准温度点记录 ADC 原始码。然后线性拟合出该模块的斜率和偏移。两点标定的误差足以覆盖绝大多数 HVAC 应用。如果要求全量程更准就做三点标定把中间点放在 50℃使用分段线性插值。标定数据存在 Flash 里每次上电读取并修正换算系数。值得提醒的是如果 PJ85718DM 内部是 NTC 加线性化电路那么在量程两端接近 0℃ 或 100℃的线性误差会大一些。所以标定必须覆盖实际使用的温度范围不要只标中间。我之前吃过亏只标了 25℃ 一个点结果 5℃ 的读数偏了 0.8℃后来才发现低温段 NTC 的非线性残余被忽略了。3.3 传感器自热误差的控制电流流过温度传感器会自身发热导致测出来的温度比实际环境高。PJ85718DM 这类模块的激励电流通常已经设计得比较小但如果在 HVAC 风管里风速很低、空气不流动自热效应仍然会被放大。实际处理经验是控制传感器供电采用间歇供电策略。只在采样前 200ms 打开传感器电源采样完成立即关断。这样传感器只有很短的导通时间平均功耗很低自热温升被压缩到最小。PIC32MX534F064H 的定时器很容易实现这个逻辑一个 GPIO 控制传感器电源采样线程在固定时刻唤醒并操作 GPIO。测静态环境温度时这个技巧特别有效能把自热误差从 0.3℃ 降到 0.05℃ 以内。还有一个容易忽略的地方传感器探头不要跟 MCU 放在同一块 PCB 上太近的位置。PIC32MX534F064H 工作时功耗大约几十毫瓦发热虽然不算严重但如果探头紧挨着芯片环境温度的读数会偏高。我用的是延长线探头方案传感器通过屏蔽线引出到被测区域PCB 上的本地温度只作为参考而不是主测量。4. 远程温度监测的通信方案数据怎么送出去、送得稳4.1 为什么首选 RS-485 Modbus RTU远程温度监测的通信方式有几种RS-485 总线、CAN 总线、以太网、Wi-Fi。对 HVAC 楼宇自控场景RS-485 搭配 Modbus RTU 仍然是实际项目中占比最高的方案。原因很简单楼宇里大量已有的网关、触摸屏、DDC 控制器都支持 Modbus RTU兼容性最好。而且 RS-485 是差分信号一对双绞线能传 1200 米抵抗共模干扰的能力强这对现场环境很友好。以太网虽然传输带宽大但布线成本和交换机成本高而且 HVAC 现场条件往往达不到标准以太网的布线要求。Wi-Fi 更不适合工业现场稳定性和漫游问题太多。因此PIC32MX534F064H 的 UART1 配一个隔离 RS-485 收发器用 Modbus RTU 从站协议是目前性价比最高的远程温度上报方案。需要注意远程温度数据不必单独走另一路传感器而是直接复用本地 PJ85718DM 的采集结果。这样本地显示的温度、参与控制的温度、上报给中控室的温度完全一致不会出现“本地显示 23.5℃远程看到 24.1℃”这种尴尬的偏差。这也是方案的核心设计——同一份数据双路分发。4.2 Modbus RTU 的数据帧设计Modbus RTU 帧结构很简单地址码 功能码 数据 CRC16。温度监测项目里只用两个功能码就够了读寄存器03和写寄存器06。我把温度值放在保持寄存器 0x0000 和 0x0001寄存器 0 存放本地温度整数比如 235 表示 23.5℃寄存器 1 存放远程温度整数。对外统一约定温度值扩大 10 倍传输这样上位机简单除 10 就能显示。CRC16 校验必须自己实现我在 PIC32 上用的是查表法查表 256 项直接映射两个字节的 CRC 结果每帧计算时间在微秒级别。这里有个常见坑接收 Modbus 帧时不能用“帧间间隔超过 1.5 字节时间”这种方式来判断帧结束就收手。如果配置不当在 9600 波特率下 1.5 字节时间约为 1.6ms而发送完成中断和接收中断之间的时序稍有波动就可能判错帧边界。稳妥做法是启用 UART 接收超时中断有时称 RX Timeout专门用来标记一帧结束。从站地址设置我习惯做成写在 Flash 里的参数通过本地按钮或调试串口配置。HVAC 项目里一栋楼可能有几十个温度节点如果地址烧死在程序里后台上位机配置时就得逐个查非常麻烦。拨码开关或者参数寄存器修改地址是现场运维最需要的功能之一。4.3 通信异常后的数据保持策略远程通信并不是每次都能稳定的尤其是现场出现电磁干扰或者施工期间接线松动时Modbus 主站可能连续读取失败。这时候工程上最容易犯的错误是把失败的通信数据覆盖掉正常采集的温度值导致中控室画面上温度跳个没完。我的处理是温度采集值单独存放在一个“原子变量”里Modbus 读请求只是从这个变量拷贝数据拷贝过程不会清除采集值。即使主站 10 分钟不读温度值照常更新。同时会记录最后一次通信成功的时间超过 30 分钟没有成功通信会在寄存器里置一个通信状态位上位机读到这个状态位就知道“温度数据在更新但通信链路可能有问题”而不是一脸茫然地看到温度还在变化却不知道链路状态。另外RS-485 总线的终端电阻不能漏。一个总线上哪怕只有两台设备也必须在总线两端各接一个 120Ω 终端电阻。很多小规模项目为了省事不接结果是长线上信号反射严重波特率一高就误码。这是我调试过几十个 RS-485 项目后最深的体会通信不稳先查终端电阻和接地别急着改协议。5. HVAC 场景下的工程化细节供电、布线与传感器安装5.1 供电架构与隔离处理HVAC 控制器内部往往同时有 24V 交流电源、继电器驱动、开关电源模块以及 MCU 弱电系统。PIC32MX534F064H 工作电压 3.3VPJ85718DM 的供电可能是 5V 或 3.3V因此需要做一次隔离或至少做一次干净的分区供电。我的推荐架构是整机从外部 24V AC 进来经过整流和开关电源转成 5V再用低噪声低压差线性稳压器转成 3.3V 给 MCUPJ85718DM 的供电单独加一级 LC 滤波磁珠加电容后从 5V 接入。这样做的好处是数字电路的高频开关噪声被磁珠挡住不会污染传感器模拟信号。如果是 4~20mA 电流环版本传感器供电和输出天然具备一定的隔离能力因为电流环接收端的地可以与发送端的地有电位差只要不超过芯片共模范围即可。但为了稳妥我仍会在 RS-485 侧加数字隔离器把 MCU 的 UART 与总线收发器的电源和地完全隔离。HVAC 现场地电位差常常超过 10V 甚至更高隔离不是可选方案而是保命方案。5.2 传感器安装位置决定测量意义HVAC 温度监测的误差大头往往不在硬件而在传感器安装位置。水管温度探头如果直接贴在管道外壁测到的是管壁温度而不是水温误差可能达到好几度。正确做法是插入式安装把探头插到水管内部的水流中心位置或者使用贴片式传感器加导热硅脂密封在管道表面但这样也只能作为参考精度。风管温度测量同样有讲究。探头要尽可能放在风管中心而不是紧贴管壁并且避免放在加热盘管或冷却盘管的正下方因为那里的局部气流温度并不代表整个风管截面温度。我在项目里给传感器加了一个简单的风管安装支架让探头悬空固定在风管中线上实测读数比贴壁安装稳定得多。防凝露是另一个被忽视的细节。HVAC 的冷水管表面温度可能低到 5℃ 或更低空气中的水蒸气会在传感器外壳上结露甚至渗进 PCB 导致读数严重偏移。给传感器做灌胶密封或者选用带 IP67 防护等级的不锈钢探头外壳是低成本高收益的方案。千万不要用普通塑壳传感器直接接触冷水管否则用不了几个月读数就不正常了。5.3 长期运行的数据记录策略我通常会在 PIC32MX534F064H 的 Flash 里开辟一小块数据记录区把本地温度和远程通信状态按照每分钟一条记录存下来存满 24 小时滚动覆盖。这样做不是给上位机用而是给现场调试用。当客户说“昨天下午温度波动异常”时直接把历史数据导出来看很快就能定位是传感器问题、电源问题还是通信问题。Flash 写入次数有限制所以每分钟写一次是合理的下限。写入时用“先写临时扇区再搬移主扇区”的方式避免正在写入时掉电导致全部数据损坏。这套数据记录逻辑在老式设备上是标准功能但在不少注重成本的新项目里却被省掉了结果出了问题只能靠人守在现场看非常被动。6. 实际调试中踩过的典型问题与排查思路6.1 温度读数跳变和周期性波动这是温度监测项目里最常见的故障现象。如果是随机跳变首先看传感器供电电源纹波用示波器测 PJ85718DM 供电脚如果纹波超过 50mV先把示波器探头点在供电端确认再检查是不是继电器动作瞬间引起的跌落。我遇到过的情况是 24V AC 整流滤波电容太小继电器一吸合5V 输出就被拉低 200ms温度读数跟着跳。如果是周期性波动而且波动周期跟压缩机启停或风机的 PWM 频率吻合基本可以判定是干扰耦合。处理办法有两条一是把传感器线改成屏蔽双绞线屏蔽层单端接地二是在 MCU 侧 ADC 输入端加一阶 RC 低通滤波截止频率做到 10Hz 左右只保留温度信号把高频干扰滤干净。还有一个隐蔽原因ADC 通道扫描顺序。如果第 1 路采集的是高阻抗信号、第 2 路是低阻抗信号高阻抗通道的采样电容没有被完全充电就被切走下一轮回来采的时候会带上上一轮的残余电荷表现就是相邻两次读数周期性交替偏高偏低。解决方法是把高阻抗通道的采样时间设为最大值并增加通道切换完成后的稳定等待时间例如 10us。6.2 温度读数系统性偏高或偏低如果读数稳定但数值整体偏移先做标定检查。用冰水混合物做 0℃ 参考注意用标准探头验证记录 ADC 读数。如果 0℃ 点偏差超过预期要看 PJ85718DM 的输出是否真正是 0V 或对应电流。一个我在现场查到过的案例是传感器和延长线之间的航空插头接触电阻变大导致电压输出型传感器在终端测得的电压偏低温度读数整体偏低。换用电流环版本后问题彻底消失。另一个常见系统偏差来源是 MCU 内部 ADC 参考电压不准。PIC32MX534F064H 的内部带隙基准也可能有 ±2% 误差如果选择内部基准且不做校准0~100℃ 量程下误差会被放大到 1℃ 以上。解决办法只有一个外部精密基准或者上电自校准用内部基准测内部带隙电压来计算实际 VDD再反推校正系数。6.3 RS-485 通信不稳定或偶发掉线通信时好时坏90% 是物理层问题。我会按以下顺序排查检查总线两端是否有 120Ω 终端电阻检查 A/B 线是否接反检查总线所有设备的地是否共同连接检查波特率是否与主站一致检查线缆是否推荐的双绞屏蔽线用示波器看 A-B 差分波形正常空闲状态下 AB 压差应大于 200mV如果波形正常但通信还是丢帧就要查软件超时设置。Modbus 主站通常要求从站在 10ms 内响应如果从站程序里有其它中断长时间关中断可能导致响应超时。我遇到过一次一个定时器中断里处理了一小段 Flash 写入操作耗了几毫秒但那时恰好主站请求到达从站没来得及响应。修改方案是 Flash 写入改为异步处理中断里只置标志位主循环再执行写入。另外RS-485 收发器的 DE/RE 方向切换如果过快会在总线上产生短时冲突。发送最后一个字节后要等这字节完全移位出去再拉低 RE不能一进发送完成中断就立刻拉低。我见过很多人直接操作 GPIO 导致最后一个字节被自己对短总线上出现 CRC 校验错误。6.4 传感器长期使用后读数越来越偏这种漂移故障通常发生在低成本的 NTC 传感器上。NTC 热敏电阻经过长时间冷热循环后阻值会缓慢漂移尤其是超过额定温度范围运行时更加明显。PJ85718DM 内部如果用的是高精度敏感元件漂移会小很多但也要定期做校准。工程上最有效的办法是设计“自检周期”每隔三个月或每年上位机给设备发一条校准指令现场用标准温度计同时读数把新的偏置量写成参数落进 Flash。以上情况在 HVAC 项目里基本可以靠定期巡检解决如果要求免维护就得选用带出厂证书的高端探头并且避免让探头长期工作在包络线边缘。最后分享一点个人体会做温度监测做到最后你会发现真正难的不是把那几个 ADC 采样值算出来而是让这个温度值在恶劣现场还能保持可信。PJ85718DM 加 PIC32MX534F064H 这套组合的优势就是把硬件调理、模数转换、远程通信这三件事分得清清楚楚传感器前端负责把物理量变成电信号MCU 负责把电信号变成稳定的数值并送出去通信协议负责把数值可靠地送到远处。我个人做这类项目时始终会记住一个原则现场的第一手温度数据永远只来源于标定好的物理传感器至于显示、记录、上报这些全都是数据的搬运工。搬运工可以出错但源头不能坏。所以我在设计时花最多心血的地方永远都是传感器电源、接线屏蔽和标定逻辑而不是花哨的协议栈。希望对正在做嵌入式和 HVAC 温度监测方案的你有帮助也欢迎分享你在现场遇到的那些怪问题。
阅读完成 · 觉得有帮助?
咨询建站