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