资讯动态

基于TM4C129和PJ85718DM的多点温度监测与以太网传输方案

发布时间:2026/10/22 12:11:28 来源:尧图企业网站定制
嵌入式开发和暖通控制这两条线平时看着井水不犯河水真做到一个项目里才发现传感器选型、总线拓扑、网络协议这些环节全都要掰开揉碎重新考量。我之前调过一套基于 TM4C129XKCZAD 和 PJ85718DM 的温测系统用在某办公园区的HVAC分区控制上既能看本地传感器节点也能通过以太网把数据送到中控。折腾完这一圈踩了不少坑也理顺了不少思路把整个过程拆出来讲讲给正在做类似温度监测或者想入门以太网传感节点开发的朋友做个参考。这个方案解决的核心问题其实很朴素现场十几个测温点不能每个点都拉一根线到控制器也不能让中控人员跑到配电间看数据。用 TM4C129XKCZAD 做主控它最大的好处是自带 10/100M 以太网 MAC 和 PHY一颗芯片就能把采集和联网全干了PJ85718DM 则是一颗很小巧的 I2C 数字温度传感器精度和一致性都够用而且引脚少、地址可配很适合挂在同一条总线上做多点测温。下面从整体架构、硬件连接、软件实现到HVAC现场的注意事项一层层往下聊。1. 整体方案拆解从本地采集到远程访问的数据链路1.1 为什么选“M4内核 数字温度传感器”这个组合先说说选型的逻辑。做多点温度采集第一条路是用 NTC 热敏电阻加 ADC 采样成本确实低但麻烦事一箩筐。NTC 的 B 值离散性很大每个探头都得单独标定长线传输还会引入压降和干扰ADC 参考源稍微不稳数据就飘。第二条路是用 1-Wire 总线的传感器比如常见的 DS18B20接线少是挺诱人但 1-Wire 时序要求苛刻遇上稍长的线缆或者总线上的寄生电容一大通信就变得不稳定冬天夏天表现还不一样排查起来很费劲。PJ85718DM 这类标准 I2C 接口的数字温度传感器就友好得多。首先它的温度数据已经在芯片内部做好线性化和校准MCU 只需要通过 I2C 读寄存器不需要自己做查表或者多项式拟合其次它的测量分辨率可以配置到 12 位也就是 0.0625℃ 的刻度对 HVAC 这种以 0.1℃ 甚至 0.5℃ 为控制粒度的场景绰绰有余。更关键的是它支持通过地址引脚组合出多个不同的 I2C 地址一条总线上可以挂多个传感器这就解决了“多点测温怎么区分数据来源”的问题。主控这边TM4C129XKCZAD 属于带浮点运算单元和丰富通信外设的 Cortex-M4F 系列芯片主频 120MHz跑个轻量级 TCP/IP 协议栈完全没压力。它最吸引我的一点是片内直接集成了完整的以太网 MAC 和 PHY焊个带网络变压器的 RJ45 座就能连网线不用外挂 PHY 芯片。对比过“普通MCU加串口转以太网模块”的方案那种做法通信链路多了一层模块固件出问题的时候你连排查的入口都找不到而 TM4C129 所有寄存器都开放从 MDIO 读 PHY 状态到抓以太网帧全部可控。1.2 “本地”与“远程”到底指什么这套系统里“本地温度”和“远程温度”不是指传感器自身带两种测量模式而是指两个维度的监测能力。本地维度指分布在 HVAC 设备现场的温度节点。比如回风口温度、送风口温度、房间代表温度、室外补偿温度这些传感器通过 I2C 总线直接挂在 TM4C129XKCZAD 的 I2C 外设上。MCU 周期轮询这些传感器得到的是短距离、高实时性的温度数据。这个环节关注的是总线稳定性和采样时序。远程维度则是通过以太网把汇聚后的温度数据推送到远端的上位机、触摸屏或者云平台。中控室不需要知道某个传感器到底挂在哪根线上只需要通过 TCP 连接向主控发一条查询指令就能拿到所有测点的当前温度和状态。这个环节关注的是网络通信的可靠性和数据协议的设计。一套系统把这两个维度同时覆盖才能真正解决“现场看得见、远处也看得见”的问题。只做本地采集不做远程上报数据就烂在现场只做远程上报而不做好本地采集传到远处的数据也是错的。1.3 整体数据链路怎么跑实际的链路是这样一个闭环PJ85718DM 传感器群 → I2C 总线 → TM4C129XKCZAD 的 I2C 外设 → 固件完成原始寄存器数据解析和滤波 → 数据写入内存中的实时数据库 → TCP 服务器线程等待上位机指令 → 按指令返回 JSON 或者自定义二进制报文。这套链路里没有任何一个环节需要人的介入。传感器上电就开始按默认配置转换MCU 上电后先初始化 I2C 外设和以太网控制器然后进入主循环一边轮询传感器、更新温度缓存一边处理 TCP 连接上的查询和配置请求。我在实际调试时最担心的是以太网协议栈占用的资源会不会挤占传感采集的实时性实测下来 120MHz 主频、加上合理划分任务优先级I2C 轮询四个传感器加上网络应答CPU 占用率根本到不了 30%余量很充足。2. 硬件设计要点PJ85718DM 的接线与 TM4C129 网络口的处理2.1 PJ85718DM 的引脚功能与 I2C 地址配置PJ85718DM 引脚不多供电、地、I2C 时钟、I2C 数据再加上地址配置引脚。它的 I2C 地址由硬件引脚的电平决定这一点非常重要规划测点的时候必须先算好地址分配否则焊完了才发现两个传感器地址相同总线上一片混乱还得返工。我用的型号支持三个地址引脚A0、A1、A2每个引脚可以接低电平、高电平或者悬空组合出一组地址。规划多个测点时建议一开始就画一张地址分配表把每个测点的物理位置和 I2C 地址一一对应比如这样测点编号物理位置A0/A1/A2 组合I2C 7位地址T1一层回风口低/低/低0x48T2一层送风口高/低/低0x49T3二层回风口低/高/低0x4AT4二层送风口悬空/高/高0x4D每个传感器的 A0/A1/A2 引脚直接接芯片的 VCC、GND 或者悬空不要串联电阻因为内部有弱上拉/弱下拉机制外部电阻反而可能引入不稳定的中间电平。地址配置的坑我在第一版板上踩过有一路传感器的地址引脚没焊牢处于半接触状态结果上电后读到的温度值一会儿对一会儿错用示波器量 SDA 线上确实有应答但应答的地址字节和我预期的不一样。后来把引脚重新补焊、地址引脚电平用万用表量一遍才彻底解决。经验是批量贴片后不要只做功能测试要逐颗确认地址配置引脚的实测电平。2.2 I2C 多节点拓扑的注意事项多个 PJ85718DM 挂同一条 I2C 总线最大的敌人是总线电容和上拉电阻的匹配。I2C 规范里标准模式 100kHz 下总线上拉电阻的取值要结合总线电容算一般 4.7kΩ 适用于短距离、少节点的情况节点变多或线缆变长时总线电容可能超过 200pF这时候 4.7kΩ 上拉会显得太弱上升沿变缓通信出错率明显上升。HVAC 现场有个特殊情况传感器不一定就在主控板上可能分布在风管附近需要几米的延长线。这种情况下我建议这几条措施一是降低 I2C 时钟频率到 100kHz 甚至 50kHz给信号边沿更多的裕量二是上拉电阻减小到 2.2kΩ 左右增强驱动能力三是双绞线传输 SCL 和 SDA并且每对双绞线的地线单独接回主控的模拟地避免形成大的地环路。提示I2C 是开漏结构所有设备的 SDA/SCL 引脚都是“或”逻辑任意一个设备拉低整条总线就是低电平。所以任何一个传感器损坏、引脚短路都会拖垮整条总线。调试时如果发现所有传感器都读不到数据第一件事不是查每一个传感器而是用示波器看 SCL 和 SDA 是不是被某个异常设备拉死了。2.3 TM4C129 以太网接口设计TM4C129XKCZAD 自带 MAC 和 PHY硬件设计上比外置 PHY 的方案简单不少但仍然有几个坑要避。RJ45 连接器需要带网络变压器最好是集成共模电感的那种变压器的中心抽头要按芯片参考设计接对应的电源或电容不能随意悬空。我见过有人图省事把中心抽头直接接地结果是信号完整性变差千兆百兆模式下都容易丢包后来改回参考设计才算稳定。PHY 的地址也需要通过引脚配置TM4C129 片内 PHY 地址在寄存器里有默认值但如果和驱动代码里的 PHY 地址不一致MDIO 通信就会失败表现为网线插上之后 link 状态一直起不来。首次调试时可以先通过调试器读 PHY 寄存器的 ID 寄存器确认 PHY 通信是否正常再继续往下调协议栈。另外以太网的 25MHz 时钟源必须稳定它的精度直接影响收发器的时序。MCU 用外部晶振的时候晶振的匹配电容要按规格书选不要随意换容值否则起振不稳定会导致时通时断。件方面如果允许尽量用有源晶振省去起振和匹配的烦恼。2.4 电源与板级布局的一些心得PJ85718DM 的工作电流非常小功耗上基本不用操心但它对电源纹波还是比较敏感的。传感器供电如果直接取自开关电源的输出纹波稍大就可能反映在温度读数上表现为固定的偏差或者小幅度的跳动。我在板子上给传感器供电做了简单的 RC 滤波10Ω 电阻串联、加上 10μF 和 0.1μF 两级电容实测纹波从几十毫伏降到几毫伏以内温度读数肉眼可见地稳定下来。布局上传感器尽量靠近被测量的物体而不是靠近主控。有人图方便把所有传感器都放在主板上然后用引线延伸到测温点结果导线自身的热传导和热容导致测量结果滞后严重。HVAC 场景里传感器的探头部分要尽量与被测空气充分接触但又不能直接被送风气流吹到否则测到的是局部射流温度不是房间代表温度。这一点后面在 HVAC 章节还会细说。TM4C129 这部分以太网变压器和 RJ45 座要靠近芯片放置数字地和模拟地要单点连接特别是 PHY 部分的模拟电源引脚要单独滤波。布线时以太网差分对要等长、走线要远离时钟线和电源开关节点这些虽然老生常谈但真影响稳定性。3. 嵌入式软件实现从读温度寄存器到建 TCP 服务器3.1 I2C 读取流程与温度数据解析PJ85718DM 的核心操作就是通过 I2C 读温度寄存器。它上电后会自动开始温度转换转换完成后温度值存放在两个 8 位寄存器里。读取的流程分两步先写寄存器地址再连续读两个字节。这是我在实际固件里用的读取函数基于寄存器级操作方便移植static float read_temperature(uint8_t i2c_addr) { uint8_t reg 0x00; uint8_t buf[2] {0}; int16_t raw 0; float temp 0.0f; // 写入温度寄存器地址 i2c_write_reg(i2c_addr, reg, 1); // 连续读取两个字节高字节在前低字节在后 i2c_read(i2c_addr, buf, 2); // 12位分辨率下低4位是无效位需要右移丢弃 raw (buf[0] 8) | buf[1]; raw 4; // 判断符号位做符号扩展 if (raw 0x0800) { raw | 0xF000; } // 每个LSB代表0.0625℃ temp raw * 0.0625f; return temp; }这里面的关键点分辨率配置不同右移的位数和 LSB 对应的温度刻度也不同。9 位分辨率每个 LSB 是 0.5℃10 位是 0.25℃11 位是 0.125℃12 位是 0.0625℃。我在项目里固定用 12 位模式数据是带符号的负数温度比如冷藏场景读取时必须做符号扩展否则零下温度会算成一个大正数。提示传感器刚上电时第一次转换往往需要一定时间如果上电后立刻读寄存器可能读到全 0 或者上一次的残留数据。固件里最好在初始化后等待转换完成再开始轮询或者连续读两次丢弃第一次的结果。3.2 数据滤波与异常处理裸读出来的温度数据如果不做处理在人机界面上会显得很“毛糙”特别是传感器离电机、变频器比较近的时候电磁干扰会在数据上叠加毛刺。我给每个测点加了一级简单的中值滤波和一级滑动平均。中值滤波的思路是每轮采样连续读 5 次排序后取中间值用来滤掉偶发的脉冲干扰。滑动平均则是维护一个长度为 8 的环形缓冲区每次把新值推入、计算平均值让数值变化曲线更平滑。HVAC 的温度变化本来就是一个缓慢过程平滑滤波不会损失有用信息反而能让 PID 控制或者阈值判断更稳定。异常处理也不能少。传感器断线、短路、地址错误等情况在 I2C 总线上表现为 NACK无应答或者读回的数据超出合理范围。我在固件里给每个测点维护一个健康状态如果连续多次读取失败就标记该测点为离线并且用最近一次正常值作为保护值同时产生一条告警记录。上位机看到离线标记后能迅速定位是哪一路传感器出了问题而不是看到一堆乱数值在那里猜。3.3 以太网通信与 TCP 查询指令协议TM4C129XKCZAD 上跑以太网我选了 lwIP 协议栈。它开源、轻量配合 TM4C129 的驱动库基本能做到开箱即用。初始化的时候需要注意 MAC 地址要设置成唯一值不能默认全 0 或者多块板子共用同一个否则在同一个局域网里通信会乱套。我实现的是一台轻量的 TCP 服务器监听一个固定端口。上位机或者中控屏作为客户端主动连接连上后按约定好的指令格式发送查询请求主控返回当前所有测点的温度数据和状态。指令格式我参考了行业里常见的 Modbus 风格但又简化了定义成这样的 JSON方便上位机解析{ cmd: query, dev: HVAC-01, points: [ {id: 1, name: 回风温度, temp: 25.3, status: ok}, {id: 2, name: 送风温度, temp: 18.1, status: ok}, {id: 3, name: 室外补偿, temp: 32.7, status: offline}, {id: 4, name: 一层大厅, temp: 24.8, status: ok} ] }选 JSON 而不是纯二进制主要是为了方便调试写个上位机脚本或者直接用网络调试助手都能看懂数据。对实时性要求更高的场合可以再定义一组紧凑的二进制帧但项目初期用 JSON 开发效率更高等联调通了再优化也不迟。TCP 通信的可靠性由协议栈保证但应用层还是要注意心跳机制。中控端意外断开连接时主控这边要能检测到超时并回收连接资源。我在 socket 收发函数上加了超时判断如果一段时间内没有任何数据交换就主动关闭连接并回到监听状态等待下一次接入。否则挂掉的客户端会占住连接名额导致新客户端连不上。3.4 采样周期与任务调度安排采样周期的设计直接关系到系统响应速度。HVAC 控制场景一般不需要毫秒级响应温度变化的时间常数通常以分钟计所以我把 I2C 轮询周期设定在 500ms 左右一个周期内依次读取四个传感器算下来每秒钟每个测点能刷新两次足以及时反映温度变化。如果某个测点距离特别远、线缆特别长还可以单独把它放到一个较慢的轮询队列里避免拉低整体节奏。主循环的结构大致是这样初始化时钟、I2C、GPIO、lwIP、TCP服务器 loop: 轮询传感器中值滤波滑动平均 更新温度缓存和健康状态 处理TCP连接接收指令、应答数据 处理告警和日志输出 delay(10ms)实际上多测点轮询、滤波运算和网络协议栈并发运行对 TM4C129 这种带浮点单元的 M4 来说非常轻松。唯一要注意的是 lwIP 的中断处理函数和主循环之间避免共享资源的竞态常用做法是关中断保护临界区或者把网络数据接收放在中断里、协议栈处理放在主循环里我采用的是后者简单可靠。4. HVAC 场景落地从 Demo 到能用的距离4.1 测温点布局的讲究HVAC 系统里温度测点的位置比传感器型号更影响整个控制效果。同样是测“房间温度”放在回风口、放在墙壁内侧、放在阳光直射的窗边测出来的数值能差好几度。回风口测得的是整个房间空气混合后的平均温度这个位置作为控制反馈是比较合理的送风口测的是经过盘管处理后的出风温度用来判断机组出力效果而外墙附近测的是围护结构的热负荷波动更多用于舒适度补偿。实际项目里我给一个 500 平米的办公层布置了 4 个回风测点、2 个送风测点、1 个室外温度补偿点。布置的密度取决于空调分区的粒度一个独立温控分区至少需要一个代表测点。如果分区面积大、或者层高超过 4 米还可能出现垂直温差那就需要分层布置测温点。这个布局的经验来自暖通专业的同事不是我们自己硬拍的。嵌入式工程师做这类项目时最好先花半天时间搞清楚 HVAC 的基本原理再设计测点否则数据采回来也是错的。4.2 HVAC 环境下的测温误差来源HVAC 现场的温度测量误差来源和纯实验室环境很不一样。首先是辐射误差传感器外壳如果直接暴露在太阳光或者暖气辐射下测到的温度会明显偏离空气的真实温度。解决办法是给传感器加一个防辐射罩或者把它安装在有遮蔽的位置让空气自然流过传感器。其次是气流速度的影响风速高时传感器表面换热加快响应变快但可能测到不均匀的气流温度风速低时响应变慢数据滞后。HVAC 应用里对响应速度的要求不高滞后一点反而有利于控制的稳定性所以我一般把采样周期设得足够长让传感器有充分时间平衡。还有一个容易被忽视的误差来源是传感器的自热效应。虽然数字温度传感器的功耗很低但长时间通电还是会产生轻微的自热导致读数略微偏高。PJ85718DM 这类低功耗器件影响可以控制在 0.1℃ 级别对 HVAC 的控制精度来说可以接受但如果要做高精度的焓值计算还需要做校准补偿。4.3 从 Demo 到产品之间要补齐的几块把一套调通的 Demo 板变成能长期运行的设备中间还有不少细节。第一是供电。Demo 板用 USB 供电现场不一定有 USB 口要么用 24V 交流转直流的电源模块要么用 PoE 供电。TM4C129 系列自带以太网对上 PoE 是很自然的搭配可以省掉电源适配器。但 PoE 控制器会引入额外发热机箱散热要做好。第二是看门狗。长时间无人值守运行固件任何一处跑飞都可能导致整个监测失效。我在固件里开了硬件看门狗主循环的每个分支正常走完后都会喂狗如果某个 I2C 读取函数因为总线锁死而阻塞看门狗超时后会自动复位系统保证设备从故障中恢复。这个机制简单但极其重要特别是布置在吊顶内、配电间的设备不可能每天派人去断电重启。第三是参数存储。I2C 地址分配、网络 IP 地址、测点名称这些参数要能通过指令在线修改并且掉电保存。TM4C129 片内有可编程的 Flash 存储区可以存一小块配置信息。我在系统里实现了一套简单的配置管理上位机发指令修改配置后主控把新数据写入 Flash重启后自动加载。没有这个功能的话每改一个测点名字都要重新烧录固件现场维护成本会高得离谱。第四是日志记录。中控室的人不可能 24 小时盯着温度曲线设备要能记录异常事件什么时候某测点离线、什么时候温度超限、什么时候网络断连重连。我在片内缓存了一个环形日志区配合 RTC 时间戳上位机随时可以拉取最近的历史日志。这些日志在实际运维中价值非常大很多时候能帮助分析出到底是传感器坏了还是空调策略本身有毛病。5. 常见问题与排查技巧实录5.1 I2C 总线异常导致全部测点离线表现上位机上所有传感器状态全部变成 offline固件日志里看到连续 NACK 错误。排查步骤首先用示波器或逻辑分析仪抓 SCL 和 SDA 波形看 SCL 是否还有正常翻转。如果 SCL 有波形但 SDA 一直为低说明总线上有设备把 SDA 拉死了这通常是个别传感器损坏或引脚短路导致的。此时可以尝试把疑似故障的传感器从总线上摘除断开它的 SDA 引脚再看总线能否恢复。如果 SCL 和 SDA 都没有波形检查 I2C 外设初始化是否正确、时钟是否使能、GPIO 复用功能是否配置对。TM4C129 的 I2C 引脚需要先配置成 I2C 功能否则只是普通 GPIO当然不会有通信波形。5.2 温度读数在正常范围内但跳变频繁表现数据不冒大数但相邻两次读取能差 0.5℃ 以上而且毫无规律。优先怀疑电源纹波。用示波器量传感器供电引脚如果纹波超过几十毫伏加上 RC 滤波再看效果。其次是线缆受到电磁干扰特别是传感器线缆和风机、变频器供电线扎在了一起这种情况下把传感器线单独走线或者换成屏蔽双绞线屏蔽层单端接地。跳变问题还有一个隐蔽来源I2C 通信错误导致读到错误数据。比如上拉电阻太大上升沿太缓在某些温度或电压条件下通信出错读回的数据错位经过符号扩展后变成一个看似合理的错误值。这种问题比电源纹波更麻烦因为它不是持续出现的。我遇到过一次后来通过降低 I2C 时钟、同时把传输的数据帧加上简单的校验字段比如重复读两次对比才稳妥解决。5.3 网线插上之后 link 起不来表现RJ45 座上的绿灯不亮协议栈里 PHY 状态寄存器显示 link down。先查 PHY 供电TM4C129 片内 PHY 有独立的电源域供电引脚要按参考设计接好缺一路电就会导致 PHY 完全无法工作。其次查 PHY 地址配置驱动代码里读取 PHY 寄存器的地址值必须和硬件设定一致不一致时 MDIO 通信不上自然读不到 link 状态。再来查网络变压器和 RJ45 座。变压器抽头接法不对、RJ45 内部线序反了都可能导致 link 起不来。手头有网线测试仪的话先确认网线本身没问题再检查板子上的差分走线有没有断开或者短接。5.4 问题速查表现象可能原因快速处理办法所有测点 offlineI2C 总线被某个设备拉死断开可疑传感器逐一路排查单个测点数据乱跳电源纹波/线缆干扰加RC滤波单独走线温度值整体偏高0.5℃传感器自热/靠近热源远离热源降低采样功耗网口 link 不亮PHY配置/变压器焊接问题检查PHY地址、差分走线上位机连不上 TCP防火墙/心跳超时关闭防火墙测试检查连接回收逻辑重启后配置丢失Flash 写入不完整确认擦写流程增加掉电保护这张表是我在调试过程中逐步积累的每一条背后都对应着一次实际的返工或者半夜的排查。把这些记下来后续再做类似项目时能省一大半时间。5.5 一项容易被忽略的校准问题多个传感器之间的一致性不一定像规格书上写的那么理想。哪怕是同一批次的芯片温度读数也可能存在零点几个摄氏度的差异。HVAC 控制如果要用到温差比如回风与送风的温差这个差异就会被放大造成控制策略误判。解决思路有两条一是在出厂时做一次批量校准用一个高精度的参考温度计把每个传感器的偏差记录下来作为软件补偿系数存到 Flash 里二是如果精度要求没那么苛刻可以在布点时尽量用同一个批次的传感器并且让它们工作在接近的环境温度下减小个体差异。我实际做的时候是两条都用了批量校准加软件补偿测点温差的一致性基本能做到 0.1℃ 以内。6. 我在这套方案里注意到的几个关键细节项目做下来最深的体会是硬件连接能有多牢靠直接影响软件调试要花多少时间。第一次把板子调通的时候I2C 总线上的传感器是直接飞线焊上去的结果偶发性读错差点让我怀疑是驱动代码的问题。后来改成可靠的接插件连接数据一下子就干净了。还有一些小细节值得多说一句。比如传感器的地址引脚不要在画原理图的时候为了省事把所有传感器地址都配成一样后面软件上想区分都区分不开网络变压器中心抽头的接法一定要逐项对照参考设计偷懒省略一个小电容都可能导致 EMC 测试不通过固件里所有温度变量尽量用浮点类型保存中间用整数运算虽然快但一不小心就会把 0.0625 的精度弄丢HVAC 的温差控制对小数位还是有要求的。最后再分享一个小技巧调试 TCP 通信时别急着写上位机先用网络调试助手之类的工具手动发指令把主控的协议逻辑验证清楚了再开发正式的客户端。这样能把“上位机问题”和“下位机问题”分开联调阶段会顺畅很多。这套基于 TM4C129XKCZAD 和 PJ85718DM 的本地加远程温度监测方案硬件上已经跑得很稳软件上也有充足的裕量可以扩展更多功能比如接入相对湿度传感器、增加继电器输出、对接楼宇自控系统后续按需往上叠加就行。

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

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

免费获取报价 →
↑