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

嵌入式温度监测实战:PJ85718DM远程测温与MK20DX128VFM5驱动开发

嵌入式温度监测实战:PJ85718DM远程测温与MK20DX128VFM5驱动开发 ★ FEATURED ARTICLE
1. 从一颗温度传感器说起为什么本地与远程测温要分开做嵌入式温度监测这件事看起来简单真做起来坑不少。我最早接触温度采集是在一个HVAC控制板的项目上当时的需求很朴素监测机房回风温度超过阈值就联动风机。一开始想当然地用了MCU自带的内部温度传感器结果实测误差能到±5℃以上根本没法用。后来换成外置数字温度传感器精度上来了但又遇到新问题——有些测点离主板十几米远走线一长信号就飘。这就是本地测温和远程测温必须分开处理的根本原因。本地温度指的是传感器和主控芯片在同一块板子上走线短、干扰小通常用I2C或SPI接口的数字传感器就能搞定远程温度则是指传感器通过长线缆连接到主控板距离可能从几十厘米到十几米不等这时候线缆电阻、电磁干扰、地电位差都会成为误差来源。我后来选用的方案是PJ85718DM搭配MK20DX128VFM5。PJ85718DM是一颗远程温度传感器支持通过外部三极管或二极管接法把感温点延伸到远端MK20DX128VFM5则是基于Cortex-M4内核的MCU自带丰富的模拟和数字外设用来做数据采集和逻辑控制很合适。这套组合在HVAC和嵌入式场景里算是比较经典的搭配。这篇文章我会把整个方案拆开讲从两颗芯片各自解决什么问题到硬件怎么连、软件怎么写再到实际调试中遇到的坑和解决办法。不管你是刚接触温度采集的新手还是想优化现有方案的老手应该都能找到有用的东西。2. PJ85718DM与MK20DX128VFM5各自扛什么活2.1 PJ85718DM远程测温的核心逻辑PJ85718DM本质上是一颗远程温度传感器芯片它的核心能力是测量外部连接的三极管或二极管结电压通过计算结电压随温度的变化来反推温度值。这种方式的优势在于感温元件可以是一颗便宜的三极管放在远离主板的测点上而芯片本身留在主板上做信号处理。它的测温原理基于一个物理事实半导体PN结的正向压降与温度呈线性关系大约每升高1℃压降下降2mV左右。芯片内部会交替注入两个不同大小的电流测量两次压降的差值ΔVbe这个差值和绝对温度成正比。用公式表示就是ΔVbe (kT/q) × ln(N)其中k是玻尔兹曼常数T是绝对温度q是电子电荷N是两个电流的比值。芯片通过测量ΔVbe就能算出温度这种方式对工艺偏差和线缆电阻不敏感因为测的是差值而不是绝对值。PJ85718DM支持本地和远程两路测温本地测温用的是芯片内部的PN结远程测温则通过外部引脚连接远端三极管。它通过I2C接口和主控通信典型精度在远程模式下能到±1℃左右本地模式稍差一些。工作电压范围宽适合3.3V和5V系统。2.2 MK20DX128VFM5采集与控制的枢纽MK20DX128VFM5是飞思卡尔现NXPKinetis K系列的一款MCUCortex-M4内核主频50MHz128KB Flash16KB RAM。放在温度监测场景里它的角色是I2C主机、数据处理单元和逻辑控制中心。我选它的理由有几个第一它有多路I2C接口可以同时挂多个传感器第二它自带12位ADC如果以后想加模拟传感器也方便第三它的低功耗模式做得不错适合需要长时间运行的HVAC设备第四封装是32脚QFN体积小适合紧凑型控制板。在这套方案里MK20DX128VFM5通过I2C总线读取PJ85718DM的温度数据然后做滤波、阈值判断、上报或者联动控制。如果温度超过设定阈值它可以驱动继电器或者通过串口上报给上位机。2.3 为什么不用MCU内部温度传感器很多人会问MK20DX128VFM5自己就有内部温度传感器为什么还要外挂一颗PJ85718DM我实测过MCU内部温度传感器的绝对精度通常在±5℃以上而且受芯片自身发热影响很大。MCU跑起来以后内核温度比环境温度高十几度是常事测出来的值根本不能代表环境温度。内部传感器只适合做芯片过热保护不适合做环境温度监测。要测环境温度必须用外置传感器而且感温点要远离发热源。这就是PJ85718DM存在的意义。3. 硬件连接从原理图到PCB布局的实操细节3.1 I2C总线的物理连接PJ85718DM和MK20DX128VFM5之间通过I2C通信需要连接四根线SCL、SDA、VCC、GND。SCL和SDA需要上拉电阻典型值是4.7kΩ如果总线电容较大或者走线较长可以降到2.2kΩ。这里有个细节容易被忽略PJ85718DM的I2C地址是可配置的通过ADDR引脚接不同电平可以设置不同地址。如果总线上挂多颗同型号芯片必须确保地址不冲突。我一般会在PCB上预留地址配置电阻的位置方便后期调整。上拉电阻的供电端要接和MCU同一路电源不要一个接3.3V一个接5V否则会出现电平不匹配的问题。我踩过一次坑PJ85718DM接5V供电上拉电阻也接5V但MK20DX128VFM5的I2C引脚是3.3V电平结果通信时好时坏后来把上拉改到3.3V才稳定。3.2 远程三极管的接法与走线远程测温的关键在于外部三极管的连接。PJ85718DM通常有两个远程测温引脚分别接三极管的基极和发射极集电极接地。三极管要选低噪声、一致性好的型号我用的是常见的MMBT3904便宜且够用。走线方面有几个硬性要求第一远程三极管的走线要尽量远离高频信号线和电源线避免耦合干扰第二两根走线要平行走最好用地线包起来减少共模干扰第三如果距离超过一米建议用屏蔽线屏蔽层单端接地。我做过一个对比测试同样用MMBT3904走线10厘米时读数波动在±0.2℃以内走线5米且没有屏蔽时波动能到±2℃加了屏蔽和地线包围后回到±0.5℃以内。所以远程测温的精度很大程度上取决于走线质量芯片本身反而不是瓶颈。3.3 电源与去耦PJ85718DM的供电范围是2.7V到5.5VMK20DX128VFM5是1.71V到3.6V。如果系统统一用3.3V两者可以共用一路电源。去耦电容方面每颗芯片的VCC引脚旁边都要放一个0.1μF的陶瓷电容距离越近越好最好在5毫米以内。如果电源纹波较大可以再加一个10μF的钽电容做低频滤波。我在一个工业环境的应用里电源上叠加了大约100mV的纹波导致温度读数有0.5℃左右的周期性波动加了10μF电容后波动降到0.1℃以内。3.4 PCB布局的注意事项PCB布局对温度测量的影响比想象中大。首先PJ85718DM要远离MCU、电源芯片、功率器件这些发热源至少保持2厘米以上的距离。其次芯片下方的铺铜不要大面积连接否则热量会通过铜皮传导过来。我一般会在传感器芯片下方做局部挖空只保留必要的走线。另外远程三极管的走线不要和I2C走线平行长距离走否则I2C的时钟信号会耦合到测温线上。如果实在避不开中间加一根地线做隔离。4. 固件开发I2C驱动、温度换算与滤波策略4.1 MK20DX128VFM5的I2C初始化MK20DX128VFM5的I2C外设配置不算复杂但有几个寄存器容易配错。首先是时钟分频I2C的波特率由总线时钟分频得到标准模式100kHz快速模式400kHz。PJ85718DM支持到400kHz我一般用100kHz稳定性更好。初始化的大致流程是使能I2C时钟、配置引脚复用为I2C功能、设置波特率寄存器、使能I2C外设。下面是一段简化的初始化代码void I2C_Init(void) { SIM_SCGC4 | SIM_SCGC4_I2C0_MASK; // 使能I2C0时钟 SIM_SCGC5 | SIM_SCGC5_PORTB_MASK; // 使能PORTB时钟 PORTB_PCR0 PORT_PCR_MUX(2) | PORT_PCR_ODE_MASK; // SCL PORTB_PCR1 PORT_PCR_MUX(2) | PORT_PCR_ODE_MASK; // SDA I2C0_F 0x14; // 波特率设置100kHz I2C0_C1 I2C_C1_IICEN_MASK; // 使能I2C }注意SCL和SDA引脚要配置为开漏模式否则总线无法正常工作。这个坑我踩过当时忘了配开漏波形一直是平的查了半天才发现。4.2 读取PJ85718DM的温度寄存器PJ85718DM的温度数据存放在内部寄存器里通过I2C读取。典型的读取流程是发送从机地址加写标志、发送寄存器地址、发送从机地址加读标志、读取两个字节数据。温度数据是16位的高字节在前低字节在后。高字节的bit7到bit0对应温度的整数部分低字节的高4位对应小数部分分辨率是1/16℃。换算公式是温度 (高字节 × 256 低字节) / 256如果读到的原始值是0x1A80换算下来就是26.5℃。注意负温度的处理PJ85718DM用补码表示负温度读到负值时需要做符号扩展。float Read_Temperature(uint8_t reg) { uint8_t buf[2]; I2C_Start(); I2C_Write(0x48 1); // 从机地址加写 I2C_Write(reg); I2C_Start(); I2C_Write((0x48 1) | 1); // 从机地址加读 buf[0] I2C_Read_ACK(); buf[1] I2C_Read_NACK(); I2C_Stop(); int16_t raw (buf[0] 8) | buf[1]; return raw / 256.0; }4.3 温度数据的滤波处理原始温度数据会有波动直接用来做阈值判断容易误触发。我一般用滑动平均滤波取最近8次采样的平均值。如果对实时性要求高可以用一阶低通滤波公式是filtered α × current (1 - α) × filtered_prevα取值在0.1到0.3之间越小越平滑但响应越慢。我一般取0.2兼顾平滑度和响应速度。还有一种情况是偶发的跳变比如读到0x7FFF这种异常值需要在滤波前做限幅处理。我的做法是如果本次读数和上次读数的差值超过5℃就丢弃本次数据用上次的值代替。这样能有效滤掉偶发干扰。4.4 阈值判断与报警逻辑温度监测的核心逻辑是阈值判断。我一般设两级阈值预警阈值和报警阈值。预警阈值触发时只上报报警阈值触发时联动控制。比如预警设35℃报警设40℃超过35℃上报提醒超过40℃启动风机。阈值判断要加迟滞否则温度在阈值附近波动时会频繁触发。迟滞量一般设1到2℃。比如报警阈值40℃温度超过40℃触发报警但要降到38℃以下才解除报警。#define ALARM_HIGH 40.0 #define ALARM_LOW 38.0 void Check_Temperature(float temp) { static uint8_t alarm_state 0; if (!alarm_state temp ALARM_HIGH) { alarm_state 1; Trigger_Alarm(); } else if (alarm_state temp ALARM_LOW) { alarm_state 0; Clear_Alarm(); } }5. 实测中的坑从读数跳变到通信失败的排查过程5.1 读数周期性跳变电源纹波的锅项目调试初期我发现温度读数每隔几秒就会跳变一次幅度大约0.5℃。一开始怀疑是传感器问题换了一颗新的还是一样。后来用示波器看电源发现3.3V上有大约80mV的纹波频率和开关电源的开关频率一致。解决办法是在PJ85718DM的VCC引脚旁边加了一个10μF的钽电容和一个0.1μF的陶瓷电容纹波降到20mV以下读数跳变消失。这个坑告诉我温度测量对电源质量的要求比想象中高尤其是分辨率到0.0625℃的时候。5.2 I2C通信失败上拉电阻选大了有一次批量生产时部分板子出现I2C通信失败概率大约10%。查了焊接没问题换了芯片也没用。后来用示波器看波形发现SDA的上升沿很缓明显是上拉电阻太大导致的。原来设计时用的是10kΩ上拉理论上100kHz速率下够用但实际板子上总线电容偏大上升时间超过了I2C规范的要求。把上拉电阻换成4.7kΩ后问题解决。后来我在设计规范里明确写了I2C上拉电阻默认4.7kΩ如果总线设备多或者走线长降到2.2kΩ。5.3 远程测温偏差大三极管选型和走线问题远程测温的精度调试花了最长时间。最初用了一颗杂牌三极管读数比实际温度高了3℃。换成MMBT3904后偏差降到1℃以内。后来又把走线从普通排线换成屏蔽线偏差进一步降到0.5℃以内。还有一个细节远程三极管的基极和发射极走线如果不等长会引入额外误差。我一般要求这两根线等长走误差控制在5毫米以内。虽然理论上影响不大但实测下来等长走线的读数一致性确实更好。5.4 温度换算的符号问题负温度的处理容易出错。PJ85718DM的输出是16位补码如果直接按无符号数换算零下温度会变成很大的正数。我第一次调试时正好是冬天实验室温度低于0℃读出来是60多度查了半天才发现是符号扩展没做。正确的做法是先把16位数据转成有符号的int16_t再做除法。如果温度范围不会低于0℃也可以不做符号处理但建议还是加上养成好习惯。6. 从单点测温到多点组网扩展思路与选型建议6.1 多颗PJ85718DM挂同一条I2C总线如果需要监测多个位置的温度可以在同一条I2C总线上挂多颗PJ85718DM通过ADDR引脚设置不同地址。PJ85718DM支持4个不同地址理论上一条总线可以挂4颗加上本地测温通道一共可以测8个点。如果测点更多可以用I2C多路复用器扩展或者换用SPI接口的传感器。不过对于大多数HVAC场景4到8个测点已经够用了。6.2 远程测温的替代方案对比除了PJ85718DM这种外接三极管的方案远程测温还有几种常见方案方案精度成本布线复杂度适用距离外接三极管±1℃低中10米以内数字传感器长线±0.5℃中低5米以内热电偶±0.5℃高高100米以内热敏电阻±1℃低中10米以内外接三极管方案的优势是成本低、芯片集成度高适合测点分散但距离不太远的场景。如果距离超过10米建议考虑热电偶或者带隔离的RS485温度变送器。6.3 低功耗设计让电池供电成为可能HVAC设备有时候需要电池供电这时候低功耗就很重要。MK20DX128VFM5支持多种低功耗模式最低可以做到几微安。我的做法是让MCU大部分时间处于休眠状态定时唤醒读取温度读完继续休眠。PJ85718DM也支持关断模式通过配置寄存器可以让它进入低功耗状态。一次转换大约需要100毫秒转换完成后自动进入关断。如果每分钟测一次平均功耗可以做到100微安以下用一节纽扣电池能撑好几个月。6.4 校准让精度再上一个台阶如果对精度要求高可以做两点校准。用一个高精度温度计做参考在低温和高温两个点分别记录读数算出偏移量和斜率然后在固件里做补偿。我一般会在生产时做一次单点校准把偏移量写到Flash里。如果客户要求高再做两点校准。校准后的精度可以做到±0.5℃以内对于大多数HVAC应用足够了。7. 这套方案适合什么场景不适合什么场景PJ85718DM加MK20DX128VFM5的组合最适合的场景是测点分散、距离在10米以内、精度要求±1℃左右、成本敏感的嵌入式温度监测。典型的应用包括机房温度监控、空调回风温度采集、设备柜内温度监测等。不太适合的场景是测点距离超过10米、需要±0.1℃的高精度、强电磁干扰环境。这些场景需要更专业的方案比如热电偶加隔离变送器或者光纤测温。我在实际项目里用这套方案做了三个版本从单点测温到四点组网稳定性都不错。最关键的经验是电源要干净、走线要讲究、滤波要做好。把这三点做到位剩下的就是按部就班的配置和调试了。最后分享一个小技巧调试阶段可以在固件里加一个原始数据输出功能把每次读到的原始寄存器和换算后的温度都通过串口打印出来。这样一旦出现异常能快速判断是通信问题、换算问题还是传感器本身的问题。这个习惯帮我省了很多排查时间。
阅读完成 · 觉得有帮助?
咨询建站