:充電、調壓與低功耗設計)
1. 為什么電源管理值得單獨拿出來做做過便攜設備的人都有一個共識主控跑得再快、算法再漂亮電源這一環(huán)拉胯整機體驗直接崩盤。我手上這個項目用的是 STM32L073RZ 這顆低功耗 MCU搭配 PCA9422 這顆帶充電和多個可調輸出軌的電源管理芯片目標是把一套小型鋰電供電系統(tǒng)的上電時序、充電管理、動態(tài)調壓、低功耗休眠全部打通。說白了就是讓設備在插著 USB 的時候能正常充電并工作拔掉線之后靠電池穩(wěn)穩(wěn)跑還要在待機時把靜態(tài)電流壓到微安級別。STM32L073RZ 屬于 L0 系列Cortex-M0 內核主打低功耗Stop 模式下能做到亞微安級的典型值配合 RTC 和低功耗定時器可以做出很長的待機時間。但低功耗 MCU 有個特點它對供電質量、上電順序、復位時序都比較敏感尤其是內核電壓和 IO 電壓的建立順序不對容易出現(xiàn)上電不啟動、復位反復觸發(fā)、Flash 讀寫異常這類玄學問題。PCA9422 正好是解決這類問題的角色它把鋰電池充電、系統(tǒng)供電、多路 LDO 輸出、I2C 可編程調壓、看門狗和復位控制集成在一顆芯片里通過 I2C 就能動態(tài)調整輸出電壓和電流限制。這套組合適合誰參考如果你在做手持儀器、便攜醫(yī)療設備、低功耗傳感器節(jié)點、帶鋰電池的消費類小硬件并且主控選的是 STM32L 系列或者類似的低功耗 MCU那這套電源架構基本可以直接抄作業(yè)。哪怕你用的是別的 MCU只要涉及鋰電池充電加多路可調電源軌PCA9422 的配置思路也是通用的。下面我會從整體設計思路、芯片關鍵細節(jié)、實操配置流程、踩坑排查幾個維度把整個項目拆開講清楚。2. 整體電源架構設計與選型思路2.1 為什么選 PCA9422 而不是分立方案分立方案做鋰電池供電通常是一顆充電 IC 加一顆升壓或降壓再加幾路 LDO外圍器件多、占板面積大、上電時序還得靠 RC 或者使能腳硬湊。PCA9422 把這一堆東西集成到一顆 QFN 封裝里內部包含線性充電器、系統(tǒng)電壓調節(jié)、以及多路可編程 LDO。它的輸入支持 USB 供電和電池供電自動切換充電電流、終止電壓、各路輸出電壓都能通過 I2C 配置省掉了大量外圍電阻電容。更關鍵的是它的上電時序可控。STM32L073RZ 要求 IO 電壓和內核電壓在合理范圍內建立PCA9422 的各路輸出有固定的上電順序和軟啟動避免了多路電源競爭導致的鎖死。這一點在分立方案里要額外加時序控制芯片才能做到成本和面積都不劃算。2.2 電源軌分配與電壓選擇這個項目里我把電源軌分成三路來用。第一路是系統(tǒng)主供電給 STM32L073RZ 的 VDD 和 VDDA 供電設定在 3.3V因為大部分外設和調試接口都是 3.3V 電平。第二路給傳感器和模擬前端設定在 2.8V原因是那顆傳感器的供電上限是 3.0V用 3.3V 會超壓而 2.8V 既能滿足傳感器又留了余量。第三路給一顆低功耗無線模塊設定在 1.8V因為該模塊的 IO 是 1.8V 域直接和 MCU 通信需要電平匹配不如單獨給它一路干凈電源。這里有個細節(jié)STM32L073RZ 的 VDD 范圍是 1.65V 到 3.6V3.3V 完全在范圍內。但如果你把 VDD 設成 1.8V 來省電要注意調試接口 SWD 的電平也會跟著變仿真器可能識別不到調試階段建議先用 3.3V量產再考慮降壓。2.3 充電參數(shù)與電池匹配電池用的是一顆單節(jié)鋰聚合物標稱 3.7V容量 1200mAh。PCA9422 的充電電流通過 I2C 配置我設定在 500mA大約是 0.4C 的充電倍率。為什么不設更大因為 1200mAh 電池在 1C 充電時發(fā)熱明顯而設備外殼是密閉的散熱條件一般0.4C 到 0.5C 是比較穩(wěn)妥的區(qū)間充滿時間大約兩個半小時對這類設備可以接受。充電終止電壓設定在 4.2V這是標準鋰電的滿充電壓。這里要提醒一句如果你的電池標稱是 4.35V 高壓電芯終止電壓要相應調整否則充不滿反過來如果用普通 4.2V 電芯卻設成 4.35V會有過充風險。這個參數(shù)一定要對著電池規(guī)格書來不能憑感覺。3. PCA9422 關鍵寄存器與配置細節(jié)3.1 I2C 地址與通信基礎PCA9422 的 I2C 從機地址由硬件引腳決定常見配置下是 0x62 或者 0x63 這類 7 位地址具體要看 ADDR 腳的接法。上電后 MCU 通過 I2C 讀寫它的寄存器來配置各路輸出和充電參數(shù)。通信速率我用的 400kHz也就是快速模式足夠快又不會因為速率太高在長走線上出問題。這里有個實操要點PCA9422 的 I2C 引腳是開漏的必須接上拉電阻我用的 4.7k 上拉到 3.3V。如果你上拉到 1.8V 而 MCU 的 IO 是 3.3V通信會不穩(wěn)定甚至損壞器件。上拉電壓一定要和 MCU 的 IO 電壓域一致。3.2 輸出電壓配置的計算邏輯PCA9422 的各路 LDO 輸出電壓是通過寄存器里的檔位來設定的不是連續(xù)可調而是按固定步進分檔。假設某路輸出的基準是 1.8V步進是 100mV那么寄存器值 0 對應 1.8V值 1 對應 1.9V以此類推。實際配置時你要先算出目標電壓對應的檔位值再寫進寄存器。以 2.8V 那一路為例如果基準 1.8V、步進 100mV那么檔位就是 (2.8 - 1.8) / 0.1 10也就是寄存器寫 10。這個計算看起來簡單但實際芯片的基準和步進要以數(shù)據(jù)手冊為準不同型號可能不一樣。我踩過的坑是想當然按 50mV 步進算結果輸出比預期高了 0.5V傳感器差點被超壓。所以第一次配置時一定要用萬用表實測每一路輸出確認無誤再往下走。3.3 充電電流與終止電流設置充電電流的配置也是分檔的通常有一個基準電流和倍率關系。比如基準 100mA寄存器值乘以基準就是實際電流。我設 500mA 就是寫 5。終止電流一般設成充電電流的十分之一左右也就是 50mA這樣電池充到接近滿電時電流逐漸減小到 50mA 時判定充滿并停止。這里有個經驗終止電流設得太小充電時間會拖得很長因為最后那點電量充得很慢設得太大電池可能只充到 90% 就停了續(xù)航縮水。50mA 對 1200mAh 電池來說大約是 0.04C是比較平衡的值。3.4 看門狗與復位控制PCA9422 內置看門狗可以在 MCU 死機時觸發(fā)系統(tǒng)復位。我把它使能了超時時間設成 2 秒。MCU 在主循環(huán)里定期喂狗一旦程序跑飛超過 2 秒沒喂PCA9422 就拉低復位腳讓 MCU 重啟。這個功能在無人值守的設備里非常有用能自動從軟件異常中恢復。但要注意調試階段最好先關掉看門狗否則你在斷點停下來看變量超過 2 秒就被復位了根本沒法調試。等固件穩(wěn)定后再打開。4. 實操配置流程與代碼實現(xiàn)4.1 硬件連接檢查清單在寫代碼之前先把硬件連接確認一遍。PCA9422 的輸入接 USB 的 5V電池接 BAT 腳系統(tǒng)輸出接 MCU 的 VDD。I2C 的 SDA、SCL 接 MCU 對應的引腳并加上拉。復位腳接到 MCU 的 NRST。另外要確認電池的 NTC 熱敏電阻如果芯片支持溫度監(jiān)測也要接上否則充電可能因為檢測不到溫度而拒絕啟動。我遇到過一個問題電池沒接 NTC芯片默認溫度異常充電一直不啟動。后來在寄存器里把溫度監(jiān)測關掉或者補上 10k 的 NTC 才正常。這個細節(jié)在數(shù)據(jù)手冊里寫得不顯眼但實際很容易踩。4.2 初始化代碼結構初始化分幾步走先初始化 I2C 外設再配置 PCA9422 的各路輸出然后配置充電參數(shù)最后使能看門狗。下面是一段簡化的初始化邏輯用 HAL 庫風格寫// 初始化 I2C MX_I2C1_Init(); // 配置 LDO1 輸出 3.3V PCA9422_WriteReg(LDO1_CFG, 0x0F); // 配置 LDO2 輸出 2.8V PCA9422_WriteReg(LDO2_CFG, 0x0A); // 配置 LDO3 輸出 1.8V PCA9422_WriteReg(LDO3_CFG, 0x00); // 設置充電電流 500mA PCA9422_WriteReg(CHG_CURRENT, 0x05); // 設置終止電流 50mA PCA9422_WriteReg(CHG_TERM, 0x01); // 使能看門狗超時 2 秒 PCA9422_WriteReg(WDT_CFG, 0x02);這段代碼里的寄存器地址和值是示意實際要對著數(shù)據(jù)手冊填。重點是順序先配輸出再配充電最后開看門狗。如果先開看門狗再配其他寄存器配置過程超過超時時間就會被復位前功盡棄。4.3 動態(tài)調壓的實現(xiàn)設備在不同工作模式下對電壓的需求不一樣。比如無線模塊發(fā)射時電流大如果 LDO 壓差不夠會導致電壓跌落這時候可以臨時把該路輸出調高 100mV 來補償。PCA9422 支持運行時通過 I2C 改輸出電壓我就在無線發(fā)射前調高發(fā)射完調回來。這個操作要注意調壓后電壓建立需要時間通常幾十微秒所以調完要延時一下再讓模塊工作。我一開始沒加延時模塊啟動瞬間電壓還沒穩(wěn)導致發(fā)射失敗。后來加了 100 微秒延時就好了。4.4 低功耗模式下的電源處理STM32L073RZ 進 Stop 模式時內核時鐘停了但 PCA9422 還在工作。為了省電我把不用的那路 LDO 關掉只保留 MCU 供電那路。PCA9422 本身在輕載時的靜態(tài)電流很低加上 MCU 的 Stop 電流整機待機可以做到幾十微安。喚醒方式有兩種一種是 RTC 定時喚醒一種是外部中斷喚醒。我用的是 RTC 每 10 秒喚醒一次采集數(shù)據(jù)采完繼續(xù)睡。喚醒后要重新使能之前關掉的 LDO等電壓穩(wěn)定再給傳感器上電。5. 常見問題與排查技巧實錄5.1 上電不啟動或反復復位這是最常見的現(xiàn)象。原因通常有三個一是上電時序不對某路電壓建立太慢導致 MCU 在電壓不足時就開始跑二是復位腳被拉低沒釋放三是看門狗超時太短MCU 還沒初始化完就被復位。排查方法先用示波器看各路輸出的上電波形確認建立時間和順序。然后看復位腳的波形正常應該是上電后延遲一段時間拉高。如果復位腳一直低檢查 PCA9422 的復位配置。看門狗問題就把超時先設長或者關掉等固件穩(wěn)定再調。5.2 I2C 通信失敗I2C 讀不到 PCA9422先查上拉電阻和地址。上拉電阻太大比如 10k 以上在 400kHz 下波形上升沿太慢通信會出錯建議 4.7k。地址不對就換個地址試或者用邏輯分析儀抓波形看有沒有 ACK。還有一種情況是 PCA9422 還沒上電完成MCU 就去訪問了。加個上電延時等電源穩(wěn)定再初始化 I2C。5.3 充電不啟動或充不滿充電不啟動先看電池溫度和 NTC再看充電使能位有沒有置上。充不滿就檢查終止電壓和終止電流設置以及電池本身是不是老化了。我遇到過一塊電池用了兩年內阻變大充到 4.1V 就判滿了換新電池就好了。5.4 待機電流偏大待機電流大先量各路 LDO 在休眠時是否真的關了。有些 LDO 即使關了也有漏電流要選支持真關斷的檔位。另外 MCU 的 IO 如果懸空輸入腳可能有漏電要把不用的 IO 配成模擬輸入或者輸出低。還有調試接口的引腳如果仿真器還連著也會拉高電流。下面這張表把常見問題和排查方向整理了一下現(xiàn)象可能原因排查方向上電不啟動時序不對、復位未釋放示波器看電源和復位波形I2C 通信失敗上拉不對、地址錯、上電未完成查上拉、換地址、加上電延時充電不啟動NTC 異常、使能位未置查溫度檢測、充電使能寄存器充不滿終止參數(shù)不對、電池老化核對參數(shù)、換電池測試待機電流大LDO 未關斷、IO 漏電逐路量電流、配置 IO 狀態(tài)5.5 幾個容易忽略的細節(jié)第一個是 PCB 布局。PCA9422 的輸入電容和輸出電容要盡量靠近芯片引腳走線短而粗否則紋波大。第二個是電池走線充電電流 500mA 不算小走線太細會有壓降導致充電判定不準。第三個是散熱線性充電在大電流時發(fā)熱明顯芯片底部的散熱焊盤一定要好好焊到地平面。6. 調試與驗證的實操心得6.1 分階段驗證的思路不要一上來就把所有功能都打開。我的做法是分三步第一步只配 MCU 供電那路確認 MCU 能正常跑起來、能下載程序第二步加上充電功能插 USB 看充電電流和電池電壓變化第三步再加其他 LDO 和低功耗模式。每步驗證通過再往下走出問題容易定位。6.2 用電流表監(jiān)控功耗調試低功耗時我在電池和系統(tǒng)之間串了一個高精度電流表實時看電流變化。正常運行時幾十毫安進 Stop 后應該掉到幾十微安。如果掉不下去就逐個關外設、關 LDO看是哪一部分在耗電。這個方法很笨但很有效。6.3 溫度對充電的影響鋰電池在低溫下充電會析鋰有安全風險。PCA9422 支持溫度監(jiān)測我設了 0 到 45 度的充電窗口超出范圍就暫停充電。實測在冬天室外電池溫度低于 0 度時充電確實會停回到室內又恢復這個保護很有必要。6.4 固件升級時的電源考慮設備在固件升級時不能斷電否則變磚。我在升級流程里加了一個判斷如果檢測到 USB 插入且充電正常才允許升級。升級過程中如果電池電量低于 20%拒絕升級并提示先充電。這個邏輯雖然簡單但能避免很多返修。7. 方案的可擴展方向這套電源架構不只適用于當前這個項目。如果你要加一塊顯示屏可以再啟用一路 LDO 給它供電通過 I2C 單獨控制開關和電壓。如果要加太陽能充電PCA9422 的輸入可以接太陽能板配合 MPPT 邏輯做最大功率點跟蹤不過那需要額外的算法。如果要做多節(jié)電池串聯(lián)那就得換支持更高電壓的充電芯片PCA9422 主要針對單節(jié)鋰電。我在另一個項目里把 PCA9422 和一顆電量計配合使用電量計通過 I2C 讀電池電壓和電流算出剩余電量MCU 再根據(jù)電量決定是否降頻或者關外設。這套組合做出來的續(xù)航估算比單純看電壓準得多因為鋰電池的電壓平臺很平光看電壓判斷電量誤差很大。最后分享一個小技巧PCA9422 的寄存器配置可以在上電后由 MCU 寫入也可以事先燒到芯片的 OTP 里。如果產量大建議用 OTP 固化默認配置這樣即使 MCU 固件還沒跑起來電源也已經按正確參數(shù)工作了能避免很多上電時序問題。OTP 燒寫需要專用工具小批量的話還是 MCU 配置更靈活。