同實(shí)現(xiàn)多路電源時(shí)序與故障監(jiān)控)
嵌入式設(shè)備做到一定復(fù)雜度電源方案就不再是“選個(gè) DCDC、接幾個(gè)電容”就能糊弄過(guò)去的事情。多路電壓軌、上電時(shí)序、過(guò)壓欠壓保護(hù)、遠(yuǎn)程狀態(tài)上報(bào)每一項(xiàng)都會(huì)變成實(shí)際問(wèn)題。我最近在整理一個(gè)控制板項(xiàng)目主控用的是 PIC18F4680前端電源交給 PCA9422 這顆多通道 PMIC整套系統(tǒng)基本做到了“上電有序、運(yùn)行可控、故障可查”。這篇就圍繞這個(gè)組合把從硬件連接到軟件配置、從調(diào)試到量產(chǎn)的完整思路寫(xiě)一寫(xiě)給正在糾結(jié)電源管理架構(gòu)的朋友一個(gè)參考。先說(shuō)結(jié)論如果你的項(xiàng)目只是單路 5V 轉(zhuǎn) 3.3V老老實(shí)實(shí)用一顆 LDO 或者 DCDC 就好沒(méi)必要上 MCU 加 PMIC。但如果你手里有五六路電壓軌還要控制時(shí)序和監(jiān)控故障那 MCU 加可編程 PMIC 的組合就非常合適。PCA9422 這類(lèi)芯片把多路 DCDC/LDO、時(shí)序控制、保護(hù)邏輯集成在一起PIC18F4680 則負(fù)責(zé)用 I2C 去配置、讀取、響應(yīng)中斷兩者各管一段職責(zé)非常清楚。1. 項(xiàng)目整體思路與方案拆解1.1 核心需求完整電源管理到底在管什么“完整電源管理”這幾個(gè)字聽(tīng)起來(lái)很空落到項(xiàng)目里其實(shí)是幾件非常具體的事。第一是電壓軌的數(shù)量和精度。常見(jiàn)嵌入式系統(tǒng)至少需要 5V、3.3V、1.8V、1.2V 這類(lèi)電源模擬前端可能還要獨(dú)立的 3.3V 或 2.5V 穩(wěn)壓數(shù)字核和 IO 供電有時(shí)甚至要求 1% 以內(nèi)的偏差。每一路都用一個(gè)獨(dú)立電源芯片原理圖會(huì)變得很龐大而且很難統(tǒng)一做保護(hù)和監(jiān)控。第二是上電時(shí)序。很多處理器和外設(shè)對(duì)電源軌的啟動(dòng)順序很敏感比如核心電壓必須先于 IO 電壓或者某路電壓穩(wěn)定之后再過(guò)幾百毫秒才能開(kāi)啟另一路。用分立器件做延時(shí)電路也能實(shí)現(xiàn)但改起來(lái)特別麻煩。用可編程 PMIC 的好處是時(shí)序參數(shù)可以寫(xiě)在寄存器里硬件調(diào)試時(shí)無(wú)需改板子。第三是故障監(jiān)控和恢復(fù)。電源不是只要輸出正常就行還要能發(fā)現(xiàn)過(guò)流、過(guò)壓、欠壓、過(guò)溫這些異常并且把這些狀態(tài)告訴主控。PIC18F4680 本身有 ADC 和中斷輸入但直接采樣每一路電壓需要很多引腳而且沒(méi)法快速感知 PMIC 內(nèi)部的故障。把監(jiān)控放在 PMIC 里MCU 定期讀取狀態(tài)寄存器是最經(jīng)濟(jì)的方式。第四是低功耗和動(dòng)態(tài)行為。設(shè)備在不同運(yùn)行階段需要的功耗不一樣比如待機(jī)時(shí)關(guān)掉大功率外設(shè)電源運(yùn)行時(shí)再把電壓提上去。如果 MCU 能通過(guò) I2C 控制 PMIC 的通道開(kāi)關(guān)和輸出電壓就可以實(shí)現(xiàn)“按需供電”而不是讓所有電壓軌一直白白耗電。所以標(biāo)題里那“完整”兩個(gè)字指的不是把電源做得有多豪華而是要覆蓋生成、時(shí)序、監(jiān)控、保護(hù)、調(diào)度這一整套閉環(huán)。1.2 方案選型為什么是 PCA9422 PIC18F4680選擇 PCA9422 而不是普通 DCDC最主要的原因是可配置性和集成度。這類(lèi) PMIC 內(nèi)部通常包含多路降壓轉(zhuǎn)換器和 LDO并且有一組寄存器用來(lái)設(shè)定輸出電壓、開(kāi)關(guān)時(shí)序、軟啟動(dòng)斜率、限流點(diǎn)甚至故障響應(yīng)策略。只要用 I2C 或 SPI 寫(xiě)入配置就能在很大范圍內(nèi)調(diào)整電源行為。對(duì)于原型階段經(jīng)常改參數(shù)的項(xiàng)目這種靈活性非常寶貴。PIC18F4680 這邊看中的是它的外設(shè)搭配。它自帶 MSSP 模塊可以作為 I2C 主設(shè)備直接操作 PMIC 的寄存器解決控制通路的問(wèn)題又有多通道 10 位 ADC可以獨(dú)立回采幾路關(guān)鍵電壓做交叉校驗(yàn)再加上 CAN 硬件模塊如果需要把電源狀態(tài)發(fā)送到總線上比如車(chē)載或者分布式工業(yè)控制場(chǎng)景這顆 MCU 可以直接完成不需要額外接一顆協(xié)議芯片。整套組合的界線很清晰PCA9422 負(fù)責(zé)“電源業(yè)務(wù)”P(pán)IC18F4680 負(fù)責(zé)“管理業(yè)務(wù)”。硬件上只有 I2C、使能、中斷、電源四組連接軟件上 MCU 不會(huì)陷進(jìn)復(fù)雜的電源環(huán)路設(shè)計(jì)PMIC 也不需要理解整個(gè)系統(tǒng)在跑什么業(yè)務(wù)邏輯。1.3 系統(tǒng)架構(gòu)里各個(gè)角色的職責(zé)先畫(huà)一個(gè)簡(jiǎn)單的邏輯架構(gòu)外部輸入電源比如 12V 或者電池進(jìn) PCA9422 的輸入引腳PMIC 內(nèi)部經(jīng)過(guò)通道配置輸出多路電壓供給 MCU、傳感器、通信模塊等負(fù)載。PIC18F4680 的 I2C 引腳接 PMIC 的 I2C 從機(jī)端口GPIO 接 PMIC 的 EN 引腳和中斷輸出引腳ADC 再引幾路采樣電阻來(lái)監(jiān)測(cè)關(guān)鍵電壓。整個(gè)系統(tǒng)的決策鏈?zhǔn)沁@樣的PMIC 產(chǎn)生電源并檢測(cè)自身異常一旦發(fā)生故障就把中斷引腳拉低MCU 被觸發(fā)后讀取狀態(tài)寄存器明確是哪一路出了問(wèn)題再?zèng)Q定是嘗試恢復(fù)還是直接關(guān)機(jī)告警。這套架構(gòu)還有一個(gè)隱藏優(yōu)勢(shì)如果 PMIC 的中斷引腳接到 PIC18F4680 的外部中斷輸入那么 MCU 平時(shí)可以進(jìn)入休眠狀態(tài)不需要輪詢電源狀態(tài)。真正出現(xiàn)電壓跌落或者過(guò)流時(shí)PMIC 會(huì)通過(guò)中斷把 MCU 喚醒既保證了響應(yīng)速度又降低了待機(jī)功耗。這一點(diǎn)在小電流電池供電的設(shè)備里特別有用。2. 硬件設(shè)計(jì)與關(guān)鍵連接2.1 電源鏈路與參數(shù)選擇做硬件設(shè)計(jì)時(shí)先別急著看軟件、寫(xiě)代碼把電源鏈路算清楚再動(dòng)手。我這里拿一個(gè)典型的項(xiàng)目場(chǎng)景做例子輸入是 12V 直流系統(tǒng)需要 3.3V 給主控5V 給傳感器和通信模塊還要一路 1.8V 給某個(gè)數(shù)字模塊。PCA9422 內(nèi)部對(duì)應(yīng)通道會(huì)承擔(dān)不同的輸出。選擇輸出電容時(shí)一般按每輸出 1A 配 10uF 到 22uF 的 X7R 或 X5R 陶瓷電容放在芯片輸出引腳附近。容量太小瞬態(tài)響應(yīng)會(huì)差容量太大軟啟動(dòng)時(shí)充電電流會(huì)過(guò)大可能觸發(fā) PMIC 的限流保護(hù)。比如 3.3V 輸出按 500mA 峰值電流算輸出電容用 22uF 是穩(wěn)妥的1.8V 輸出功耗小用 10uF 就夠。輸入電容要更大一些因?yàn)樵诙嗦坟?fù)載同時(shí)切換時(shí)輸入電壓容易跌落我用的是 47uF 加一個(gè) 0.1uF 高頻去耦電容。電感的選擇要關(guān)注飽和電流。DCDC 通道的電感飽和電流最好留 30% 以上的裕量比如實(shí)際負(fù)載最大 500mA電感的飽和電流最好在 750mA 以上。曾經(jīng)遇到過(guò)電感選小了負(fù)載一上來(lái)電感就飽和輸出紋波變得非常難看而且電感還會(huì)嘯叫。注意PMIC 的輸出電壓和限流值不要只看芯片手冊(cè)里“最大能輸出多少”還要結(jié)合自己的負(fù)載變化率一起評(píng)估。動(dòng)態(tài)負(fù)載的啟動(dòng)電流往往比穩(wěn)態(tài)電流高一截硬件上留出裕量軟件上也要設(shè)計(jì)好軟啟動(dòng)。2.2 I2C 接口連接與上拉電阻PIC18F4680 的 MSSP 模塊可以工作在 I2C 主模式與 PCA9422 的 I2C 從機(jī)接口連接。連接本身很簡(jiǎn)單SCL 接 SCLSDA 接 SDA兩邊共地然后加 I2C 總線上拉電阻。上拉電阻的選擇不能隨便來(lái)我一般先用 4.7kΩ總線速度快不起來(lái)的時(shí)候再改為 2.2kΩ。如果 MCU 和 PMIC 的 IO 電平不一致比如 MCU 是 3.3V IOPMIC 那邊是 1.8V IO就必須加電平轉(zhuǎn)換或者確認(rèn)雙方是否兼容。PCA9422 這類(lèi) PMIC 的 I2C 電平通常會(huì)在數(shù)據(jù)手冊(cè)里寫(xiě)清楚設(shè)計(jì)時(shí)最好留一個(gè)電平轉(zhuǎn)換芯片的位置等確認(rèn)實(shí)驗(yàn)板沒(méi)問(wèn)題后再?zèng)Q定法拉不焊。另一個(gè)容易被忽略的是地址引腳。PMIC 的 I2C 地址一般由 ADDR/SEL 引腳的電平?jīng)Q定。硬件上接上拉或下拉后軟件里要先確定實(shí)際地址再寫(xiě)死到通信代碼里。如果 PCB 上這個(gè)引腳懸空默認(rèn)電平往往不是你想要的地址第一輪調(diào)試就會(huì)栽在通信上。2.3 使能、中斷與復(fù)位邏輯PMIC 的 EN 引腳是總開(kāi)關(guān)我用 PIC18F4680 的一個(gè) GPIO 控制。為什么要用 GPIO 控制而不直接接輸入電源因?yàn)檫@樣可以實(shí)現(xiàn)“軟開(kāi)關(guān)”MCU 先跑起來(lái)再?zèng)Q定是否開(kāi)啟 PMIC 輸出。如果 PMIC 默認(rèn)上電就輸出MCU 可能還沒(méi)運(yùn)行負(fù)載就已經(jīng)被供電某些負(fù)載可能在沒(méi)有初始化完成時(shí)出現(xiàn)不確定狀態(tài)。中斷引腳 INT 連接 PIC18F4680 的外部中斷輸入觸發(fā)方式應(yīng)設(shè)置為下降沿觸發(fā)。PMIC 檢測(cè)到故障時(shí)通常會(huì)把 INT 拉低MCU 從休眠中喚醒后去讀狀態(tài)寄存器。這里要特別注意中斷是事件觸發(fā)不是狀態(tài)觸發(fā)所以在中斷里應(yīng)該快速讀取狀態(tài)并做一次“清中斷”動(dòng)作否則相同的故障會(huì)反復(fù)觸發(fā)。復(fù)位邏輯上我給 PMIC 的中斷輸出和使能控制都加了 RC 延時(shí)或緩沖避免 MCU 上電期間 GPIO 狀態(tài)不穩(wěn)定導(dǎo)致 PMIC 被誤開(kāi)或誤關(guān)。PIC18F4680 的 GPIO 在上電瞬間是輸入狀態(tài)外部控制腳的默認(rèn)電平必須靠上下拉電阻保證。2.4 PCB 布局中的幾個(gè)重點(diǎn)布局決定成敗。DCDC 開(kāi)關(guān)節(jié)點(diǎn)的高頻噪聲非常容易串到 I2C 信號(hào)線上一旦 I2C 通信被干擾讀取電壓配置就會(huì)得到亂值。第一PCA9422 的輸入電容要盡量靠近芯片電源引腳輸出電感下面不要鋪大面積的信號(hào)參考層減少開(kāi)關(guān)噪聲對(duì)地平面的污染。第二I2C 的 SDA 和 SCL 走線盡量短最好相鄰走線中間夾一根地線或者至少保持平行且靠近地參考層。我一開(kāi)始圖省事把 I2C 走線在板子上繞了大半圈結(jié)果 100kHz 工作正常400kHz 一開(kāi)就跑飛后來(lái)才發(fā)現(xiàn)是走線過(guò)長(zhǎng)且離電感太近。第三如果要回采輸出電壓ADC 的分壓電阻要放在負(fù)載端取樣直接量 PMIC 輸出端和負(fù)載端會(huì)有差異尤其是大電流路徑上有明顯壓降的話。提示能用一個(gè)完整的地平面就盡量用。PMIC 的多種輸出電壓軌如果回流路徑不干凈會(huì)出現(xiàn)奇怪的兩個(gè)地之間有電位差的問(wèn)題輕則 ADC 讀數(shù)不準(zhǔn)重則燒邏輯。3. 軟件驅(qū)動(dòng)與實(shí)操流程3.1 底層 I2C 通信函數(shù)寫(xiě)軟件時(shí)先做一組可靠的 I2C 讀寫(xiě)原語(yǔ)不要一上來(lái)就寫(xiě)業(yè)務(wù)邏輯。PIC18F4680 的 MSSP 模塊用庫(kù)函數(shù)或者直接操作寄存器都行我這里給出一個(gè)基于寄存器的簡(jiǎn)化思路。uint8_t pca9422_write_reg(uint8_t device_addr, uint8_t reg_addr, uint8_t data) { // 發(fā)送起始條件 // 發(fā)送 device_addr 1 | 0 (寫(xiě)標(biāo)志) // 等待 SSPIF 置位檢查 ACK // 發(fā)送 reg_addr等待 ACK // 發(fā)送 data等待 ACK // 發(fā)送停止條件 // 返回成功或失敗 }代碼看起來(lái)簡(jiǎn)單但有幾個(gè)容易出錯(cuò)的地方。第一每一次發(fā)送字節(jié)后都要等待 MSSP 的中斷標(biāo)志位并檢查 ACK 狀態(tài)如果從機(jī)沒(méi)有應(yīng)答就繼續(xù)發(fā)會(huì)導(dǎo)致總線掛死。第二重復(fù)一些寄存器寫(xiě)入時(shí)最好加一個(gè)小的延時(shí)尤其是 PMIC 內(nèi)部 EEPROM 或者配置加載期間寫(xiě)太快會(huì)丟數(shù)據(jù)。第三錯(cuò)誤處理不應(yīng)該是清一下標(biāo)志就完事還要考慮總線恢復(fù)連續(xù) 9 個(gè) SCL 時(shí)鐘脈沖可以幫忙解除 SDA 被拉死的狀態(tài)這個(gè)邏輯可以放在重試函數(shù)里。I2C 時(shí)鐘速度方面我習(xí)慣先用 100kHz 調(diào)試穩(wěn)定后再改到 400kHz。波特率由 MSSP 的 SSPADD 寄存器決定以系統(tǒng)時(shí)鐘 8MHz、目標(biāo)頻率 400kHz 算理論值是 Fosc 除以 4 倍再減 1也就是SSPADD 8MHz / (4 * 400kHz) - 1 4。但實(shí)際還要考慮上升沿時(shí)間和線上電容我經(jīng)常會(huì)設(shè)成 4 或者 5再拿示波器看實(shí)際波形保證滿足時(shí)序要求。3.2 初始化與輸出電壓配置初始化 PMIC 的順序我總結(jié)成一句先確認(rèn)通信再確認(rèn)身份最后才寫(xiě)配置。上電后 MCU 先調(diào)用pca9422_read_id()讀取芯片 ID 寄存器確認(rèn) I2C 地址和通信鏈路都沒(méi)問(wèn)題。如果讀到 0xFF 或者 0x00說(shuō)明 SDA/SCL 可能有接觸問(wèn)題、上拉不對(duì)或者地址不對(duì)這時(shí)候不要繼續(xù)往下寫(xiě)先把問(wèn)題解決掉。接下來(lái)配置各通道輸出電壓。PCA9422 的電壓配置寄存器一般是一路一個(gè)字節(jié)其中低幾位是電壓索引高幾位可能還有使能位或模式選擇。我這里用一個(gè)表列出示例配置通道目標(biāo)電壓寄存器配置值示例說(shuō)明VOUT13.3V0x1A主控電源軟啟動(dòng)時(shí)間較長(zhǎng)VOUT25.0V0x2C傳感器電源限流點(diǎn)略高VOUT31.8V0x0F數(shù)字核心電壓精度要求高注意上面這些數(shù)值不是給你直接抄的不同批次、不同型號(hào)定義不一樣必須對(duì)著手頭數(shù)據(jù)手冊(cè)找。我見(jiàn)過(guò)有人直接把另一個(gè)項(xiàng)目的寄存器值移植過(guò)來(lái)結(jié)果輸出電壓高了 0.4V后級(jí)芯片直接冒煙。配置寫(xiě)完之后還有一個(gè)關(guān)鍵步驟回讀驗(yàn)證。寫(xiě)進(jìn)去再讀出來(lái)跟期望值比對(duì)一次。很多 PMIC 寄存器寫(xiě)一次不一定馬上生效可能需要等內(nèi)部 LDO 穩(wěn)定之后才能讀回真實(shí)值。3.3 上電時(shí)序控制的實(shí)現(xiàn)PCA9422 這類(lèi) PMIC 一般會(huì)提供可編程延時(shí)比如 VOUT1 使能后延時(shí) 5ms 再使能 VOUT2。寄存器里通常會(huì)有seq_delay或startup_delay之類(lèi)的位配置方式是把延時(shí)檔位寫(xiě)到某個(gè)寄存器。不過(guò)軟件上也不能完全把時(shí)序甩給 PMIC。MCU 需要知道每一個(gè)電源軌什么時(shí)候就緒。我的做法是使能 PMIC 輸出之后不要立刻初始化外設(shè)而是利用一個(gè) GPIO 或者 PMIC 的 Power Good 狀態(tài)來(lái)等待穩(wěn)定。如果 PMIC 有 PGOOD 引腳直接接到 MCU 的另一個(gè) GPIO如果只有狀態(tài)位那就輪詢狀態(tài)寄存器直到對(duì)應(yīng)位置位。這里要提一個(gè)坑不要把 Power Good 當(dāng)成“電壓已經(jīng)穩(wěn)定”的絕對(duì)依據(jù)。它更多是芯片內(nèi)部比較器判斷的結(jié)果從比較器到 MCU 讀取之間還有延遲所以重要外設(shè)的復(fù)位釋放時(shí)間要額外加一點(diǎn)余量。比如 Power Good 已經(jīng)置位我再加 2ms 延時(shí)才釋放傳感器的復(fù)位引腳這樣穩(wěn)妥很多。3.4 狀態(tài)監(jiān)控與故障處理運(yùn)行時(shí)要做的不是反復(fù)讀所有電壓寄存器而是依靠中斷和狀態(tài)寄存器配合。主循環(huán)里可以只定期核對(duì)兩個(gè)狀態(tài)全局 status 寄存器有沒(méi)有非零錯(cuò)誤位當(dāng)前工作模式是否正常。如果發(fā)現(xiàn)異常再按位解析是哪一路故障。PIC18F4680 的中斷服務(wù)程序里可以設(shè)置一個(gè)power_fault_flag主循環(huán)發(fā)現(xiàn)標(biāo)志后調(diào)用故障處理函數(shù)不推薦在中斷里做長(zhǎng)時(shí)間處理。故障處理函數(shù)至少要做這些事讀到狀態(tài)寄存器區(qū)分過(guò)流、過(guò)壓、欠壓、過(guò)溫如果是瞬態(tài)過(guò)流可以嘗試重新使能對(duì)應(yīng)通道如果連續(xù)重啟幾次都失敗就不要再反復(fù)嘗試直接進(jìn)入保護(hù)狀態(tài)把 LED 或者蜂鳴器拉響同時(shí)保存故障代碼到 EEPROM。PIC18F4680 自帶 EEPROM不用外掛存儲(chǔ)這個(gè)優(yōu)勢(shì)在電源故障記錄上很好用。我做過(guò)一個(gè)設(shè)備每次故障重啟后蜂鳴器叫一聲用戶也不知道是哪種問(wèn)題后來(lái)把故障碼寫(xiě)進(jìn) EEPROM現(xiàn)場(chǎng)維護(hù)人員通過(guò)通信接口讀出來(lái)問(wèn)題定位快了很多。4. 低功耗運(yùn)行與動(dòng)態(tài)電源調(diào)度4.1 低功耗模式的設(shè)計(jì)思路電池供電的設(shè)備最關(guān)心的往往不是極限性能而是待機(jī)能耗。MCU 進(jìn)入休眠只是其中一部分PMIC 的負(fù)載才是大頭。如果幾個(gè)外設(shè)電源軌在待機(jī)時(shí)仍然開(kāi)著那待機(jī)電流依然降不下去。低功耗設(shè)計(jì)的第一步是把 PMIC 的通道按照系統(tǒng)狀態(tài)分組。比如通信模塊算一組傳感器算一組核心主控算一組。在待機(jī)狀態(tài)下關(guān)閉通信模塊和傳感器的電源軌只保留主控電源和實(shí)時(shí)時(shí)鐘電源。PIC18F4680 在休眠前通過(guò) I2C 寫(xiě) PMIC 對(duì)應(yīng)通道的使能寄存器把不需要的通道關(guān)掉。第二步MCU 進(jìn)入 SLEEP 指令前要確認(rèn) PMIC 的中斷引腳仍然接到外部喚醒源上。否則用戶按鍵或者外部設(shè)備發(fā)來(lái)喚醒信號(hào)時(shí)主控還在睡。PCA9422 如果有關(guān)鍵電壓跌落也會(huì)通過(guò) INT 引腳喚醒主控這是系統(tǒng)最后一道防線。4.2 動(dòng)態(tài)調(diào)整輸出電壓有些模塊在不同工作模式下對(duì)電壓要求不同。比如射頻模塊發(fā)射時(shí)可能需要 3.3V接收時(shí)可以降到 2.8V 來(lái)節(jié)能。這種動(dòng)態(tài)調(diào)壓可以通過(guò) I2C 修改 PMIC 對(duì)應(yīng)通道的輸出電壓寄存器實(shí)現(xiàn)。但要注意動(dòng)態(tài)調(diào)壓不能一步切臺(tái)。如果一下子從 3.3V 改到 2.8V負(fù)載端可能來(lái)不及適應(yīng)而且輸出電容的充放電電流對(duì) PMIC 內(nèi)部環(huán)路也是個(gè)擾動(dòng)。我一般會(huì)分幾步調(diào)整先寫(xiě)一個(gè)中間檔延時(shí)幾毫秒再寫(xiě)目標(biāo)檔必要時(shí)配合 MCU 工作頻率一起降。這里有一個(gè)工程經(jīng)驗(yàn)動(dòng)態(tài)調(diào)壓前先看看該通道有沒(méi)有“transient response”或者“slew rate”相關(guān)的寄存器。有的 PMIC 可以設(shè)置壓擺率專門(mén)用來(lái)控制輸出電壓變化速率。如果硬件上不支持那就靠軟件多寫(xiě)幾步實(shí)現(xiàn)軟切。4.3 掉電保存與快速保護(hù)系統(tǒng)掉電時(shí)PMIC 的輸入電壓會(huì)下降之后各通道輸出電壓跟著跌落。如果主控還在寫(xiě) Flash 或者保存關(guān)鍵參數(shù)半路斷電會(huì)讓數(shù)據(jù)損壞。常規(guī)做法是把 PMIC 的輸入電壓檢測(cè)引腳接到一個(gè)比較閾值一旦檢測(cè)到輸入低于閾值迅速產(chǎn)生中斷MCU 利用輸出大電容里殘余的電荷在幾十毫秒內(nèi)完成關(guān)鍵數(shù)據(jù)保存。PIC18F4680 內(nèi)置 EEPROM寫(xiě)一個(gè)字節(jié)大概是幾毫秒足夠保存幾百字節(jié)的狀態(tài)。硬件設(shè)計(jì)時(shí)最好在 PMIC 輸入側(cè)放一個(gè)較大的儲(chǔ)能電容這樣掉電后還能維持主控運(yùn)行一段時(shí)間。我實(shí)際測(cè)過(guò)10uF 的輸入電容在 12V 輸入掉電后維持不了幾毫秒至少要用 100uF 鋁電解或者超級(jí)電容才能保證寫(xiě)入時(shí)間。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 I2C 讀寫(xiě)全是 0xFF 或 0x00這是最常遇到的第一個(gè)問(wèn)題。原因通常是幾個(gè)簡(jiǎn)單但對(duì)新手很隱蔽的地方。先檢查設(shè)備地址。PMIC 的地址引腳如果接法不對(duì)讀出來(lái)的地址就跟數(shù)據(jù)手冊(cè)不一樣。我習(xí)慣寫(xiě)一個(gè)小函數(shù)掃描 0x00 到 0x7F 所有地址然后打印出哪幾個(gè)地址有 ACK 應(yīng)答就能快速確認(rèn)實(shí)際地址。第二查 SDA/SCL 是否反接很多 PCB 布局為了繞線方便會(huì)故意交叉但 I2C 不允許 SDA/SDA 混著接邏輯分析儀一看波形就能發(fā)現(xiàn)。第三查上拉電阻沒(méi)有上拉電阻的話總線空閑時(shí) SDA 和 SCL 都可能被芯片內(nèi)部拉到一個(gè)不確定電平通信自然失敗。5.2 上電時(shí)序?qū)е潞蠹?jí)反復(fù)重啟如果一個(gè)系統(tǒng)上電后一直重啟先把輸出紋波和電源軌上電波形抓出來(lái)看。我遇到過(guò) PMIC 默認(rèn)輸出順序跟后級(jí)需求正好相反導(dǎo)致后級(jí)芯片先供電后復(fù)位邏輯混亂。解決辦法是利用 PMIC 的時(shí)序配置把目標(biāo)順序顯式寫(xiě)死。還有一個(gè)常見(jiàn)原因是過(guò)流保護(hù)誤觸發(fā)??蛰d的時(shí)候一切正常接上負(fù)載后某一路啟動(dòng)電流超過(guò) PMIC 限流點(diǎn)PMIC 自動(dòng)關(guān)斷輸出又迅速重啟形成循環(huán)。排查時(shí)最好斷開(kāi)負(fù)載先讓 PMIC 空載啟動(dòng)觀察每一路電壓再逐步接負(fù)載。如果確認(rèn)是限流問(wèn)題調(diào)整限流寄存器或者把對(duì)應(yīng)通道的軟啟動(dòng)時(shí)間調(diào)長(zhǎng)。5.3 輸出紋波偏大和開(kāi)關(guān)噪聲干擾紋波大不一定就是電容少。我遇到過(guò)電感選型不當(dāng)導(dǎo)致飽和輸出紋波從 20mV 變成 100mV換了一顆飽和電流更大的電感之后明顯改善。排查手段是先看開(kāi)關(guān)節(jié)點(diǎn)波形再量輸出電壓紋波。如果開(kāi)關(guān)節(jié)點(diǎn)波形邊緣有過(guò)沖要查電感電容的寄生參數(shù)和 PCB 走線如果開(kāi)關(guān)節(jié)點(diǎn)波形沒(méi)問(wèn)題但輸出紋波大重點(diǎn)查輸出電容的 ESR 和反饋取樣點(diǎn)。I2C 通信被干擾也是類(lèi)似情況。如果只有在某個(gè)電源通道開(kāi)啟后通信才報(bào)錯(cuò)大概率是 PCB 上 DCDC 開(kāi)關(guān)噪聲耦合到了 I2C 線上。解決方法是調(diào)整布局或者給 I2C 走線做包地再不行就把 I2C 速率從 400kHz 降回 100kHz穩(wěn)定性優(yōu)先。5.4 PMIC 默認(rèn)寄存器值讓 MCU 為難很多 PMIC 出廠配置不一定適合你的系統(tǒng)。比如默認(rèn)電壓、默認(rèn)使能狀態(tài)可能都不是你想要的而 MCU 必須自己先跑起來(lái)才有能力去重新配置 PMIC。這時(shí)就出現(xiàn)一個(gè)“雞生蛋”的問(wèn)題MCU 的電源也需要 PMIC 輸出但 PMIC 又默認(rèn)輸出了一組并不合適的電壓。解決思路有兩個(gè)方向。一是選擇支持出廠配置燒寫(xiě)的 PMIC通過(guò)配套工具把量產(chǎn)配置燒進(jìn)去上電就按你的要求跑。二是硬件上做兼容設(shè)計(jì)把 MCU 這一路電源單獨(dú)用一個(gè)小 LDO 供電確保 MCU 在任何情況下都能啟動(dòng)再讓 MCU 去初始化 PMIC。我比較推薦第二種不僅調(diào)試方便量產(chǎn)也少了一個(gè)配置依賴。5.5 把數(shù)據(jù)手冊(cè)變成自己的“查錯(cuò)表”最后分享一個(gè)我自己養(yǎng)成的習(xí)慣把 PCA9422 數(shù)據(jù)手冊(cè)里的寄存器映射、位定義、默認(rèn)值和狀態(tài)位整理成一張速查表打印出來(lái)放在工位上。每次調(diào)試出問(wèn)題先從狀態(tài)寄存器開(kāi)始查再對(duì)照速查表找可能影響的配置項(xiàng)比反復(fù)翻幾百頁(yè) PDF 高效得多。我在實(shí)際項(xiàng)目里踩過(guò)幾次坑之后最大的體會(huì)是電源管理不是把 PMIC 接上、抄幾個(gè)初始化代碼就結(jié)束了真正花時(shí)間的往往是硬件布局、時(shí)序細(xì)節(jié)和故障恢復(fù)邏輯。PCA9422 和 PIC18F4680 這套組合勝在把“電源本身”和“電源管理”拆成了兩個(gè)可以獨(dú)立迭代的部分——硬件工程師可以專心調(diào) PMIC 的電性能軟件工程師只需要通過(guò) I2C 操作寄存器兩邊都不會(huì)被對(duì)方的復(fù)雜性拖住。如果你正在做一個(gè)有多路電源軌、有嚴(yán)格時(shí)序要求、又希望把電源狀態(tài)納入整機(jī)監(jiān)控的項(xiàng)目這個(gè)思路可以直接拿過(guò)去當(dāng)起點(diǎn)。