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