程溫度傳感器:嵌入式與HVAC兩路測(cè)溫的完整設(shè)計(jì))
過(guò)去一年多我在三個(gè)產(chǎn)品上做過(guò)同一件事用一顆低功耗 MCU 加一顆帶遠(yuǎn)程通道的溫度傳感器把本地溫度和遠(yuǎn)端溫度一起讀準(zhǔn)再按周期送出去。三塊板子分別是某項(xiàng)目的 HVAC 控制面板、一個(gè)電機(jī)驅(qū)動(dòng)器和一張電池管理檢測(cè)子卡測(cè)溫對(duì)象雖然完全不同但骨架完全一樣——PJ85718DM 負(fù)責(zé)把本地溫度與遠(yuǎn)端探頭的溫度變成數(shù)字量STM32L021K4 負(fù)責(zé)在大部分時(shí)間里休眠只按周期醒來(lái)取數(shù)、校準(zhǔn)、上報(bào)。如果你正在做嵌入式溫度監(jiān)測(cè)或者想給 HVAC 的控制器加一路遠(yuǎn)程測(cè)溫這篇應(yīng)該能幫你省掉不少?gòu)澛?。下面我把這套設(shè)計(jì)從需求、電路、固件到聯(lián)調(diào)細(xì)節(jié)完整捋一遍包括我在實(shí)際調(diào)試中踩過(guò)的幾個(gè)坑能避一個(gè)是一個(gè)。1. 這套組合要解決什么本地與遠(yuǎn)程測(cè)溫的兩個(gè)典型場(chǎng)景1.1 嵌入式里的遠(yuǎn)程溫度和 HVAC 里的遠(yuǎn)程溫度不是一回事在寫(xiě)代碼之前先把概念捋清楚。嵌入式系統(tǒng)里說(shuō)的本地溫度通常指?jìng)鞲衅魉?PCB 附近的環(huán)境溫度或者機(jī)箱內(nèi)部溫度遠(yuǎn)程溫度則指放在遠(yuǎn)處測(cè)溫對(duì)象里的測(cè)溫二極管比如電源管理芯片、功率器件模塊內(nèi)部的襯底二極管。這類(lèi)二極管并沒(méi)有封裝成傳感器只是芯片里引出來(lái)的一對(duì)引腳需要專(zhuān)門(mén)的測(cè)溫 IC 去激勵(lì)和讀取。HVAC 行業(yè)對(duì)兩個(gè)詞的理解略不同。本地溫度一般指控制器所在柜體內(nèi)的空氣溫度遠(yuǎn)程溫度指安裝在風(fēng)管、送風(fēng)口、回風(fēng)口或管道表面的探頭讀數(shù)探頭和控制器之間可能隔著 1 到 10 米線(xiàn)纜。HVAC 的遠(yuǎn)程強(qiáng)調(diào)的是距離和現(xiàn)場(chǎng)安裝條件而不單純指半導(dǎo)體二極管。這兩種場(chǎng)景放在一起看共性非常清楚都需要兩路測(cè)溫一路在板子上一路在別處都需要較低的系統(tǒng)功耗因?yàn)?HVAC 控制器和嵌入式設(shè)備經(jīng)常長(zhǎng)期通電待機(jī)都需要盡可能免標(biāo)定、讀數(shù)穩(wěn)定、抗現(xiàn)場(chǎng)干擾。PJ85718DM 正好把本地和遠(yuǎn)程兩個(gè)通道做在一顆芯片里MCU 只需要通過(guò) I2C 讀寄存器不需要自己搭二極管激勵(lì)電路。這就是整套設(shè)計(jì)的出發(fā)點(diǎn)。1.2 為什么不用兩路 NTC 或 MCU 內(nèi)置 ADC 直接采NTC 便宜HVAC 里非常常見(jiàn)但每個(gè)探頭都有 B 值和精度離散性批量生產(chǎn)時(shí)要逐個(gè)標(biāo)定或者接受比較寬的誤差。MCU 內(nèi)置 ADC 直采還要處理參考電壓、自熱、走線(xiàn)串?dāng)_如果板子上還有 PWM、繼電器、變頻電機(jī)模擬采樣的抗干擾成本并不低。遠(yuǎn)程二極管測(cè)溫的核心優(yōu)勢(shì)在于測(cè)的是兩個(gè)電流下的 ΔVBE 壓差二極管絕對(duì)壓差的離散偏移被抵消所以探頭一致性好。數(shù)字接口 I2C 比長(zhǎng)距離模擬線(xiàn)好處理雖然 I2C 本身不適合拉 10 米但把模擬前端從探頭搬到傳感器芯片里之后探頭到芯片只要兩根短線(xiàn)或雙絞線(xiàn)芯片到 MCU 又是標(biāo)準(zhǔn)數(shù)字總線(xiàn)校準(zhǔn)和故障定位都方便得多。如果你是做純 HVAC、遠(yuǎn)端探頭距離 5 米以上、產(chǎn)品標(biāo)定流程已經(jīng)很成熟NTC 方案依然好用但如果你想要免標(biāo)定、兩路同時(shí)采、還要兼顧嵌入式里那種二極管測(cè)溫需求這套方案的優(yōu)勢(shì)就體現(xiàn)出來(lái)了。這不是誰(shuí)替代誰(shuí)的問(wèn)題是看你的探頭形態(tài)和生產(chǎn)流程更匹配哪條路。1.3 為什么是 PJ85718DM STM32L021K4而不是別的排列組合PJ85718DM 從型號(hào)定位來(lái)看屬于本地加遠(yuǎn)程兩通道的數(shù)字溫度傳感器I2C 接口地址可配置帶關(guān)斷或單次轉(zhuǎn)換模式。一顆芯片干完兩個(gè)通道的活BOM 簡(jiǎn)單軟件上也不用面對(duì)兩片傳感器的地址和時(shí)序協(xié)調(diào)問(wèn)題。STM32L021K4 這邊LQFP32 封裝適合中小批量板子16 KB Flash 跑一個(gè)溫度采集狀態(tài)機(jī)足夠供電從 1.65V 到 3.6V對(duì)電池和 3.3V 系統(tǒng)都友好stop 模式電流不到 1 μA配合低功耗定時(shí)器可以做到秒級(jí)喚醒采集。Cortex-M0 核心雖然沒(méi)有硬件浮點(diǎn)但溫度換算只是乘一個(gè) 0.0625 的常數(shù)軟浮點(diǎn)完全感覺(jué)不到負(fù)擔(dān)。如果換用普通 Cortex-M0 加獨(dú)立遠(yuǎn)程測(cè)溫 IC要多管一片 I2C 總線(xiàn)和一路使能信號(hào)如果換用帶豐富模擬前端的高端 MCU成本又上去了。選這套組合本質(zhì)上是把模擬前端和低壓低功耗 MCU兩個(gè)問(wèn)題分別交給最合適的器件各管一段出了問(wèn)題排查面也窄。2. 從傳感器到 MCU 的電路細(xì)節(jié)供電、地址、上拉與現(xiàn)場(chǎng)保護(hù)2.1 PJ85718DM 的供電、地址與報(bào)警腳設(shè)計(jì)先交代最基礎(chǔ)的連接。PJ85718DM 的 VDD 我習(xí)慣直接接 3.3V電源引腳旁邊放一個(gè) 100 nF 陶瓷電容緊貼引腳稍遠(yuǎn)一點(diǎn)再并一個(gè) 1 μF如果傳感器和 MCU 用同一個(gè)電源域上電時(shí)序問(wèn)題基本不存在。GND 引腳底下記得鋪地別讓 I2C 走線(xiàn)穿過(guò)繼電器或者加熱器區(qū)域。地址引腳 ADDR 接 GND 或 VDD 可以換來(lái)不同的 7 位 I2C 地址。按這類(lèi)器件的常見(jiàn)映射默認(rèn)地址可能是 0x48ADDR 接 VDD 后變成 0x49具體以手冊(cè)為準(zhǔn)。板子上如果只有這一顆傳感器地址不用搞復(fù)雜固定接死就行但如果一個(gè)系統(tǒng)里掛多顆ADDR 的幾種接法就要在原理圖階段規(guī)劃清楚別等 PCB 回來(lái)了才發(fā)現(xiàn)地址撞了。ALERT 腳是開(kāi)漏輸出我一般接一個(gè) 10 kΩ 上拉到 3.3 V再連到 MCU 的一個(gè)普通 GPIO。如果你的系統(tǒng)不打算用中斷方式處理溫度越限這顆腳也可以完全不接軟件輪詢(xún)寄存器就夠了。真正要注意的是 ALERT 腳的配置模式這個(gè)后面在踩坑部分會(huì)詳細(xì)講。2.2 本地通道與遠(yuǎn)程通道的接法本地通道不需要任何外部元件傳感器內(nèi)部自帶測(cè)溫結(jié)。板上布局時(shí)注意離發(fā)熱元件遠(yuǎn)一點(diǎn)如果把它貼在電源旁邊讀出來(lái)的就不是環(huán)境溫度而是局部受熱溫度。很多現(xiàn)場(chǎng)問(wèn)題其實(shí)從這里就埋下了。遠(yuǎn)程通道按用途分兩種接法。嵌入式場(chǎng)景里遠(yuǎn)程測(cè)溫對(duì)象通常是目標(biāo)芯片內(nèi)部的襯底二極管直接把傳感器的 D/D- 兩個(gè)引腳連到目標(biāo)芯片的測(cè)溫引腳即可走線(xiàn)盡量短兩個(gè)引腳之間不要跨過(guò) PWM 輸出或高頻信號(hào)線(xiàn)。HVAC 場(chǎng)景里遠(yuǎn)程通道需要把一個(gè) PN 結(jié)封裝成獨(dú)立探頭推薦用二極管接法的 PNP 小信號(hào)三極管發(fā)射極接 D基極和集電極短接后接 D-。這個(gè)接法符合多數(shù)遠(yuǎn)程測(cè)溫 IC 的電流方向約定雙絞線(xiàn)引到控制器線(xiàn)長(zhǎng)控制在手冊(cè)標(biāo)稱(chēng)范圍內(nèi)。極性一定不能接反接反了讀數(shù)會(huì)直接變成亂碼或者明顯錯(cuò)誤裝機(jī)前先用萬(wàn)用表確認(rèn)一遍。2.3 I2C 上拉電阻的計(jì)算與電平匹配I2C 是開(kāi)漏總線(xiàn)必須有上拉電阻。上拉阻值取決于總線(xiàn)電容和時(shí)鐘頻率公式是R_pullup ≤ t_rise / (0.8473 × C_bus)同時(shí)還要保證從機(jī)在拉低時(shí)能滿(mǎn)足低電平輸出要求。實(shí)際計(jì)算起來(lái)不用太精確按經(jīng)驗(yàn)值選就好總線(xiàn)電容100 kHz 推薦400 kHz 推薦100 pF4.7 kΩ ~ 10 kΩ2.2 kΩ ~ 4.7 kΩ200 pF3.3 kΩ ~ 4.7 kΩ1.5 kΩ ~ 2.2 kΩ板子上的走線(xiàn)很短總線(xiàn)電容通常在 100 pF 以下所以我量產(chǎn)設(shè)計(jì)里 100 kHz 用 4.7 kΩ100 kHz 是首選。HVAC 現(xiàn)場(chǎng)電磁環(huán)境差低速總線(xiàn)本身抗干擾能力就更好沒(méi)有必要為了快那一點(diǎn)去跑 400 kHz。電平匹配方面PJ85718DM 和 STM32L021K4 都用 3.3 V 供電時(shí)不存在問(wèn)題但如果傳感器是 5 V 供電的版本就要考慮開(kāi)漏上拉到 3.3 V 還是 5 V以及 MCU 引腳是否容忍 5 V。用同一個(gè)電壓域是最省事的我這邊全按 3.3 V 設(shè)計(jì)。2.4 HVAC 現(xiàn)場(chǎng)保護(hù)電路探頭線(xiàn)進(jìn)柜子之前做的事HVAC 現(xiàn)場(chǎng)最怕兩件事雷擊感應(yīng)和變頻器傳導(dǎo)干擾。探頭線(xiàn)進(jìn)入控制柜之后我會(huì)在傳感器之前加一級(jí)保護(hù)D/D- 之間并一顆雙向 TVS對(duì)地也加 TVS再串一個(gè) 1 kΩ 左右的限流電阻靠近傳感器引腳放。電源線(xiàn)上加磁珠I2C 走線(xiàn)盡量短而直。線(xiàn)纜屏蔽層的接地也有講究。屏蔽雙絞線(xiàn)的屏蔽層應(yīng)該在控制器側(cè)單端接地不要兩端都接否則會(huì)形成地環(huán)路反而把干擾引進(jìn)系統(tǒng)。我見(jiàn)過(guò)不少現(xiàn)場(chǎng)案例讀數(shù)周期性跳動(dòng)最后查出來(lái)就是屏蔽層兩端都接了地。另外提醒一句I2C 總線(xiàn)不適合像 RS485 那樣長(zhǎng)距離掛一堆節(jié)點(diǎn)。如果 HVAC 系統(tǒng)里有多路遠(yuǎn)程探頭更合理的做法是每路探頭配一顆帶遠(yuǎn)程通道的傳感器芯片然后通過(guò) RS485 或 Modbus 匯總到主控不要在一條 I2C 上硬拉 10 米。3. STM32L021K4 固件I2C 讀取、校準(zhǔn)與低功耗調(diào)度3.1 初始化引腳復(fù)用、時(shí)鐘和 I2C 參數(shù)固件這邊我按 HAL 庫(kù)來(lái)寫(xiě)因?yàn)?STM32L021K4 的資源有限用 HAL 反而省心。先初始化 GPIOSCL 用 PB6SDA 用 PB7復(fù)用為開(kāi)漏輸出內(nèi)部上拉關(guān)掉因?yàn)橥獠恳呀?jīng)有 4.7 kΩ 上拉。然后初始化 I2C1__HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_I2C1_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct {0}; GPIO_InitStruct.Pin GPIO_PIN_6 | GPIO_PIN_7; GPIO_InitStruct.Mode GPIO_MODE_AF_OD; GPIO_InitStruct.Pull GPIO_NOPULL; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, GPIO_InitStruct); hi2c1.Instance I2C1; hi2c1.Init.ClockSpeed 100000; 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);這里有兩個(gè)容易忽略的點(diǎn)。第一速度等級(jí)不要選太高低速 GPIO 配合 100 kHz 時(shí)鐘足夠還能減少邊沿噪聲第二I2C 時(shí)鐘頻率我建議直接定 100 kHz現(xiàn)場(chǎng)穩(wěn)定遠(yuǎn)比速度重要調(diào)試的時(shí)候再臨時(shí)切 400 kHz 測(cè)性能也不遲。3.2 讀溫度寄存器的時(shí)序與代碼這類(lèi)溫度傳感器的標(biāo)準(zhǔn)讀法是一樣的先寫(xiě)寄存器指針再讀數(shù)據(jù)。以讀本地溫度為例先把指針指向溫度寄存器然后連讀兩個(gè)字節(jié)uint8_t reg 0x00; uint8_t rx[2] {0}; HAL_I2C_Master_Transmit(hi2c1, PJ85718DM_ADDR, reg, 1, 50); HAL_I2C_Master_Receive(hi2c1, PJ85718DM_ADDR, rx, 2, 50); int16_t raw (int16_t)((uint16_t)(rx[0] 8) | rx[1]); float temperature (float)raw * 0.0625f;其中 0.0625 是這類(lèi)器件常見(jiàn)的溫度分辨率因?yàn)閮?nèi)部 ADC 是 12 位最高位是符號(hào)位每位代表 0.0625°C。注意這里的符號(hào)處理必須先轉(zhuǎn)成 signed 16 位再做乘法否則后面全是負(fù)數(shù)處理問(wèn)題。寄存器具體是 12 位左對(duì)齊還是右對(duì)齊不同器件不同以手冊(cè)為準(zhǔn)如果手頭的寄存器格式和示例不同把移位邏輯調(diào)整一下就行整體流程不變。遠(yuǎn)程通道的讀法完全一樣只是寄存器指針不同。代碼層面建議把寫(xiě)指針 讀兩字節(jié) 換算溫度封裝成一個(gè)函數(shù)本地和遠(yuǎn)程各調(diào)一次別在主循環(huán)里裸寫(xiě) I2C 事務(wù)。3.3 遠(yuǎn)程通道的校準(zhǔn)與偏移處理遠(yuǎn)程測(cè)溫的原理是利用二極管在不同電流下的正向壓降差ΔVBE (kT/q)·ln(N)其中 N 是兩個(gè)激勵(lì)電流的比值。這個(gè)公式的好處是把二極管的絕對(duì)壓降消掉了所以探頭一致性很好但二極管理想因子和線(xiàn)阻仍然會(huì)帶來(lái)偏差所以遠(yuǎn)程通道多少要做一點(diǎn)校準(zhǔn)。我的校準(zhǔn)方法是兩點(diǎn)線(xiàn)性插值。先在 25°C 恒溫環(huán)境讀遠(yuǎn)程通道記錄偏差 delta1再在 60°C 恒溫環(huán)境讀一次記錄偏差 delta2。固件里保存這兩個(gè)點(diǎn)實(shí)際讀數(shù)出來(lái)后做線(xiàn)性補(bǔ)償float calibrate_remote(float raw_temp) { // T125, T260, offset1/offset2 由實(shí)測(cè)得到 float slope (offset2 - offset1) / (T2 - T1); return raw_temp (raw_temp - T1) * slope offset1; }本地通道通常做一個(gè)固定偏移就夠了因?yàn)樗钠钪饕欠庋b和貼片應(yīng)力引起的線(xiàn)性度本身不錯(cuò)。遠(yuǎn)程通道如果現(xiàn)場(chǎng)線(xiàn)長(zhǎng)是固定的兩點(diǎn)校準(zhǔn)之后偏差可以壓到 ±1°C 以?xún)?nèi)對(duì) HVAC 控制來(lái)說(shuō)足夠了。3.4 低功耗調(diào)度1 秒周期上報(bào)平均電流怎么算系統(tǒng)大部分時(shí)間應(yīng)該待在 stop 模式用 LPTIM 或 RTC 產(chǎn)生 1 秒喚醒。喚醒后做三件事讀兩個(gè)通道、校準(zhǔn)換算、寫(xiě) UART 或 RS485 上報(bào)然后回到 stop。PJ85718DM 如果有關(guān)斷或單次轉(zhuǎn)換模式讀完立即切過(guò)去它能省下的電流可能比 MCU stop 電流還大。平均電流可以這樣估算假設(shè)每次喚醒后運(yùn)行 5 ms運(yùn)行態(tài)整鏈路電流約 1.2 mA休眠 995 msMCU stop 加傳感器關(guān)斷合計(jì)約 1.2 μA。那么一秒鐘的電荷消耗大約是 1200 μA × 0.005 s 1.2 μA × 0.995 s ≈ 7.2 μA·s平均電流就是 7 μA 左右。這個(gè)量級(jí)對(duì)電池供電的嵌入式監(jiān)測(cè)設(shè)備很友好。如果你想把平均電流再壓下去把上報(bào)周期從 1 秒拉到 5 秒或 10 秒平均電流能降到 2 μA 以下但 HVAC 控制回路一般需要 1 秒以?xún)?nèi)的采樣率所以我在 HVAC 項(xiàng)目里堅(jiān)持用 1 秒在電池監(jiān)測(cè)項(xiàng)目里才用更長(zhǎng)周期。4. 聯(lián)調(diào)時(shí)踩過(guò)的幾個(gè)坑死鎖恢復(fù)、線(xiàn)阻誤差與數(shù)據(jù)處理4.1 總線(xiàn)死鎖傳感器把 SDA 拉低不放手第一次遇到這個(gè)現(xiàn)象時(shí)我以為上拉電阻焊壞了拆了又焊焊了又拆折騰了快一天。現(xiàn)象是這樣的程序跑一段時(shí)間后I2C 總線(xiàn)的 SDA 一直為低MCU 復(fù)位也沒(méi)用必須整板斷電才能恢復(fù)。這類(lèi)溫度傳感器帶 SMBus 風(fēng)格的總線(xiàn)協(xié)議如果主機(jī)在錯(cuò)誤時(shí)序下多發(fā)了時(shí)鐘或者從機(jī)以為主機(jī)還在讀數(shù)據(jù)它就可能一直把 SDA 拉低形成死鎖。恢復(fù)方法其實(shí)很簡(jiǎn)單用 GPIO 模擬 SCL 連續(xù)翻轉(zhuǎn) 9 個(gè)時(shí)鐘讓從機(jī)釋放 SDA然后再發(fā)一個(gè) STOP。代碼上就是在 I2C 引腳切換成普通 GPIO 后手動(dòng)拉高拉低 SCL。更重要的還是預(yù)防。每個(gè) I2C 事務(wù)都加超時(shí)判斷不要無(wú)限等 HAL 回調(diào)讀數(shù)據(jù)時(shí)先寫(xiě)寄存器指針再讀確保持久事務(wù)之間的 STOP/RESTART 行為符合手冊(cè)要求。另外如果 ALERT 引腳被誤配成了比較器模式且閾值不合理它也可能一直把某個(gè)引腳拉低讓你誤以為是總線(xiàn)問(wèn)題。4.2 遠(yuǎn)程線(xiàn)纜線(xiàn)阻與濾波電容造成的讀數(shù)偏差現(xiàn)場(chǎng)反饋遠(yuǎn)程探頭讀數(shù)比實(shí)際高 1 到 2°C實(shí)驗(yàn)室里怎么都復(fù)現(xiàn)不了后來(lái)發(fā)現(xiàn)是 3 米雙絞線(xiàn)的線(xiàn)阻在作怪。遠(yuǎn)程二極管測(cè)溫會(huì)把線(xiàn)阻上的壓降也計(jì)入 ΔVBE線(xiàn)越長(zhǎng)、線(xiàn)越細(xì)正偏差越大。解決辦法有兩個(gè)方向一是現(xiàn)場(chǎng)條件允許就換粗一點(diǎn)的屏蔽雙絞線(xiàn)并確認(rèn) D/D- 的壓降在手冊(cè)允許范圍內(nèi)二是用傳感器自帶的線(xiàn)阻補(bǔ)償或者 offset 寄存器把這個(gè)系統(tǒng)性偏差消掉。但要提醒一句補(bǔ)償值是對(duì)固定線(xiàn)長(zhǎng)有效的如果現(xiàn)場(chǎng)線(xiàn)長(zhǎng)不固定最好在安裝說(shuō)明里規(guī)定最長(zhǎng)線(xiàn)纜規(guī)格讓每個(gè)項(xiàng)目的補(bǔ)償條件一致。另一個(gè)坑是濾波電容。為了抗干擾我在 D/D- 之間并了 100 nF結(jié)果讀數(shù)開(kāi)始漂。原因是激勵(lì)電流切換后電容充放電會(huì)干擾 ADC 的采樣時(shí)機(jī)。這類(lèi)遠(yuǎn)程通道的抗干擾應(yīng)該靠芯片內(nèi)部濾波和雙絞線(xiàn)本身外部并電容要非??酥莆易詈蟀讶葜到档?1 nF 以?xún)?nèi)才穩(wěn)定。4.3 符號(hào)位與分辨率負(fù)數(shù)溫度別讀成 4046°C有次凌晨收到現(xiàn)場(chǎng)消息說(shuō)溫度顯示 4046°C我第一反應(yīng)是探頭短路了。排查到最后原因很簡(jiǎn)單某次讀到原始值 0xFCE0按 uint16 計(jì)算是 64736乘 0.0625 就是 4046°C而正確的處理是先轉(zhuǎn)成 int160xFCE0 對(duì)應(yīng)的有符號(hào)值是 -800再乘 0.0625 才是 -50°C。這個(gè)問(wèn)題在 0°C 以下的制冷場(chǎng)景很容易踩。不同器件的寄存器格式差別很大有的是 12 位左對(duì)齊有的是右對(duì)齊有的帶符號(hào)擴(kuò)展位。我建議把字節(jié)轉(zhuǎn)溫度的代碼集中在一個(gè)函數(shù)里把所有位數(shù)、符號(hào)、縮放邏輯都寫(xiě)清楚業(yè)務(wù)層只認(rèn) float 溫度值不要在多個(gè)地方各自移位。如果你用 Modbus 上報(bào)還要注意協(xié)議層的符號(hào)約定。常見(jiàn)做法是溫度乘以 10 后以 int16 上報(bào)那么 -5.0°C 就是 -50接收端再除以 10。這一步看起來(lái)簡(jiǎn)單但發(fā)送端和接收端只要有一邊忘了縮放現(xiàn)場(chǎng)調(diào)試就會(huì)多耗半天。4.4 報(bào)警腳、中斷風(fēng)暴與地址沖突ALERT 腳如果不打算用硬件中斷最安全的做法是在初始化時(shí)把芯片配置成中斷模式并讓主機(jī)輪詢(xún)狀態(tài)寄存器來(lái)清標(biāo)志或者干脆關(guān)閉報(bào)警功能只靠軟件閾值。如果誤用比較器模式閾值設(shè)置不合理ALERT 會(huì)一直拉低和總線(xiàn)死鎖癥狀一模一樣很容易誤導(dǎo)排查方向。多傳感器場(chǎng)景下地址沖突是原理圖階段就該解決的問(wèn)題。上電初始化時(shí)先掃描一遍 I2C 地址確認(rèn)每個(gè)地址都能讀到預(yù)期器件 ID再進(jìn)入正常運(yùn)行讀不到就報(bào)故障而不是用默認(rèn)溫度繼續(xù)跑。HVAC 里如果溫度信號(hào)丟失還按正常溫度控制風(fēng)機(jī)和閥門(mén)就會(huì)按錯(cuò)誤邏輯動(dòng)作后果比報(bào)警本身嚴(yán)重得多。5. 實(shí)測(cè)數(shù)據(jù)與落地部署從實(shí)驗(yàn)室到 HVAC 現(xiàn)場(chǎng)5.1 實(shí)驗(yàn)室驗(yàn)證恒溫箱與鉑電阻參考固件寫(xiě)得差不多之后我做了三輪驗(yàn)證。方法不復(fù)雜把整個(gè)測(cè)試板放進(jìn)恒溫箱遠(yuǎn)程探頭通過(guò) 2 米 24AWG 雙絞線(xiàn)引出箱外再放回箱內(nèi)模擬現(xiàn)場(chǎng)走線(xiàn)穩(wěn)定 30 分鐘后同時(shí)讀本地通道、遠(yuǎn)程通道和鉑電阻參考值。數(shù)據(jù)大概是這樣恒溫箱設(shè)定鉑電阻參考本地通道遠(yuǎn)程通道25.0°C25.03°C25.01°C25.05°C45.0°C44.96°C45.02°C44.91°C70.0°C69.94°C69.98°C70.11°C本地通道最大偏差 0.07°C遠(yuǎn)程通道經(jīng)過(guò)兩點(diǎn)校準(zhǔn)后最大偏差約 0.15°C這個(gè)精度對(duì) HVAC 和嵌入式保護(hù)用途都足夠。需要說(shuō)明的是這只是我自己測(cè)試板的個(gè)別數(shù)據(jù)不能代表芯片全溫區(qū)指標(biāo)量產(chǎn)項(xiàng)目還是要按批量抽檢方式做統(tǒng)計(jì)。5.2 HVAC 場(chǎng)景控制柜加管道探頭現(xiàn)場(chǎng)環(huán)境比實(shí)驗(yàn)室殘酷得多。某項(xiàng)目的控制柜裝在機(jī)房角落風(fēng)管探頭在 3 米外中間還過(guò)了兩個(gè)彎。柜內(nèi)本地溫度實(shí)測(cè) 38°C風(fēng)管里的遠(yuǎn)程溫度只有 24.5°C。如果把控制邏輯只看本地溫度系統(tǒng)會(huì)一直以為環(huán)境過(guò)熱而加大制冷實(shí)際風(fēng)管側(cè)早就達(dá)標(biāo)了加入遠(yuǎn)程通道作為控制變量后閥門(mén)的動(dòng)作才合理。安裝層面的心得是探頭不能貼在風(fēng)管保溫層外面那測(cè)的是環(huán)境溫度不是管道溫度D/D- 極性裝機(jī)前必須確認(rèn)屏蔽層接柜內(nèi)大地不接傳感器地探頭線(xiàn)不要和 220V 動(dòng)力線(xiàn)走同一個(gè)線(xiàn)槽。這些都是現(xiàn)場(chǎng)沒(méi)人會(huì)替你保證的細(xì)節(jié)寫(xiě)進(jìn)安裝手冊(cè)最靠譜。5.3 嵌入式場(chǎng)景電機(jī)驅(qū)動(dòng)器與電池管理監(jiān)測(cè)另一個(gè)項(xiàng)目是電機(jī)驅(qū)動(dòng)器功率模塊內(nèi)部有測(cè)溫二極管用同一顆 PJ85718DM 的遠(yuǎn)程通道去讀。實(shí)測(cè)遠(yuǎn)程結(jié)溫 87.5°C 時(shí)本地通道看到的 PCB 空氣溫度只有 52°C。這個(gè)溫差很正常但也說(shuō)明了一個(gè)問(wèn)題如果你的保護(hù)邏輯用的是板載溫度實(shí)際功率結(jié)溫可能已經(jīng)超限了。這類(lèi)場(chǎng)景里D/D- 走線(xiàn)盡量短在 PCB 上走差分形式遠(yuǎn)離 PWM 輸出和功率走線(xiàn)。我做過(guò)一次調(diào)整把遠(yuǎn)程通道的兩根線(xiàn)從功率管旁邊拉開(kāi) 2 mm讀數(shù)穩(wěn)定度立刻改善。電池管理子卡上也類(lèi)似遠(yuǎn)程通道貼在電芯表面用來(lái)做充放電溫度保護(hù)讀取周期可以放到 5 秒平均電流非常低。5.4 數(shù)據(jù)送出去串口、Modbus 與本地記錄溫度讀出來(lái)總要送出去才有意義。HVAC 項(xiàng)目里我把 STM32L021K4 的 USART 接了一顆 RS485 收發(fā)器跑 Modbus RTU 上報(bào)本地溫度和遠(yuǎn)程溫度分別映射到兩個(gè)保持寄存器單位是 0.1°C。代碼里只有一行關(guān)鍵轉(zhuǎn)換uint16_t reg_local (uint16_t)(int16_t)(local_temp * 10.0f); uint16_t reg_remote (uint16_t)(int16_t)(remote_temp * 10.0f);嵌入式場(chǎng)景更簡(jiǎn)單直接 UART 輸出文本幀或者二進(jìn)制幀給主控。如果主控資源緊張可以在 STM32L021K4 的 Flash 里做一個(gè)環(huán)形緩沖保存最近 100 條記錄報(bào)警前后各留 20 條方便事后分析。這套固件狀態(tài)機(jī)很小16 KB Flash 完全裝得下我最后還塞了一個(gè)簡(jiǎn)單的自檢邏輯上電時(shí)確認(rèn)寄存器能讀寫(xiě)才進(jìn)入主循環(huán)。最后聊一個(gè)我自己的習(xí)慣每次拿到新批次 PJ85718DM我會(huì)先做一次 25°C 和 60°C 的兩通道復(fù)測(cè)把偏差寫(xiě)進(jìn)固件里的偏移表而不是依賴(lài)生產(chǎn)環(huán)節(jié)做滿(mǎn)板標(biāo)定。這樣批量焊接后的分布很穩(wěn)定現(xiàn)場(chǎng)出問(wèn)題的概率小很多。這套架構(gòu)真正省心的地方在于傳感器把模擬前端處理掉了MCU 只做數(shù)字搬運(yùn)和時(shí)機(jī)調(diào)度剩下的就是對(duì)閾值和濾波邏輯的持續(xù)打磨了。祝一次過(guò)。