
1. 項目緣起與整體設計思路1.1 為什么偏偏選中這兩顆芯片先交代一下這個項目的來龍去脈。我手上有一個便攜式數(shù)據(jù)采集終端的活兒設備需要鋰電池供電、支持USB充電、還要給主控、傳感器、顯示屏、無線模塊分別供不同的電壓。早期版本我用的是分立方案一顆充電IC加一顆DC-DC再加兩三顆LDO板子上電源部分占了將近三分之一的面積BOM表拉出來十幾行調(diào)試的時候光是上電時序就折騰了我一個禮拜。后來痛定思痛決定換成集成度更高的PMIC方案最終鎖定了PCA9422這顆電源管理芯片主控則沿用我一直很順手的PIC18F86J15。PCA9422是一顆面向低功耗便攜設備的電源管理IC內(nèi)部集成了線性充電器、多路可配置的降壓和線性穩(wěn)壓輸出還帶I2C接口可以動態(tài)調(diào)壓和讀取狀態(tài)。選它的核心理由有三條第一集成度高一顆芯片把充電、系統(tǒng)供電、多路外設供電全包了板子面積直接砍掉一半第二I2C可編程電壓和上電時序都能通過寄存器配置不用改硬件就能適配不同批次的物料第三靜態(tài)功耗低對電池續(xù)航敏感的設備來說這點很關鍵。PIC18F86J15則是一顆經(jīng)典的8位MCU128KB Flash、近4KB RAM外設資源豐富I2C、SPI、UART、ADC一應俱全工作電壓范圍寬工業(yè)級溫度范圍也扛得住。它和PCA9422搭配的好處是MCU本身就能通過I2C直接管理電源芯片不需要額外的橋接芯片整個電源管理邏輯全部在固件里實現(xiàn)靈活度極高。提示選PMIC的時候一定要先確認它的輸出電壓檔位和你的負載需求是否匹配。PCA9422的輸出檔位是固定的幾檔可選不是任意電壓都能出選型階段就要把每一路負載的電壓需求列清楚。1.2 整體電源架構(gòu)是怎么搭的這個項目的電源架構(gòu)可以分成三層來理解。第一層是能量輸入層包括USB 5V輸入和鋰電池PCA9422內(nèi)部集成了充電管理負責把USB的電充進電池同時在有USB的時候優(yōu)先用USB供電。第二層是電壓轉(zhuǎn)換層PCA9422把電池電壓典型3.0V到4.2V轉(zhuǎn)換成系統(tǒng)需要的各路電壓包括一路給MCU的3.3V、一路給傳感器的1.8V、一路給顯示屏的2.8V等等。第三層是監(jiān)控與控制層PIC18F86J15通過I2C總線讀取PCA9422的狀態(tài)寄存器獲取電池電壓、充電狀態(tài)、各路輸出是否正常等信息并根據(jù)這些信息做出決策比如低電量時關閉顯示屏背光、充滿電后切換充電模式等。這個架構(gòu)最大的好處是軟硬解耦。硬件上電源部分就是一個標準模塊軟件上所有電源策略都在MCU固件里改策略不用動烙鐵。我后來給客戶做定制版本的時候只是改了幾行配置寄存器的值硬件一版沒動就交付了這在分立方案時代是不可想象的。1.3 設計階段踩過的幾個坑設計初期我犯了一個典型錯誤想當然地認為PMIC的上電時序可以完全靠硬件默認值搞定。結(jié)果樣機回來發(fā)現(xiàn)MCU的3.3V和傳感器的1.8V幾乎同時上電傳感器在MCU還沒完成初始化的時候就輸出了數(shù)據(jù)導致I2C總線被拉低MCU啟動失敗。后來查手冊才發(fā)現(xiàn)PCA9422的各路輸出上電順序是可以通過寄存器配置的但默認值并不一定適合你的負載。這件事給我的教訓是PMIC的上電時序必須在上電之前就想清楚不能等出了問題再補。另一個坑是I2C總線的上拉電阻。PCA9422的I2C接口和MCU的I2C接口電平標準一致但總線電容如果太大上拉電阻選小了會導致上升沿太陡產(chǎn)生振鈴選大了又會導致上升沿太緩通信失敗。我最后用示波器實測了波形把上拉電阻定在4.7k總線速率降到100kHz才穩(wěn)定下來。這個后面在實操部分會詳細講。2. 核心細節(jié)解析與實操要點2.1 PCA9422的寄存器配置邏輯PCA9422的寄存器大致可以分成幾類充電控制寄存器、輸出電壓配置寄存器、上電時序寄存器、狀態(tài)寄存器、中斷寄存器。每一類都有它自己的配置邏輯不能混著來。充電控制寄存器主要管充電電流、充電截止電壓、充電使能這些。這里有個細節(jié)充電電流不是隨便設的要根據(jù)電池容量來算。一般鋰電池的充電電流建議在0.5C到1C之間比如1000mAh的電池充電電流設在500mA到1000mA之間比較合適。設太大了電池發(fā)熱嚴重壽命縮短設太小了充電時間太長用戶體驗差。PCA9422的充電電流是分檔可調(diào)的具體檔位要看手冊我一般選中間檔兼顧速度和發(fā)熱。輸出電壓配置寄存器管各路輸出的電壓值。這里要注意的是不是所有輸出都能獨立調(diào)壓有些是固定檔位有些是跟主輸出聯(lián)動的。配置之前一定要把每一路負載的電壓范圍和最大電流列成表格然后對照手冊的檔位表逐一匹配。我見過有人把1.8V的傳感器接到3.3V輸出上上電就冒煙了這種低級錯誤其實在配置階段就能避免。上電時序寄存器是我認為最容易被忽視但最重要的部分。它決定了各路輸出誰先誰后、間隔多久。一般的規(guī)則是先給MCU供電等MCU穩(wěn)定后再給外設供電如果有模擬電路模擬部分要最后上電避免數(shù)字噪聲干擾。PCA9422支持給每路輸出配置獨立的啟動延遲這個功能一定要用起來。2.2 PIC18F86J15的I2C驅(qū)動要點PIC18F86J15的I2C外設叫MSSP模塊用起來不算復雜但有幾個坑要注意。首先是時鐘配置I2C的時鐘頻率由SSPADD寄存器決定計算公式是SSPADD (Fosc / (4 * Fscl)) - 1。假設MCU跑16MHz想要100kHz的I2C速率SSPADD就是(16M / (4 * 100k)) - 1 39。這個值算錯了通信肯定失敗而且失敗的時候不一定報錯可能只是數(shù)據(jù)錯亂很難查。其次是中斷處理。I2C通信如果用電平中斷在從設備拉低時鐘的時候容易反復進中斷我一般用邊沿觸發(fā)或者干脆用輪詢方式。輪詢雖然效率低一點但在這個項目里I2C通信不是高頻操作輪詢完全夠用而且邏輯簡單不容易出bug。還有一個細節(jié)是PCA9422的I2C地址。它的地址不是固定的有幾位是可以通過硬件引腳配置的這意味著同一塊板子上可以掛多顆PCA9422。如果你的板子上只有一顆地址引腳接地或接VCC都行但一定要在代碼里寫清楚不然換一批板子地址變了就抓瞎了。2.3 上電時序的配置實例我拿實際項目里的配置舉個例子。這個設備有三路主要負載MCU3.3V、傳感器1.8V、顯示屏2.8V。我的上電順序是MCU先上電延遲10ms后傳感器上電再延遲20ms后顯示屏上電。為什么是這個順序因為MCU要先完成初始化才能去配置傳感器傳感器穩(wěn)定輸出后MCU才能去讀數(shù)據(jù)顯示屏最后上電是因為它啟動電流大放在最后可以避免和其他負載搶電流導致電壓跌落。在PCA9422里這個時序是通過給每路輸出配置不同的啟動延遲來實現(xiàn)的。具體寄存器地址和位定義這里不展開但配置的邏輯是先使能MCU那一路設置延遲為0再使能傳感器那一路設置延遲為10ms對應的檔位最后使能顯示屏那一路設置延遲為30ms對應的檔位。配置完之后一定要實測波形用示波器同時抓三路輸出的上升沿確認順序和間隔符合預期。注意上電時序配置完之后建議在固件里加一個自檢邏輯讀取PCA9422的狀態(tài)寄存器確認各路輸出都正常如果有異常就通過串口或LED報錯。這個自檢邏輯在批量生產(chǎn)的時候能幫你篩掉不少硬件不良品。2.4 低功耗模式的實現(xiàn)細節(jié)這個項目對功耗有要求待機電流要控制在100微安以內(nèi)。PCA9422支持多種低功耗模式PIC18F86J15也有休眠模式兩者要配合使用。我的做法是系統(tǒng)空閑時MCU先通過I2C把不需要的外設輸出關掉然后自己進入休眠PCA9422在檢測到I2C總線空閑一段時間后自動進入低功耗模式只保留MCU那一路輸出的待機供電。這里有個關鍵點MCU休眠后怎么喚醒我用的是PCA9422的中斷輸出引腳把它接到MCU的外部中斷引腳上。當電池電壓低于閾值、或者有USB插入、或者有按鍵按下的時候PCA9422產(chǎn)生中斷MCU被喚醒然后通過I2C讀取狀態(tài)寄存器判斷喚醒源再決定下一步動作。這個機制比MCU定時輪詢要省電得多因為MCU大部分時間都在休眠只有事件發(fā)生時才醒來。實測下來這套低功耗機制把待機電流從原來的2mA降到了80微安左右效果非常明顯。但調(diào)試過程中也踩了坑一開始中斷引腳沒有配置上拉導致誤觸發(fā)頻繁MCU反復被喚醒功耗反而更高了。后來加了外部上拉電阻并在固件里加了中斷去抖邏輯才穩(wěn)定下來。3. 實操過程與核心環(huán)節(jié)實現(xiàn)3.1 硬件設計與焊接要點PCB布局方面PCA9422的外圍元件不多但有幾個地方不能馬虎。輸入電容和輸出電容要盡量靠近芯片引腳走線要短而粗減少寄生電感。電感的選擇要根據(jù)輸出電流和開關頻率來定我一般選4.7微亨到10微亨之間的屏蔽電感飽和電流要留足余量至少是最大輸出電流的1.5倍。I2C總線的走線要等長遠離電感和開關節(jié)點避免噪聲耦合。焊接的時候PCA9422一般是QFN封裝底部有散熱焊盤這個焊盤必須焊好不然芯片散熱不行大電流輸出的時候會過熱保護。我用的方法是先在PCB焊盤上涂一層薄錫用熱風槍把芯片吹上去再用烙鐵補焊四周引腳。焊完之后用萬用表測一下各引腳對地阻抗確認沒有短路再上電。PIC18F86J15是TQFP封裝引腳比較密焊接的時候容易連錫。我的習慣是用拖焊法先固定對角兩個引腳然后加足量焊錫用烙鐵快速拖過所有引腳最后用吸錫帶清理多余的錫。焊完用放大鏡檢查一遍確認沒有虛焊和連錫。3.2 固件框架與關鍵代碼固件我分成三個模塊I2C驅(qū)動模塊、PCA9422配置模塊、電源管理策略模塊。I2C驅(qū)動模塊負責底層的讀寫操作PCA9422配置模塊封裝了所有寄存器的讀寫函數(shù)電源管理策略模塊則實現(xiàn)具體的業(yè)務邏輯。I2C寫一個寄存器的函數(shù)大概長這樣unsigned char PCA9422_WriteReg(unsigned char reg, unsigned char val) { unsigned char ret; I2C_Start(); ret I2C_WriteByte(PCA9422_ADDR 1); // 寫地址 if (ret) { I2C_Stop(); return 1; } ret I2C_WriteByte(reg); // 寄存器地址 if (ret) { I2C_Stop(); return 1; } ret I2C_WriteByte(val); // 寫入的值 if (ret) { I2C_Stop(); return 1; } I2C_Stop(); return 0; }讀寄存器的函數(shù)類似只是要先寫寄存器地址再重啟總線讀數(shù)據(jù)。這里要注意的是PCA9422的I2C時序要求比較嚴格每個字節(jié)之后從設備會拉低時鐘做應答如果MCU沒有正確釋放時鐘線通信就會卡死。我在I2C_WriteByte函數(shù)里加了超時機制如果時鐘線被拉低超過一定時間就強制退出并報錯避免死鎖。電源管理策略模塊的核心是一個狀態(tài)機根據(jù)電池電壓、充電狀態(tài)、系統(tǒng)負載情況在不同狀態(tài)之間切換。比如電池電壓低于3.3V時進入低電量模式關閉顯示屏背光、降低MCU主頻電池電壓低于3.0V時進入保護模式只保留MCU供電其他全部關閉。這個狀態(tài)機的邏輯不復雜但狀態(tài)之間的切換條件要仔細設計避免在臨界點反復切換。3.3 參數(shù)計算與選型過程充電電流的計算前面提過了這里再補充一下其他參數(shù)的計算。輸出電壓的配置要根據(jù)負載的電壓范圍來定比如傳感器標稱1.8V但允許范圍是1.7V到1.9V那PCA9422的輸出檔位里選最接近1.8V的那一檔就行。如果負載對電壓精度要求高就要選線性穩(wěn)壓輸出而不是降壓輸出因為線性穩(wěn)壓的紋波更小。電感的選擇計算稍微復雜一點。假設降壓輸出的開關頻率是2MHz輸入電壓4.2V輸出電壓3.3V最大輸出電流500mA那么電感值可以用公式L (Vin - Vout) * Vout / (Vin * fsw * ΔIL)來估算其中ΔIL是電感紋波電流一般取輸出電流的30%左右。代入數(shù)值L (4.2 - 3.3) * 3.3 / (4.2 * 2M * 0.15) ≈ 2.36微亨。實際選型的時候我會選4.7微亨留足余量因為電感值大一點紋波小一點代價是瞬態(tài)響應慢一點對這個項目來說可以接受。輸出電容的選擇主要看紋波要求。一般降壓輸出的輸出電容在10微法到22微法之間如果紋波要求嚴格就加大到47微法。我一般用兩個10微法的陶瓷電容并聯(lián)既保證了容量又降低了ESR。3.4 實測波形與調(diào)試記錄樣機回來之后我第一件事是上電測各路輸出的波形。用示波器抓MCU那一路3.3V的上升沿確認從0V到3.3V的時間在1ms以內(nèi)沒有過沖和振鈴。然后抓傳感器那一路1.8V確認它在MCU上電后10ms才啟動。最后抓顯示屏那一路2.8V確認它在傳感器上電后20ms才啟動。三路都符合預期之后才開始跑固件。固件跑起來之后我通過串口打印PCA9422的狀態(tài)寄存器確認電池電壓、充電狀態(tài)、各路輸出的使能狀態(tài)都正確。然后模擬各種場景拔掉USB看是否切換到電池供電、電池電壓降到閾值看是否進入低電量模式、插入USB看是否開始充電。每個場景都反復測試了多次確認邏輯穩(wěn)定。調(diào)試過程中遇到一個有意思的問題電池電壓在3.3V附近的時候系統(tǒng)會在正常模式和低電量模式之間反復切換因為電池電壓在負載變化時會波動導致ADC讀數(shù)在閾值附近跳動。解決辦法是加了一個遲滯區(qū)間比如低于3.25V才進入低電量模式高于3.35V才退出這樣就不會反復切換了。這個技巧在電池供電的設備里非常實用建議大家都加上。4. 常見問題與排查技巧實錄4.1 I2C通信失敗怎么查I2C通信失敗是這個項目里最常見的問題表現(xiàn)是MCU讀不到PCA9422的寄存器或者讀到的數(shù)據(jù)全是0xFF。排查思路我總結(jié)了一個順序先查硬件再查時序最后查地址。硬件方面先用萬用表測SDA和SCL對地阻抗確認沒有短路再測上拉電阻是否焊接、阻值是否正確然后用示波器看SDA和SCL的靜態(tài)電平正常應該是高電平如果被拉低說明有設備在占用總線或者有短路。時序方面用示波器抓通信波形看時鐘頻率是否正常、數(shù)據(jù)是否在時鐘高電平期間穩(wěn)定、應答位是否正確。如果時鐘頻率不對檢查SSPADD寄存器的值如果數(shù)據(jù)不穩(wěn)定檢查上拉電阻和總線電容。地址方面確認代碼里的從設備地址和硬件引腳配置是否一致。PCA9422的地址有幾位是硬件可配的如果引腳接錯了地址就錯了通信自然失敗。4.2 輸出電壓不對怎么排查輸出電壓不對一般有三種情況電壓偏高、電壓偏低、電壓跳動。電壓偏高通常是反饋電阻的問題檢查反饋引腳的分壓電阻是否焊接正確、阻值是否匹配。電壓偏低可能是負載太重導致跌落到限流模式檢查負載電流是否超過PMIC的最大輸出能力。電壓跳動可能是輸入電容不足或者電感選型不當加大輸入電容或者換更大感值的電感試試。還有一種情況是配置寄存器寫錯了比如把1.8V的輸出配成了3.3V。這種問題在調(diào)試階段容易發(fā)現(xiàn)但在批量生產(chǎn)的時候如果固件版本搞錯了就很危險。我的做法是在固件里加一個版本校驗每次上電讀取PCA9422的配置寄存器和預期值對比不一致就報錯并進入安全模式。4.3 充電異常怎么處理充電異常的表現(xiàn)包括插上USB不充電、充電電流不對、充電指示燈不亮。先查USB輸入電壓是否正常PCA9422的USB輸入一般要求4.5V到5.5V低于4.5V可能不啟動充電。再查充電使能寄存器是否配置正確有些PMIC默認充電是關閉的需要固件里顯式打開。充電電流不對的話檢查充電電流配置寄存器的值以及電池溫度檢測引腳是否接好。很多PMIC都有電池溫度保護如果溫度檢測引腳懸空或者接錯PMIC會認為電池溫度異常而降低充電電流甚至停止充電。這個坑我踩過后來在溫度檢測引腳上接了一個10k的NTC電阻到地問題就解決了。4.4 常見問題速查表問題現(xiàn)象可能原因排查方法解決方案I2C讀不到數(shù)據(jù)地址錯誤核對硬件引腳和代碼地址修正地址配置I2C讀不到數(shù)據(jù)上拉電阻缺失測SDA/SCL靜態(tài)電平補焊上拉電阻輸出電壓偏高反饋電阻錯誤測分壓電阻阻值更換正確阻值輸出電壓偏低負載過重測負載電流減小負載或換更大電流檔位充電不啟動USB電壓不足測USB輸入電壓換合格USB電源充電電流小溫度檢測異常測NTC電阻接正確NTC待機功耗高中斷誤觸發(fā)測中斷引腳波形加上拉和去抖上電時序不對延遲配置錯誤抓各路輸出波形修正延遲寄存器4.5 幾個獨家避坑技巧第一個技巧PCA9422的配置寄存器建議在固件里做成一個配置表每一項都有注釋說明為什么這么配。我見過太多項目因為換了一個人維護沒人知道某個寄存器為什么設成那個值結(jié)果改錯了導致批量事故。配置表加上注釋后來人一看就懂。第二個技巧上電自檢邏輯一定要有而且要把自檢結(jié)果通過某種方式暴露出來比如串口打印或者LED閃爍編碼。批量生產(chǎn)的時候產(chǎn)線工人不需要懂技術(shù)看LED閃幾下就知道板子有沒有問題效率高很多。第三個技巧低功耗調(diào)試的時候不要只看萬用表上的平均電流要用示波器看電流波形。有時候平均電流很低但瞬間有大的電流尖峰這種尖峰可能來自某個外設的周期性喚醒萬用表看不出來示波器一看就清楚了。第四個技巧I2C總線上如果掛了多個設備一定要確認每個設備的地址不沖突。PCA9422的地址可配但配置引腳在PCB上要留測試點方便調(diào)試的時候改地址。我一般會在地址引腳上留一個0歐電阻的位置需要改地址的時候換個電阻就行不用飛線。5. 項目擴展與個人體會這套電源管理方案后來我又用在了兩個類似的項目上一個是手持式儀器一個是無線傳感器節(jié)點。手持式儀器對功耗要求沒那么高我把低功耗模式簡化了只保留了基本的充電管理和上電時序控制開發(fā)周期縮短了一半。無線傳感器節(jié)點對功耗要求極高我在原有基礎上增加了動態(tài)電壓調(diào)節(jié)MCU根據(jù)任務負載實時調(diào)整自己的供電電壓進一步降低了功耗。PCA9422和PIC18F86J15這個組合給我的最大感受是夠用且靈活。PCA9422不是那種功能最全的PMIC但它把便攜設備最需要的功能都集成了而且I2C可編程的特性讓它在不同項目之間復用非常方便。PIC18F86J15雖然是一顆老芯片但它的I2C外設穩(wěn)定可靠固件開發(fā)工具鏈成熟對于不需要復雜算法的電源管理任務來說完全夠用。如果你也在做類似的便攜設備電源管理我的建議是先把電源架構(gòu)想清楚把每一路負載的電壓、電流、上電時序需求列成表格然后再去選PMIC。選型的時候不要只看參數(shù)要看它能不能滿足你的時序配置需求以及I2C接口是否好用。硬件設計階段把電容、電感、上拉電阻這些細節(jié)做到位固件調(diào)試階段就會省很多事。最后上電自檢和狀態(tài)監(jiān)控邏輯一定要加這是批量生產(chǎn)時的保命符。