計)
1. 從一顆芯片到一套供電系統(tǒng)這個項目到底在解決什么問題如果你做過帶鋰電池的便攜設(shè)備大概率經(jīng)歷過這樣的場景主控芯片選好了傳感器也定了結(jié)果到了畫電源部分發(fā)現(xiàn)光是給各個模塊配LDO和充電管理就要占掉小半張板子。更頭疼的是鋰電池電壓從4.2V掉到3.0V的過程中如果直接用LDO降壓效率低得可憐發(fā)熱還嚴(yán)重。這時候如果有一顆芯片能把充電管理、多路降壓、電量計、I2C控制全都塞進(jìn)去事情就簡單多了。PCA9422就是干這個的。它是一顆面向低功耗應(yīng)用的電源管理芯片內(nèi)部集成了線性充電器、多路降壓轉(zhuǎn)換器Buck、LDO以及一個可以通過I2C讀寫寄存器的控制接口。而PIC18F55K42是Microchip的一款8位單片機帶I2C外設(shè)成本低、資源夠用非常適合做電源管理的主控。把這兩顆芯片組合起來就能搭出一套完整的電源管理方案單片機通過I2C配置PCA9422的充電參數(shù)、輸出電壓、工作模式同時讀取芯片的狀態(tài)寄存器實現(xiàn)充電狀態(tài)監(jiān)控、故障檢測、動態(tài)電壓調(diào)節(jié)等功能。這個項目的核心價值在于用一顆PMIC加一顆低成本的8位MCU替代傳統(tǒng)分立式電源方案減少BOM數(shù)量、縮小PCB面積、提升系統(tǒng)可靠性。適合做便攜醫(yī)療設(shè)備、手持儀器、IoT終端、電池供電的數(shù)據(jù)采集器等場景的開發(fā)者參考。如果你正在糾結(jié)電源部分怎么設(shè)計或者想從分立方案遷移到PMIC方案這篇內(nèi)容會把整個鏈路拆開講清楚。我下面會從芯片選型邏輯、硬件連接、I2C通信實現(xiàn)、寄存器配置、充電管理、動態(tài)調(diào)壓、故障處理這幾個維度展開盡量把每個環(huán)節(jié)的“為什么”和“怎么做”都說明白。文中涉及的寄存器地址和參數(shù)值我會給出典型值但具體項目一定要以數(shù)據(jù)手冊為準(zhǔn)因為不同批次的芯片可能有細(xì)微差異。2. 為什么選PCA9422加PIC18F55K42這個組合2.1 PCA9422的電源管理能力拆解PCA9422是一顆高度集成的PMIC內(nèi)部結(jié)構(gòu)大致可以分成幾個模塊線性充電器、降壓轉(zhuǎn)換器、LDO、I2C控制邏輯、以及各種保護(hù)電路。充電器部分支持鋰電池的恒流恒壓充電充電電流和終止電壓都可以通過寄存器配置。降壓轉(zhuǎn)換器通常有兩路或三路輸出電壓可以通過I2C動態(tài)調(diào)節(jié)適合給MCU核心、傳感器、射頻模塊分別供電。LDO一般用于給低噪聲模擬電路供電比如ADC參考電壓或者傳感器模擬前端。這顆芯片的關(guān)鍵優(yōu)勢在于集成度高。傳統(tǒng)方案里充電管理用一顆芯片降壓用另一顆LDO再單獨配每顆芯片都要外圍電容電阻加起來占的面積和成本都不低。PCA9422把這些都集成到一顆芯片里外圍只需要幾個電感和電容PCB面積能省下不少。另外它支持I2C接口意味著MCU可以實時讀取芯片狀態(tài)比如充電是否完成、是否發(fā)生過溫保護(hù)、輸入電壓是否正常等這對于需要做電池管理的設(shè)備來說非常實用。還有一個容易被忽略的點PCA9422的降壓轉(zhuǎn)換器支持動態(tài)電壓調(diào)節(jié)。也就是說MCU可以在運行過程中通過I2C修改輸出電壓。比如設(shè)備在待機時把核心電壓降到1.8V省電需要跑高性能任務(wù)時再升到3.3V。這種靈活性是分立方案很難做到的因為分立方案的輸出電壓通常由電阻分壓固定改起來要動硬件。2.2 PIC18F55K42作為主控的合理性PIC18F55K42是Microchip的8位單片機核心是PIC18架構(gòu)主頻可以跑到64MHz帶I2C、SPI、UART等外設(shè)Flash和RAM對于電源管理任務(wù)來說綽綽有余。選它做電源管理主控主要考慮幾個因素成本低、I2C外設(shè)穩(wěn)定、開發(fā)工具成熟。有人可能會問為什么不用更便宜的STM8或者國產(chǎn)MCU原因在于PIC18F55K42的I2C外設(shè)支持多主模式和從模式而且有獨立的波特率發(fā)生器配置靈活。另外Microchip的MCCMPLAB Code Configurator工具可以圖形化配置I2C參數(shù)生成初始化代碼省去手動計算寄存器的麻煩。對于電源管理這種對時序要求不算極端苛刻、但對可靠性要求高的場景PIC18F55K42是一個很平衡的選擇。還有一點PIC18F55K42的工作電壓范圍寬支持1.8V到5.5V可以直接由PCA9422的某一路降壓輸出供電不需要額外的電平轉(zhuǎn)換。這在系統(tǒng)設(shè)計上簡化了不少。2.3 兩顆芯片的協(xié)同工作模式整個系統(tǒng)的供電架構(gòu)是這樣的鋰電池接入PCA9422的充電輸入端PCA9422負(fù)責(zé)給電池充電同時把電池電壓降壓后輸出給PIC18F55K42和其他負(fù)載。PIC18F55K42通過I2C總線連接PCA9422上電后先初始化I2C外設(shè)然后讀取PCA9422的器件ID確認(rèn)通信正常接著配置充電參數(shù)和輸出電壓最后進(jìn)入主循環(huán)定期輪詢PCA9422的狀態(tài)寄存器。這里有一個設(shè)計要點PIC18F55K42的供電必須來自PCA9422的某一路輸出而且這一路輸出要在上電時默認(rèn)使能。PCA9422的降壓轉(zhuǎn)換器通常有默認(rèn)輸出電壓比如3.3V不需要MCU配置就能工作。這樣MCU上電后才有電跑代碼再去配置其他路輸出。如果所有輸出都需要MCU配置才使能那就成了“雞生蛋蛋生雞”的問題。所以硬件設(shè)計時一定要確認(rèn)哪一路是默認(rèn)開啟的把MCU掛在這一路上。3. 硬件連接與I2C總線的物理層設(shè)計3.1 電源輸入與電池接口的走線要點鋰電池通過連接器接入PCA9422的VBAT引腳充電輸入通常來自USB或者DC插座接到VIN引腳。這兩個引腳的走線要盡量短粗因為充電電流可能達(dá)到幾百毫安甚至1A以上。如果走線太細(xì)太長壓降會很明顯導(dǎo)致充電效率下降甚至充電異常。VBAT和VIN附近要放足夠的去耦電容典型值是10uF加0.1uF的組合。10uF負(fù)責(zé)濾低頻紋波0.1uF負(fù)責(zé)濾高頻噪聲。電容要盡量靠近芯片引腳否則濾波效果打折扣。我見過一些設(shè)計把電容放在板子另一頭結(jié)果充電時紋波大得離譜芯片頻繁觸發(fā)保護(hù)。電池連接器建議用帶極性的插座防止反接。雖然PCA9422內(nèi)部有防反接保護(hù)但反接時電流會流過保護(hù)電路發(fā)熱嚴(yán)重。如果產(chǎn)品面向普通用戶反接保護(hù)是必須的。3.2 I2C上拉電阻的取值計算I2C總線需要上拉電阻這是老生常談但經(jīng)常被忽略細(xì)節(jié)的地方。上拉電阻的取值取決于總線電容和通信速率。PCA9422支持標(biāo)準(zhǔn)模式100kHz和快速模式400kHzPIC18F55K42的I2C外設(shè)也支持這些速率。假設(shè)總線電容Cb是100pF通信速率是400kHz上升時間tr要求小于300ns。根據(jù)公式Rp(max) tr / (0.8473 × Cb)算出來Rp(max)大約是3.5kΩ。所以上拉電阻不能大于3.5kΩ否則上升沿太慢通信會出錯。但也不能太小太小會導(dǎo)致灌電流過大增加功耗。典型值取2.2kΩ到4.7kΩ之間。實際項目中如果總線上掛了多個從機總線電容會增大上拉電阻要相應(yīng)減小。但減小到1kΩ以下就要注意了因為PCA9422的I2C引腳灌電流能力有限太小可能拉不低。我一般先用2.2kΩ試用示波器看上升沿如果太慢就換1.5kΩ如果波形有振鈴就適當(dāng)增大。注意上拉電阻要接到MCU的IO電壓域不是接到電池電壓。如果MCU是3.3V供電上拉就接3.3V不要接5V否則可能損壞PCA9422的I2C引腳。3.3 中斷引腳的利用與GPIO分配PCA9422通常有一個中斷輸出引腳可以在充電狀態(tài)變化、故障發(fā)生時拉低通知MCU。這個引腳接到PIC18F55K42的外部中斷引腳上可以避免MCU頻繁輪詢I2C降低功耗。比如充電完成時PCA9422拉低中斷MCU在中斷服務(wù)程序里讀取狀態(tài)寄存器確認(rèn)后關(guān)閉充電指示燈或者進(jìn)入下一步邏輯。如果不用中斷MCU就得定期輪詢比如每100ms讀一次狀態(tài)寄存器。輪詢的好處是邏輯簡單壞處是功耗略高而且響應(yīng)有延遲。對于電池供電的設(shè)備建議用中斷方式讓MCU大部分時間處于休眠中斷來了再喚醒。PIC18F55K42的GPIO資源豐富除了I2C和中斷引腳還可以分配幾個IO做LED指示、按鍵輸入、或者控制其他外設(shè)。建議在PCB上預(yù)留測試點方便調(diào)試時用邏輯分析儀抓I2C波形。4. I2C通信協(xié)議的軟件實現(xiàn)細(xì)節(jié)4.1 PIC18F55K42的I2C外設(shè)初始化PIC18F55K42的I2C外設(shè)配置涉及幾個關(guān)鍵寄存器波特率寄存器、控制寄存器、狀態(tài)寄存器。用MCC工具可以圖形化配置但了解底層寄存器有助于排查問題。初始化步驟大致如下先設(shè)置I2C引腳為輸入方向開漏輸出然后配置波特率。假設(shè)系統(tǒng)時鐘是64MHzI2C時鐘是400kHz波特率分頻值計算為Fosc / (4 × Fscl) - 1 64M / (4 × 400k) - 1 39。所以波特率寄存器寫39。然后使能I2C模塊等待總線空閑。初始化完成后不要急著發(fā)數(shù)據(jù)先做一個總線恢復(fù)操作。如果上次通信異常導(dǎo)致從機把SDA拉低總線會一直忙?;謴?fù)方法是把SCL配置為普通IO手動發(fā)9個時鐘脈沖然后發(fā)一個停止條件。這個技巧在實際調(diào)試中非常有用能解決很多“I2C突然不工作”的問題。4.2 寫寄存器的完整時序與代碼示例寫PCA9422寄存器的流程是發(fā)啟動條件發(fā)從機地址加寫位等ACK發(fā)寄存器地址等ACK發(fā)數(shù)據(jù)等ACK發(fā)停止條件。每一步都要檢查ACK如果從機沒應(yīng)答說明地址錯了或者從機沒準(zhǔn)備好。下面是一段簡化的寫寄存器函數(shù)基于PIC18F55K42的I2C外設(shè)uint8_t PCA9422_WriteReg(uint8_t reg, uint8_t data) { I2C_Start(); if (I2C_WriteByte(PCA9422_ADDR 1 | 0) ! ACK) { I2C_Stop(); return 1; // 地址無應(yīng)答 } if (I2C_WriteByte(reg) ! ACK) { I2C_Stop(); return 2; // 寄存器地址無應(yīng)答 } if (I2C_WriteByte(data) ! ACK) { I2C_Stop(); return 3; // 數(shù)據(jù)無應(yīng)答 } I2C_Stop(); return 0; // 成功 }這段代碼里I2C_WriteByte函數(shù)負(fù)責(zé)發(fā)送一個字節(jié)并返回ACK狀態(tài)。實際項目中每次寫操作后建議加一個小延時比如10us讓PCA9422有時間處理。雖然數(shù)據(jù)手冊說芯片響應(yīng)很快但實測中不加延時偶爾會出現(xiàn)連續(xù)寫失敗的情況。4.3 讀寄存器的重復(fù)啟動與數(shù)據(jù)解析讀寄存器比寫多一個步驟先寫寄存器地址告訴從機要讀哪個寄存器然后發(fā)重復(fù)啟動條件再發(fā)從機地址加讀位接著讀數(shù)據(jù)最后發(fā)NACK和停止條件。uint8_t PCA9422_ReadReg(uint8_t reg, uint8_t *data) { I2C_Start(); if (I2C_WriteByte(PCA9422_ADDR 1 | 0) ! ACK) { I2C_Stop(); return 1; } if (I2C_WriteByte(reg) ! ACK) { I2C_Stop(); return 2; } I2C_Start(); // 重復(fù)啟動 if (I2C_WriteByte(PCA9422_ADDR 1 | 1) ! ACK) { I2C_Stop(); return 3; } *data I2C_ReadByte(); I2C_SendNACK(); I2C_Stop(); return 0; }讀回來的數(shù)據(jù)要根據(jù)寄存器定義解析。比如狀態(tài)寄存器里某一位表示“充電完成”另一位表示“輸入過壓”還有幾位表示當(dāng)前充電階段。解析時要用位掩碼不要直接比較整個字節(jié)否則其他位變化會導(dǎo)致誤判。5. 充電參數(shù)配置與電池管理策略5.1 充電電流與終止電壓的寄存器設(shè)置PCA9422的充電電流和終止電壓通過寄存器配置。充電電流通常有一個計算公式比如Icharge (寄存器值 / 某系數(shù)) × 基準(zhǔn)電流。具體系數(shù)要查數(shù)據(jù)手冊。假設(shè)基準(zhǔn)是10mA寄存器值范圍是0到31那么最大充電電流是310mA。實際設(shè)置時要根據(jù)電池容量來定一般充電電流不超過電池容量的1C。比如1000mAh的電池充電電流設(shè)500mA到1000mA之間比較合適。終止電壓通常是4.2V但有些電池是4.35V或4.4V。設(shè)置錯了會導(dǎo)致電池充不滿或者過充。過充會損壞電池甚至引發(fā)安全問題所以這個參數(shù)一定要按電池規(guī)格書來。如果不確定先用4.2V保守設(shè)置。充電電流和終止電壓的寄存器通常有寫保護(hù)需要先解鎖某個寄存器才能修改。解鎖序列一般是向特定寄存器寫特定值具體參考數(shù)據(jù)手冊。我建議在初始化代碼里把解鎖、配置、鎖定寫成一個函數(shù)避免每次修改都手動操作。5.2 充電狀態(tài)機的輪詢與中斷處理PCA9422內(nèi)部有一個充電狀態(tài)機狀態(tài)包括未充電、預(yù)充電、恒流充電、恒壓充電、充電完成、故障。MCU可以通過讀取狀態(tài)寄存器獲取當(dāng)前狀態(tài)。如果用輪詢方式主循環(huán)里每100ms讀一次狀態(tài)寄存器根據(jù)狀態(tài)更新LED指示或者上報給上位機。輪詢的缺點是功耗高因為MCU要定期喚醒。如果用中斷方式PCA9422狀態(tài)變化時拉低中斷引腳MCU在中斷里讀狀態(tài)寄存器處理完再清除中斷標(biāo)志。中斷方式的代碼結(jié)構(gòu)大致是中斷服務(wù)程序里讀狀態(tài)寄存器判斷是哪種事件設(shè)置一個全局標(biāo)志主循環(huán)根據(jù)標(biāo)志做后續(xù)處理。注意中斷服務(wù)程序要盡量短不要在里面做I2C讀寫之外的重活否則可能影響其他中斷響應(yīng)。5.3 溫度監(jiān)測與充電安全保護(hù)鋰電池充電時溫度過高或過低都有風(fēng)險。PCA9422通常支持外接熱敏電阻通過內(nèi)部ADC讀取溫度在溫度超出范圍時暫停充電。熱敏電阻一般貼在電池表面阻值隨溫度變化PCA9422根據(jù)阻值判斷溫度。配置溫度保護(hù)需要設(shè)置幾個閾值低溫閾值、高溫閾值、恢復(fù)閾值。比如低溫低于0度暫停充電高溫高于45度暫停充電溫度回到5到40度之間恢復(fù)充電。這些閾值通過寄存器設(shè)置具體值參考電池規(guī)格書。如果不用外接熱敏電阻也可以用MCU內(nèi)部的溫度傳感器做粗略監(jiān)測但精度不夠不建議用于安全保護(hù)。安全相關(guān)的功能一定要用獨立的熱敏電阻而且要做好冗余設(shè)計。6. 動態(tài)電壓調(diào)節(jié)與低功耗模式切換6.1 降壓轉(zhuǎn)換器輸出電壓的實時調(diào)整PCA9422的降壓轉(zhuǎn)換器輸出電壓可以通過I2C實時修改。比如設(shè)備在待機時把MCU核心電壓從3.3V降到1.8V功耗能降低不少。調(diào)整步驟是先讀當(dāng)前輸出電壓寄存器計算出目標(biāo)值對應(yīng)的寄存器值寫入然后等待電壓穩(wěn)定通常幾十微秒再讓MCU切換到低壓運行。這里有一個坑降壓轉(zhuǎn)換器的輸出電壓不能突變太大。如果從3.3V直接跳到1.8V輸出電容上的電荷會通過負(fù)載放電可能導(dǎo)致電壓跌落過大MCU復(fù)位。正確的做法是分步調(diào)整比如先降到2.5V延時再降到1.8V。或者用轉(zhuǎn)換器的軟啟動功能讓電壓緩慢變化。另外修改輸出電壓前要確認(rèn)MCU的工作電壓范圍。PIC18F55K42支持1.8V到5.5V所以降到1.8V沒問題。但如果系統(tǒng)里有其他器件只支持3.3V就不能隨便降。6.2 休眠模式下的電源域管理設(shè)備進(jìn)入休眠時可以把不用的電源域關(guān)掉。PCA9422的每一路降壓和LDO通常都有使能位通過I2C可以單獨關(guān)閉。比如傳感器只在采集時供電采集完就關(guān)掉待機電流能降到微安級。關(guān)閉電源域的順序要注意先關(guān)負(fù)載再關(guān)電源。如果先關(guān)電源負(fù)載上的電容可能通過負(fù)載放電產(chǎn)生反向電流影響芯片壽命。正確順序是MCU先通知負(fù)載進(jìn)入休眠延時然后關(guān)閉對應(yīng)的電源輸出。喚醒時順序相反先開電源延時等待電壓穩(wěn)定再喚醒負(fù)載。這個延時不能省否則負(fù)載可能在電壓沒穩(wěn)時就啟動導(dǎo)致初始化失敗。6.3 喚醒源配置與快速恢復(fù)PIC18F55K42支持多種喚醒源外部中斷、定時器、串口接收等。在電源管理場景下常用的是外部中斷比如按鍵喚醒和定時器定期采集。喚醒后MCU要快速恢復(fù)I2C通信重新配置PCA9422的輸出電壓和電源域??焖倩謴?fù)的關(guān)鍵是保存上下文。在進(jìn)入休眠前把當(dāng)前的電源配置參數(shù)保存在RAM里喚醒后直接根據(jù)保存的參數(shù)恢復(fù)不需要重新計算。這樣能縮短喚醒時間提升用戶體驗。如果喚醒后需要立即通信比如上報數(shù)據(jù)要確保PCA9422的輸出電壓已經(jīng)穩(wěn)定。可以在喚醒后加一個幾毫秒的延時或者讀PCA9422的狀態(tài)寄存器確認(rèn)電源正常。7. 調(diào)試過程中容易踩的坑與排查思路7.1 I2C通信失敗的常見原因I2C通信失敗是最常見的問題表現(xiàn)是MCU發(fā)地址后收不到ACK。排查思路如下第一檢查硬件連接。用萬用表測SDA和SCL對地電阻正常應(yīng)該是上拉電阻的阻值。如果接近0說明有短路。如果無窮大說明斷路。第二檢查上拉電阻。如果上拉電阻太大上升沿太慢高速通信會失敗。用示波器看波形上升時間超過1us就要減小上拉電阻。第三檢查從機地址。PCA9422的I2C地址可能是7位發(fā)的時候要左移一位再加讀寫位。地址錯了肯定沒ACK。第四檢查電源。PCA9422的VIN和VBAT都要有電如果只有VBAT沒VIN芯片可能不工作。用萬用表測各引腳電壓確認(rèn)在正常范圍。第五檢查總線電容。如果總線上掛了多個從機電容太大上拉電阻要相應(yīng)減小。但減小到1kΩ以下就要注意灌電流問題。我遇到過一次I2C死活不通最后發(fā)現(xiàn)是PCB上SDA和SCL走線交叉了飛線解決。所以畫板子的時候一定要仔細(xì)檢查。7.2 充電異常的診斷流程充電異常的表現(xiàn)有充不進(jìn)電、充電電流不對、充電指示燈不亮等。診斷流程如下先讀PCA9422的狀態(tài)寄存器看充電狀態(tài)機在哪個狀態(tài)。如果是“未充電”檢查VIN是否有電電池是否接好。如果是“故障”讀故障寄存器看是過溫、過壓還是其他問題。如果狀態(tài)正常但電流不對檢查充電電流寄存器的設(shè)置。用電流表串在電池回路里測實際電流和設(shè)置值對比。如果差太多可能是寄存器值算錯了或者電池電壓太低進(jìn)入了預(yù)充電模式。如果充電指示燈不亮檢查LED的驅(qū)動電路。有些設(shè)計用PCA9422的GPIO直接驅(qū)動LED有些用MCU的IO驅(qū)動。如果是MCU驅(qū)動檢查MCU是否在讀狀態(tài)寄存器后正確控制了IO。7.3 動態(tài)調(diào)壓導(dǎo)致系統(tǒng)復(fù)位的排查動態(tài)調(diào)壓時系統(tǒng)復(fù)位通常是電壓跌落太大導(dǎo)致的。排查方法用示波器看降壓輸出波形在調(diào)壓瞬間是否有大的跌落。如果有說明輸出電容不夠或者調(diào)壓步進(jìn)太大。解決辦法增加輸出電容比如從10uF增加到22uF。或者分步調(diào)壓每次降0.3V延時后再降。還可以啟用降壓轉(zhuǎn)換器的軟啟動功能讓電壓緩慢變化。另外檢查MCU的復(fù)位閾值。PIC18F55K42的復(fù)位電壓通常在1.6V左右如果降壓輸出跌到1.6V以下MCU就會復(fù)位。所以調(diào)壓時最低電壓不能低于MCU的最低工作電壓。8. 從原型到產(chǎn)品的工程化建議8.1 PCB布局中的電源完整性考慮電源管理芯片的PCB布局直接影響性能。PCA9422的輸入電容、輸出電容、電感都要盡量靠近芯片引腳。電感下面不要走信號線避免耦合噪聲。I2C走線要遠(yuǎn)離電感和開關(guān)節(jié)點防止干擾。地平面要完整不要被走線割裂。模擬地和數(shù)字地可以單點連接但電源管理芯片的地要接到主地平面不要單獨走細(xì)線。散熱焊盤要打足夠多的過孔幫助芯片散熱。如果充電電流較大VBAT和VIN的走線要加寬比如1A電流至少要走40mil寬。過孔也要多打幾個降低阻抗。8.2 固件中的異?;謴?fù)機制固件要有異常恢復(fù)機制。比如I2C通信連續(xù)失敗3次就重新初始化I2C外設(shè)再試。如果還是失敗可以嘗試復(fù)位PCA9422如果有復(fù)位引腳或者進(jìn)入安全模式只保持基本供電??撮T狗定時器要啟用防止MCU死機??撮T狗超時時間根據(jù)任務(wù)周期設(shè)置比如主循環(huán)100ms一次看門狗設(shè)500ms。在中斷服務(wù)程序里也要喂狗但要注意不要喂太頻繁否則失去意義。關(guān)鍵參數(shù)要保存在EEPROM里比如充電電流、輸出電壓。這樣即使斷電重啟也能恢復(fù)到之前的配置。保存時要注意寫平衡不要頻繁寫同一個地址。8.3 量產(chǎn)測試與參數(shù)校準(zhǔn)量產(chǎn)時要測試每塊板的充電功能和I2C通信。測試項目包括充電電流是否在范圍內(nèi)、終止電壓是否準(zhǔn)確、I2C讀寫是否正常、各路輸出電壓是否正確。如果發(fā)現(xiàn)參數(shù)偏差可以在固件里做校準(zhǔn)。比如充電電流實測偏小可以在寄存器值上加一個補償量。校準(zhǔn)值存在EEPROM里每塊板單獨校準(zhǔn)。測試工裝可以用一塊帶MCU的板子做主機通過I2C連接被測板自動跑測試流程記錄結(jié)果。這樣能提高測試效率減少人為誤差。9. 個人經(jīng)驗總結(jié)與后續(xù)擴展方向這套方案我在幾個便攜設(shè)備項目里用過整體穩(wěn)定性不錯。最大的體會是電源管理芯片的寄存器配置一定要仔細(xì)核對數(shù)據(jù)手冊尤其是充電電流和終止電壓設(shè)錯了輕則充不滿重則損壞電池。另外I2C總線的上拉電阻和走線布局比想象中重要很多通信問題都是硬件引起的軟件再怎么調(diào)也沒用。后續(xù)如果想擴展可以考慮幾個方向一是增加電量計功能PCA9422本身可能不帶庫侖計但可以通過MCU的ADC讀取電池電壓結(jié)合放電曲線估算電量。二是增加USB PD協(xié)商功能如果充電輸入支持PD可以用MCU控制PD控制器實現(xiàn)快充。三是把電源管理邏輯做成狀態(tài)機用RTOS的任務(wù)來管理代碼結(jié)構(gòu)會更清晰。最后分享一個小技巧調(diào)試I2C時如果手頭沒有邏輯分析儀可以用MCU的IO口模擬I2C在關(guān)鍵步驟翻轉(zhuǎn)一個IO用示波器看時序。雖然麻煩但能解決大部分問題。