:從電壓軌到動態(tài)調(diào)壓)
搞嵌入式這些年我發(fā)現(xiàn)一個很硬的規(guī)律凡是死在實驗室里的板子十之八九不是程序問題而是電源問題。最近調(diào)一套需要長時間離線運行的數(shù)據(jù)采集板主控用了 PIC32MZ1024EFK144電源管理芯片選了 PCA9422。從裸板回來第一次上電的亂跳一直調(diào)到休眠電流能壓到微安級、動態(tài)調(diào)壓跑完整個工作循環(huán)中間踩了不少坑。這篇文章就把整個電源管理方案的思路、硬件設(shè)計、固件配置和調(diào)試過程完整梳理一遍給正在折騰同類型主控和 PMIC 組合的朋友做個參考。這套組合適合誰如果你在做電池供電的工業(yè)采集器、便攜儀表或者任何對“運行功耗、休眠功耗、動態(tài)調(diào)壓”都有硬性要求的系統(tǒng)PCA9422 加上 PIC32MZ1024EFK144 這套組合能把電源從一堆離散的 LDO 和 MOS 管開關(guān)變成一組可配置、可讀取、可動態(tài)調(diào)整的寄存器資源。整篇文章不吹玄乎的框架只講實際怎么設(shè)計、怎么寫代碼、怎么把板子調(diào)穩(wěn)。1. 方案價值與設(shè)計目標為什么選這兩顆芯片先把方案為什么成立講清楚。PIC32MZ1024EFK144 這顆主控很多人把它當普通單片機用接個傳感器、跑個串口就完事了。但真把它往 200MHz 滿頻上推再掛 USB、以太網(wǎng)、LCD 這類外設(shè)供電復雜度和普通 8 位單片機完全不是一個量級。PCA9422 的價值就是把這些復雜的電源需求抽象成幾個可控的電壓軌讓主控自己決定什么時候把哪一路拉高、哪一路關(guān)掉。1.1 完整電源管理到底要管哪些事我在項目里常跟人解釋一個完整的電源管理方案往上要適配系統(tǒng)需求往下要管住每一個電壓軌中間還要能跟主控對話。先看系統(tǒng)需求。以我手里這套采集板為例四個典型工作狀態(tài)正常運行主控滿頻跑采集和通信都工作空閑主控降頻等中斷休眠大部分外設(shè)斷電只保留 RTC 和喚醒邏輯深度關(guān)機整個系統(tǒng)接近零功耗。這四個狀態(tài)里電壓軌的數(shù)量和電壓值不是一成不變的。正常運行需要模擬供電、數(shù)字核心供電、傳感器和通信供電休眠狀態(tài)希望傳感器電源被徹底切斷主控核心電壓降到維持值甚至關(guān)斷只保留一路備份供電給實時時鐘和喚醒引腳。如果只用 LDO 加MOS管做倒是能做但問題在于狀態(tài)切換要寫一堆 GPIO 邏輯電壓狀態(tài)沒法回讀故障診斷全靠示波器人肉排查。換成帶 I2C 的 PMIC 之后狀態(tài)切換就是寫寄存器電壓值、電流限制、溫度狀態(tài)全都能讀回來調(diào)試效率提高一大截。PCA9422 正是這樣一顆偏重低功耗場景的可編程電源管理芯片內(nèi)部包含多路 DC-DC 和 LDO 通道關(guān)鍵參數(shù)都支持通過 I2C 配置非常適合和 MCU 組成閉環(huán)的電源管理系統(tǒng)。1.2 為什么是 PCA9422為什么是 PIC32MZ1024EFK144從主控往下看PIC32MZ1024EFK144 是一個工作頻率能到 200MHz、帶浮點單元的 MIPS 架構(gòu) MCU1MB 閃存加 512KB RAM跑復雜的采集算法、通信協(xié)議棧、圖形界面都夠用。它的電源引腳不是簡單的一路 VDD而是分了數(shù)字核心、模擬部分、USB 接口等多組對電源噪聲和上電時序有明確要求。這種復雜度決定了它需要一路按順序、可控的電源管理而不是三四個隨便接一起的線性穩(wěn)壓器。群里經(jīng)常有人問“PIC32MZ 能不能直接用 3.3V 一節(jié)電池帶”答案是不能穩(wěn)定帶。ADC 要用 AVDD核心要用低噪聲的 DVDD外設(shè)還需要獨立電壓域。只要有一個軌順序不對板子就起不來。從電源往上看PCA9422 的優(yōu)勢在于靈活性。多路輸出可以獨立設(shè)電壓、獨立使能、獨立調(diào)序電池供電場景下還能實時讀取電壓和電流狀態(tài)。我自己選它的幾個硬指標待機功耗足夠低能在休眠時關(guān)斷大部分負載I2C 配置響應(yīng)快切換電壓域不用等幾十毫秒輸入電壓范圍能覆蓋單節(jié)鋰電池或者兩節(jié)堿性電池的供電場景。再加上它和 PIC32MZ 這類低功耗主控配合時硬件連接非常簡單省掉的 PCB 面積和物料成本都很可觀。2. 電源架構(gòu)設(shè)計先把電壓軌和電流預算算清楚拿到一顆 PMIC 和一顆主控第一件該做的事不是焊板子而是把電壓軌規(guī)劃表畫出來。沒有這張表后面所有配置都是拍腦袋。我在實際項目中吃過虧第一版原理圖里直接把 3.3V 供給所有模擬電路結(jié)果傳感器上電瞬間的浪涌電流把 LDO 拉垮主控周期性復位。后來重新按電壓軌一個一個核算電流才把問題定位到“某一路過流保護被觸發(fā)”。2.1 電壓軌劃分與去向電壓軌劃分核心原則是噪聲敏感的和噪聲大的分開常供電的和可斷電的分開大電流和小電流分開。拿我的采集板舉例大致劃分如下電壓軌電壓值主要負載持續(xù)電流開關(guān)策略數(shù)字核心1.8VPIC32MZ DVDD、VCAP 周邊80-150mA常供電休眠可降模擬電源3.3V運放、ADC 參考、傳感器信號20-40mA采集時開啟通信接口3.3VRS485 收發(fā)器、無線模塊50-120mA通信時開啟備份電源3.0V/1.8VRTC、喚醒邏輯5mA 以內(nèi)始終保留這個表看起來簡單但把它細化到每個引腳的電流來源就會發(fā)現(xiàn)很多坑。比如 PIC32MZ1024EFK144 的 AVDD 雖然是模擬電源但內(nèi)部還有不少數(shù)字邏輯如果直接從數(shù)字 3.3V 上分出來ADC 噪聲會明顯惡化。所以我在設(shè)計里把模擬電源軌做了二次濾波先由 PCA9422 輸出一個干凈的主電壓軌再經(jīng)過磁珠和電容濾波后供給 AVDD。這么做犧牲了零點幾伏壓降換來的是 ADC 采樣值的穩(wěn)定。2.2 電流預算與通道分配電流預算表做好之后下一步是把這些電壓軌分配到 PCA9422 的各個輸出通道上。記住一個鐵律Buck 電路效率高、能出大電流但紋波相對大、啟動慢LDO 電路噪聲低、響應(yīng)快但效率上限擺在那不適合出大電流。大電流數(shù)字負載放 DC-DC 通道小電流模擬負載放 LDO 通道這是最不容易出問題的分法。我實際使用的分配策略是PCA9422 的 DC-DC 通道輸出 1.8V 給數(shù)字核心另一路 DC-DC 通道輸出 3.3V 給通信接口和傳感器總電源LDO 通道輸出經(jīng)過濾波的 3.3V 給模擬電路。數(shù)字和模擬在 PMIC 內(nèi)部就是兩個獨立通道互不干擾PCB 上也能更干凈地做分區(qū)。電流預算有一個容易被低估的項目動態(tài)負載的瞬態(tài)電流。無線模塊發(fā)射瞬間可能從 50mA 跳到 200mA如果只按平均電流選電感輸出電壓會瞬間跌落。我給通信軌預留了 1.5 倍設(shè)計余量實際測量下來模塊發(fā)包瞬間電壓只掉了不到 50mV這個余量是有必要的。2.3 上電時序設(shè)計電壓軌規(guī)劃里最容易被忽略、但翻車率最高的就是上電時序。PIC32MZ1024EFK144 這種大芯片內(nèi)部有多種電路如果數(shù)字核心電壓沒起來、IO 電源先起來了內(nèi)部邏輯可能出現(xiàn)不可預知的鎖存狀態(tài)。最典型的表現(xiàn)就是程序偶爾能跑、偶爾死機復位多次才能正常。PCA9422 的優(yōu)勢在于支持可編程的上電時序。我在配置里把核心電壓設(shè)為首個輸出模擬電源其次通信接口電源最后每一路之間延遲大約 5ms。這里用到了 PMIC 內(nèi)部的電源時序控制寄存器不同廠家寄存器定義不同設(shè)計時一定把數(shù)據(jù)手冊對應(yīng)章節(jié)打印出來照著配置。主控側(cè)也要注意PIC32MZ 的復位引腳要保持低電平直到所有電源軌穩(wěn)定。我的做法是用 PCA9422 的電源正常輸出信號接一個 RC 延時網(wǎng)絡(luò)再接到主控的復位腳保證上電完成后再釋放復位。這套組合跑下來板子從來沒有再出現(xiàn)上電隨機死機的問題。3. 硬件電路實現(xiàn)從原理圖到 PCB 的關(guān)鍵細節(jié)方案講得再好落到 PCB 上才是真考驗。很多朋友在調(diào)板時發(fā)現(xiàn) PMIC 輸出電壓不對、紋波大得離譜、I2C 讀寫時好時壞基本都能在硬件連接和布局上找到原因。這一節(jié)把原理圖連接、電感電容選型、布局布線的關(guān)鍵點拆開講。3.1 最小連接關(guān)系誰管誰先理清 PCA9422 和 PIC32MZ1024EFK144 之間的最小連接關(guān)系。PCA9422 這邊需要接電池或電源輸入多個電壓軌輸出分別接到主控對應(yīng)的電源引腳組。I2C 接口的兩根線 SCL、SDA 接到主控的對應(yīng)引腳別忘了接上拉電阻阻值根據(jù)總線速率選。很多 PMIC 還帶中斷輸出腳我把這個腳接到主控制器的一個外部中斷引腳上這樣 PMIC 檢測到過流、過壓、欠壓或者溫度異常時主控可以第一時間響應(yīng)。主控側(cè)要重點檢查 PIC32MZ1024EFK144 的每個電源引腳。數(shù)據(jù)手冊上標了多組 VDD、AVDD、VBUS 等設(shè)計時最好給每組電源引腳就近放一組去耦電容10uF 和 100nF 搭配著來。我見過不少抄官方 demo 的原理圖把好幾個引腳串一塊共用一個電容結(jié)果在高頻負載變化時電源出現(xiàn)振鈴最后只能靠加電容補救。電源引腳不能偷懶該獨立濾波就獨立濾波。3.2 電感、電容選型與布局PCA9422 的 DC-DC 通道需要外部電感電感選型直接影響輸出紋波和瞬態(tài)響應(yīng)。選型三要素感值、飽和電流、直流電阻。感值太小紋波電流大輸出紋波高感值太大瞬態(tài)響應(yīng)慢。最佳方法不是憑經(jīng)驗硬猜而是先查手冊里的推薦感值范圍再結(jié)合負載電流計算飽和電流。我用的 2.2uH 電感飽和電流選在 2A 以上直流電阻控制在 100mΩ 以內(nèi)。雖然實際負載只有 150mA但飽和電流余量給大可以避免電感飽和引起的電壓突降。布局上DC-DC 的開關(guān)節(jié)點是 PCB 上噪聲最強的地方。開關(guān)節(jié)點銅皮面積越小越好電感靠近 PMIC 的 SW 引腳輸出電容緊跟著電感地腳直接過孔打到地層。輸出反饋線要走遠離電感的路徑避免把開關(guān)噪聲引入反饋端。還有一個很多人不知道的細節(jié)PMIC 下方的地平面最好別為了散熱開一堆亂七八糟的孔要開就開規(guī)則排列的過孔陣列否則回流路徑混亂EMI 測試會讓你懷疑人生。3.3 使能、復位與狀態(tài)信號的串聯(lián)使能引腳是另一個頻繁踩坑的地方。PCA9422 的各個通道一般都有 EN 引腳有些通道默認是使能的有些默認是關(guān)斷的具體要看芯片手冊的默認狀態(tài)。我遇到過一次尷尬板子回來主控還沒固件PMIC 某個通道默認把 3.3V 輸出了導致后級還沒初始化的通信芯片上了一半電狀態(tài)怪異。后來我把關(guān)鍵通道的 EN 引腳全部改為由主控 GPIO 控制固件跑起來之后再拉高使能徹底避免了這類問題。狀態(tài)信號串聯(lián)也要考慮。如果 PMIC 的電源正常指示信號要送到主控或者送到后級電路的復位端要注意電平匹配。有的 PMIC 輸出的是開漏結(jié)構(gòu)需要外接上拉有的是推挽輸出電壓可能與主控 IO 電壓域不匹配。我在設(shè)計時加了電平轉(zhuǎn)換保護即使 PMIC 輸出的電壓域和主控不一致也不會燒毀引腳。4. 固件實現(xiàn)I2C 配置與動態(tài)電源管理硬件只是骨架真正讓電源管理“活”起來的是固件。這一節(jié)是整篇文章里信息密度最高的部分我會把 I2C 初始化、寄存器配置、模式切換和故障診斷完整串一遍。代碼以偽代碼和示例代碼為主具體寄存器地址和位定義請嚴格對照你手上那顆芯片的數(shù)據(jù)手冊。4.1 先搞清 I2C 地址與寄存器讀寫寫固件之前第一件事是確認 PCA9422 的 I2C 地址。這類 PMIC 一般有多個地址引腳可以硬件配置地址的低位。我的板子上 PMIC 設(shè)備地址是 0x60 左右具體值以手冊為準。初始化 I2C 外設(shè)時注意總線速率不要太激進我用的 400kHz穩(wěn)定可靠。如果總線過長或者上拉電阻偏大可以降到 100kHz 試一下。接下來寫一個基礎(chǔ)的讀寫函數(shù)void pmic_write_reg(uint8_t reg, uint8_t val) { uint8_t buf[2] { reg, val }; i2c_write(I2C_BUS, PMIC_ADDR, buf, 2); } uint8_t pmic_read_reg(uint8_t reg) { i2c_write(I2C_BUS, PMIC_ADDR, reg, 1); uint8_t val; i2c_read(I2C_BUS, PMIC_ADDR, val, 1); return val; }這個函數(shù)是后面所有功能的基礎(chǔ)。我建議在固件里增加一個讀回校驗操作寫完寄存器之后馬上讀回來比較不一致就重寫連續(xù)三次失敗上報錯誤。因為 PMIC 在電源不穩(wěn)的瞬間I2C 寫操作有可能被跳過如果沒有校驗后面所有配置都會白費。4.2 初始化配置流程初始化配置流程要按順序來不能亂。我總結(jié)了一套步驟先配置通道電壓值再配置通道使能最后配置時序和中斷。順序倒過來會導致上電瞬間的電壓和時序不對可能損壞負載設(shè)備。以我的項目為例偽代碼如下void pmic_init(void) { // 1. 配置各通道電壓 pmic_write_reg(REG_VOUT_SEL_0, 0x32); // 通道0: 1.8V pmic_write_reg(REG_VOUT_SEL_1, 0x50); // 通道1: 3.3V pmic_write_reg(REG_LDO_VOUT, 0x50); // LDO: 3.3V // 2. 配置電流限制和保護閾值 pmic_write_reg(REG_ILIM, 0x0F); // 3. 配置上電時序 pmic_write_reg(REG_PWR_SEQ, 0x12); // 4. 使能輸出 pmic_write_reg(REG_ENABLE, 0x07); // 5. 讀回校驗 uint8_t chk pmic_read_reg(REG_ENABLE); if (chk ! 0x07) { error_handler(); } }這里每個寄存器的數(shù)值都需要對照手冊核對不要直接抄我的值。我寫這段主要是想強調(diào)流程電壓先定使能后開時序由固化寄存器控制最后必須回讀。曾經(jīng)有一版固件漏了回讀某次電源彈跳把配置丟了系統(tǒng)在沒配置好的狀態(tài)下運行了一個多小時直到通信異常才被發(fā)現(xiàn)。加回讀后這類問題在啟動階段就直接被攔截。4.3 運行模式切換與動態(tài)電壓調(diào)整動態(tài)電源管理的核心是把系統(tǒng)的運行狀態(tài)映射到 PMIC 的通道開關(guān)和電壓值上。我的系統(tǒng)有三個主要狀態(tài)切換void system_enter_sleep(void) { pmic_write_reg(REG_ENABLE, 0x01); // 只保留核心供電 // 關(guān)閉傳感器電源軌、通信電源軌 pmic_write_reg(REG_VOUT_SEL_0, 0x18); // 核心電壓降到 1.2V sys_sleep_mode(); } void system_enter_active(void) { pmic_write_reg(REG_VOUT_SEL_0, 0x32); // 核心電壓恢復到 1.8V pmic_write_reg(REG_ENABLE, 0x07); // 打開全部通道 }休眠降電壓、運行升電壓這個動態(tài)調(diào)整是降低整體功耗最有效的手段。PIC32MZ1024EFK144 工作在 1.2V 時動態(tài)功耗比 1.8V 時下降明顯而穩(wěn)壓的靜態(tài)損耗也降低了不少。有一點要注意提高電壓前先讓軟件準備新的外設(shè)狀態(tài)降低電壓前確保外設(shè)已經(jīng)關(guān)閉。順序反了負載會在欠壓狀態(tài)下工作輕則數(shù)據(jù)錯亂重則鎖死。4.4 電池監(jiān)控與故障診斷閉環(huán)完整電源管理還包含狀態(tài)感知。PCA9422 一般提供電壓、電流和溫度狀態(tài)寄存器主控可以周期性讀取。我的做法是每秒鐘讀一次電池電壓和核心電壓并存到環(huán)形緩沖區(qū)。一旦電源出現(xiàn)異常波動可以通過歷史數(shù)據(jù)快速定位是瞬間電流沖擊還是持續(xù)的供電不足。故障診斷閉環(huán)是這樣做的void pmic_monitor_task(void) { uint16_t vbat pmic_read_reg(REG_VBAT_ADC_H) 8 | pmic_read_reg(REG_VBAT_ADC_L); if (vbat LOW_THRESHOLD) { // 通知應(yīng)用層保存重要數(shù)據(jù)進入低功耗模式 system_enter_brownout(); } // 檢查過溫標志 if (pmic_read_reg(REG_STATUS) TEMP_ALERT) { pmic_write_reg(REG_ENABLE, 0x01); } }有了這個閉環(huán)系統(tǒng)能自己處理很多電源異常不用每次都等人工介入。我還把 PMIC 的中斷輸出接到了主控的喚醒引腳這樣電源異常時主控可以立刻從休眠中醒來處理。5. 實測數(shù)據(jù)與常見問題排查配置寫完總要上電實測。這一章分享我的實測記錄和排查經(jīng)驗很多問題不是芯片不行而是調(diào)試方法不對導致誤判。5.1 上電時序?qū)崪y記錄實測上電時我用示波器同時抓了核心電壓、模擬電壓和復位引腳。理想時序是核心電壓先到目標值然后模擬電壓跟上最后復位釋放。因為是 PMIC 內(nèi)部時序控制的過程非常穩(wěn)定三路波形間隔約 5ms與配置完全一致。這里要提醒一下觀察時鐘的觸發(fā)電平用 1V 左右別用 50% 的默認觸發(fā)電平因為 1.8V 電壓軌的 50% 是 0.9V容易誤觸發(fā)。另一個實測項目是動態(tài)調(diào)壓的響應(yīng)時間。從發(fā)出 I2C 寫寄存器命令到輸出穩(wěn)定到新電壓值大約需要 3 到 5ms。這個時間對系統(tǒng)狀態(tài)切換是足夠的。如果發(fā)現(xiàn)響應(yīng)時間特別長檢查一下 I2C 總線上有沒有其他設(shè)備長時間占用總線或者寫寄存器時有沒有被中斷打斷。5.2 常見問題速查表調(diào)試過程中遇到的問題我整理成了一張速查表現(xiàn)象可能原因排查方向上電后主控反復復位電壓軌時序不對檢查 PMIC 時序配置、復位釋放點I2C 讀寫超時地址錯誤/上拉電阻太大確認地址引腳、減小上拉到 2.2kΩ輸出電壓偏低反饋采樣點遠或電感飽和檢查反饋走線、換用高飽和電流電感休眠電流偏高某路負載未真正關(guān)斷逐通道關(guān)閉輸出用電流表確認無線模塊發(fā)包時電壓跌落瞬態(tài)電流超出通道能力增大輸出電容、檢查電感余量ADC 采樣噪聲大模擬供電和數(shù)字供電耦合磁珠隔離、模擬地分區(qū)這張表在實際排查時非常有用。比如“I2C 讀寫超時”這個問題我遇到過兩次一次是上拉電阻選了 10kΩ總線電容偏高導致沿太慢另一次是 PCA9422 的地址引腳被懸空結(jié)果默認地址和我配置的不一致。排查這些問題時先看波形再看寄存器不要上來就換芯片。5.3 功耗測量技巧測功耗是電源管理調(diào)試里最容易翻車的環(huán)節(jié)。萬用表串聯(lián)進去測先不說表的內(nèi)阻影響單是表在各個量程之間的切換就會引入很大誤差。我的做法是在電池輸入串聯(lián)一個 1mΩ 精密采樣電阻用示波器差分探頭量壓降這樣既能看平均功耗又能抓瞬態(tài)尖峰。測休眠電流時要確保系統(tǒng)確實進入了休眠狀態(tài)而不是停在某個空循環(huán)里空轉(zhuǎn)。我以前只測過軟件休眠標志位沒注意外設(shè)時鐘還在跑白白浪費了半個月優(yōu)化“虛假的功耗”。測量時還要注意把探頭盡量靠近負載端避免線纜上的壓降導致測量點電壓與實際不符。瞬態(tài)電流測量要配合負載開關(guān)的狀態(tài)一起分析這樣才能看出哪些外設(shè)是真正的功耗大戶。6. 經(jīng)驗與擴展建議整套方案跑下來我最大的體會是完整電源管理不是讓主控用寄存器控制電源芯片這么簡單它是一個閉環(huán)系統(tǒng)電壓軌規(guī)劃、硬件布局、初始化時序、運行狀態(tài)切換、故障診斷五個環(huán)節(jié)缺一不可。PCA9422 和 PIC32MZ1024EFK144 這對組合給我最大的驚喜是它們把電源管理從“硬件工程師不斷地改電阻換電容”提升到了“固件工程師寫代碼就能調(diào)電源”的層次。最后分享一個我的個人習慣每次調(diào)完電源把寄存器配置和實測波形存檔包括異常波形。這樣做的好處是下次改版或者換主控時可以直接對比舊版本的數(shù)據(jù)快速判斷是軟件引入的問題還是硬件的退化。我就是靠著一份完整的調(diào)試記錄把第二版板子的硬件調(diào)通時間從兩周壓縮到了三天。如果你也準備用這套組合建議先從電壓軌規(guī)劃表開始不要急著畫原理圖。把每一路電流估算清楚把上電時序想明白后面的一切都會順利很多。等這套基礎(chǔ)玩法跑通之后還可以嘗試利用 PMIC 的更深層功能比如根據(jù)負載動態(tài)切換 DC-DC 的強制 PWM 和跳過模式配合主控的算法進一步省電。那個方向又夠折騰一陣子了。