同的HVAC遠程溫度采集方案)
1. 項目要解決的核心問題本地溫度為什么不能當(dāng)遠程溫度來用接到這個項目需求時客戶的要求只有一句話在嵌入式控制板上測本地溫度同時把遠端探頭位置的溫度也測出來用于 HVAC 設(shè)備聯(lián)動。聽起來簡單可一旦細(xì)化到“本地”和“遠程”這兩個詞工程細(xì)節(jié)就完全不一樣了。距離、線纜、電磁干擾、傳感器供電、總線拓?fù)涿恳画h(huán)都可能讓溫度數(shù)據(jù)從“看著對”變成“根本沒法用”。這套方案的核心器件是 PJ85718DM 和 PIC18F85J10。PIC18F85J10 屬于高性能 8 位單片機引腳多、片上外設(shè)全適合作為整個 HVAC 控制器的主控PJ85718DM 則作為前端溫度采集模塊負(fù)責(zé)規(guī)整本地傳感器和遠程總線傳感器。把“采集溫度”這件事從前端到主控做成一條清晰通路后續(xù)的顯示、風(fēng)機控制、壓縮機啟停才有可靠的數(shù)據(jù)依據(jù)。為什么要特意區(qū)分本地和遠程因為兩者的電氣環(huán)境差別很大。本地傳感器貼著主板放線纜短、信號穩(wěn)直接用 I2C 或者 SPI 讀最快。遠程傳感器可能部署在風(fēng)管、室外機、房間角落線長幾米甚至幾十米如果用普通 I2C 拉長線時序會被線纜電容拖垮通信錯誤率猛增。這種場景必須換思路用帶收發(fā)驅(qū)動、能容忍長線傳輸?shù)目偩€方式或者是帶遠端地址的傳感器節(jié)點方案。PJ85718DM 的價值就是把這些差異封裝起來主控統(tǒng)一通過寄存器去操作底層協(xié)議的變化盡量被屏蔽。1.1 HVAC 場景里最常見的兩組溫度測點結(jié)合我實際做過的類似項目HVAC 設(shè)備的溫度測點大體可以分成兩組。第一組在主板附近比如控制板進風(fēng)口溫度、電源模塊表面溫度、通訊模塊周圍溫度。這組測點離 MCU 很近幾厘米到幾十厘米適合用板載傳感器或者 I2C 總線上掛著的小封裝傳感器。第二組則分布在需要被控溫的真實環(huán)境里比如回風(fēng)溫度、送風(fēng)溫度、室外環(huán)境溫度、管道內(nèi)溫度它們通常位于設(shè)備殼體外側(cè)甚至單獨拉線到房間中間去。第一組測數(shù)據(jù)的目的多半是保護電子硬件防止板級過熱第二組才是真正的空調(diào)控制依據(jù)。在調(diào)試現(xiàn)場我發(fā)現(xiàn)很多新手只接了一路回風(fēng)溫度就把壓縮機控制寫死了結(jié)果送風(fēng)溫度沒檢測冬天熱風(fēng)直接把房間烤過頭。設(shè)計架構(gòu)時至少要預(yù)留兩路以上遠程測點而且遠程通道要具備擴展能力方便后續(xù)增加探頭。用 PJ85718DM 做前端管理的好處是它天然自帶多通道采集邏輯把本地傳感器的輪詢和遠程傳感器節(jié)點的地址管理放在一個模塊里主控不需要頻繁中斷去處理位時序。這樣在 HVAC 主循環(huán)里溫度刷新可以做到毫秒級穩(wěn)定不太影響其他控制任務(wù)。1.2 PIC18F85J10 和 PJ85718DM 各自承擔(dān)什么角色PIC18F85J10 這顆片子最大的優(yōu)勢是資源均衡。它有充足的外部引腳可以同時接 PJ85718DM 的數(shù)字接口、LCD 顯示、按鍵、風(fēng)機調(diào)速 PWM、繼電器控制預(yù)留 UART 口做通訊調(diào)試也不顯得擁擠。片上自帶多個定時器和硬件串行外設(shè)不需要全部用 GPIO 模擬時序。如果換成一顆小封裝單片機引腳規(guī)劃和中斷優(yōu)先級就會很痛苦HVAC 這種需要多種外設(shè)協(xié)同的場景很容易翻車。PJ85718DM 在我這里扮演的是“采集前端”的角色。它可以連接若干個本地數(shù)字溫度傳感器同時管理一條遠程傳感器總線把不同物理位置的傳感器統(tǒng)一編址。主控只需通過標(biāo)準(zhǔn)寄存器接口下發(fā)指令比如“讀取 2 號通道溫度”PJ85718DM 內(nèi)部就會完成啟動轉(zhuǎn)換、等待讀數(shù)、錯誤重試最后把結(jié)果放到數(shù)據(jù)寄存器里。主控利用 I2C 或 SPI 把數(shù)據(jù)取回來就行。這種“主控前端”的分工比讓主控直接操作一堆傳感器更穩(wěn)。主要原因在于主控的工作負(fù)擔(dān)不只是讀溫度還要跑 PID 算法、處理通訊協(xié)議、驅(qū)動繼電器如果把傳感器時序細(xì)節(jié)都堆到主控里一旦線纜干擾導(dǎo)致時序重試主控實時性就會崩。PJ85718DM 擋在中間臟活累活它干了主控只拿到干凈的結(jié)果。2. 硬件鏈路搭建主控、PJ85718DM、傳感器三者怎么接2.1 系統(tǒng)拓?fù)浣Y(jié)構(gòu)整體鏈路設(shè)計上我分了三層。最底層是傳感器層包括板邊沿的本地傳感器和多處遠程探頭中間層是 PJ85718DM負(fù)責(zé)采集和總線調(diào)度最頂層是 PIC18F85J10負(fù)責(zé)控制邏輯與人機交互。鏈路的物理連接大致是這樣PIC18F85J10 通過一組 SPI 或 I2C 與 PJ85718DM 連接這屬于主控與前端模塊之間的高速內(nèi)部總線。PJ85718DM 向下本地傳感器接入其 I2C 擴展口遠程傳感器則接到它的串行總線接口上。遠程總線上可以掛多個地址不同的探頭具體數(shù)量由 PJ85718DM 的地址空間決定實際項目中我通常掛 4~8 個太多會增加輪詢周期降低實時性。有一點要明確PJ85718DM 承擔(dān)的是“采集并整理”PIC18F85J10 承擔(dān)的是“決策并使用”。溫度數(shù)據(jù)不是拿來顯示的而是用來風(fēng)機調(diào)速、壓縮機通斷、報警輸出的。因此軟件上必須把溫度讀取函數(shù)設(shè)計成同步阻塞還是異步輪詢要提前想清楚。我建議用輪詢方式因為采集周期本身只有幾十毫秒在 HVAC 這種毫秒級控制場景里阻塞幾百微秒完全可接受狀態(tài)機反而能簡化。2.2 電源、上拉電阻與布線規(guī)范硬件布線是整個項目里看似不起眼、實際上最容易出問題的部分。PJ85718DM 和傳感器的供電我建議統(tǒng)一用 3.3V 穩(wěn)壓軌前提是傳感器本身支持 3.3V。遠程探頭如果距離長則需要考慮線上壓降必要時用 5V 供電、信號接口加電平轉(zhuǎn)換。遠程傳感器在現(xiàn)場經(jīng)常遇到的問題是供電不足導(dǎo)致轉(zhuǎn)換結(jié)果偏移不是傳感器壞了而是遠端電壓跌到了傳感器的最低工作電壓以下??偩€電阻方面本地 I2C 接口上拉電阻我習(xí)慣選 4.7kΩ 到 10kΩ這要看掛載數(shù)量。但遠程總線延長之后線纜電容會變大4.7kΩ 上拉帶來的上升沿可能不夠換成 1kΩ~2.2kΩ 通常會改善。不過上拉太小會增加靜態(tài)功耗長線反射和振鈴也可能出現(xiàn)需要示波器實測。我在自動化測試平臺實測過15 米雙絞線、2.2kΩ 上拉、波特率 9600波形還比較干凈如果波特率拉到 38400 以上遠端設(shè)備基本就很難穩(wěn)定同步。在 PCB 布局上建議把 PJ85718DM 靠近 PIC18F85J10 放置中間信號線不要太長避免高速 SPI 信號形成環(huán)形天線。傳感器走線遠離繼電器和壓縮機驅(qū)動電路尤其是感性負(fù)載切換時會產(chǎn)生高壓尖峰地線處理不好會把溫度數(shù)據(jù)干擾得跳來跳去。輸出級加 RC 吸收或者壓敏電阻傳感器走線加磁珠隔離這些措施對 HVAC 現(xiàn)場設(shè)備來說不是可選項是必要項。2.3 關(guān)鍵引腳分配參考具體引腳分配上每個項目會有差異但大的思路是一致的。我提供一個實際用過的規(guī)劃作為參考PIC18F85J10 的 SPI 片選接給 PJ85718DM作為模塊的唯一控制入口另一組普通 GPIO 用于 PJ85718DM 的中斷輸出和復(fù)位控制。本地傳感器如果掛在 PJ85718DM 的 I2C 通道上這個通道僅限板內(nèi)不延伸出去遠程總線則單獨占用一組帶收發(fā)器驅(qū)動的 UART 或者專用 1-Wire 端口具體看傳感器類型。主控側(cè)的 PWM 通道預(yù)留至少兩路一路給風(fēng)機一路備用水泵或電加熱不要在后期才想起沒有多余 PWM。LCD 顯示可以用并行或 SPI 方式能省引腳就省引腳。所有預(yù)留的 UART 至少留一個給調(diào)試器用這在后期排查問題時能省大量時間。3. 軟件驅(qū)動實現(xiàn)初始化、讀取、換算和出錯重試3.1 PJ85718DM 寄存器操作流程PJ85718DM 對外的工作方式我按寄存器來理解上手會很快。模塊內(nèi)部主要有控制寄存器、狀態(tài)寄存器、數(shù)據(jù)寄存器、地址配置寄存器幾類。操作流程通常是這樣先通過 SPI 寫控制寄存器選擇要讀取的通道并啟動溫度轉(zhuǎn)換然后輪詢狀態(tài)寄存器看轉(zhuǎn)換是否完成完成后讀取數(shù)據(jù)寄存器的高低位。如果是遠程多通道節(jié)點還需要先寫通道地址再發(fā)出讀取命令等待節(jié)點返回結(jié)果。給一段我實際調(diào)試過的初始化代碼框架可以直接作為參考模板#define PJ_CS_PIN LATBbits.LATB2 #define PJ_SPI_CLK LATBbits.LATB1 #define PJ_SPI_SDO LATCbits.LATC6 void pj_write_reg(uint8_t addr, uint8_t val) { PJ_CS_PIN 0; spi_write_byte(PJ_CMD_WRITE | addr); spi_write_byte(val); PJ_CS_PIN 1; __delay_us(10); } uint8_t pj_read_reg(uint8_t addr) { uint8_t tmp; PJ_CS_PIN 0; spi_write_byte(PJ_CMD_READ | addr); tmp spi_read_byte(); PJ_CS_PIN 1; return tmp; }初始化階段我習(xí)慣先復(fù)位模塊然后讀取模塊 ID 寄存器確認(rèn)通信建立正常。這一步一定要做很多看似“傳感器讀數(shù)不對”的問題其實是主控和前端模塊之間的 SPI 時序都沒對齊地址和數(shù)據(jù)全都錯位。讀模塊 ID 等于給整套通信鏈路做一個心跳檢查雖然浪費幾個毫秒但能大大縮短硬件排錯時間。讀取溫度的邏輯我封裝成了獨立函數(shù)返回原始值和處理后的溫度值。主控主循環(huán)里只管調(diào)用這個函數(shù)不用關(guān)心底層時序。每輪采集結(jié)束把數(shù)據(jù)放到公共變量區(qū)供顯示刷新和控制算法使用。3.2 溫度數(shù)據(jù)解碼與線性換算不同的溫度傳感器原始數(shù)據(jù)格式會不一樣。比較常見的是 12 位二進制補碼單位為 0.0625°C高位字節(jié)在前低位字節(jié)在后的組織方式。真實溫度的計算公式是這樣實際溫度 (原始值 4) × 0.0625°C當(dāng)原始值為負(fù)數(shù)時需要按補碼先取反再加 1再換算。用代碼表示float temp_raw_to_celsius(int16_t raw) { float t (float)raw * 0.0625f; return t; }在 HVAC 控制里這個 0.0625°C 的精度基本夠用?,F(xiàn)場控制精度要求通常在 ±0.5°C 以內(nèi)畢竟空調(diào)系統(tǒng)本身的滯后效應(yīng)很大。如果對精度要求更高可以做兩點校準(zhǔn)。把傳感器放在冰水浴和沸水浴里記錄原始值然后建立線性校正公式把偏移和斜率修正到代碼里。批量生產(chǎn)時每個通道的校準(zhǔn)參數(shù)建議存儲在外部 EEPROM 或 PIC18F85J10 的數(shù)據(jù) EEPROM 里這樣換板不換探頭校準(zhǔn)值不丟。這里要說個容易被忽略的點溫度換算結(jié)果不要頻繁做浮點運算。主循環(huán)每 100ms 讀一次溫度每次都做浮點換算雖然單個耗時不大但累積起來會影響其他實時任務(wù)。我的做法是先把原始值保存下來只在顯示和控制計算時再做一次換算中間過程盡量用整數(shù)運算。3.3 數(shù)據(jù)校驗與異常值剔除溫度和電流、電壓不同它的變化趨勢是緩慢的正常情況下相鄰兩次采樣之間的差值不會很大。利用這個特點可以做一個簡單的異常值剔除如果某次采樣值和上一次數(shù)值之差超過閾值比如 5°C先不要立刻采用而是連續(xù)再讀兩次兩次結(jié)果互相接近才采信否則上報傳感器故障。這種軟件濾波在 HVAC 現(xiàn)場特別管用。工業(yè)環(huán)境里變頻器、接觸器吸合瞬間會產(chǎn)生強烈的電磁干擾傳感器線如果恰好靠近動力線ADC 轉(zhuǎn)換結(jié)果就可能出現(xiàn)毛刺。做過一次軟件濾波之后毛刺對控制邏輯的影響能降到很低。雖然 PJ85718DM 本身帶有一些數(shù)字濾波能力但雙保險總歸沒壞處。遠程探頭返回超時也是常見問題。PJ85718DM 在內(nèi)部會做重試但主控也應(yīng)當(dāng)在規(guī)定時間內(nèi)沒有得到結(jié)果時把該通道標(biāo)記為故障而不是一直死等。在 HVAC 設(shè)備中某個探頭掉了不能導(dǎo)致整機停機正確做法是轉(zhuǎn)用備用傳感器或固定輸出一個安全溫度值保證壓縮機不會因為缺數(shù)據(jù)而誤判斷。4. HVAC 控制邏輯把溫度值變成執(zhí)行器動作4.1 滯后比較實現(xiàn)風(fēng)機與壓縮機控制溫度采集只是手段控制動作才是目的。HVAC 控制里最常用的一招是滯后比較也叫回差控制。假設(shè)制冷模式下回風(fēng)溫度目標(biāo)值是 25°C如果探頭測得 26°C 就啟動壓縮機降到 24°C 才停止那這中間 2°C 的回差可以避免壓縮機頻繁啟停。直接用代碼判斷#define TARGET_COOL 25.0f #define HYSTERESIS 2.0f if (temp_room (TARGET_COOL HYSTERESIS / 2.0f)) { comp_on(); } else if (temp_room (TARGET_COOL - HYSTERESIS / 2.0f)) { comp_off(); }這類邏輯用文字描述很容易但放到真實設(shè)備里要結(jié)合多個溫度源。我認(rèn)為制冷模式至少要看回風(fēng)溫度和蒸發(fā)器管溫回風(fēng)溫度決定壓縮機是否運行管溫用于防止蒸發(fā)器結(jié)霜。如果只靠單一探頭夏天高濕環(huán)境很容易把蒸發(fā)器凍住然后冷風(fēng)送不出去房間溫度根本降不下來。PJ85718DM 的多通道能力在這里就體現(xiàn)出來了一個模塊接多路探頭主控算法可以綜合判斷。風(fēng)機的轉(zhuǎn)速也可以根據(jù)溫差做無級調(diào)節(jié)。溫差大時風(fēng)機高速運轉(zhuǎn)溫差接近目標(biāo)時降速既省電又安靜。具體的調(diào)速曲線我建議現(xiàn)場實測調(diào)整先把采集到的溫度通過串口打出來再對照設(shè)備實際風(fēng)速決定占空比映射。想一次性調(diào)出一個完美的 PID 參數(shù)很難從滯后控制和分段控制起步是更穩(wěn)妥的做法。4.2 遠程探頭故障時的降級策略投運一段時間后遠程探頭損壞是必然事件不是會不會壞而是什么時候壞。每路遠程通道在軟件中都應(yīng)當(dāng)有健康狀態(tài)標(biāo)志位。主控讀取失敗若干次后將故障探頭的溫度值替換成備用通道數(shù)值或者用最近一次有效值凍結(jié)。如果所有遠程探頭同時故障HVAC 設(shè)備要進入強制保護模式。壓縮機如果繼續(xù)工作而沒有溫度反饋可能導(dǎo)致蒸發(fā)器結(jié)霜或冷凝器壓力過高。實際項目中我見過因為探頭脫落壓縮機硬生生把空調(diào)凍成冰坨的情況。所以故障降級的底線是寧可停機不要瞎運行??刂七壿嬂锉仨氂忻鞔_的“無有效溫度數(shù)據(jù)則停止相應(yīng)執(zhí)行器”分支這是安全優(yōu)先級最高的一條不能因為擔(dān)心誤停機而不跳轉(zhuǎn)。5. 實測記錄架構(gòu)調(diào)整前后對比以及需要注意的事項5.1 第一版方案的失敗教訓(xùn)剛開始我圖省事讓 PIC18F85J10 直接通過 I2C 去讀板外的所有遠程傳感器傳感器節(jié)點用手工搭的電路沒有經(jīng)過 PJ85718DM 統(tǒng)一管理。樣機在實驗室里跑得很歡一到現(xiàn)場就出問題??蛻衄F(xiàn)場的強電柜距離設(shè)備不到兩米線纜長度接近十米I2C 時鐘信號變形嚴(yán)重數(shù)據(jù)讀取經(jīng)常超時偶爾還會讀出一會兒 15°C、一會兒 85°C 這種跳變值。后來把架構(gòu)改成現(xiàn)在的樣子遠程傳感器統(tǒng)一接到 PJ85718DM 管理的總線上模塊本身承擔(dān)了波形成型和重試工作主控只從模塊寄存器取結(jié)果。再把傳感器走線重新規(guī)劃避開動力線加了屏蔽層通信穩(wěn)定性和讀數(shù)一致性立竿見影。實測連續(xù)運行三天溫度波動基本保持在 0.2°C 以內(nèi)實驗室和現(xiàn)場的數(shù)據(jù)基本一致。這里也反映出一個經(jīng)驗嵌入式系統(tǒng)實驗室環(huán)境過得太順往往是因為沒有真實干擾源。溫度采集這類對噪聲敏感的功能必須在帶負(fù)載、帶線纜的條件下測試而不是只測一塊裸板。5.2 優(yōu)化前后的數(shù)據(jù)對比觀察項我整理了幾項最重要的實測觀察點落地項目時可以按這個思路去做驗證一是在滿載和空載兩種工況下分別讀取本地與遠程溫度確認(rèn)讀數(shù)不隨供電波動亂跳二是人為拔掉一路遠程探頭確認(rèn)故障標(biāo)志在 3 秒內(nèi)能上報三是用示波器觀察遠程總線波形確認(rèn)波特率和上拉匹配合理四是長時間運行監(jiān)控溫度曲線的連續(xù)性不能有周期性毛刺。用這批指標(biāo)跑數(shù)據(jù)整套系統(tǒng)是否可靠會有一個非常直觀的判斷。不要只看某一次的絕對值反而要關(guān)注變化趨勢和跳變概率。溫度采集系統(tǒng)真正難的不是測準(zhǔn)一次而是連續(xù)幾個小時穩(wěn)定可復(fù)現(xiàn)。哪個通道偶爾跳一下、哪個通道線一松就復(fù)位這些才是真問題。6. 常見問題與排查表6.1 現(xiàn)場常見故障速查現(xiàn)象可能原因檢查與處理辦法本地溫度正常遠程全部無數(shù)據(jù)遠程總線供電缺失、收發(fā)器方向控制錯誤用萬用表測探頭端電壓確認(rèn)總線使能引腳電平正確單個遠程通道讀數(shù)跳變接頭氧化、線纜過長、上拉電阻不匹配重新壓接端子縮短線纜改用雙絞屏蔽線并降低波特率讀到的溫度始終為固定值傳感器已損壞或總線地址沖突確認(rèn)傳感器地址有無重復(fù)用模塊自檢命令單點讀測壓縮機頻繁啟停溫度更新周期太慢或回差設(shè)置過小縮短輪詢周期擴大回差或者加入數(shù)據(jù)平滑上電后 PJ85718DM 通信失敗SPI 相位極性配置錯誤、復(fù)位時序不滿足對照模塊手冊確認(rèn) SPI Mode檢查復(fù)位引腳時序示波器抓波形確認(rèn)這套速查表基本把我在現(xiàn)場遇到的高頻問題都覆蓋了適合直接打印出來當(dāng)調(diào)試小抄。很多問題表面上是傳感器壞了實際是通信配置和現(xiàn)場線纜布局的問題優(yōu)先排查鏈路再懷疑器件本體。6.2 依我來看最終必須避開的坑主要在幾個地方。第一遠程傳感器線徑不要太細(xì)24AWG 以上的屏蔽線是底線太細(xì)的線不僅壓降大抗干擾能力也弱。第二主控和前端模塊之間不要用杜邦線長期跑調(diào)試可以產(chǎn)品階段必須用焊接或者壓接杜邦線氧化后接觸電阻增大偶爾會出現(xiàn)隨機通信錯誤排查起來極其痛苦。第三不要在設(shè)計里把所有通道都當(dāng)成必須在線一定要預(yù)設(shè)探頭故障路徑否則現(xiàn)場任何一個探頭失效整套設(shè)備都會跟著出問題。第四溫度校準(zhǔn)不要只在室溫做一次最好能在低溫、常溫和高溫三個點做校驗確認(rèn)傳感器在量程內(nèi)沒有明顯非線性。PIC18F85J10 的看門狗配置也值得一提。HVAC 設(shè)備要求長期無人值守運行看門狗必須開啟而且看門狗超時后要能把故障狀態(tài)記錄下來。溫度采集模塊如果在看門狗復(fù)位后沒有重新初始化會一直報錯。我習(xí)慣把“模塊重新初始化”寫進復(fù)位向量后的自檢流程里這樣即使系統(tǒng)被殺掉重啟整個采集鏈也能快速恢復(fù)。做這套系統(tǒng)最大的體會就是溫度監(jiān)測不是功能是所有 HVAC 控制決策的地基。地基想打穩(wěn)前端采集模塊要分擔(dān)復(fù)雜度主控要留足資源軟件要提前考慮異常降級。按照這個思路用 PJ85718DM 配合 PIC18F85J10 去搭整個項目的穩(wěn)定性和可維護性都會比臨時拼的電路好很多。如果后續(xù)想擴到更多測點或者改成無線采集這套框架的接口劃分也能平滑過渡不需要推翻重來。