測(cè)系統(tǒng)實(shí)戰(zhàn))
做嵌入式溫度監(jiān)測(cè)十有八九不是卡在“讀溫度”上而是卡在“把本地和遠(yuǎn)程兩路的溫度都讀準(zhǔn)、還不出幺蛾子”上。我最近用 PJ85718DM 搭配 dsPIC33FJ256GP710A 搭了一套雙通道溫度監(jiān)測(cè)系統(tǒng)同時(shí)覆蓋嵌入式設(shè)備內(nèi)部測(cè)溫與 HVAC 系統(tǒng)風(fēng)管、水管的測(cè)溫場(chǎng)景實(shí)測(cè)下來讀數(shù)穩(wěn)定、通信可靠。這套方案從選型到布線的完整思路加上我在現(xiàn)場(chǎng)踩過的坑整理出來給正在做類似項(xiàng)目的朋友做個(gè)參考尤其是那些既要管本地傳感器、又要把遠(yuǎn)端溫度拉回來的活兒應(yīng)該能幫你少走不少?gòu)澛?。先說這套東西適合誰(shuí)看如果你在做嵌入式控制板、設(shè)備內(nèi)部過熱保護(hù)、機(jī)房環(huán)境監(jiān)控或者在做風(fēng)機(jī)盤管、新風(fēng)機(jī)組、冷熱水管溫度采集這類 HVAC 項(xiàng)目手頭正好在糾結(jié)“溫度用什么芯片讀、遠(yuǎn)端數(shù)據(jù)怎么傳回來”那這篇文章基本把該說的都說到了。內(nèi)容覆蓋方案選型、硬件接口規(guī)劃、固件里的濾波與標(biāo)定、以及最常見的干擾和通信問題排查偏實(shí)戰(zhàn)不繞彎子。1. 項(xiàng)目整體設(shè)計(jì)與方案選型拆解1.1 本地溫度與遠(yuǎn)程溫度到底怎么定義很多人一上來就寫代碼讀溫度結(jié)果讀回來的是個(gè)跳來跳去的數(shù)最后才發(fā)現(xiàn)問題出在“本地”和“遠(yuǎn)程”這兩個(gè)概念的劃分上。我在這套項(xiàng)目里把溫度通道分成兩種本地溫度指設(shè)備本體或控制板所在位置的溫度。比如嵌入式控制器內(nèi)部的板溫、功率管附近的環(huán)境溫度、HVAC 現(xiàn)場(chǎng)控制箱內(nèi)的溫度。這類測(cè)溫的特點(diǎn)是傳感器離主控芯片近走線短干擾相對(duì)可控實(shí)時(shí)性要求高讀回來的值直接參與邏輯控制比如超溫保護(hù)、風(fēng)扇調(diào)速。遠(yuǎn)程溫度指通過總線或線纜從遠(yuǎn)端測(cè)點(diǎn)讀回來的溫度。比如 HVAC 系統(tǒng)里風(fēng)管內(nèi)的送風(fēng)溫度、冷凍水供水/回水溫度、室外新風(fēng)溫度或者嵌入式系統(tǒng)里布置在機(jī)柜另一側(cè)、電池組附近的測(cè)溫點(diǎn)。特點(diǎn)是傳感器距離主控遠(yuǎn)走線可能長(zhǎng)達(dá)幾十上百米中間要過端子排、橋架、強(qiáng)電干擾區(qū)信號(hào)鏈路的穩(wěn)定性比“讀得準(zhǔn)不準(zhǔn)”更關(guān)鍵。這套項(xiàng)目里PJ85718DM 承擔(dān)的是溫度采集前端的角色負(fù)責(zé)本地和遠(yuǎn)端各路溫度信號(hào)的激勵(lì)、調(diào)理、數(shù)字化轉(zhuǎn)換再通過隔離接口交給 dsPIC33FJ256GP710A 做主控處理。dsPIC33FJ256GP710A 則負(fù)責(zé)把所有溫度數(shù)據(jù)做濾波、標(biāo)定、邏輯判斷以及通過 Modbus RTU 或其他協(xié)議對(duì)外上報(bào)。簡(jiǎn)單說PJ85718DM 管“感知”dsPIC33 管“決策和通信”。1.2 為什么選 PJ85718DM 加 dsPIC33FJ256GP710A 這個(gè)組合先說 dsPIC33FJ256GP710A。這是一顆 16 位數(shù)字信號(hào)控制器主頻最高能跑到 40 MIPSFlash 有 256KBRAM 有 30KB片上外設(shè)非常齊全12 位 ADC、CAN 2.0B、雙 UART、SPI、I2C、DMA、PWM 定時(shí)器全都集成在一個(gè)封裝里。用這顆芯片做溫度監(jiān)測(cè)系統(tǒng)的主控最大的好處是“一顆芯片包圓”溫度采集后的濾波計(jì)算可以用 DSP 指令高效完成PID 溫控算法跑得動(dòng)RS-485 和 CAN 通信不用外擴(kuò)芯片甚至還能同時(shí)驅(qū)動(dòng)液晶屏或者按鍵輸入不需要再掛一顆單片機(jī)專門管邏輯。對(duì)比一下普通 8 位 MCU比如某些資源緊張的單片機(jī)做溫度監(jiān)測(cè)本身沒問題但一旦要同時(shí)處理兩路遠(yuǎn)程傳感器、做浮點(diǎn)溫度換算、跑 Modbus 協(xié)議、再留點(diǎn)余量做控制算法存儲(chǔ)空間和外設(shè)資源就開始捉襟見肘。而用更高端的應(yīng)用處理器又明顯大材小用功耗和成本都不劃算。dsPIC33FJ256GP710A 正好卡在“夠用且有余量”的位置上。再說 PJ85718DM。我這邊把 PJ85718DM 當(dāng)作一個(gè)集成式溫度采集前端模塊來用的它內(nèi)部集成了高精度 ADC、傳感器激勵(lì)源、信號(hào)調(diào)理電路和隔離通信接口。之所以不直接用主控的片上 ADC 去讀所有傳感器原因有三第一HVAC 現(xiàn)場(chǎng)傳感器線纜長(zhǎng)信號(hào)容易衰減和引入干擾PJ85718DM 這類采集前端可以在傳感器端就近完成模數(shù)轉(zhuǎn)換輸出數(shù)字信號(hào)抗干擾能力遠(yuǎn)強(qiáng)于直接傳模擬小信號(hào)。第二PJ85718DM 自帶激勵(lì)源可以適配多種傳感器類型比如 Pt100、Pt1000、NTC 熱敏電阻甚至是熱電偶換傳感器不用大改硬件電路只需要調(diào)整配置參數(shù)。第三它內(nèi)部做了隔離本地通道和遠(yuǎn)程通道、以及和主控之間都有隔離措施能徹底切斷地環(huán)路這對(duì) HVAC 現(xiàn)場(chǎng)那種動(dòng)力設(shè)備和傳感器混布的環(huán)境特別重要。說白了這個(gè)組合的思路就是把最難做的模擬前端和隔離交給專門模塊把邏輯控制、通信、算法交給 DSP 能力強(qiáng)又外設(shè)齊的主控各干各最擅長(zhǎng)的事。2. 硬件設(shè)計(jì)與接口規(guī)劃2.1 供電架構(gòu)與電源分配溫度監(jiān)測(cè)系統(tǒng)的硬件設(shè)計(jì)第一個(gè)要解決的是供電。整套系統(tǒng)在現(xiàn)場(chǎng)可能會(huì)遇到多種電源環(huán)境嵌入式機(jī)柜里通常有 24V 直流或者 5V 直流HVAC 控制柜里常見 24V AC 或者 24V DC有些地方甚至是 220V 交流經(jīng)過開關(guān)電源轉(zhuǎn)出來的。我這套方案里采用的是多級(jí)電源架構(gòu)系統(tǒng)從外部接入 24V 直流或交流先經(jīng)過一級(jí) EMI 濾波和浪涌保護(hù)再進(jìn)入隔離 DC-DC 模塊把電源分成兩個(gè)部分一個(gè)是給 dsPIC33FJ256GP710A 和本地?cái)?shù)字電路供電的 3.3V另一個(gè)是給傳感器和 PJ85718DM 前端供電的隔離電源。這里有個(gè)關(guān)鍵點(diǎn)溫度和模擬采集的供電一定要和通信接口、主控電源做隔離。如果直接共用電源遠(yuǎn)程傳感器線纜上的共模干擾會(huì)通過地線直接串進(jìn)采集電路表現(xiàn)出來就是溫度值在某個(gè)固定值附近來回跳而且跳變的幅度會(huì)隨著附近電機(jī)啟停而變化。電源分區(qū)這塊省不得。實(shí)際項(xiàng)目里我給主控用的是一顆低噪聲 LDO從 5V 降到 3.3V給數(shù)字電路供電。給模擬前端用的則是獨(dú)立的隔離 DC-DC輸出紋波控制在 50mV 以內(nèi)。電源層和地層在 PCB 上做了分割模擬地和數(shù)字地通過磁珠單點(diǎn)連接這一點(diǎn)對(duì)溫度采集的穩(wěn)定性影響非常大。2.2 本地溫度采集鏈路本地溫度采集鏈路的設(shè)計(jì)相對(duì)來說直接一點(diǎn)但直接不代表可以隨意。我的做法是本地溫度用一路 Pt100 傳感器采用三線制接法接到 PJ85718DM 的本地通道。為什么用三線制兩線制雖然省一根線但導(dǎo)線電阻會(huì)直接疊加到傳感器電阻上Pt100 在 0℃ 時(shí)是 100Ω如果線纜電阻是 2Ω溫度誤差能到 5℃ 以上這完全不可接受。三線制通過恒流源激勵(lì)加電壓檢測(cè)的接法可以自動(dòng)抵消導(dǎo)線電阻帶來的誤差線纜長(zhǎng)度在幾十米以內(nèi)基本不影響精度。PJ85718DM 內(nèi)部會(huì)完成恒流源激勵(lì)、差分放大、ADC 轉(zhuǎn)換這一整套流程主控這邊只需要通過 SPI 或 UART 讀取轉(zhuǎn)換后的數(shù)字量。這里要提醒一下讀取頻率不用太高溫度信號(hào)本身是慢變化量每秒取 5 到 10 次足夠太高反而會(huì)把干擾一起采進(jìn)來。我在固件里把采樣率設(shè)成了 8 次/秒效果比較理想。本地通道還有一個(gè)容易被忽略的細(xì)節(jié)傳感器探頭安裝位置。測(cè)嵌入式控制板的板溫時(shí)最好把探頭貼在功率器件附近的銅箔上比如 MOSFET 或者 LDO 的散熱焊盤旁邊用導(dǎo)熱膠固定而不是懸空在機(jī)箱里測(cè)空氣溫度。測(cè)空氣溫度時(shí)探頭要避開熱源直吹的方向。這個(gè)安裝細(xì)節(jié)有時(shí)候比選什么傳感器影響還大。2.3 遠(yuǎn)程溫度采集與總線設(shè)計(jì)遠(yuǎn)程溫度的采集是這套系統(tǒng)里最需要花心思的部分。我的架構(gòu)是遠(yuǎn)程測(cè)點(diǎn)部署多個(gè) PJ85718DM 前端模塊每個(gè)模塊就近接入風(fēng)管溫度傳感器和冷水管溫度傳感器通過 RS-485 總線以 Modbus RTU 協(xié)議把數(shù)據(jù)傳給 dsPIC33FJ256GP710A 主控。這樣有幾個(gè)好處一是傳感器信號(hào)不走長(zhǎng)線。溫度傳感器到采集前端的線纜可以控制在 1 到 2 米以內(nèi)傳感器輸出的小信號(hào)不會(huì)長(zhǎng)距離傳輸剩下走長(zhǎng)線的是 RS-485 差分?jǐn)?shù)字信號(hào)抗干擾能力強(qiáng)得多。二是多測(cè)點(diǎn)擴(kuò)展方便。RS-485 是總線型拓?fù)湟粭l總線最多能掛幾十個(gè)節(jié)點(diǎn)后續(xù)要增加測(cè)溫點(diǎn)只需要在總線上再掛一個(gè)前端采集模塊不需要改動(dòng)主控硬件。三是便于隔離。每個(gè) PJ85718DM 前端模塊都做隔離供電和隔離通信節(jié)點(diǎn)之間、節(jié)點(diǎn)和主控之間沒有電氣上的直接聯(lián)系某個(gè)節(jié)點(diǎn)出問題不會(huì)殃及整條總線。遠(yuǎn)程布線上有幾個(gè)細(xì)節(jié)必須做到位。RS-485 的 A/B 差分線要用屏蔽雙絞線屏蔽層在靠近主控的一端單點(diǎn)接地千萬不能兩端都接否則屏蔽層會(huì)變成地環(huán)路的一部分反而引入更大的干擾??偩€兩端要接 120Ω 終端電阻如果總線上只有一個(gè)遠(yuǎn)端節(jié)點(diǎn)那遠(yuǎn)端和主控端都要接如果節(jié)點(diǎn)掛得比較多只在物理最遠(yuǎn)的兩個(gè)端點(diǎn)接即可。實(shí)際項(xiàng)目里我遇到過不加終端電阻時(shí)通信也大體能跑但線纜稍長(zhǎng)或者有電機(jī)啟動(dòng)干擾時(shí)偶發(fā)通信錯(cuò)誤明顯增多。終端電阻加上之后信號(hào)邊沿的過沖和振鈴明顯改善長(zhǎng)時(shí)間跑下來穩(wěn)定很多??偩€波特率我設(shè)置在 9600bps這個(gè)速率在幾十米到幾百米的現(xiàn)場(chǎng)環(huán)境下可靠性最好不一定追求高速穩(wěn)定壓倒一切。3. 固件實(shí)現(xiàn)與溫度數(shù)據(jù)處理3.1 主控固件的整體結(jié)構(gòu)固件這一層我習(xí)慣先把整個(gè)系統(tǒng)的狀態(tài)機(jī)畫清楚再動(dòng)手寫代碼不然做到后面很容易亂。這套溫度監(jiān)測(cè)系統(tǒng)的固件結(jié)構(gòu)大致分四層初始化層配置系統(tǒng)時(shí)鐘、IO 口、ADC 或 SPI 接口、UART 外設(shè)、定時(shí)器、看門狗。dsPIC33FJ256GP710A 的初始化代碼量不少尤其要注意時(shí)鐘配置如果時(shí)鐘樹配錯(cuò)后面所有外設(shè)的波特率和采樣頻率都會(huì)對(duì)不上。采集層周期性從 PJ85718DM 讀取本地和遠(yuǎn)程溫度數(shù)據(jù)。讀取方式可以用 SPI 中斷或者 DMA 配合避免主循環(huán)被長(zhǎng)時(shí)間阻塞。我這邊用的是 DMA 方式數(shù)據(jù)到了自動(dòng)搬到內(nèi)存緩沖區(qū)主循環(huán)只需檢查標(biāo)志位再去處理。數(shù)據(jù)處理層對(duì)原始數(shù)據(jù)做濾波、標(biāo)定、斷線檢測(cè)、故障標(biāo)記。這個(gè)層是保證“讀數(shù)準(zhǔn)不準(zhǔn)”的核心后面專門展開講。應(yīng)用層根據(jù)溫度值做邏輯控制、超溫報(bào)警以及響應(yīng) Modbus 主站請(qǐng)求把溫度數(shù)據(jù)填到保持寄存器里供上位機(jī)讀取。架構(gòu)上要注意的一點(diǎn)采集、處理、通信盡量別放在同一個(gè)中斷里硬扛不然通信一慢或者報(bào)警一多采集周期就會(huì)抖動(dòng)溫度數(shù)據(jù)的時(shí)間戳就不準(zhǔn)了。我用的是定時(shí)器產(chǎn)生秒級(jí)心跳主循環(huán)按順序輪詢各個(gè)任務(wù)關(guān)鍵路徑上盡量不在中斷里做浮點(diǎn)運(yùn)算。3.2 溫度濾波與標(biāo)定算法的選擇溫度數(shù)據(jù)到手之后第一個(gè)要處理的問題是濾波。溫度信號(hào)屬于慢變物理量但采集鏈路里經(jīng)?;烊牍ゎl干擾、開關(guān)電源噪聲甚至電機(jī)啟停時(shí)產(chǎn)生的脈沖干擾。我實(shí)際使用中發(fā)現(xiàn)單純的平均濾波對(duì)脈沖干擾沒轍單純的中值濾波又會(huì)讓溫度響應(yīng)變慢。所以用的是“中值加滑動(dòng)平均”的組合方式每一輪采集連續(xù)采 5 個(gè)原始值先做中值濾波去掉最大的和最小的取中間 3 個(gè)值的平均作為這一輪的采樣結(jié)果。然后在內(nèi)存里維護(hù)一個(gè)長(zhǎng)度為 8 的滑動(dòng)窗口每來一輪采樣結(jié)果就更新窗口輸出窗口內(nèi)所有數(shù)的平均值。這樣組合下來對(duì)隨機(jī)噪聲和脈沖干擾都有比較好的抑制溫度響應(yīng)延遲控制在 2 到 3 秒以內(nèi)對(duì) HVAC 和嵌入式設(shè)備監(jiān)測(cè)場(chǎng)景完全夠用。核心的濾波代碼如下用的是 C直接跑在 dsPIC33FJ256GP710A 上#define FILTER_WINDOW_SIZE 8 static float history[FILTER_WINDOW_SIZE]; static uint8_t history_index 0; static uint8_t history_count 0; float temperature_filter_process(float raw_value) { float window_sum 0.0f; uint8_t i; history[history_index] raw_value; history_index (history_index 1) % FILTER_WINDOW_SIZE; if (history_count FILTER_WINDOW_SIZE) { history_count; } for (i 0; i history_count; i) { window_sum history[i]; } return window_sum / (float)history_count; }標(biāo)定環(huán)節(jié)標(biāo)準(zhǔn)做法是兩點(diǎn)標(biāo)定甚至三點(diǎn)標(biāo)定。我用的辦法是把傳感器探頭和標(biāo)準(zhǔn)溫度計(jì)一起放到恒溫槽里分別在 0℃ 附近和 80℃ 附近取兩個(gè)實(shí)測(cè)點(diǎn)算出增益和偏移量寫入到 dsPIC33FJ256GP710A 內(nèi)部 Flash 的標(biāo)定參數(shù)區(qū)。公式很簡(jiǎn)單實(shí)際溫度 原始測(cè)量溫度 × gain offset其中 gain (T2_standard - T1_standard) / (T2_raw - T1_raw)offset T1_standard - T1_raw × gain。在實(shí)際項(xiàng)目里標(biāo)定參數(shù)我建議留三組分別對(duì)應(yīng)軟件不同版本或者不同傳感器批次。因?yàn)?NTC 熱敏電阻的批次一致性比較差同一型號(hào)不同批次的電阻-溫度曲線可能有明顯差異換一批傳感器就需要換一組標(biāo)定參數(shù)。把參數(shù)放在不可輕易擦除的存儲(chǔ)區(qū)同時(shí)支持通過特定 Modbus 寄存器在線修改生產(chǎn)調(diào)試會(huì)方便很多。3.3 遠(yuǎn)程通信協(xié)議Modbus RTU 的解析與實(shí)現(xiàn)遠(yuǎn)程溫度數(shù)據(jù)從 PJ85718DM 回到主控之后主控還需要把這些數(shù)據(jù)統(tǒng)一打包給上位機(jī)或者云網(wǎng)關(guān)讀取。這套系統(tǒng)里我用的是 Modbus RTU 協(xié)議從機(jī)地址由撥碼開關(guān)設(shè)定波特率 9600bps8 數(shù)據(jù)位、1 停止位、無校驗(yàn)。寄存器映射我做了如下規(guī)劃寄存器地址內(nèi)容說明0x0000本地溫度值有符號(hào)數(shù)單位 0.1℃0x0001遠(yuǎn)程通道 1 溫度值有符號(hào)數(shù)單位 0.1℃0x0002遠(yuǎn)程通道 2 溫度值有符號(hào)數(shù)單位 0.1℃0x0003故障狀態(tài)字bit0本地?cái)嗑€bit1遠(yuǎn)程通道 1 斷線bit2遠(yuǎn)程通道 2 斷線0x0100標(biāo)定增益浮點(diǎn)數(shù)拆成兩個(gè)寄存器存放0x0102標(biāo)定偏移浮點(diǎn)數(shù)拆成兩個(gè)寄存器存放Modbus RTU 的核心是 CRC16 校驗(yàn)這一步必須自己實(shí)現(xiàn)而且要確認(rèn)和標(biāo)準(zhǔn) Modbus 的計(jì)算方式一致。實(shí)現(xiàn)的時(shí)候可以用查表法提高效率但要注意多項(xiàng)式是 0xA001。以下是實(shí)際跑過的 CRC16 代碼uint16_t modbus_crc16(uint8_t *data, uint16_t length) { uint16_t crc 0xFFFF; uint16_t i, j; for (i 0; i length; i) { crc ^ data[i]; for (j 0; j 8; j) { if (crc 0x0001) { crc (crc 1) ^ 0xA001; } else { crc crc 1; } } } return crc; }寫 Modbus 從站程序時(shí)最容易出的問題有三類一是幀超時(shí)時(shí)間沒算對(duì)導(dǎo)致把相鄰兩幀數(shù)據(jù)當(dāng)成一幀處理二是不支持功能碼或者對(duì)異常碼處理不正確三是沒有處理好廣播地址和單播地址的區(qū)別。我這邊實(shí)際使用的串口中斷處理里接收完一幀數(shù)據(jù)后會(huì)檢查幀間隔超過 3.5 個(gè)字符時(shí)間仍沒有新數(shù)據(jù)就認(rèn)為一幀結(jié)束然后才做地址匹配和 CRC 校驗(yàn)。4. 嵌入式和 HVAC 場(chǎng)景應(yīng)用要點(diǎn)4.1 嵌入式設(shè)備板級(jí)溫度監(jiān)測(cè)的關(guān)鍵細(xì)節(jié)嵌入式應(yīng)用里溫度監(jiān)測(cè)通常不是為了“看看多少度”而是為了保護(hù)設(shè)備和節(jié)能控制。我在這套系統(tǒng)上做過的幾個(gè)典型場(chǎng)景包括功率模塊過溫保護(hù)、電池倉(cāng)溫度監(jiān)測(cè)、機(jī)柜內(nèi)環(huán)境溫度監(jiān)測(cè)。板級(jí)溫度監(jiān)測(cè)要注意的是探頭布局。測(cè)功率器件時(shí)傳感器要盡量貼近發(fā)熱源最好用帶有絕緣層的 NTC 或 Pt100 探頭配合導(dǎo)熱硅膠固定。測(cè)環(huán)境溫度時(shí)探頭要避開發(fā)熱元件的熱輻射路徑放在進(jìn)風(fēng)口或者遠(yuǎn)離熱源的位置同時(shí)要考慮風(fēng)道的影響。很多嵌入式設(shè)備里風(fēng)機(jī)一轉(zhuǎn)溫度能掉好幾度這種動(dòng)態(tài)變化如果不做濾波和遲滯判斷很容易導(dǎo)致風(fēng)扇頻繁啟停。在固件層面嵌入式設(shè)備的溫度控制我一般會(huì)加遲滯區(qū)間。比如設(shè)定 60℃ 開啟風(fēng)扇55℃ 關(guān)閉風(fēng)扇中間這 5℃ 就是遲滯防止溫度在臨界點(diǎn)附近抖動(dòng)導(dǎo)致風(fēng)扇反復(fù)啟??s短風(fēng)扇壽命也增加噪聲。這個(gè)邏輯實(shí)現(xiàn)起來很簡(jiǎn)單但價(jià)值非常大尤其是 HVAC 控制箱這種無人值守環(huán)境。4.2 HVAC 系統(tǒng)溫度監(jiān)測(cè)的實(shí)施要點(diǎn)HVAC 場(chǎng)景和嵌入式設(shè)備相比最大的差異是現(xiàn)場(chǎng)環(huán)境惡劣、線纜長(zhǎng)、干擾源多、安裝位置特殊。我在這套方案里做過的應(yīng)用包括風(fēng)管溫度監(jiān)測(cè)、冷熱水管溫度監(jiān)測(cè)、新風(fēng)機(jī)組進(jìn)風(fēng)溫度監(jiān)測(cè)。風(fēng)管測(cè)溫探頭的安裝深度是一個(gè)很講究的細(xì)節(jié)。探頭要插入風(fēng)管內(nèi)部但也不能完全懸在風(fēng)管中心最好插入管徑的 1/3 到 1/2 深度這樣既不會(huì)被管壁溫度干擾也不會(huì)因?yàn)樘筋^過長(zhǎng)產(chǎn)生振動(dòng)導(dǎo)致傳感器線纜松動(dòng)。水管測(cè)溫要用帶套管的探頭套管內(nèi)要填充導(dǎo)熱硅脂確保探頭和管壁之間有良好的熱接觸同時(shí)又方便日后把探頭拔出來檢修。還有一個(gè) HVAC 現(xiàn)場(chǎng)獨(dú)有的難題是冷凝水。冷凍水管表面溫度低如果探頭安裝位置沒有做好保溫冷凝水會(huì)順著探頭線纜流到采集模塊里輕則測(cè)量不準(zhǔn)重則短路燒板。我的處理方式是在探頭出線位置做防水彎頭采集模塊安裝在高于水管的位置線纜入線口朝下進(jìn)線口做好密封。這套做法雖然土但在現(xiàn)場(chǎng)特別管用。遠(yuǎn)程通道的傳感器接線HVAC 現(xiàn)場(chǎng)也經(jīng)常藏著坑。我曾經(jīng)遇到過溫度值整體偏高的情況查了半天才發(fā)現(xiàn)是探頭線纜和動(dòng)力電纜在橋架里并行了很長(zhǎng)一段感應(yīng)電壓疊加到了傳感器信號(hào)上。后來把所有傳感器線纜換成屏蔽線屏蔽層在采集前端端接地故障立刻消失。所以說HVAC 系統(tǒng)的遠(yuǎn)程測(cè)溫很大一部分精力要花在線纜布線和抗干擾上而不是和傳感器本身較勁。5. 常見問題與排查技巧實(shí)錄5.1 溫度值跳變或者毛刺過多現(xiàn)象本地或遠(yuǎn)程溫度在正常值附近上下快速跳動(dòng)跳變幅度從零點(diǎn)幾度到好幾度不等。排查思路先確認(rèn)是不是電源問題。用示波器看采集模塊的供電電壓如果紋波偏大或者有周期性跌落優(yōu)先換低噪聲電源。再看濾波算法是不是生效了。如果原始值跳變但濾波后依然跳變說明濾波窗口太小或者有脈沖干擾超出了中值濾波的容忍范圍。檢查傳感器線纜是不是有破損或者接頭松動(dòng)?,F(xiàn)場(chǎng)振動(dòng)大的地方端子壓接不穩(wěn)會(huì)導(dǎo)致接觸電阻變化表現(xiàn)就是溫度無規(guī)律跳變。確認(rèn)是否地環(huán)路。把遠(yuǎn)程通道的屏蔽層暫時(shí)懸空如果跳變消失說明屏蔽層兩端都接地了形成了地環(huán)路。5.2 遠(yuǎn)程通信時(shí)好時(shí)壞現(xiàn)象Modbus 通信偶爾超時(shí)或者讀回來的數(shù)據(jù)偶發(fā)性錯(cuò)誤CRC 有時(shí)校驗(yàn)不過。這種問題大多出在 RS-485 總線物理層。按順序做三件事確認(rèn)兩端終端電阻是否都在檢查 A/B 線有沒有接反很多現(xiàn)場(chǎng)問題是調(diào)試時(shí)臨時(shí)接線接反了用示波器看總線波形如果信號(hào)在過零點(diǎn)附近有抖動(dòng)說明總線驅(qū)動(dòng)能力不夠或者線纜太長(zhǎng)需要降低波特率。另一個(gè)容易忽略的點(diǎn)是RS-485 收發(fā)器的 DE 和 RE 方向控制引腳時(shí)序。主控在發(fā)送數(shù)據(jù)完成后必須等發(fā)送移位寄存器真正把最后一個(gè)字節(jié)發(fā)出去才能把方向引腳切回接收模式。如果切換太早最后一個(gè)字節(jié)的尾部會(huì)被截?cái)鄬?duì)方收到幀后 CRC 校驗(yàn)必然不過。我的做法是在發(fā)送完成后加一小段延時(shí)或者等待發(fā)送緩沖區(qū)空標(biāo)志再切換方向。5.3 本地溫度標(biāo)定后仍然偏差大現(xiàn)象用標(biāo)準(zhǔn)溫度計(jì)對(duì)比標(biāo)定后還是差 1℃ 到 2℃。這種情況要區(qū)分是傳感器本身的問題還是標(biāo)定過程的問題。如果是 NTC 熱敏電阻它的電阻-溫度曲線是非線性的兩點(diǎn)標(biāo)定只能保證在兩個(gè)標(biāo)定點(diǎn)附近準(zhǔn)確中間區(qū)域會(huì)有非線性誤差。解決辦法是用查表法把傳感器廠家提供的分度表直接燒到 Flash 里用插值計(jì)算出溫度值誤差可以控制在 0.2℃ 以內(nèi)。還要注意標(biāo)定時(shí)的熱平衡。很多人把傳感器從恒溫槽拿出來立刻讀數(shù)此時(shí)探頭表面還殘留熱量讀數(shù)自然不準(zhǔn)。正確做法是每個(gè)標(biāo)定點(diǎn)至少要穩(wěn)定 10 到 15 分鐘等讀數(shù)不再變化了再記錄數(shù)據(jù)。5.4 看門狗反復(fù)復(fù)位現(xiàn)象系統(tǒng)運(yùn)行一段時(shí)間后自動(dòng)復(fù)位時(shí)間不固定看起來沒有規(guī)律。先把看門狗窗口想清楚再查干擾。dsPIC33FJ256GP710A 的配置位里有看門狗設(shè)置如果喂狗周期設(shè)置得太緊主循環(huán)稍微卡頓就會(huì)觸發(fā)復(fù)位。排查方法是把看門狗先禁掉看故障是否消失。如果消失說明是喂狗時(shí)序問題。如果禁掉看門狗后依然復(fù)位就要懷疑是電源跌落或者復(fù)位引腳干擾。檢查主控供電是不是有瞬間跌落尤其當(dāng)遠(yuǎn)程通信模塊或者繼電器同時(shí)動(dòng)作時(shí)電流沖擊可能會(huì)導(dǎo)致 3.3V 短暫跌落低于芯片復(fù)位閾值便觸發(fā)復(fù)位。解決方案是在電源輸入端加大容量?jī)?chǔ)能電容或者對(duì)繼電器等感性負(fù)載加續(xù)流吸收。寫在最后的幾點(diǎn)體會(huì)這套系統(tǒng)做完之后我最大的感受是溫度監(jiān)測(cè)這個(gè)活兒看著簡(jiǎn)單真正要在現(xiàn)場(chǎng)長(zhǎng)期穩(wěn)定運(yùn)行功夫全在硬件細(xì)節(jié)和軟件魯棒性上。很多人覺得讀個(gè)溫度有什么難的但實(shí)際項(xiàng)目里干擾、地環(huán)路、傳感器安裝、通信時(shí)序任何一個(gè)環(huán)節(jié)出問題都會(huì)讓你調(diào)上半天甚至幾天。我個(gè)人在實(shí)際項(xiàng)目中的經(jīng)驗(yàn)是三層第一層硬件上電源隔離和線纜屏蔽必須一次做對(duì)不要指望軟件濾波能把所有硬件問題都兜住第二層軟件上濾波和標(biāo)定要做好但更重要的是把斷線檢測(cè)、異常標(biāo)記這些功能做全讓故障能自動(dòng)上報(bào)而不是默默給出錯(cuò)誤溫度第三層現(xiàn)場(chǎng)安裝和接線要規(guī)范化PVC 編碼管號(hào)、端子壓接、屏蔽接地這些看著不起眼的小事才是長(zhǎng)期穩(wěn)定運(yùn)行的關(guān)鍵。這套基于 PJ85718DM 與 dsPIC33FJ256GP710A 的方案目前在我這邊已經(jīng)跑了兩個(gè)完整季度的現(xiàn)場(chǎng)一個(gè)用在嵌入式設(shè)備溫度保護(hù)一個(gè)用在小型的 HVAC 控制系統(tǒng)里整體表現(xiàn)穩(wěn)定。如果你也在做類似的事不妨按這個(gè)思路先搭一套最小系統(tǒng)跑起來后續(xù)還可以把遠(yuǎn)程溫度數(shù)據(jù)接到云平臺(tái)上做告警和趨勢(shì)分析擴(kuò)展空間也很大。