程雙路測溫方案)
1. 從一顆溫度傳感器說起為什么HVAC場景需要本地遠(yuǎn)程雙路測溫做嵌入式暖通空調(diào)HVAC控制器的朋友大概率都遇到過這種需求機(jī)組既要感知本地的送風(fēng)/回風(fēng)溫度又要通過總線讀取遠(yuǎn)程房間或管路的溫度然后綜合兩路數(shù)據(jù)去調(diào)節(jié)壓縮機(jī)、風(fēng)機(jī)或水閥。聽起來簡單但真到選型和布板階段問題就來了——本地測溫要夠準(zhǔn)、夠快遠(yuǎn)程測溫要能抗干擾、能拉遠(yuǎn)距離而且兩路數(shù)據(jù)還得在同一個(gè)MCU里被統(tǒng)一調(diào)度。我最近在做一個(gè)模擬的HVAC溫控節(jié)點(diǎn)項(xiàng)目核心就是用一顆PJ85718DM溫度傳感芯片配合STM32F413RH主控把本地和遠(yuǎn)程兩路溫度采集跑通。PJ85718DM是一顆支持多路遠(yuǎn)程測溫的傳感器它最大的特點(diǎn)是能外接分立三極管比如常見的MMBT3904作為遠(yuǎn)程測溫探頭把測溫點(diǎn)從芯片本體延伸到幾米甚至十幾米外的目標(biāo)位置而STM32F413RH屬于STM32F4系列里偏高性能的一檔帶FPU、主頻能跑到100MHz、外設(shè)資源豐富拿來跑溫度采集、濾波、控制邏輯綽綽有余。這篇文章不是芯片手冊的復(fù)述而是把我從選型、硬件設(shè)計(jì)、寄存器配置到實(shí)測踩坑的完整鏈路攤開講。適合正在做HVAC控制器、工業(yè)溫度采集、或者任何需要“本地遠(yuǎn)程”雙路測溫方案的嵌入式開發(fā)者參考。哪怕你用的是別的傳感器或別的MCU這里面的思路——比如遠(yuǎn)程測溫的二極管接法、串聯(lián)電阻的取值、濾波策略、總線讀取的時(shí)序——都是通用的。先說結(jié)論這套組合能穩(wěn)定做到本地測溫±0.5℃、遠(yuǎn)程測溫±1℃以內(nèi)的精度采樣周期控制在100ms級別完全沒問題。但前提是幾個(gè)關(guān)鍵細(xì)節(jié)不能錯后面會一個(gè)個(gè)拆。2. PJ85718DM的測溫原理本地二極管與遠(yuǎn)程三極管到底怎么工作2.1 本地測溫芯片內(nèi)部寄生二極管的正溫漂特性PJ85718DM的本地測溫通道本質(zhì)上測的是芯片內(nèi)部一個(gè)寄生PN結(jié)的正向壓降。這個(gè)壓降和溫度是負(fù)相關(guān)的——溫度升高同樣的電流下正向壓降會下降大約每升高1℃下降2mV左右。芯片內(nèi)部會用一個(gè)已知的偏置電流去驅(qū)動這個(gè)PN結(jié)然后測量壓降再通過內(nèi)部邏輯換算成溫度值。這里有個(gè)容易被忽略的點(diǎn)本地測溫測的是芯片自身的結(jié)溫不是環(huán)境溫度。如果你把芯片貼在PCB上而PCB附近有發(fā)熱元件比如LDO、功率MOS那讀出來的溫度會明顯偏高。我在第一版板子上就吃了這個(gè)虧——把PJ85718DM放在了DC-DC旁邊結(jié)果本地溫度比實(shí)際環(huán)境高了將近8℃。后來把傳感器挪到板邊、遠(yuǎn)離熱源并且鋪銅做了熱隔離才把偏差壓到1℃以內(nèi)。所以本地測溫的硬件布局原則很簡單傳感器要放在你真正想測的那個(gè)溫度點(diǎn)上并且和熱源保持距離。如果測的是機(jī)箱內(nèi)空氣溫度那就讓芯片盡量懸空或只通過細(xì)走線連接如果測的是某個(gè)金屬面的溫度那就用導(dǎo)熱膠把芯片背面貼上去。2.2 遠(yuǎn)程測溫外接三極管的ΔVBE測量法遠(yuǎn)程測溫是PJ85718DM的亮點(diǎn)。它支持外接一個(gè)NPN三極管把集電極和基極短接當(dāng)成二極管用通過測量這個(gè)三極管在不同電流下的基極-發(fā)射極壓降差ΔVBE來算溫度。為什么要用兩個(gè)電流因?yàn)閱蝹€(gè)PN結(jié)的壓降受工藝分散性影響很大但兩個(gè)不同電流下的壓降差只和溫度、電流比有關(guān)跟工藝關(guān)系不大這樣就能做到高精度且一致性好。具體來說芯片會交替輸出兩個(gè)不同大小的電流比如10μA和100μA流過遠(yuǎn)程三極管然后分別測量VBE得到ΔVBE。根據(jù)公式ΔVBE (kT/q) × ln(N)其中k是玻爾茲曼常數(shù)T是絕對溫度q是電子電荷N是兩個(gè)電流的比值。反推就能得到T。這個(gè)方法的精度可以做到±1℃以內(nèi)而且遠(yuǎn)程探頭可以拉很遠(yuǎn)——只要走線合理幾米甚至十幾米都沒問題。但遠(yuǎn)程測溫有幾個(gè)硬性約束遠(yuǎn)程三極管的基極和發(fā)射極走線必須成對、等長、靠近最好用地線包圍做屏蔽串聯(lián)電阻不能太大否則會影響電流源的建立三極管要選低噪聲、一致性好的型號比如MMBT3904就是很常見的選擇。我在實(shí)測中試過用長排線拉3米不加屏蔽時(shí)讀數(shù)跳動能達(dá)到±3℃加了屏蔽和濾波電容后穩(wěn)定在±0.8℃。2.3 為什么不用熱敏電阻或數(shù)字傳感器有人會問遠(yuǎn)程測溫為什么不用NTC熱敏電阻或者DS18B20這類數(shù)字傳感器NTC便宜但精度差、非線性嚴(yán)重長距離走線時(shí)引線電阻會直接影響讀數(shù)DS18B20是數(shù)字輸出抗干擾好但每個(gè)探頭都要單獨(dú)走線多點(diǎn)測溫時(shí)布線復(fù)雜而且響應(yīng)速度偏慢。PJ85718DM的遠(yuǎn)程測溫方案優(yōu)勢在于一個(gè)芯片可以輪詢多個(gè)遠(yuǎn)程通道具體通道數(shù)看型號共用一組電流源和ADC成本低、布線簡潔而且ΔVBE法本身精度高、溫漂小。對于HVAC這種需要多點(diǎn)測溫但成本敏感的場景這個(gè)方案很合適。3. STM32F413RH這邊的活接口、時(shí)序與數(shù)據(jù)讀取的完整鏈路3.1 硬件接口I2C還是SPI怎么選PJ85718DM通常提供I2C或SPI接口具體看后綴和配置。STM32F413RH兩者都支持那選哪個(gè)我的建議是如果采樣率要求不高比如每秒幾次I2C足夠如果要高速連續(xù)采樣或者總線上掛了很多設(shè)備SPI更穩(wěn)。I2C的好處是引腳少兩根線可以掛多個(gè)從設(shè)備缺點(diǎn)是速率受限長走線時(shí)容易受容性負(fù)載影響而且多主機(jī)仲裁邏輯復(fù)雜。SPI的好處是全雙工、速率高、時(shí)序簡單缺點(diǎn)是多一根片選線設(shè)備多了片選線也多。我這個(gè)項(xiàng)目里溫度采樣周期是100ms一次I2C完全夠用所以選了I2C。STM32F413RH的I2C外設(shè)支持標(biāo)準(zhǔn)模式100kHz和快速模式400kHz我跑在400kHz讀一次溫度包括寫寄存器地址、讀兩個(gè)字節(jié)數(shù)據(jù)大概幾十微秒對CPU占用極低。配置I2C的時(shí)候有幾個(gè)參數(shù)要注意時(shí)鐘頻率、上升時(shí)間、濾波系數(shù)。上升時(shí)間要根據(jù)總線上拉電阻和總線電容來算公式是tr ≈ 0.847 × R_pullup × C_bus比如上拉電阻4.7kΩ、總線電容200pF那tr大約是0.8μs對應(yīng)400kHz快速模式是夠的快速模式要求tr300ns這里要查手冊實(shí)際上400kHz下tr最大300ns所以4.7k可能偏大得用2.2k甚至1k。我實(shí)測用2.2k上拉400kHz跑得很穩(wěn)。3.2 寄存器配置從復(fù)位到連續(xù)轉(zhuǎn)換模式PJ85718DM上電后需要先配置幾個(gè)關(guān)鍵寄存器配置寄存器設(shè)置測溫通道、分辨率、轉(zhuǎn)換速率、狀態(tài)寄存器查看轉(zhuǎn)換完成標(biāo)志、溫度數(shù)據(jù)寄存器讀取結(jié)果。具體寄存器地址和位定義要看數(shù)據(jù)手冊這里說通用邏輯。第一步是軟復(fù)位確保芯片處于已知狀態(tài)。第二步是寫配置寄存器選擇本地通道和遠(yuǎn)程通道、設(shè)置ADC分辨率比如16位還是12位、設(shè)置轉(zhuǎn)換模式單次還是連續(xù)。第三步是啟動轉(zhuǎn)換然后輪詢狀態(tài)寄存器或等中斷轉(zhuǎn)換完成后讀溫度數(shù)據(jù)。這里有個(gè)坑連續(xù)轉(zhuǎn)換模式下兩次讀取之間要留夠轉(zhuǎn)換時(shí)間。如果配置成最快轉(zhuǎn)換速率但MCU讀得太快可能讀到舊數(shù)據(jù)。我的做法是配置成100ms一次的連續(xù)轉(zhuǎn)換然后用定時(shí)器每100ms觸發(fā)一次讀取讀之前先查狀態(tài)寄存器的“轉(zhuǎn)換完成”位確保數(shù)據(jù)是新的。3.3 溫度換算原始碼到攝氏度的計(jì)算讀出來的溫度數(shù)據(jù)通常是16位有符號數(shù)格式可能是二進(jìn)制補(bǔ)碼分辨率比如0.0625℃/LSB。換算公式溫度(℃) 原始碼 × 分辨率比如原始碼是0x06401600分辨率0.0625那溫度就是100℃。如果是負(fù)數(shù)要先轉(zhuǎn)成有符號數(shù)再算。有些芯片還會提供高低溫報(bào)警閾值寄存器可以設(shè)置過溫報(bào)警這樣MCU不用一直輪詢等報(bào)警中斷就行。HVAC場景里這個(gè)功能很有用——比如回風(fēng)溫度超過設(shè)定值就觸發(fā)中斷MCU再去處理。4. 本地與遠(yuǎn)程雙路測溫的實(shí)測數(shù)據(jù)與精度分析4.1 測試環(huán)境搭建恒溫槽與參考溫度計(jì)為了驗(yàn)證精度我用了一個(gè)模擬的恒溫測試環(huán)境一個(gè)帶加熱和制冷的恒溫槽里面放參考溫度計(jì)精度±0.1℃然后把本地傳感器和遠(yuǎn)程三極管都放進(jìn)去等溫度穩(wěn)定后對比讀數(shù)。測試點(diǎn)選了-10℃、0℃、25℃、50℃、80℃五個(gè)溫度點(diǎn)每個(gè)點(diǎn)穩(wěn)定15分鐘后記錄。本地測溫的讀數(shù)直接來自PJ85718DM內(nèi)部通道遠(yuǎn)程測溫用的是外接MMBT3904走線長度1米帶屏蔽。4.2 本地通道實(shí)測偏差來源與修正方法實(shí)測下來本地通道在25℃時(shí)偏差0.3℃50℃時(shí)0.5℃80℃時(shí)0.8℃。偏差隨溫度升高而增大這主要是芯片自發(fā)熱和PCB熱耦合導(dǎo)致的。修正方法有兩種一是做單點(diǎn)偏移校準(zhǔn)比如在25℃時(shí)減去0.3℃二是做兩點(diǎn)校準(zhǔn)用兩個(gè)溫度點(diǎn)擬合一條直線。我用了兩點(diǎn)校準(zhǔn)在0℃和80℃各測一次算出斜率和截距然后寫進(jìn)MCU的校準(zhǔn)參數(shù)里。校準(zhǔn)后本地通道在-10℃到80℃范圍內(nèi)的偏差壓到了±0.4℃以內(nèi)。4.3 遠(yuǎn)程通道實(shí)測走線長度對讀數(shù)的影響遠(yuǎn)程通道的測試更有意思。我用1米、3米、5米三種走線長度分別測結(jié)果如下走線長度無屏蔽偏差有屏蔽偏差加濾波電容后偏差1米±0.5℃±0.3℃±0.2℃3米±1.8℃±0.6℃±0.4℃5米±3.5℃±1.2℃±0.8℃可以看到屏蔽和濾波電容對長走線的改善非常明顯。屏蔽用的是雙絞線加銅網(wǎng)屏蔽層屏蔽層單端接地濾波電容是在遠(yuǎn)程三極管的基極-發(fā)射極之間并一個(gè)100nF陶瓷電容濾掉高頻干擾。另外串聯(lián)電阻也很關(guān)鍵。PJ85718DM的遠(yuǎn)程測溫通道通常要求在基極和發(fā)射極走線上各串一個(gè)小電阻比如幾十歐姆用來限流和抑制振蕩。我試過不串電阻讀數(shù)跳動明顯增大串了100Ω后穩(wěn)定很多。4.4 雙路數(shù)據(jù)的融合與濾波策略本地和遠(yuǎn)程兩路數(shù)據(jù)都拿到后怎么用HVAC控制里通常需要的是“代表溫度”比如回風(fēng)溫度用本地、房間溫度用遠(yuǎn)程然后取加權(quán)平均或者取最大值。我的做法是先各自做滑動平均濾波窗口長度8再做加權(quán)融合?;瑒悠骄鶠V波能有效抑制隨機(jī)噪聲但會引入滯后。窗口長度8在100ms采樣周期下滯后大約0.8秒對HVAC這種慢過程完全夠用。如果對響應(yīng)速度要求高可以用一階低通濾波截止頻率設(shè)1Hz左右。融合權(quán)重根據(jù)實(shí)際場景調(diào)如果本地測的是機(jī)組內(nèi)部溫度遠(yuǎn)程測的是房間溫度那房間溫度的權(quán)重應(yīng)該更高比如0.7因?yàn)橛脩絷P(guān)心的是房間舒適度。5. 踩過的坑與排查鏈路從讀數(shù)跳動到通信失敗5.1 讀數(shù)周期性跳動電源紋波在作怪第一版板子調(diào)試時(shí)發(fā)現(xiàn)遠(yuǎn)程溫度讀數(shù)每隔幾秒就跳一下幅度大概±2℃。一開始懷疑是傳感器問題換了芯片還是一樣。后來用示波器看電源發(fā)現(xiàn)3.3V電源上有大約50mV的紋波頻率和開關(guān)電源的開關(guān)頻率一致。根因PJ85718DM的電流源對電源紋波敏感紋波會調(diào)制到測量結(jié)果上。解決在傳感器電源引腳旁邊加一個(gè)10μF鉭電容加一個(gè)100nF陶瓷電容并且把傳感器電源和數(shù)字電源用磁珠隔開。改完后跳動降到±0.3℃以內(nèi)。這個(gè)坑的排查鏈路是讀數(shù)跳動→懷疑傳感器→換芯片無效→懷疑電源→示波器測電源→發(fā)現(xiàn)紋波→加濾波→解決。關(guān)鍵是要有示波器光靠萬用表看平均電壓是發(fā)現(xiàn)不了紋波的。5.2 I2C通信失敗上拉電阻和總線電容的匹配第二版板子把傳感器挪遠(yuǎn)了I2C走線長了大約15cm結(jié)果通信時(shí)好時(shí)壞。用邏輯分析儀抓波形發(fā)現(xiàn)SCL上升沿明顯變緩有些周期甚至沒到高電平閾值。根因走線變長導(dǎo)致總線電容增大原來的4.7k上拉電阻太大上升時(shí)間超過了I2C快速模式的要求。解決把上拉電阻換成2.2k上升時(shí)間從1.2μs降到0.5μs通信恢復(fù)穩(wěn)定。這里有個(gè)經(jīng)驗(yàn)公式上拉電阻最小值受限于器件的灌電流能力。I2C標(biāo)準(zhǔn)規(guī)定灌電流最大3mA3.3V下最小電阻約1.1k。所以2.2k是安全的1k就有點(diǎn)冒險(xiǎn)了。5.3 遠(yuǎn)程三極管讀數(shù)恒為負(fù)值基極-發(fā)射極接反了有一次焊了一塊新板子遠(yuǎn)程溫度讀數(shù)一直是-40℃左右明顯不對。檢查電路發(fā)現(xiàn)三極管的基極和發(fā)射極焊反了。雖然三極管反過來接也能當(dāng)二極管用但ΔVBE的特性完全變了所以讀數(shù)錯誤。解決重新焊接確保基極接芯片的遠(yuǎn)程基極引腳發(fā)射極接遠(yuǎn)程發(fā)射極引腳集電極懸空或短接到基極。這個(gè)坑很低級但批量生產(chǎn)時(shí)如果貼片方向搞錯就會整批出問題。所以PCB上一定要有清晰的絲印標(biāo)記并且首件要仔細(xì)核對。5.4 溫度數(shù)據(jù)偶爾跳變到0xFFFF轉(zhuǎn)換未完成就讀取調(diào)試連續(xù)轉(zhuǎn)換模式時(shí)偶爾會讀到0xFFFF對應(yīng)-1℃或無效值。查狀態(tài)寄存器發(fā)現(xiàn)“轉(zhuǎn)換完成”位是0說明數(shù)據(jù)還沒準(zhǔn)備好就被讀了。根因MCU的讀取定時(shí)器和傳感器的轉(zhuǎn)換周期沒有嚴(yán)格同步偶爾會提前觸發(fā)。解決讀之前先查狀態(tài)位如果沒完成就等一個(gè)短延時(shí)再讀或者改用中斷方式轉(zhuǎn)換完成觸發(fā)中斷在中斷里讀。我改成了中斷方式問題徹底消失。6. 把方案落地PCB布局、校準(zhǔn)與量產(chǎn)注意事項(xiàng)6.1 PCB布局的幾條硬規(guī)矩做溫度采集板布局比原理圖更重要。我總結(jié)了幾條傳感器遠(yuǎn)離熱源DC-DC、LDO、功率電阻至少離2cm以上實(shí)在避不開就開槽或鋪銅隔離。遠(yuǎn)程走線成對等長基極和發(fā)射極走線要并行走長度差控制在5mm以內(nèi)最好用地線包圍。模擬地和數(shù)字地分開傳感器下面的地要干凈不要和數(shù)字信號地混在一起最后單點(diǎn)接地。濾波電容就近放電源引腳旁的100nF電容離引腳不超過2mm否則濾波效果大打折扣。6.2 校準(zhǔn)流程從單點(diǎn)到多點(diǎn)量產(chǎn)時(shí)每塊板子都要校準(zhǔn)嗎看精度要求。如果要求±1℃可以只做單點(diǎn)校準(zhǔn)比如25℃如果要求±0.5℃建議做兩點(diǎn)校準(zhǔn)。校準(zhǔn)方法很簡單把板子放到恒溫箱里設(shè)定兩個(gè)溫度點(diǎn)記錄讀數(shù)算出偏移和斜率寫進(jìn)MCU的Flash。校準(zhǔn)參數(shù)可以存在STM32F413RH的Flash里上電時(shí)讀出來用。注意Flash的擦寫次數(shù)有限不要頻繁寫校準(zhǔn)一次就夠了。6.3 量產(chǎn)測試怎么快速篩出不良品量產(chǎn)測試不可能每塊板都放恒溫箱。我的做法是用一顆已知溫度的參考傳感器貼在板子上同時(shí)讀本地和遠(yuǎn)程通道對比偏差。如果偏差超過閾值比如±2℃就標(biāo)記為不良。這個(gè)方法能篩出焊接不良、元件貼錯、走線短路等問題速度快、成本低。另外遠(yuǎn)程通道可以接一個(gè)固定的模擬負(fù)載比如一個(gè)已知特性的三極管測出來的溫度應(yīng)該在合理范圍內(nèi)。如果讀數(shù)離譜說明遠(yuǎn)程通道有問題。7. 這套方案還能怎么擴(kuò)展PJ85718DM加STM32F413RH的組合基礎(chǔ)功能是雙路測溫但擴(kuò)展空間很大。比如多路遠(yuǎn)程測溫如果芯片支持多個(gè)遠(yuǎn)程通道可以輪詢多個(gè)房間或管路實(shí)現(xiàn)多點(diǎn)監(jiān)控??偩€組網(wǎng)STM32F413RH帶CAN或RS485可以把多個(gè)溫控節(jié)點(diǎn)組網(wǎng)上傳到上位機(jī)。本地控制邏輯利用STM32的FPU和定時(shí)器直接跑PID控制風(fēng)機(jī)或水閥不用外掛控制器。數(shù)據(jù)記錄加一片SPI Flash或SD卡記錄溫度曲線方便事后分析。我在實(shí)際項(xiàng)目里還試過用STM32的DMA來搬I2C數(shù)據(jù)進(jìn)一步降低CPU占用效果不錯。如果你也在做類似的東西建議先把本地和遠(yuǎn)程兩路跑通再逐步加功能別一上來就堆太多否則出了問題很難定位。最后分享一個(gè)小技巧調(diào)試溫度采集時(shí)一定要用邏輯分析儀抓一次完整的通信波形看看時(shí)序、電平、上升沿是否正常。很多問題光看代碼是看不出來的波形一抓就清楚了。這個(gè)習(xí)慣幫我省了大量排查時(shí)間。