ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

基于PCA9422与PIC18F86J15的便携设备电源管理方案

基于PCA9422与PIC18F86J15的便携设备电源管理方案 1. 项目缘起与整体设计思路1.1 为什么偏偏选中这两颗芯片先交代一下这个项目的来龙去脉。我手上有一个便携式数据采集终端的活儿设备需要锂电池供电、支持USB充电、还要给主控、传感器、显示屏、无线模块分别供不同的电压。早期版本我用的是分立方案一颗充电IC加一颗DC-DC再加两三颗LDO板子上电源部分占了将近三分之一的面积BOM表拉出来十几行调试的时候光是上电时序就折腾了我一个礼拜。后来痛定思痛决定换成集成度更高的PMIC方案最终锁定了PCA9422这颗电源管理芯片主控则沿用我一直很顺手的PIC18F86J15。PCA9422是一颗面向低功耗便携设备的电源管理IC内部集成了线性充电器、多路可配置的降压和线性稳压输出还带I2C接口可以动态调压和读取状态。选它的核心理由有三条第一集成度高一颗芯片把充电、系统供电、多路外设供电全包了板子面积直接砍掉一半第二I2C可编程电压和上电时序都能通过寄存器配置不用改硬件就能适配不同批次的物料第三静态功耗低对电池续航敏感的设备来说这点很关键。PIC18F86J15则是一颗经典的8位MCU128KB Flash、近4KB RAM外设资源丰富I2C、SPI、UART、ADC一应俱全工作电压范围宽工业级温度范围也扛得住。它和PCA9422搭配的好处是MCU本身就能通过I2C直接管理电源芯片不需要额外的桥接芯片整个电源管理逻辑全部在固件里实现灵活度极高。提示选PMIC的时候一定要先确认它的输出电压档位和你的负载需求是否匹配。PCA9422的输出档位是固定的几档可选不是任意电压都能出选型阶段就要把每一路负载的电压需求列清楚。1.2 整体电源架构是怎么搭的这个项目的电源架构可以分成三层来理解。第一层是能量输入层包括USB 5V输入和锂电池PCA9422内部集成了充电管理负责把USB的电充进电池同时在有USB的时候优先用USB供电。第二层是电压转换层PCA9422把电池电压典型3.0V到4.2V转换成系统需要的各路电压包括一路给MCU的3.3V、一路给传感器的1.8V、一路给显示屏的2.8V等等。第三层是监控与控制层PIC18F86J15通过I2C总线读取PCA9422的状态寄存器获取电池电压、充电状态、各路输出是否正常等信息并根据这些信息做出决策比如低电量时关闭显示屏背光、充满电后切换充电模式等。这个架构最大的好处是软硬解耦。硬件上电源部分就是一个标准模块软件上所有电源策略都在MCU固件里改策略不用动烙铁。我后来给客户做定制版本的时候只是改了几行配置寄存器的值硬件一版没动就交付了这在分立方案时代是不可想象的。1.3 设计阶段踩过的几个坑设计初期我犯了一个典型错误想当然地认为PMIC的上电时序可以完全靠硬件默认值搞定。结果样机回来发现MCU的3.3V和传感器的1.8V几乎同时上电传感器在MCU还没完成初始化的时候就输出了数据导致I2C总线被拉低MCU启动失败。后来查手册才发现PCA9422的各路输出上电顺序是可以通过寄存器配置的但默认值并不一定适合你的负载。这件事给我的教训是PMIC的上电时序必须在上电之前就想清楚不能等出了问题再补。另一个坑是I2C总线的上拉电阻。PCA9422的I2C接口和MCU的I2C接口电平标准一致但总线电容如果太大上拉电阻选小了会导致上升沿太陡产生振铃选大了又会导致上升沿太缓通信失败。我最后用示波器实测了波形把上拉电阻定在4.7k总线速率降到100kHz才稳定下来。这个后面在实操部分会详细讲。2. 核心细节解析与实操要点2.1 PCA9422的寄存器配置逻辑PCA9422的寄存器大致可以分成几类充电控制寄存器、输出电压配置寄存器、上电时序寄存器、状态寄存器、中断寄存器。每一类都有它自己的配置逻辑不能混着来。充电控制寄存器主要管充电电流、充电截止电压、充电使能这些。这里有个细节充电电流不是随便设的要根据电池容量来算。一般锂电池的充电电流建议在0.5C到1C之间比如1000mAh的电池充电电流设在500mA到1000mA之间比较合适。设太大了电池发热严重寿命缩短设太小了充电时间太长用户体验差。PCA9422的充电电流是分档可调的具体档位要看手册我一般选中间档兼顾速度和发热。输出电压配置寄存器管各路输出的电压值。这里要注意的是不是所有输出都能独立调压有些是固定档位有些是跟主输出联动的。配置之前一定要把每一路负载的电压范围和最大电流列成表格然后对照手册的档位表逐一匹配。我见过有人把1.8V的传感器接到3.3V输出上上电就冒烟了这种低级错误其实在配置阶段就能避免。上电时序寄存器是我认为最容易被忽视但最重要的部分。它决定了各路输出谁先谁后、间隔多久。一般的规则是先给MCU供电等MCU稳定后再给外设供电如果有模拟电路模拟部分要最后上电避免数字噪声干扰。PCA9422支持给每路输出配置独立的启动延迟这个功能一定要用起来。2.2 PIC18F86J15的I2C驱动要点PIC18F86J15的I2C外设叫MSSP模块用起来不算复杂但有几个坑要注意。首先是时钟配置I2C的时钟频率由SSPADD寄存器决定计算公式是SSPADD (Fosc / (4 * Fscl)) - 1。假设MCU跑16MHz想要100kHz的I2C速率SSPADD就是(16M / (4 * 100k)) - 1 39。这个值算错了通信肯定失败而且失败的时候不一定报错可能只是数据错乱很难查。其次是中断处理。I2C通信如果用电平中断在从设备拉低时钟的时候容易反复进中断我一般用边沿触发或者干脆用轮询方式。轮询虽然效率低一点但在这个项目里I2C通信不是高频操作轮询完全够用而且逻辑简单不容易出bug。还有一个细节是PCA9422的I2C地址。它的地址不是固定的有几位是可以通过硬件引脚配置的这意味着同一块板子上可以挂多颗PCA9422。如果你的板子上只有一颗地址引脚接地或接VCC都行但一定要在代码里写清楚不然换一批板子地址变了就抓瞎了。2.3 上电时序的配置实例我拿实际项目里的配置举个例子。这个设备有三路主要负载MCU3.3V、传感器1.8V、显示屏2.8V。我的上电顺序是MCU先上电延迟10ms后传感器上电再延迟20ms后显示屏上电。为什么是这个顺序因为MCU要先完成初始化才能去配置传感器传感器稳定输出后MCU才能去读数据显示屏最后上电是因为它启动电流大放在最后可以避免和其他负载抢电流导致电压跌落。在PCA9422里这个时序是通过给每路输出配置不同的启动延迟来实现的。具体寄存器地址和位定义这里不展开但配置的逻辑是先使能MCU那一路设置延迟为0再使能传感器那一路设置延迟为10ms对应的档位最后使能显示屏那一路设置延迟为30ms对应的档位。配置完之后一定要实测波形用示波器同时抓三路输出的上升沿确认顺序和间隔符合预期。注意上电时序配置完之后建议在固件里加一个自检逻辑读取PCA9422的状态寄存器确认各路输出都正常如果有异常就通过串口或LED报错。这个自检逻辑在批量生产的时候能帮你筛掉不少硬件不良品。2.4 低功耗模式的实现细节这个项目对功耗有要求待机电流要控制在100微安以内。PCA9422支持多种低功耗模式PIC18F86J15也有休眠模式两者要配合使用。我的做法是系统空闲时MCU先通过I2C把不需要的外设输出关掉然后自己进入休眠PCA9422在检测到I2C总线空闲一段时间后自动进入低功耗模式只保留MCU那一路输出的待机供电。这里有个关键点MCU休眠后怎么唤醒我用的是PCA9422的中断输出引脚把它接到MCU的外部中断引脚上。当电池电压低于阈值、或者有USB插入、或者有按键按下的时候PCA9422产生中断MCU被唤醒然后通过I2C读取状态寄存器判断唤醒源再决定下一步动作。这个机制比MCU定时轮询要省电得多因为MCU大部分时间都在休眠只有事件发生时才醒来。实测下来这套低功耗机制把待机电流从原来的2mA降到了80微安左右效果非常明显。但调试过程中也踩了坑一开始中断引脚没有配置上拉导致误触发频繁MCU反复被唤醒功耗反而更高了。后来加了外部上拉电阻并在固件里加了中断去抖逻辑才稳定下来。3. 实操过程与核心环节实现3.1 硬件设计与焊接要点PCB布局方面PCA9422的外围元件不多但有几个地方不能马虎。输入电容和输出电容要尽量靠近芯片引脚走线要短而粗减少寄生电感。电感的选择要根据输出电流和开关频率来定我一般选4.7微亨到10微亨之间的屏蔽电感饱和电流要留足余量至少是最大输出电流的1.5倍。I2C总线的走线要等长远离电感和开关节点避免噪声耦合。焊接的时候PCA9422一般是QFN封装底部有散热焊盘这个焊盘必须焊好不然芯片散热不行大电流输出的时候会过热保护。我用的方法是先在PCB焊盘上涂一层薄锡用热风枪把芯片吹上去再用烙铁补焊四周引脚。焊完之后用万用表测一下各引脚对地阻抗确认没有短路再上电。PIC18F86J15是TQFP封装引脚比较密焊接的时候容易连锡。我的习惯是用拖焊法先固定对角两个引脚然后加足量焊锡用烙铁快速拖过所有引脚最后用吸锡带清理多余的锡。焊完用放大镜检查一遍确认没有虚焊和连锡。3.2 固件框架与关键代码固件我分成三个模块I2C驱动模块、PCA9422配置模块、电源管理策略模块。I2C驱动模块负责底层的读写操作PCA9422配置模块封装了所有寄存器的读写函数电源管理策略模块则实现具体的业务逻辑。I2C写一个寄存器的函数大概长这样unsigned char PCA9422_WriteReg(unsigned char reg, unsigned char val) { unsigned char ret; I2C_Start(); ret I2C_WriteByte(PCA9422_ADDR 1); // 写地址 if (ret) { I2C_Stop(); return 1; } ret I2C_WriteByte(reg); // 寄存器地址 if (ret) { I2C_Stop(); return 1; } ret I2C_WriteByte(val); // 写入的值 if (ret) { I2C_Stop(); return 1; } I2C_Stop(); return 0; }读寄存器的函数类似只是要先写寄存器地址再重启总线读数据。这里要注意的是PCA9422的I2C时序要求比较严格每个字节之后从设备会拉低时钟做应答如果MCU没有正确释放时钟线通信就会卡死。我在I2C_WriteByte函数里加了超时机制如果时钟线被拉低超过一定时间就强制退出并报错避免死锁。电源管理策略模块的核心是一个状态机根据电池电压、充电状态、系统负载情况在不同状态之间切换。比如电池电压低于3.3V时进入低电量模式关闭显示屏背光、降低MCU主频电池电压低于3.0V时进入保护模式只保留MCU供电其他全部关闭。这个状态机的逻辑不复杂但状态之间的切换条件要仔细设计避免在临界点反复切换。3.3 参数计算与选型过程充电电流的计算前面提过了这里再补充一下其他参数的计算。输出电压的配置要根据负载的电压范围来定比如传感器标称1.8V但允许范围是1.7V到1.9V那PCA9422的输出档位里选最接近1.8V的那一档就行。如果负载对电压精度要求高就要选线性稳压输出而不是降压输出因为线性稳压的纹波更小。电感的选择计算稍微复杂一点。假设降压输出的开关频率是2MHz输入电压4.2V输出电压3.3V最大输出电流500mA那么电感值可以用公式L (Vin - Vout) * Vout / (Vin * fsw * ΔIL)来估算其中ΔIL是电感纹波电流一般取输出电流的30%左右。代入数值L (4.2 - 3.3) * 3.3 / (4.2 * 2M * 0.15) ≈ 2.36微亨。实际选型的时候我会选4.7微亨留足余量因为电感值大一点纹波小一点代价是瞬态响应慢一点对这个项目来说可以接受。输出电容的选择主要看纹波要求。一般降压输出的输出电容在10微法到22微法之间如果纹波要求严格就加大到47微法。我一般用两个10微法的陶瓷电容并联既保证了容量又降低了ESR。3.4 实测波形与调试记录样机回来之后我第一件事是上电测各路输出的波形。用示波器抓MCU那一路3.3V的上升沿确认从0V到3.3V的时间在1ms以内没有过冲和振铃。然后抓传感器那一路1.8V确认它在MCU上电后10ms才启动。最后抓显示屏那一路2.8V确认它在传感器上电后20ms才启动。三路都符合预期之后才开始跑固件。固件跑起来之后我通过串口打印PCA9422的状态寄存器确认电池电压、充电状态、各路输出的使能状态都正确。然后模拟各种场景拔掉USB看是否切换到电池供电、电池电压降到阈值看是否进入低电量模式、插入USB看是否开始充电。每个场景都反复测试了多次确认逻辑稳定。调试过程中遇到一个有意思的问题电池电压在3.3V附近的时候系统会在正常模式和低电量模式之间反复切换因为电池电压在负载变化时会波动导致ADC读数在阈值附近跳动。解决办法是加了一个迟滞区间比如低于3.25V才进入低电量模式高于3.35V才退出这样就不会反复切换了。这个技巧在电池供电的设备里非常实用建议大家都加上。4. 常见问题与排查技巧实录4.1 I2C通信失败怎么查I2C通信失败是这个项目里最常见的问题表现是MCU读不到PCA9422的寄存器或者读到的数据全是0xFF。排查思路我总结了一个顺序先查硬件再查时序最后查地址。硬件方面先用万用表测SDA和SCL对地阻抗确认没有短路再测上拉电阻是否焊接、阻值是否正确然后用示波器看SDA和SCL的静态电平正常应该是高电平如果被拉低说明有设备在占用总线或者有短路。时序方面用示波器抓通信波形看时钟频率是否正常、数据是否在时钟高电平期间稳定、应答位是否正确。如果时钟频率不对检查SSPADD寄存器的值如果数据不稳定检查上拉电阻和总线电容。地址方面确认代码里的从设备地址和硬件引脚配置是否一致。PCA9422的地址有几位是硬件可配的如果引脚接错了地址就错了通信自然失败。4.2 输出电压不对怎么排查输出电压不对一般有三种情况电压偏高、电压偏低、电压跳动。电压偏高通常是反馈电阻的问题检查反馈引脚的分压电阻是否焊接正确、阻值是否匹配。电压偏低可能是负载太重导致跌落到限流模式检查负载电流是否超过PMIC的最大输出能力。电压跳动可能是输入电容不足或者电感选型不当加大输入电容或者换更大感值的电感试试。还有一种情况是配置寄存器写错了比如把1.8V的输出配成了3.3V。这种问题在调试阶段容易发现但在批量生产的时候如果固件版本搞错了就很危险。我的做法是在固件里加一个版本校验每次上电读取PCA9422的配置寄存器和预期值对比不一致就报错并进入安全模式。4.3 充电异常怎么处理充电异常的表现包括插上USB不充电、充电电流不对、充电指示灯不亮。先查USB输入电压是否正常PCA9422的USB输入一般要求4.5V到5.5V低于4.5V可能不启动充电。再查充电使能寄存器是否配置正确有些PMIC默认充电是关闭的需要固件里显式打开。充电电流不对的话检查充电电流配置寄存器的值以及电池温度检测引脚是否接好。很多PMIC都有电池温度保护如果温度检测引脚悬空或者接错PMIC会认为电池温度异常而降低充电电流甚至停止充电。这个坑我踩过后来在温度检测引脚上接了一个10k的NTC电阻到地问题就解决了。4.4 常见问题速查表问题现象可能原因排查方法解决方案I2C读不到数据地址错误核对硬件引脚和代码地址修正地址配置I2C读不到数据上拉电阻缺失测SDA/SCL静态电平补焊上拉电阻输出电压偏高反馈电阻错误测分压电阻阻值更换正确阻值输出电压偏低负载过重测负载电流减小负载或换更大电流档位充电不启动USB电压不足测USB输入电压换合格USB电源充电电流小温度检测异常测NTC电阻接正确NTC待机功耗高中断误触发测中断引脚波形加上拉和去抖上电时序不对延迟配置错误抓各路输出波形修正延迟寄存器4.5 几个独家避坑技巧第一个技巧PCA9422的配置寄存器建议在固件里做成一个配置表每一项都有注释说明为什么这么配。我见过太多项目因为换了一个人维护没人知道某个寄存器为什么设成那个值结果改错了导致批量事故。配置表加上注释后来人一看就懂。第二个技巧上电自检逻辑一定要有而且要把自检结果通过某种方式暴露出来比如串口打印或者LED闪烁编码。批量生产的时候产线工人不需要懂技术看LED闪几下就知道板子有没有问题效率高很多。第三个技巧低功耗调试的时候不要只看万用表上的平均电流要用示波器看电流波形。有时候平均电流很低但瞬间有大的电流尖峰这种尖峰可能来自某个外设的周期性唤醒万用表看不出来示波器一看就清楚了。第四个技巧I2C总线上如果挂了多个设备一定要确认每个设备的地址不冲突。PCA9422的地址可配但配置引脚在PCB上要留测试点方便调试的时候改地址。我一般会在地址引脚上留一个0欧电阻的位置需要改地址的时候换个电阻就行不用飞线。5. 项目扩展与个人体会这套电源管理方案后来我又用在了两个类似的项目上一个是手持式仪器一个是无线传感器节点。手持式仪器对功耗要求没那么高我把低功耗模式简化了只保留了基本的充电管理和上电时序控制开发周期缩短了一半。无线传感器节点对功耗要求极高我在原有基础上增加了动态电压调节MCU根据任务负载实时调整自己的供电电压进一步降低了功耗。PCA9422和PIC18F86J15这个组合给我的最大感受是够用且灵活。PCA9422不是那种功能最全的PMIC但它把便携设备最需要的功能都集成了而且I2C可编程的特性让它在不同项目之间复用非常方便。PIC18F86J15虽然是一颗老芯片但它的I2C外设稳定可靠固件开发工具链成熟对于不需要复杂算法的电源管理任务来说完全够用。如果你也在做类似的便携设备电源管理我的建议是先把电源架构想清楚把每一路负载的电压、电流、上电时序需求列成表格然后再去选PMIC。选型的时候不要只看参数要看它能不能满足你的时序配置需求以及I2C接口是否好用。硬件设计阶段把电容、电感、上拉电阻这些细节做到位固件调试阶段就会省很多事。最后上电自检和状态监控逻辑一定要加这是批量生产时的保命符。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表