资讯详情

资讯详情

PJ85718DM与PIC18F86K90实现HVAC本地温度采集与远程上报

1. 从一个温度监测需求说起为什么选这对组合嵌入式温度监测这件事听起来简单做起来坑不少。我最早接触这类需求是在一个 HVAC暖通空调控制板的项目上当时的要求很朴素本地要能实时看到出风口和回风口的温度远程中控室也要能拿到同一组数据刷新率不低于每秒一次精度控制在 ±0.5℃ 以内而且整套方案的成本要压得住。市面上能选的方案很多比如用热敏电阻加 ADC 自己搭、用单总线数字传感器、用 I2C 或 SPI 接口的集成温度芯片每一种都有各自的适用边界。最后我落到的方案是PJ85718DM 搭配 PIC18F86K90。这个组合不是拍脑袋定的而是把几个硬约束摆在一起筛出来的结果。PJ85718DM 是一颗本地温度传感器接口简单、外围元件少适合贴在板子上做板级温度采集PIC18F86K90 是一颗带丰富外设的 8 位单片机自带多路 ADC、UART、SPI、I2C还有足够的 Flash 和 RAM 来跑一套轻量的本地显示加远程上报逻辑。两者配合本地采集走模拟或数字通道远程传输走串口或总线分工清晰。这篇文章面向的是正在做嵌入式温度采集、尤其是 HVAC 类控制板的同行。不管你是刚接手这类需求的新手还是想换一套更稳方案的老人我都会把选型逻辑、硬件连接、固件实现、标定方法和踩过的坑一条条讲清楚。核心关键词就三个本地温度采集、远程温度上报、HVAC 控制。你把这三点抓住后面所有细节都是围绕它们展开的。先说清楚这套方案到底解决什么问题。HVAC 场景里温度不是一个孤立的数字它直接参与风机启停、阀门开度、压缩机保护这些控制决策。本地采集负责“看得见”远程上报负责“管得着”。如果本地采集抖动大控制就会频繁动作如果远程上报丢包中控就失去判断依据。所以这套方案的重点不是“能测温度”而是“测得稳、传得准、控得住”。2. 方案整体设计与选型背后的考量2.1 为什么不是随便一颗传感器加一颗 MCU很多人第一反应是温度传感器满地都是随便挑一颗数字输出的接上 MCU 的 I2C 不就行了理论上没错但放到 HVAC 的实际环境里问题就来了。HVAC 控制板通常工作在电磁干扰比较强的场合风机、继电器、变频器都在附近长距离走线也常见。这时候传感器的接口抗干扰能力、MCU 的外设资源、以及整机的标定便利性就变成了比“精度指标”更重要的因素。PJ85718DM 的特点是本地测量、输出形式灵活既可以走模拟通道也可以走数字通道具体取决于你的配置方式。它的封装和外围需求都比较克制适合密集布板。PIC18F86K90 这边我看重的是它同时具备多路 10 位 ADC、硬件 UART、SPI 和 I2C这意味着本地采集和远程上报可以并行处理不用在资源上互相挤占。举个具体的例子ADC 负责采本地传感器UART 负责往中控发数据I2C 还能挂一个本地显示屏三件事同时跑CPU 负载依然可控。注意选型时不要只看数据手册上的“典型精度”要看“全温区精度”和“长期漂移”。HVAC 设备往往要连续运行好几年漂移比初始误差更致命。2.2 本地与远程两条链路的职责划分这套方案里本地链路和远程链路的职责必须分清楚否则固件会写成一团乱麻。我的划分原则是这样的本地链路PJ85718DM 负责感知PIC18F86K90 的 ADC 或数字接口负责读取MCU 内部做滤波和线性化然后驱动本地显示或本地保护逻辑。这条链路要求实时性高、延迟低因为它直接参与控制。远程链路MCU 把处理过的温度数据打包通过 UART 或总线发给上位机或中控模块。这条链路要求协议稳定、有校验、能重传因为它跨越了板级距离干扰和丢包概率更高。两条链路共用同一个温度源但处理策略不同。本地链路可以接受稍高的采样率远程链路则要控制发送频率避免总线拥塞。我一般会把本地采样定在 10Hz 左右远程上报定在 1Hz 左右中间用一个环形缓冲区做解耦。这样即使远程链路短暂阻塞本地控制也不会被拖累。2.3 成本、精度与开发周期的三角平衡做嵌入式方案永远绕不开成本、精度、开发周期这三个角。PJ85718DM 加 PIC18F86K90 的组合在这三者之间取得了一个比较务实的平衡。成本上两颗芯片都属于主流价位外围元件少PCB 面积可控精度上配合合理的标定做到 ±0.5℃ 并不困难开发周期上PIC18F86K90 的生态成熟工具链和例程丰富上手快。如果你追求更高精度可以换更高位的 ADC 或更贵的传感器但成本会上去如果你追求更快开发可以用现成的温度模块但灵活性和可控性会下降。这套方案的价值就在于它给你留了足够的调整空间同时不会让你在基础环节反复折腾。3. 核心细节解析与实操要点3.1 PJ85718DM 的接口配置与读取方式PJ85718DM 的读取方式取决于你把它的输出配置成什么形式。实际项目中我见过两种典型用法一种是走模拟输出接到 PIC18F86K90 的 ADC 通道另一种是走数字接口直接读寄存器。两种方式各有优劣下面这张表是我整理出来的对比方便你按场景选。对比项模拟输出方式数字接口方式硬件连接只需一根信号线到 ADC需要时钟和数据线抗干扰能力较弱长线易受干扰较强适合板间传输精度影响受 ADC 参考电压和噪声影响受传感器内部量化影响软件复杂度需要滤波和线性化直接读值需处理协议适用场景板级短距离采集需要数字隔离或远传我个人的经验是如果传感器和 MCU 在同一块板子上距离不超过几厘米模拟方式足够如果传感器要放到远离主控的位置或者中间要经过连接器优先选数字方式。模拟方式下ADC 的参考电压一定要干净最好单独加滤波电容否则电源纹波会直接反映到温度读数上。读取模拟通道时PIC18F86K90 的 ADC 配置有几个关键点参考电压选择、采样时间、转换时钟。参考电压我一般用外部基准比用 VDD 做参考稳得多采样时间要留够让采样保持电容充分充电转换时钟不能太快否则精度下降。这些参数在数据手册里都有推荐范围照着设基本不会出大问题。3.2 PIC18F86K90 的外设分配与资源规划PIC18F86K90 的外设不少但如果不提前规划写到一半发现资源冲突就很麻烦。我的做法是画一张资源分配表把每个外设的用途、引脚、优先级都列清楚。下面是我在一个典型项目里的分配方案你可以参考。外设用途优先级备注ADC采集 PJ85718DM 模拟输出高用外部基准UART远程温度上报高带校验和重传I2C本地显示屏中刷新率可降低Timer0采样节拍高10Hz 中断Timer1远程上报节拍中1Hz 中断GPIO继电器/风机控制高带保护逻辑这张表的意义在于它强迫你在写代码之前就想清楚“谁先谁后、谁快谁慢”。比如 Timer0 的中断优先级要高于 Timer1因为本地采样比远程上报更紧急。I2C 显示屏的刷新可以放在主循环里不占用中断资源。GPIO 控制要加硬件保护防止软件跑飞时误动作。提示PIC18F86K90 的中断优先级配置要仔细看手册有些外设共享中断向量处理不当会互相影响。我一般会把高频中断和低频中断分开避免长中断阻塞短中断。3.3 温度数据的滤波与线性化处理传感器读回来的原始值不能直接当温度用。模拟通道有噪声数字通道有量化误差而且传感器的输出和温度之间往往不是完美线性。所以滤波和线性化是必须做的两步。滤波方面我用的是“滑动平均加中值”的组合。滑动平均负责压随机噪声中值滤波负责剔除偶发的野值。具体做法是维护一个长度为 8 的环形缓冲区每次新采样进来先做中值判断再更新平均值。这样既能平滑数据又不会因为一个坏点把整体拉偏。实测下来这种方式对 HVAC 场景里的风机启停干扰有很好的抑制效果。线性化方面如果传感器输出和温度是线性的直接用两点标定就够了如果是非线性的就要用分段线性或查表法。PJ85718DM 在常规温区内的线性度不错我一般用两点标定加一个修正系数。标定点选在 0℃ 和 50℃ 两个位置覆盖 HVAC 的主要工作区间。标定的时候要用高精度参考温度计别用另一颗传感器去标否则误差会叠加。// 滑动平均加中值滤波的简化实现 #define FILTER_SIZE 8 int filter_buf[FILTER_SIZE]; int filter_index 0; int filter_temperature(int new_sample) { filter_buf[filter_index] new_sample; filter_index (filter_index 1) % FILTER_SIZE; // 复制一份用于排序找中值 int temp[FILTER_SIZE]; for (int i 0; i FILTER_SIZE; i) { temp[i] filter_buf[i]; } // 简单冒泡排序 for (int i 0; i FILTER_SIZE - 1; i) { for (int j 0; j FILTER_SIZE - 1 - i; j) { if (temp[j] temp[j 1]) { int t temp[j]; temp[j] temp[j 1]; temp[j 1] t; } } } // 去掉最大最小各两个剩下的求平均 int sum 0; for (int i 2; i FILTER_SIZE - 2; i) { sum temp[i]; } return sum / (FILTER_SIZE - 4); }这段代码不是最优美的但足够直观。实际项目里我会把排序换成更高效的算法或者直接用硬件滤波加软件限幅。关键是思路先剔除野值再平滑最后才做线性化。4. 实操过程与核心环节实现4.1 硬件连接与上电检查硬件连接这一步我吃过不少亏所以现在养成了固定流程。第一步是确认供电PJ85718DM 和 PIC18F86K90 的供电电压要匹配去耦电容要靠近引脚放置。第二步是确认信号线模拟通道要远离高频信号线数字通道要注意上拉电阻。第三步是上电前用万用表测一遍关键点确认没有短路。上电后的第一件事不是跑程序而是测电压。用示波器看电源纹波用万用表测参考电压确认 ADC 的输入在合理范围内。我见过好几次因为参考电压不稳导致温度读数跳变的情况最后查出来是去耦电容虚焊。所以这一步千万别省。连接检查清单供电电压在数据手册范围内纹波小于 50mV去耦电容紧靠芯片引脚容值符合推荐模拟信号线远离高频和开关信号数字接口的上拉电阻阻值合适参考电压稳定温度漂移小4.2 固件框架与任务调度固件这边我用的是一个轻量的时间片轮询加中断的框架。Timer0 产生 10Hz 中断在中断里置位采样标志主循环检测到标志后执行采样、滤波、线性化Timer1 产生 1Hz 中断置位上报标志主循环检测到后打包数据、发送、等待应答。这样本地采样和远程上报互不阻塞逻辑清晰。任务调度的关键是优先级。本地采样必须优先于远程上报因为控制逻辑依赖本地数据。如果远程链路阻塞不能影响本地采样。我的做法是把远程发送放在主循环的低优先级位置发送失败就重试重试次数超限就丢弃并记录绝不阻塞主循环。// 简化的任务调度框架 volatile bit sample_flag 0; volatile bit report_flag 0; void interrupt isr(void) { if (TMR0IF) { TMR0IF 0; TMR0 0x06; // 重装载10Hz sample_flag 1; } if (TMR1IF) { TMR1IF 0; TMR1 0x80; // 重装载1Hz report_flag 1; } } void main(void) { init_system(); while (1) { if (sample_flag) { sample_flag 0; do_local_sample(); } if (report_flag) { report_flag 0; do_remote_report(); } do_display_update(); do_control_logic(); } }这个框架的好处是简单、可预测。每个任务的执行时间要提前估算确保主循环一圈的时间小于最短任务周期。如果某个任务太重就拆成多个小步骤分几次执行。4.3 远程上报协议的设计与实现远程上报协议不需要太复杂但必须有校验和重传。我用的是一个固定长度的帧结构帧头、地址、温度值、状态、校验和、帧尾。温度值用两个字节表示高字节在前精度到 0.1℃。校验和用累加取反简单但够用。发送流程是这样的主循环检测到上报标志后先检查总线是否空闲空闲则发送发送后等待应答。如果在规定时间内没收到应答重试一次再失败就记录错误等下一个周期再试。这样既保证了可靠性又不会因为一次失败就卡死。字段长度说明帧头1 字节固定值用于同步地址1 字节设备地址支持多机温度高字节1 字节温度整数部分温度低字节1 字节温度小数部分状态1 字节传感器状态和错误码校验和1 字节累加取反帧尾1 字节固定值用于结束判断注意帧头和帧尾要选不容易在数据中出现的值否则接收方可能误判。如果数据里可能包含帧头值就要做转义处理或者改用更长的同步序列。4.4 本地显示与远程中控的联动本地显示我一般用一个小型 I2C 屏显示当前温度、设定温度、工作状态。刷新率不用太高2Hz 就够了太高反而占资源。远程中控那边除了接收温度数据还要能下发设定值和模式切换命令。所以协议要支持双向通信不能只做单向上报。联动的逻辑是这样的本地显示和远程中控共用同一个温度源但显示值可以加一点平滑避免数字跳动太频繁。远程中控下发的设定值要经过范围检查和确认后才生效防止误操作。如果远程链路断开本地控制要能独立运行不能因为失去中控就停机。5. 常见问题与排查技巧实录5.1 温度读数跳变或漂移这是最常见的问题原因通常有三个电源噪声、参考电压不稳、滤波不足。排查顺序是先用示波器看电源和参考电压再看传感器信号线是否有干扰最后检查滤波参数是否合适。我遇到过一次温度读数每隔几秒跳一次最后查出来是风机启停时电源跌落加了大电容和 LC 滤波后解决。另一个容易被忽略的点是传感器的自发热。PJ85718DM 功耗不高但如果周围有发热元件或者传感器贴得太靠近功率器件读数就会偏高。解决办法是让传感器远离热源或者加温度补偿。补偿的方法是在同一板上放一颗参考传感器测出板温然后做差值修正。5.2 远程通信丢包或误码远程通信的问题先查硬件再查软件。硬件方面检查线缆长度、屏蔽、终端电阻、共模电压。软件方面检查波特率误差、校验和算法、重传逻辑。我见过一次误码率很高的情况最后发现是波特率配置有偏差晶振精度不够。换成更高精度的晶振后误码率直接降到可忽略。如果通信距离较长建议用差分信号而不是单端信号抗共模干扰能力强得多。如果必须用单端就要降低波特率增加校验和重传次数。另外通信线要和电源线分开走避免耦合。5.3 标定后精度仍不达标标定后精度不达标通常是标定方法有问题。常见错误包括标定点太少、参考温度计精度不够、标定时环境温度不稳定、标定后没有验证。我的做法是至少取三个标定点覆盖工作温区的低中高段用高精度参考温度计标定时等温度稳定后再读数标定后在不同温度点验证。如果标定后仍有偏差检查传感器的线性度和迟滞。有些传感器在升温过程和降温过程中读数不一致这就是迟滞。迟滞大的传感器不适合做高精度控制要么换型号要么加软件补偿。5.4 常见问题速查表现象可能原因排查方法解决措施读数跳变电源噪声示波器看电源加滤波电容读数偏高自发热测板温对比远离热源或补偿通信丢包线缆干扰查屏蔽和终端改差分或降波特率误码率高波特率偏差测晶振频率换高精度晶振标定不准标定点少增加标定点重新标定并验证控制振荡滤波不足看温度曲线加强滤波或加死区提示排查问题时先怀疑硬件再怀疑软件。硬件问题往往表现为随机性软件问题往往表现为规律性。抓住这个特征能省很多时间。6. 一些实操心得与后续扩展方向这套方案我在几个项目里都用过稳定性没问题但每次都会根据具体场景做调整。比如有的项目要求传感器和主控隔离我就会在中间加数字隔离器有的项目要求多路温度采集我就会用多路 ADC 或者多颗传感器挂总线。核心思路不变本地采集要稳远程上报要准两条链路要解耦。后续如果要扩展有几个方向可以考虑。一是增加温度记录功能把数据存到外部存储方便事后分析二是增加无线上报能力用低功耗无线模块替代有线三是增加自诊断功能传感器开路短路时能自动报警。这些扩展都不难前提是基础框架搭得干净。最后分享一个小技巧调试温度采集时用一个可控温的恒温槽或者恒温箱做参考比用室温环境靠谱得多。室温波动大标定和验证都不准。如果没有恒温设备至少要在温度稳定的时候做别在空调出风口旁边标定那是自找麻烦。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →