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