1. 项目缘起与整体设计思路
搞嵌入式的人都有一个共识:电源管理是那种“做好了没人夸、做砸了全盘崩”的活儿。我手头这个项目,主控用的是STM32F405ZG,一颗Cortex-M4的经典款,168MHz主频、1MB Flash、192KB SRAM,性能放在今天依然能打。但问题在于,这套系统需要长时间靠电池运行,还要驱动一堆外设——传感器阵列、无线通信模块、一块小尺寸显示屏,偶尔还得跑一跑电机驱动。如果电源部分还是用传统的LDO加几个分立元件凑合,发热和续航都会很难看。
所以我把目光投向了PCA9422。这颗芯片是专门为低功耗应用设计的电源管理IC,集成了多路可编程的降压和升压转换器,还带电池充电管理功能。简单说,它能把锂电池那飘忽不定的3.0V到4.2V电压,稳稳地转换成系统需要的各路电压轨,同时还能通过I2C接口让MCU实时监控和调整电源状态。这比用一堆独立DC-DC芯片省事太多了,PCB面积能缩小将近一半。
整个设计的核心思路是这样的:PCA9422作为电源管理中枢,负责电池充电、电压转换和电源域控制;STM32F405ZG作为主控,通过I2C总线与PCA9422通信,读取电池电压、电流、温度等参数,并根据系统工作状态动态调整各路输出的电压和开关时序。比如系统进入低功耗模式时,MCU可以命令PCA9422关闭显示屏背光供电、降低传感器供电电压,甚至切断某些外设的电源域,把静态功耗压到微安级别。
这个方案解决的核心问题是:如何在有限的电池容量下,让一个功能复杂的嵌入式系统既能满负荷跑得动,又能在待机时几乎不耗电。适合谁参考呢?如果你正在做便携式仪器、手持终端、电池供电的工业传感器节点,或者任何需要精细电源管理的STM32项目,这套组合拳都值得一看。哪怕你用的是其他MCU,PCA9422的配置思路和电源域划分方法也是通用的。
注意:PCA9422的I2C地址是固定的,不能通过引脚改变,所以总线上不能挂两个同型号芯片。如果系统需要更多路电源,得考虑其他方案或者加I2C多路复用器。
2. PCA9422核心特性与硬件设计要点
2.1 为什么选PCA9422而不是分立方案
先说说选型逻辑。市面上做电源管理的芯片不少,TI的TPS系列、ADI的 ADP系列都有类似功能。我最终选PCA9422,主要看中三点:集成度高、I2C控制灵活、静态功耗低。
集成度高体现在它内部集成了四个降压转换器(Buck)和一个升压转换器(Boost),还有电池充电器。具体来说,Buck1和Buck2可以输出0.6V到3.3V,最大电流分别是1A和1.5A;Buck3和Buck4输出范围类似但电流小一些,适合给传感器和IO供电;Boost主要用于驱动需要5V的USB外设或者背光。这些电压轨都可以通过I2C独立开关和调压,步进精度是25mV,对于大多数数字和模拟电路来说足够用了。
I2C控制灵活意味着MCU可以在运行时动态调整。比如系统检测到电池电量低于20%,MCU可以主动把Buck2的输出从3.3V降到3.0V,同时关闭Buck4,让传感器进入低压工作模式。这种动态电源管理是分立方案很难做到的,因为分立方案的输出电压通常由电阻分压固定,想改就得动硬件。
静态功耗低是便携设备的命根子。PCA9422在待机模式下的静态电流典型值是15微安,关断模式下不到1微安。对比一下,如果用LM2596这类老牌Buck芯片,静态电流动辄几个毫安,电池放几天就空了。
2.2 硬件连接与外围元件选型
PCA9422的硬件设计有几个关键点。首先是输入电容和输出电容的选择。Buck转换器的输入电容建议用22微法陶瓷电容,X5R或X7R材质,耐压至少10V。输出电容根据电流大小选,Buck1和Buck2各配22微法,Buck3和Buck4配10微法就够。电感选2.2微亨到4.7微亨,饱和电流要大于最大输出电流的1.5倍。我用的是一颗4.7微亨、3A饱和电流的屏蔽电感,实测纹波在20毫伏以内。
I2C总线的上拉电阻不能省,典型值4.7千欧,接到1.8V或3.3V都行,取决于MCU的IO电平。STM32F405ZG的I2C引脚是开漏输出,必须外部上拉。走线尽量短,远离电感和开关节点,否则容易引入噪声导致通信失败。
电池充电部分,PCA9422支持最大1A的充电电流,通过一个外部电阻设定。充电电流的计算公式是:I_charge = 1000 / R_set,其中R_set单位是千欧,I_charge单位是毫安。比如要设500毫安充电电流,R_set就用2千欧。这个电阻的精度直接影响充电电流的准确性,建议用1%精度的金属膜电阻。
实操心得:PCA9422的散热焊盘必须可靠接地,并且要打足够多的过孔到地平面。我第一次打样时焊盘只打了4个过孔,结果满载工作时芯片温度到了85度,后来加到12个过孔,温度降到了55度左右。这个细节在数据手册里只是轻描淡写提了一句,但实际影响很大。
2.3 电源域划分与上电时序设计
电源域划分是电源管理的灵魂。我把系统分成四个域:核心域(STM32F405ZG、晶振、复位电路)由Buck1供电,固定3.3V;通信域(无线模块、CAN收发器)由Buck2供电,可调1.8V到3.3V;传感域(模拟传感器、运放)由Buck3供电,可调1.8V到3.3V;外设域(显示屏背光、指示灯、电机驱动逻辑)由Buck4和Boost供电,可开关控制。
上电时序也很讲究。STM32F405ZG要求内核电压先建立,然后才是IO电压。所以上电顺序是:Buck1先启动,延时2毫秒后Buck2和Buck3启动,再延时5毫秒后Buck4和Boost启动。这个延时通过PCA9422的内部寄存器配置,不需要MCU干预。如果顺序反了,可能出现IO口倒灌电流,导致MCU启动异常甚至锁死。
下电时序反过来:先关Buck4和Boost,再关Buck3和Buck2,最后关Buck1。这样能保证外设先断电,避免MCU已经断电但外设还有电导致IO口承受反向电压。
3. STM32F405ZG与PCA9422的I2C通信实现
3.1 I2C外设初始化与寄存器配置
STM32F405ZG的I2C外设用起来不算复杂,但坑不少。我用的标准模式100kHz,实际测试400kHz也能稳定工作,但为了可靠性还是降到了100kHz。初始化代码如下:
void I2C_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; I2C_InitTypeDef I2C_InitStruct = {0}; RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_OType = GPIO_OType_OD; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1); GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1); I2C_InitStruct.I2C_Mode = I2C_Mode_I2C; I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStruct.I2C_OwnAddress1 = 0x00; I2C_InitStruct.I2C_Ack = I2C_Ack_Enable; I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStruct.I2C_ClockSpeed = 100000; I2C_Init(I2C1, &I2C_InitStruct); I2C_Cmd(I2C1, ENABLE); }PCA9422的I2C地址是0x62(7位地址),写操作时地址字节是0xC4,读操作是0xC5。它的寄存器是8位地址、8位数据,支持单字节读写和连续读写。我封装了两个基础函数:
uint8_t PCA9422_WriteReg(uint8_t reg, uint8_t data) { I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, 0xC4, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(I2C1, reg); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C1, data); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTOP(I2C1, ENABLE); return 0; } uint8_t PCA9422_ReadReg(uint8_t reg) { uint8_t data; I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, 0xC4, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(I2C1, reg); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, 0xC5, I2C_Direction_Receiver); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); I2C_AcknowledgeConfig(I2C1, DISABLE); I2C_GenerateSTOP(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); data = I2C_ReceiveData(I2C1); I2C_AcknowledgeConfig(I2C1, ENABLE); return data; }注意:STM32F405ZG的I2C外设有个著名的“死锁”问题,就是在某些异常情况下BUSY标志会一直置位。我的解决办法是在初始化时加一个GPIO模拟的复位序列:把SCL拉低几个毫秒再释放,然后重新初始化I2C。这个技巧在ST的社区里讨论过很多次,实测有效。
3.2 关键寄存器配置与电压调节
PCA9422的寄存器不多,但每个都很关键。我挑几个最重要的说。
寄存器0x01是Buck1的电压设置,低6位有效,步进25mV,基准是0.6V。比如要输出3.3V,计算过程是:(3.3 - 0.6) / 0.025 = 108,十六进制是0x6C。写入0x6C即可。Buck2到Buck4的寄存器分别是0x02、0x03、0x04,计算方法一样。
寄存器0x05是Buck的使能控制,每一位对应一路输出。Bit0到Bit3分别控制Buck1到Buck4,Bit4控制Boost。写1使能,写0关闭。上电时序就是通过依次写这个寄存器实现的。
寄存器0x10是电池充电控制,Bit7是充电使能,Bit6到Bit4是充电电流档位,Bit3到Bit0是充电终止电压设置。充电电流档位和外部电阻共同决定实际电流,具体对应关系在数据手册里有表格。
寄存器0x20是状态寄存器,读取它可以获取电池电压、充电状态、各路输出的故障标志。电池电压的ADC精度是8位,对应0V到5V,分辨率约19.5mV。对于锂电池监控来说够用了。
我写了一个电压设置函数,把常用的电压值做成宏定义:
#define BUCK1_3V3 0x6C #define BUCK2_3V3 0x6C #define BUCK2_1V8 0x30 #define BUCK3_3V3 0x6C #define BUCK3_2V5 0x4C #define BUCK4_3V3 0x6C void PCA9422_SetVoltage(uint8_t buck, uint8_t value) { PCA9422_WriteReg(buck, value); }3.3 中断与实时监控机制
PCA9422有一个中断输出引脚,可以配置成在电池电压低、充电完成、输出故障等事件时拉低。我把这个引脚接到STM32F405ZG的PA0上,配置成下降沿触发的外部中断。中断服务程序里读取状态寄存器,判断事件类型,然后做相应处理。
比如电池电压低于3.3V时,中断触发,MCU读取电压值确认后,可以主动降低系统功耗:关闭显示屏背光、降低传感器采样率、把无线模块切换到低功耗模式。如果电压继续降到3.0V以下,就进入深度睡眠,只保留RTC和唤醒电路工作。
这个机制的好处是MCU不用一直轮询I2C,可以安心睡觉,等PCA9422主动叫醒它。实测下来,轮询方式下MCU每秒钟要醒来几十次读寄存器,功耗比中断方式高了将近200微安。对于用一节2000毫安时电池的设备来说,这200微安意味着续航从40天降到30天,差别很明显。
4. 完整电源管理固件的架构与实现
4.1 软件分层与状态机设计
固件我分成三层:硬件抽象层负责I2C读写和寄存器操作;电源管理服务层负责电压调节、时序控制、事件处理;应用层根据系统状态调用服务层接口。
电源管理服务层用一个状态机来组织,状态包括:初始化态、正常态、低功耗态、充电态、故障态。状态迁移由事件驱动,事件来源包括PCA9422中断、MCU内部定时器、应用层请求。
初始化态的流程是:配置I2C、读取PCA9422的ID寄存器确认通信正常、按顺序使能各路输出、配置充电参数、使能中断。如果任何一步失败,进入故障态并点亮错误指示灯。
正常态下,MCU每5秒读取一次电池电压和系统电流,根据电量调整运行策略。电量高于50%时全速运行;20%到50%之间关闭非必要外设;低于20%进入低功耗态。
低功耗态下,MCU把Buck2降到1.8V、关闭Buck4和Boost、把自身切换到STOP模式,只保留I2C和外部中断。PCA9422继续监控电池,电压回升到3.5V以上时通过中断唤醒MCU。
充电态下,MCU检测到充电器插入后,把系统切换到外部供电优先模式,同时监控充电电流和温度。如果温度超过45度,主动降低充电电流。
4.2 动态电压调节的实操步骤
动态电压调节是这套方案最实用的功能。我举一个实际场景:系统检测到电池电量低于30%,需要把无线模块从3.3V切换到1.8V以降低功耗。
第一步,确认无线模块支持1.8V供电。查手册确认后,第二步,通过I2C写Buck2的电压寄存器,从0x6C(3.3V)改成0x30(1.8V)。第三步,等待至少1毫秒让电压稳定。第四步,读取状态寄存器确认没有欠压故障。第五步,通知应用层无线模块已切换电压,可以继续工作。
整个过程不到5毫秒,对用户完全无感。但如果不按这个顺序来,比如先通知应用层再改电压,无线模块可能在电压切换过程中掉电重启,导致通信中断。
实操心得:电压切换时最好先把该路输出关闭,改好电压值再重新使能。虽然PCA9422支持在线调压,但负载较重时突然降压可能导致输出电压跌落过多,触发欠压复位。我试过在无线模块发射数据时直接调压,结果模块直接重启了。后来改成先关闭输出、调压、再使能,就再没出过问题。
4.3 电池充电管理与温度保护
PCA9422的充电管理支持三种模式:预充、恒流、恒压。电池电压低于3.0V时进入预充模式,电流是恒流模式的10%;3.0V到4.2V之间是恒流模式,电流由外部电阻设定;达到4.2V后进入恒压模式,电流逐渐减小,小于设定值的10%时充电完成。
温度保护通过外接NTC热敏电阻实现。我把NTC贴在电池表面,分压后接到PCA9422的TS引脚。芯片内部会根据TS引脚的电压判断温度,超过设定范围时自动暂停充电。温度范围可以通过寄存器配置,我设的是0度到45度。
这里有个细节:NTC的阻值和B值要与PCA9422的内部曲线匹配。数据手册推荐用10千欧、B值3380的NTC。我一开始用了一个B值3950的,结果温度检测偏差了将近8度。换了推荐型号后,偏差在2度以内。
充电电流的设定也要考虑电池规格。我用的是一节2000毫安时的锂聚合物电池,标准充电电流是0.5C也就是1000毫安,但为了控制发热和延长寿命,我设成了500毫安也就是0.25C。充电时间从2小时延长到4小时,但电池温度明显更低,循环寿命也更长。
5. 实测数据与性能优化记录
5.1 各路输出效率与纹波实测
我用电子负载和示波器测了各路输出的实际表现。输入电压3.7V(电池标称电压),环境温度25度。
| 输出路 | 设定电压 | 负载电流 | 实测电压 | 效率 | 纹波 |
|---|---|---|---|---|---|
| Buck1 | 3.3V | 500mA | 3.31V | 92% | 18mV |
| Buck2 | 3.3V | 300mA | 3.29V | 90% | 22mV |
| Buck3 | 2.5V | 200mA | 2.51V | 88% | 15mV |
| Buck4 | 3.3V | 100mA | 3.30V | 87% | 20mV |
| Boost | 5.0V | 200mA | 4.98V | 85% | 25mV |
效率数据是在满载条件下测的,轻载时效率会下降,这是开关电源的通病。比如Buck1在10毫安负载时效率只有75%左右。为了改善轻载效率,PCA9422支持PFM模式,在轻载时自动从PWM切换到PFM,效率能提升到85%以上。这个功能默认是开启的,不需要额外配置。
纹波方面,Buck1到Buck4都在20毫伏左右,Boost稍大一些。对于数字电路来说完全够用,模拟传感器供电的话建议再加一级LDO滤波。我在传感域后面加了一颗低噪声LDO,纹波降到了2毫伏以下,ADC采样精度明显提升。
5.2 整机功耗与续航估算
整机功耗测试分三种场景:
全速运行:MCU 168MHz、无线模块发射、显示屏亮、传感器全开,总电流约280毫安。2000毫安时电池能撑约7小时。
正常待机:MCU 84MHz、无线模块接收、显示屏关闭、传感器间歇采样,总电流约45毫安。续航约44小时。
深度睡眠:MCU STOP模式、无线模块休眠、所有外设断电,总电流约120微安。续航约690天,当然实际受电池自放电影响,大概能撑一年半。
从280毫安到120微安,跨度超过2000倍,这就是精细电源管理的价值。如果没有PCA9422,深度睡眠电流很难做到1毫安以下,续航会从一年半降到两个月。
5.3 优化前后的对比与改进措施
第一版硬件做完后,我发现几个问题。一是深度睡眠电流比预期高了50微安,排查后发现是STM32F405ZG的某个IO口在STOP模式下仍然有漏电流,因为该IO配置成了上拉输入但外部接了低电平。改成模拟输入后,漏电流消失了。
二是Buck2在轻载时效率偏低,只有70%左右。后来把电感从4.7微亨换成2.2微亨,轻载效率提升到了82%。原因是小电感在轻载时储能更少,开关损耗更低。
三是I2C通信偶尔失败,概率大概千分之一。用示波器抓波形发现SCL上升沿太慢,上拉电阻4.7千欧偏大。换成2.2千欧后,上升沿从1.2微秒缩短到0.5微秒,通信再没失败过。
这些优化措施看起来都是小改动,但累积起来对系统稳定性和续航的影响很大。嵌入式电源管理就是这样,细节决定成败。
6. 常见问题排查与避坑指南
6.1 I2C通信失败排查流程
I2C通信失败是最常见的问题,排查步骤我整理成了一张表:
| 现象 | 可能原因 | 排查方法 | 解决方法 |
|---|---|---|---|
| 完全无应答 | 地址错误 | 用逻辑分析仪抓波形 | 确认地址是0x62 |
| 完全无应答 | 上拉电阻缺失 | 万用表测SCL/SDA电压 | 加4.7千欧上拉 |
| 偶发NACK | 总线电容过大 | 测上升沿时间 | 减小上拉电阻或降低速率 |
| 偶发NACK | 电源噪声 | 示波器看电源纹波 | 加去耦电容 |
| BUSY标志卡死 | 总线死锁 | 读SR2寄存器 | GPIO模拟复位序列 |
| 数据错误 | 时序违规 | 检查建立/保持时间 | 降低I2C速率 |
注意:STM32F405ZG的I2C外设在某些情况下会产生额外的时钟脉冲,导致从机状态机错乱。如果遇到无法解释的通信问题,可以尝试用软件I2C替代硬件I2C。虽然速率慢一些,但稳定性好很多。我在一个干扰较大的电机项目里就换成了软件I2C,再没出过通信故障。
6.2 电源输出异常与保护机制
电源输出异常通常表现为电压偏高、偏低或完全无输出。电压偏高一般是反馈电阻开路或虚焊,PCA9422内部有反馈网络,但外部电感和电容的焊接质量也会影响。电压偏低可能是负载过重导致限流,或者输入电压不足。完全无输出先检查使能位是否置1,再检查输入电容是否短路。
PCA9422内置了过流保护、过温保护和欠压锁定。过流保护阈值是最大电流的1.5倍,触发后输出关闭,需要重新使能。过温保护在150度时触发,降到120度以下自动恢复。欠压锁定在输入低于2.5V时关闭输出,防止电池过放。
这些保护机制很完善,但不要依赖它们做常规保护。比如过流保护是最后一道防线,正常工作时应该通过负载设计保证电流在额定范围内。我见过一个案例,有人用PCA9422驱动一个启动电流很大的电机,每次启动都触发过流保护,虽然芯片没坏,但系统频繁重启。后来加了软启动电路才解决。
6.3 低功耗模式下的漏电流排查
低功耗模式下漏电流超标是便携设备的隐形杀手。排查方法是从电源输入端串一个微安表,然后逐个关闭外设,看电流变化。如果关闭某个外设后电流明显下降,说明该外设有漏电。
常见的漏电点包括:IO口配置不当导致倒灌、电容漏电、PCB表面污染导致微短路。IO口倒灌最隐蔽,因为MCU已经进入STOP模式,但某个IO还输出高电平,外部电路通过该IO向MCU内部二极管灌电流。解决办法是在进入低功耗前把所有IO配置成模拟输入或开漏输出。
PCB表面污染在潮湿环境下很常见。助焊剂残留吸收水分后形成微弱的导电通路,漏电流可能达到几十微安。解决办法是出厂前用超声波清洗,或者涂三防漆。我在一个户外项目里就遇到过这个问题,清洗后漏电流从80微安降到了5微安。
6.4 充电异常与电池保护
充电异常的表现有:不充电、充电电流偏小、充电指示灯不灭。不充电先检查充电器电压是否高于电池电压加0.5V,再检查充电使能位和外部电阻。充电电流偏小可能是外部电阻阻值偏大,或者电池温度超出范围触发了温度保护。充电指示灯不灭说明充电未完成,可能是电池老化导致恒压阶段电流降不到终止阈值。
电池保护方面,除了PCA9422内置的保护,我建议再加一颗独立的电池保护IC,比如DW01加8205A的组合。这样即使PCA9422失效,电池也不会过充过放。多一层保护多一份安心,成本增加不到一块钱。
实操心得:锂电池在低温下充电会析出锂枝晶,有安全风险。如果设备可能在0度以下使用,一定要配置低温充电禁止。PCA9422的TS引脚可以接NTC实现这个功能,但NTC要贴在电池上,不能贴在PCB上,否则测的是板温不是电池温度。我见过一个设计把NTC放在芯片旁边,结果冬天户外使用时电池已经零下了,芯片还因为自身发热显示20度,充电一直没停,电池很快就鼓包了。
7. 方案扩展与个人体会
这套PCA9422加STM32F405ZG的电源管理方案,我已经在三个项目里实际用过,最长的已经连续运行了一年多,没出过电源相关的故障。它的价值在于把复杂的电源管理抽象成了几个I2C寄存器操作,让嵌入式工程师不用深入理解开关电源的环路补偿、纹波抑制这些模拟电路细节,就能实现专业级的电源管理。
后续如果想进一步优化,有几个方向可以考虑。一是把PCA9422的状态数据通过无线模块上传到上位机,做电池健康度分析,预测剩余寿命。二是在MCU里跑一个简单的电量计算法,结合电压、电流、温度三个参数,比单纯看电压准确得多。三是把电源管理配置做成参数表存在Flash里,不同项目只需改参数不用改代码,提高复用性。
我个人在实际操作中的体会是:电源管理没有“差不多就行”这回事。一个电容选错、一个时序搞反,轻则续航减半,重则系统不稳定。但反过来,只要把细节做到位,它就能成为整个系统最可靠的部分,让你在调试应用功能时完全不用操心电源问题。这种安心感,值得在前期多花几天时间把电源部分做扎实。