字溫度傳感器實現(xiàn)HVAC多點測溫的實戰(zhàn)解析)
嵌入式控溫這活兒玩久了就會發(fā)現(xiàn)一個規(guī)律需求本身永遠不復雜復雜的是把“測量”這件事在一個滿是強電干擾和溫度梯度的環(huán)境里做穩(wěn)。我之前做 HVAC 控制器時就遇到過這種問題——既要監(jiān)測主控板上芯片工作溫度又要盯壓縮機 IGBT 模塊、風機驅動電路以及風管、水管里好幾個點的溫度。最初用的是板載 NTC、外掛 NTC 加運放和 ADC 那套老方案電路占面積不說一路一路校準、一段一段查線實在煩。后來把硬件方案整體換成了 PJ85718DM 加 STM32F415RG 的組合由 PJ85718DM 完成本地和遠程溫度采樣STM32F415RG 通過 I2C/SMBus 總線把數(shù)據(jù)讀走再去做控制邏輯和上位機上報。這套組合把信號鏈大大簡化也讓我第一次覺得多點控溫這事兒可以做得既干凈又穩(wěn)。這篇文章就圍繞這個方案把原理、電路、軟件、標定和各種坑完整講一遍。1. 一個讓我頭疼的溫度監(jiān)測需求最后怎么落到 PJ85718DM 和 STM32F415RG 上1.1 為什么不用熱電偶、PT100 和一堆 NTC做 HVAC 控制的基本都繞不開溫度采集但不同場景選型思路完全不同。熱電偶測溫范圍大、耐高溫可冷端補償和調理電路麻煩精度達到 ±1°C 以內要花不少功夫PT100 精度高適合管道測溫但需要恒流源或比例電橋、運放和 ADC還得做三線制或者四線制接線成本一下子就上去了。NTC 便宜非線性明顯需要查表或做多項式擬合而且長期穩(wěn)定性不如數(shù)字方案。我這次的需求是板上溫度、功率器件結溫、水管和風管溫度誤差允許在 ±1°C 左右這不追求實驗室級精度但是要求一致性高、可重復性好、調試速度快。PJ85718DM 這一類數(shù)字溫度傳感器恰好卡在這個甜點上它把溫度敏感單元、ADC、報警邏輯和數(shù)字接口封裝在一顆芯片里外部只需要很簡單的電路就能接入 MCU每路溫度讀出來就是數(shù)字量不需要單獨校運放零漂和增益。1.2 “本地溫度”和“遠程溫度”到底有什么區(qū)別很多人第一次聽到“本地與遠程溫度”會覺得是網絡上傳遠程數(shù)據(jù)其實在 PJ85718DM 這類芯片的語境里“本地溫度”指的是芯片內部溫度傳感器測到的自身溫度一般等于芯片周圍 PCB 區(qū)域的溫度“遠程溫度”指的是芯片通過外部引腳連接的感溫二極管所在位置的溫度。這是一個非常實用的設計控制板上需要知道板內環(huán)境溫度功率器件旁邊又需要實時監(jiān)測有沒有過熱而功率器件和 MCU 往往離得比較遠。老辦法是在功率管殼上貼 NTC再用兩根引線拉回來引線上的干擾和電阻變化都會直接影響測量。PJ85718DM 的遠程測溫方式是把一個普通小信號三極管或二極管作為感溫探頭通過“雙電流激勵”的方式獲得與被測溫度成比例的信號對引線串聯(lián)電阻的敏感度很低因此可以把探頭放得比較遠這正是它在 HVAC 場景里很合適的原因。1.3 STM32F415RG 在這個系統(tǒng)里承擔什么角色STM32F415RG 做 HVAC 主控相當合適主頻夠高Flash/RAM 資源對控制邏輯和通信協(xié)議來說綽綽有余外設上有多個 I2C、SPI、UART、CAN 和以太網 MAC正好接這幾種典型需求I2C 讀溫度傳感器、RS485/CAN 和上位機或樓宇自控系統(tǒng)通信、以太網做本地數(shù)據(jù)網關。我選它的更重要理由是生態(tài)系統(tǒng)成熟HAL 庫用起來快調試工具多遇到問題查資料也方便對工程師來說這本身就是節(jié)省時間的大優(yōu)勢。2. 從信號鏈看懂 PJ85718DM 的本地與遠程測溫原理2.1 本地溫度片上帶隙和數(shù)字化邏輯PJ85718DM 的本地測溫本質上還是基于硅片的帶隙結構。半導體 PN 結正向導通電壓 Vbe 與溫度呈近似線性關系但單一 PN 結的絕對 Vbe 受工藝和電流影響很大直接測絕對 Vbe 很難做準。芯片內部采用類似“帶隙基準”的方式用不同電流密度下兩個結壓降的差值 ΔVbe 來推算溫度ΔVbe 和熱力學溫度成很好的比例關系這樣就消除了單個結絕對值的偏差和大部分工藝漂移。片上 ADC 再把模擬量轉成數(shù)字最后通過數(shù)字接口輸出。這個過程對用戶是完全透明的我們看到的寄存器值已經是經過內部校正的本地溫度。這也是我比較喜歡數(shù)字傳感器的原因硬件調理和補償隱藏在芯片內部用戶在系統(tǒng)層面少背很多鍋。2.2 遠程溫度遠程二極管測溫不是讀一個模擬電壓那么簡單遠程測溫的原理是給外部感溫二極管施加兩個不同的正向電流 I1 和 I2分別測量兩種電流下的正向壓降 V1 和 V2然后做差。理想二極管的差值滿足公式ΔV V1 - V2 ≈ (k·T / q) · ln(I1 / I2)其中 k 是玻爾茲曼常數(shù)q 是電子電荷T 是熱力學溫度。只要兩個電流比精確ΔV 就直接正比于溫度基本不依賴二極管的絕對導通壓降。正因為這個差分原理外部接線電阻、二極管型號差異帶來的影響會被大幅抵消這就是遠程溫度探頭可以做得比較遠的關鍵依據(jù)。實際工程里還要注意芯片內部會配置一個理想因子ideality factor修正系數(shù)因為真實三極管/二極管的 I-V 曲線并不是教科書里那么理想。如果遠程探頭用的是普通小信號三極管比如常見的小封裝貼片三極管通常把基極和集電極短接當成二極管使用或者直接用基極-發(fā)射極結這時芯片數(shù)據(jù)手冊里往往會給出對應的修正參數(shù)或建議型號。這里強烈建議實際選型前先看 PJ85718DM 數(shù)據(jù)手冊里關于遠程二極管非理想因子、串聯(lián)電阻補償?shù)木唧w說明不同批次、不同封裝的晶體管測量結果在極端溫度下會有可觀測的偏差。2.3 I2C/SMBus 接口和報警輸出省掉了什么老方案里 NTC 采集需要運放、ADC、基準源每一路都要校準零點PJ85718DM 把這部分全部集成掉了。它對外提供 I2C/SMBus 數(shù)字接口MCU 只需讀寄存器就能拿到兩個溫度值。另外還有報警輸出引腳常見命名如 ALERT 或 THERM當溫度超過設定閾值時可以主動通知 MCU而不用 MCU 輪詢這在 HVAC 里做壓縮機過熱保護太重要了——保護動作最好由硬件鏈路直接觸發(fā)減少軟件忙等帶來的延遲風險。SMBus 和 I2C 的區(qū)別使用時要留意SMBus 有時鐘超時機制、有 SMBALERT 報警協(xié)議、有些設備還支持 PEC 校驗PJ85718DM 如果標注為 SMBus 兼容寫驅動時就要考慮這些特性不能直接把普通 I2C 讀寫一套照搬到底。3. 硬件怎么搭STM32F415RG 與 PJ85718DM 的接口設計和 PCB 細節(jié)3.1 最小系統(tǒng)連接和 I2C 上拉電阻的取值邏輯連接本身不復雜PJ85718DM 的 VDD 接 3.3VGND 接地SDA 和 SCL 分別接到 STM32F415RG 的 I2C 引腳兩個引腳都要經上拉電阻到 3.3VALERT/THERM 輸出經一個上拉電阻接 MCU 的外部中斷輸入。如果有多顆 PJ85718DM 掛在同一條總線上地址引腳要按手冊配置成不同電平避免地址沖突。上拉電阻阻值不是隨手選的。I2C 上拉電阻和總線電容共同決定信號上升沿時間總線電容越大、目標通信速率越高需要的上拉電阻就越小。常見取值是 10kΩ 用于低速 100kbps 短距離4.7kΩ 用于 400kbps 板內通信2.2kΩ 用于總線電容偏大或者速率更高的場景。但電阻也不能太小否則灌電流過大影響低電平標準。我一般以手冊給定上升時間和實際示波器測量為準最終在干擾和功耗之間取平衡。// 以 STM32 HAL 庫為例初始化 I2C1 I2C_HandleTypeDef hi2c1; hi2c1.Instance I2C1; hi2c1.Init.ClockSpeed 400000; // 400kbps hi2c1.Init.DutyCycle I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 0; hi2c1.Init.AddressingMode I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode I2C_DUALADDRESS_DISABLE; HAL_I2C_Init(hi2c1);3.2 遠程感溫二極管和長走線的布線要點PJ85718DM 的遠程測溫引腳一般只有兩根線常見的 D 和 D-或者叫 DXP/DXN。這兩根線的布線質量直接決定遠程溫度讀數(shù)穩(wěn)定性。理想做法是走成一對差分走線周圍用地包住避免和 PWM 驅動線、繼電器控制線平行布放如果需要把探頭拉到幾十厘米甚至一米外用雙絞線或者屏蔽線更穩(wěn)妥屏蔽層最好單端接地。這里有個容易踩的坑有人會在遠程二極管兩端加一個大電容濾波理由是“濾掉干擾”。結果經常發(fā)現(xiàn)溫度讀數(shù)跳動甚至錯誤。原因是遠程測溫靠電流切換和快速電壓采樣引腳電容太大時電流建立過程變慢芯片在尚未穩(wěn)定時采樣讀出來的差值就不是真實 ΔVbe。所以濾波電容要特別注意如果一定要加盡量只加幾十皮法級別的小電容并參照數(shù)據(jù)手冊給出的最大值不要憑感覺加大。3.3 HVAC 強電環(huán)境里的隔離、ESD 和防護HVAC 設備往往同時存在 220V/380V 強電、壓縮機啟動電流、繼電器觸點火花、變頻器 PWM 輸出這些都會對低壓數(shù)字電路造成干擾。溫度傳感器芯片和 MCU 一般放在同一邊風險評估主要是三塊第一遠程探頭是否穿越強電區(qū)域如果走線太長且靠近強電要采取屏蔽和防浪涌措施第二I2C 總線不要直接引出到外部接口避免外部插拔時的靜電打壞芯片第三如果探頭必須放在電氣隔離的另一側不要簡單地把遠程二極管兩根線直接飛過去因為隔離兩側地電位不同容易出現(xiàn)共模問題。更穩(wěn)妥的是在探頭側用一個小隔離變送器或者在總線上用數(shù)字隔離器但要注意隔離器的時序延遲能否滿足 I2C 時序要求。4. 驅動代碼把寄存器讀出來的原始數(shù)據(jù)變成人話4.1 I2C 初始化與 SMBus 時序適配STM32F415RG 的 I2C 外設可以直接操作 7 位地址讀寫。PJ85718DM 這類傳感器一般支持多字節(jié)讀寫驅動核心就是寫配置寄存器、讀溫度寄存器。如果你的項目嚴格走 SMBus還需要關注最小端口時序、從機超時SMBus 規(guī)定時鐘低超時 25ms 左右要復位以及 PEC 字節(jié)。用 STM32 的硬件 I2C 時它通常不自動做 SMBus 超時檢測這時要么在軟件里加超時重試要么改用 SMBus 主機模式的功能層次要搞清楚。4.2 讀取本地和遠程溫度的代碼骨架下面的代碼是一個去寄存器具體細節(jié)的骨架實際使用時必須對照 PJ85718DM 數(shù)據(jù)手冊的寄存器表和位定義調整#define PJ85718DM_I2C_ADDR (0x4C 1) // 示例地址實際看 A0/A1 引腳 #define REG_CONFIG 0x01 // 示例配置寄存器 #define REG_CONV_RATE 0x04 // 示例轉換速率寄存器 #define REG_TEMP_LOCAL 0x00 // 示例本地溫度數(shù)據(jù)寄存器 #define REG_TEMP_REMOTE 0x01 // 示例遠程溫度數(shù)據(jù)寄存器 #define REG_ALARM_LIMIT_REMOTE 0x10 // 示例遠程高溫報警閾值 float read_local_temp(void) { uint8_t buf[2] {0}; HAL_I2C_Mem_Read(hi2c1, PJ85718DM_I2C_ADDR, REG_TEMP_LOCAL, I2C_MEMADD_SIZE_8BIT, buf, 2, 100); int16_t raw (int16_t)((buf[0] 8) | buf[1]); // 常見左對齊 16 位字分辨率 0.0625°C實際按手冊換算 return (float)raw * 0.0625f; } float read_remote_temp(void) { uint8_t buf[2] {0}; HAL_I2C_Mem_Read(hi2c1, PJ85718DM_I2C_ADDR, REG_TEMP_REMOTE, I2C_MEMADD_SIZE_8BIT, buf, 2, 100); int16_t raw (int16_t)((buf[0] 8) | buf[1]); return (float)raw * 0.0625f; }需要注意遠程溫度寄存器在高低溫邊界可能出現(xiàn)特殊標志位比如短路或開路診斷位讀的時候不要只取溫度數(shù)據(jù)最好同時檢查狀態(tài)位避免把錯誤數(shù)據(jù)喂給控制邏輯。4.3 報警閾值、PEC 校驗和總線恢復報警閾值寄存器可以設置本地/遠程的高低限超過后 ALERT 引腳拉低MCU 通過外部中斷進入保護流程。HVAC 里最常見的用法是給壓縮機 IGBT 模塊設置一個高溫閾值超溫直接降低載頻或停機。寫閾值時要注意比較邏輯是“大于等于”還是“大于”以及有多少度回差hysteresis設置不當會在閾值附近反復觸發(fā)報警。SMBus PEC 校驗邏輯不復雜對讀寫命令和數(shù)據(jù)進行多項式 CRC-8 計算附加在數(shù)據(jù)末尾。如果單片機比較老、處理不過來也可以不做 PEC但要做好抗干擾措施。我在實際項目里通常會加總線錯誤恢復I2C 通信返回 HAL_ERROR 或讀回全 FF 時先把總線釋放再拉幾個時鐘脈沖讓從機釋放 SDA最后重新初始化。void recover_i2c_bus(void) { // 釋放 SDA/SCL HAL_I2C_DeInit(hi2c1); // 模擬 9 個時鐘脈沖讓卡住的從機釋放 SDA for (int i 0; i 9; i) { HAL_GPIO_WritePin(SCL_PORT, SCL_PIN, GPIO_PIN_RESET); HAL_Delay(1); HAL_GPIO_WritePin(SCL_PORT, SCL_PIN, GPIO_PIN_SET); HAL_Delay(1); } HAL_I2C_Init(hi2c1); }4.4 濾波、轉換速率與功耗即使硬件布局沒問題溫度數(shù)據(jù)讀出來之后直接用于 PID 控制還是會有小幅抖動。芯片內部一般有采樣平均但溫度變化慢外部再做一次軟件濾波很劃算。我用一階 IIRy[n] α · x[n] (1 - α) · y[n-1]α Ts / (τ Ts)Ts 是采樣周期τ 是濾波時間常數(shù)。比如采樣 100ms希望溫度環(huán)響應時間 1sτ 取 0.5sα≈0.167。這個公式比簡單滑動窗口更適合嵌入式只需要兩個變量。JSON 存儲、梯形規(guī)劃這些花活都用不上濾波算法簡單可靠最重要。5. 標定與驗證讀出數(shù)字不是終點數(shù)據(jù)準才是硬道理5.1 系統(tǒng)級標定流程數(shù)字溫度傳感器出廠前已經校準過但出廠校準是在理想條件下做的實際 PCB 上的熱傳導路徑、探頭導熱硅脂厚度、裝配方向和外部長線都會引入系統(tǒng)偏差。因此產品階段一定要做系統(tǒng)級標定把整個傳感器組件放進能提供穩(wěn)定溫度環(huán)境的裝置里比如恒溫槽、冰水混合物、恒溫箱甚至一段可以控制水溫的管路等溫度穩(wěn)定后記錄下來和標準溫度計讀數(shù)的偏差。常見做法是至少選兩個校準點低溫點 0°C 或 10°C高溫點 50°C 或 60°C通過線性修正temp_comp (temp_raw - offset) · gain得到 offset 和 gain 后寫進 MCU 的 Flash。如果擔心非線性可以在三個溫度點做分段校正。需要特別注意校準點必須和傳感器實際工作狀態(tài)一致比如通電穩(wěn)定一段時間后再校否則自熱效應對標定結果的影響很大。5.2 長線、功率發(fā)熱和接觸熱阻帶來的誤差遠程測溫對引線串聯(lián)電阻不敏感是它的優(yōu)勢但距離長了總會有邊界。首先是遠程端感溫二極管本身的封裝熱阻和接觸熱阻如果二極管只是貼在散熱器表面而不是埋在功率模塊內部測到的是外殼溫度不是真正的結溫這之間可能有幾十度差距。其次是自熱效應激勵電流流過二極管會產生微小功耗如果探頭連接線散熱很差讀數(shù)會被抬高一點點。再就是 PCB 上傳感器的擺放位置不要把它貼著電源開關管或變壓器否則“本地溫度”會被局部熱點拉高失去環(huán)境溫度的代表性。5.3 一組實測數(shù)據(jù)下面這組數(shù)據(jù)是我在一個模擬 HVAC 控制板上跑出來的參考溫度由恒溫槽里的標準溫度計給出PJ85718DM 讀值經過程序里的兩點校準和后端濾波測試點參考溫度 °C本地讀值 °C遠程讀值 °C偏差 °C冰點0.00.2-0.10.2 / -0.1室溫25.025.125.30.1 / 0.3水管環(huán)路45.045.245.40.2 / 0.4恒溫箱上限60.060.159.70.1 / -0.3遠程探頭用的是一根大約 50cm 的雙絞線線兩端的接頭壓接緊固。結果在 ±0.5°C 以內對這個應用已經足夠。如果發(fā)現(xiàn)偏差趨勢一致優(yōu)先查校準參數(shù)如果偏差隨機跳動優(yōu)先查接線、屏蔽和濾波設置。6. 從 demo 到 HVAC 產品幾個典型場景的接法6.1 壓縮機 IGBT 結溫監(jiān)測這是遠程測溫最值得用的場景。IGBT 模塊內部或表面放一個感溫二極管PJ85718DM 的遠程通道實時讀它的溫度報警閾值設為例如 100°C一旦超限MCU 先降載頻仍壓不住就封鎖 PWM 輸出。硬件上要注意 IGBT 開關噪聲比較強遠程引線必須遠離功率走線軟件上建議采用“硬件報警中斷周期查詢兜底”的雙保險避免單路中斷失效導致保護不動作。6.2 風管和水管多點溫度監(jiān)測一套中央空調或精密空調往往有好幾個測點送風溫度、回風溫度、冷凍水供水溫度、回水溫度。一顆 PJ85718DM 只有一路本地加一路遠程不夠時可以在同一條 I2C 總線上并聯(lián)多顆芯片每顆芯片接一路遠程探頭地址通過地址引腳區(qū)分。這樣多路探頭最終都匯聚到 STM32F415RGMCU 再通過 RS485 Modbus 或 CAN 把溫度數(shù)據(jù)上報給樓宇控制系統(tǒng)。多芯片并聯(lián)要注意總線電容累加。每顆傳感器都會給 SDA/SCL 增加一點負載芯片數(shù)量多了傳輸距離遠了400kbps 就跑不穩(wěn)這時候要么降速到 100kbps要么把總線分成兩路分別掛在 MCU 的不同 I2C 外設上。6.3 和 MCU 其他功能整合STM32F415RG 讀到的溫度值最終要服務于控制策略壓縮機頻率根據(jù)冷凝管溫做前饋電子膨脹閥根據(jù)過熱度調節(jié)風機轉速根據(jù)溫度變化率調整。溫度數(shù)據(jù)不只是拿來顯示的所以驅動層的更新頻率要匹配控制環(huán)路的帶寬。HVAC 系統(tǒng)溫度變化通常以秒計我一般用 100ms 到 500ms 的采樣周期濾波時間常數(shù)按照控制需求設置不會讓控制環(huán)去追溫度噪聲否則執(zhí)行器會一直在抖動。7. 踩坑實錄這些坑我替你先踩了一遍7.1 遠程二極管接反和虛焊遠程二極管的極性很容易接反。D/D- 反接時常見現(xiàn)象是讀數(shù)非常離譜比如顯示 -50°C 或者檢測到開路標志。接線端子比較小虛焊也會造成時好時壞。排查時先用萬用表二極管擋確認探頭極性再檢查焊接點。如果芯片還提供了遠程二極管短路/開路診斷狀態(tài)一定先讀狀態(tài)寄存器比單純看溫度值直觀得多。7.2 I2C 總線被強電干擾整掛有一次我把 I2C 排線從控制板拉到顯示板路過一段繼電器區(qū)域結果繼電器一動作整條總線就卡死讀出來的數(shù)據(jù)全是 0xFF。根因就是兩件事并存一是排線沒有屏蔽繼電器觸點火花耦合進來二是軟件沒有做總線恢復。解法是把 I2C 走線改到遠離繼電器的路徑增加屏蔽地并在每次通信失敗后執(zhí)行總線恢復流程。對于必須過敏感區(qū)域的信號寧可加一個 I2C 緩沖器/電平轉換器也不要裸奔。7.3 SMBus 超時和 PEC 校驗的噩夢標準 I2C 總線沒有超時機制但 SMBus 從機可能在某些異常狀態(tài)下鎖住總線。PJ85718DM 這類芯片如果同時兼容 SMBus在高速率下偶發(fā)通信失敗時MCU 很容易因為缺少超時檢測而卡死在等待應答狀態(tài)。解決辦法是 HAL 讀寫函數(shù)的超時時間不要設太長并且失敗后先做總線恢復再做重試。如果項目數(shù)據(jù)可靠性要求高占用帶寬也不在乎就把 SMBus PEC 打開這個字節(jié)能攔住大部分單比特翻轉。7.4 上電順序和初始化時序STM32F415RG 上電初始化速度比傳感器快第一次讀溫度往往發(fā)生在 PJ85718DM 還沒有完成內部自檢的時候讀回來的是無效初始值。正確做法是等傳感器上電穩(wěn)定后先讀一次 ID 或配置寄存器確認它回應正確了再正式讀寫如果在不可靠環(huán)境下配置寄存器里的轉換速率和報警閾值應該在每次上電時都重寫一遍而不是依賴寄存器的掉電保持能力。這些坑說穿了都不復雜但它們集中出現(xiàn)在 HVAC 這種強電與弱電混合、溫度變化快、現(xiàn)場條件惡劣的環(huán)境里。一個環(huán)節(jié)沒兜住就可能出現(xiàn)“實驗室好用、裝機翻車”的尷尬。我現(xiàn)在做類似方案時已經把遠程探頭極性檢查、I2C 總線自動恢復、上下電重新初始化配置這幾件事固化到測試流程里了。把這幾點守住PJ85718DM 加 STM32F415RG 這套組合在嵌入式和 HVAC 溫度監(jiān)測上是能省很多心的。