news 2026/10/10 5:02:52

基于PCA9422与PIC18F85J10的便携设备电源管理与上电时序设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于PCA9422与PIC18F85J10的便携设备电源管理与上电时序设计

一台需要在户外连续跑十几个小时的便携数据采集设备,电源方案却让我推翻重来了三次,最后才定下 PCA9422 + PIC18F85J10 这套组合。这两颗芯片一个管电,一个管策略:PCA9422 负责锂电池充电、USB 输入管理、各路电压输出和基本的过压过流保护;PIC18F85J10 负责上电时序、工作状态切换、按键与中断处理,以及异常时的数据保存和关机流程。整套做下来,BOM 比原先用分离元件拼的方案少了一大半,调试反而省了更多时间。如果你也在做带锂电池、需要 USB 充电、同时还要 3.3V/1.8V/5V 多路电源轨的便携产品,这篇内容可以直接当参考。

1. 为什么不用一堆分立器件,而要上一颗PMIC

1.1 分立方案的三个痛点

先说说我用过的反面教材。第一版方案很“传统”:一颗单节锂电充电管理芯片负责充电,一颗升压芯片把电池电压抬到 5V,再挂两颗 LDO 出 3.3V 和 1.8V,充电状态靠充电芯片的 STAT 引脚接 LED,电压检测用比较器搭窗口,上电时序靠 RC 延时加逻辑门。参数标称都能对上,实际联调的时候问题全出来了。

第一个痛点是 BOM 和面积。充电、升压、LDO、比较器、逻辑门,加上配套的电容电阻,一共多出十几个器件。对一块大板子来说无所谓,但设备要做成手持式,PCB 面积就被电源部分吃掉一大块。

第二个痛点是上电时序。分立方案里,各路电源的延时完全靠 RC 常数和逻辑门凑,温度一变、电容容差一变,顺序就可能翻转。外设里最怕这个,尤其是同时挂 SD 卡和液晶屏的时候,电源顺序错了,总线竞争、闩锁、初始化失败,什么情况都能遇到。

第三个痛点是故障处理。充电过温、电池反接、输出短路,分立的保护逻辑散布在各芯片里,状态信号要么没有,要么只有一根引脚,MCU 根本拿不到完整的电源状态。出了问题只能拿示波器从头查,非常痛苦。

1.2 这套架构的分工

换到 PCA9422 之后,输入端、充电通路、电源路径、各路输出轨、NTC 温度检测、I2C 状态回读全部集成在一颗芯片里。PIC18F85J10 的角色不是“参与供电”,而是“管理供电”:它通过 I2C 读写芯片的配置寄存器和状态寄存器,决定什么时候开启哪一路输出、什么时候进入充电、检测到故障后怎么响应。两者分工如下表:

功能模块承担方具体职责
充电管理PCA9422CC/CV 充电曲线、输入限流、温度窗口、充电截止
电源路径PCA9422USB 在位时由外部供电并同时充电,拔掉后自动切到电池
电源输出PCA9422升压 5V、降压、LDO 输出多路低压轨
参数配置PIC18F85J10上电后通过 I2C 写入充电电压、电流、使能位
状态判断PIC18F85J10读取状态寄存器、按键、IRQ 中断,驱动状态机
异常处理PIC18F85J10掉电保存、关闭非必要外设、进入低功耗或安全关机

这套模式最值得推荐的地方在于,MCU 拿到的是一份“结构化”的电源状态,而不是几根电平信号。充电中、充电完成、输入插入、温度异常,芯片都会置位对应标志并拉低 IRQ,MCU 轮询或者中断处理都方便。

1.3 选型时最该看的三个参数

不是所有带充电的 PMIC 都适合你的产品,我后来总结出三个必看参数:

  • 输入限流挡位。需要能配到 USB 枚举后的 500mA,否则插电脑充电会被识别成非法负载。
  • 输出轨的数量和电流能力。像我这个项目一颗搞定 5V 升压 + 3.3V 主轨 + 1.8V 模拟轨,BOM 才真正省下来。
  • 中断/状态信息来源。至少要能区分充电完成、充电故障、输入插入、温度过限几类事件。

另外,PMIC 封装通常不大,散热一定不能忽略。芯片底部的散热焊盘要好好焊,最好打过孔到地层。全速充电时裸片温度上升很明显,内置热折返会主动降低充电电流,所以 layout 阶段就要把热通路留好。

2. PCA9422 电源侧资源盘点:充电、电源路径和输出轨

2.1 充电链路

PCA9422 的充电部分是典型的 CC/CV 方案,针对单节锂电。整体流程:电池电压低于约 2.9V(具体以手册为准)时先小电流预充,回到安全电压后才进入恒流快充;接近目标电压(4.2V 或 4.35V,可通过寄存器配置)后转入恒压,电流逐渐下降,降到终止电流(一般是设定值的 1/10)时判为充电完成。

实际配置时我建议把终止电流设高一点,比如 60mA 左右。设太低,恒压阶段拖得特别长,最后那 10mA 的电流可能要磨半个小时,对用户体验是负优化。输入侧还有 USB 枚举和输入限流的问题:插电脑时按 100mA/500mA 两档切换,插适配器时再切成适配器限流。如果不做输入限流,电脑 USB 口会先保护起来——这个我在第一版方案里吃过亏。

2.2 电源输出轨

这颗芯片上的电源轨组合大致是:一路 5V 升压、一路降压、一到两路 LDO。这里要提醒一下,升压是从电池电压往上抬,电池电压低到 3.0V 以下时,同样输出电流需要更大的输入电流,输出能力会跟着下降。设计时不要按标称最大电流打满,留 20% 余量。

我们板子的实际分配如下:

输出轨电压用途电流余量
升压5.0V传感器偏置、USB OTG 供电300mA 负载,留 200mA
降压3.3VMCU、逻辑电路、显示屏400mA 负载,留 100mA
LDO11.8V模拟前端、基准50mA 负载,留 30mA
LDO23.3V无线模块独立供电按协议峰值配

无线模块我单独挂了一路 LDO,这样模块发射时的大电流脉冲不会直接砸在 MCU 的 3.3V 轨上,实测对屏幕闪烁和 ADC 噪声都有明显改善。如果无线模块和主控共轨,发射瞬间电压跌落很容易把 MCU 拉进复位。

2.3 电源路径管理

电源路径是这颗芯片最值钱的功能之一。USB/适配器插入时,系统负载直接从外部输入取电,同时充电电路给电池充电;外部输入拔掉后,立刻无缝切换到电池供电。这意味着电池彻底放空、电压低于系统最低工作电压时,只要插上 USB,系统依然能立刻启动,而不是要先等电池充到某个电压才能开机。

对便携设备来说这个特性太关键了。我遇到过不少板子,电池没电就得等充半天才能开机,用户体验很差。电源路径做在芯片内部,还省掉了一颗理想二极管控制器和周边元件,这也是 BOM 大幅减少的原因。

2.4 I2C 控制面

芯片所有充电参数、输出轨使能、中断屏蔽、ADC 使能都挂在 I2C 寄存器上。我按用途把它分成四组:

  • 设备信息组:芯片 ID、版本,上电先读这个确认 I2C 通路。
  • 充电控制组:充电电压、快充电流、预充电流、终止电流、输入限流。
  • 输出控制组:各路轨的使能、放电、电压设定。
  • 状态/中断组:当前状态、各类事件标志、IRQ 输出使能。

内置 ADC 可以回读电池电压、充电电流和芯片结温,这个对后面的电量估算和热保护非常有用,等于省掉了一颗独立的电池监视 ADC。下面代码里出现的寄存器宏是示意命名,具体地址和位定义以芯片手册为准。

3. PIC18F85J10 的角色:I2C 主控、状态机和故障响应

3.1 硬件连接与引脚分配

系统里 PIC18F85J10 是唯一的主控,外部只要一个 8MHz 晶振或者直接用内部振荡器都行,代码量真不大。硬件连接就几根线,但每根都有讲究:

PCA9422 引脚PIC18F85J10 引脚说明
SCL硬件 I2C SCL(MSSP)400kHz,上拉电阻 2.2k 到 3.3V
SDA硬件 I2C SDA(MSSP)同上,布线远离升压电感
IRQINT0(边沿触发)芯片事件通知,低有效
使能相关普通 GPIO 输出控制 5V 轨和低功耗模式
—按键输入(内部上拉)开机/关机按键

选 PIC18F85J10 的原因,一个是它有硬件 MSSP 模块,发 I2C 不占 CPU;另一个是 nanoWatt 低功耗模式,系统空闲时可以睡下去,电源状态完全交给 PMIC 维持。这里提醒一句:IRQ 一定要接边沿触发而不是电平触发,否则事件持续期间中断会在主循环里反复进入,把系统卡死。

3.2 I2C 读写实现

代码用的是 MSSP 主模式,400kHz。芯片手册里没特别说明的话,标准 7 位地址加寄存器寻址就行。写一个字节的流程是发起 START、发芯片地址(写位)、发寄存器地址、发数据、STOP。读一个字节稍微绕一点,要先写寄存器地址,再发一次 START 转成读方向。

uint8_t pmic_read_reg(uint8_t reg) { uint8_t v = 0; i2c_start(); i2c_write((PMIC_I2C_ADDR << 1) | 0); // 写方向 i2c_write(reg); i2c_restart(); i2c_write((PMIC_I2C_ADDR << 1) | 1); // 读方向 v = i2c_read_nack(); i2c_stop(); return v; }

这里最容易翻车的是总线被从设备拉伸时钟。PCA9422 内部有些寄存器在 ADC 转换期间可能需要拉着 SCL,主控必须支持时钟拉伸,或者干脆把速率降到 100kHz。PIC 的 MSSP 主模式对时钟拉伸的支持要看具体硅版本,我建议量产固件里加一个带超时的重试机制,任何一次 I2C 操作超过 5ms 没有完成就重新初始化总线。

3.3 中断与事件处理

电源事件用中断处理而不是轮询,好处是 CPU 大部分时间可以睡觉。我的做法是 IRQ 进中断后只置位一个事件标志,主循环里再去读状态寄存器,判断是充电完成、输入插入、温度过限还是充电故障,然后驱动状态机。

注意:大部分 PMIC 的中断标志是读后清除或者需要写清除的,进中断服务函数第一件事就是把标志读出来清掉,不然中断会一直触发。我已经不止一次在联调时看到 IRQ 一直拉低,查了半天发现是没清标志。

3.4 低功耗配合

PIC18F85J10 的 nanoWatt 模式很适合这个场景。系统空闲进入 SLEEP,此时只有 PMIC 的中断能把它唤醒。电池供电时,主控睡、PMIC 继续维持 3.3V 轨、无线模块休眠,整机静态电流能做到几十微安级别。唯一要小心的是,进入 SLEEP 之前要把 I2C 总线状态收拾干净,避免挂在半截传输上把总线占住,那样下次唤醒后第一次读寄存器就会超时。

4. 上电时序设计:从电池抵达系统启动

4.1 为什么要按顺序上电

很多人觉得上电时序是玄学,直到有一天看到系统偶发性死机,示波器一抓,发现 3.3V 轨起来时 SD 卡还在复位,卡初始化时序正好被破坏。上电顺序的本质是保证每个器件在初始化之前,它的供电、复位和其它依赖关系已经就绪。乱序上电还会造成浪涌叠加,多路电源同时启动时,输入电容瞬间充电电流可能把 PMIC 打到限流保护。

所以我在这个设计里把上电过程明确成状态机的第一步,而不是简单地把所有使能位一次打开。

4.2 我们的时序实现

实测下来这套设备的上电顺序是:

  1. 按键按下或 USB 插入,PMIC 先输出 3.3V 主轨,PIC18F85J10 上电启动。
  2. MCU 复位后立刻用 I2C 配置芯片:充电电压、输入限流、输出轨使能、中断屏蔽。
  3. 等主轨稳定 10ms,再使能 1.8V LDO,给模拟前端供电。
  4. 等 5ms,使能 3.3V 第二路 LDO,给无线模块供电。
  5. 等 10ms,最后使能 5V 升压;确认升压输出 OK 后,再点亮外设状态灯。

实现上就是一个简单的状态机,每步之间通过延时和寄存器回读确认:

void power_on_sequence(void) { // 第一步:配置充电参数,示例值,以手册为准 pmic_write_reg(PMIC_REG_CHG_CTRL, 0x3A); // 第二步:使能 1.8V LDO pmic_write_reg(PMIC_REG_LDO1_EN, 0x01); delay_ms(5); // 第三步:使能 3.3V 第二路 LDO pmic_write_reg(PMIC_REG_LDO2_EN, 0x01); delay_ms(10); // 最后:使能 5V 升压,并回读确认 pmic_write_reg(PMIC_REG_BOOST_EN, 0x01); while (!(pmic_read_reg(PMIC_REG_STATUS) & BOOST_OK)) { if (++timeout > 50) { enter_fault(); return; } } system_ready = 1; }

注意 5V 升压一定要最后开。升压输出电容容量大,启动瞬间需要一个不小的浪涌电流,如果此时 3.3V 主轨的外设还在初始化,可能会触发输入欠压。实测中出现过一次,主控没复位,但传感器那边读回来的数据乱了一帧。

4.3 掉电保护与安全关机

掉电分两种:电池电压缓慢下降和瞬时跌落。瞬时跌落通常是外设大电流造成的,PMIC 自己有过压过流保护,不用太担心。真正要处理的是持续下降到 MCU 无法稳定工作的临界点。

我的方案是设置一个关机电压阈值(比如 3.3V),通过 PMIC 的 ADC 周期回读电池电压,连续三次低于阈值且没有输入电源时,进入关机状态机:先向传感器发停止命令,把当前配置写回 EEPROM,然后关闭无线模块,等 20ms,把 5V 和 LDO 依次关掉,最后只保留主控的掉电监测。整个流程不超过 200ms,和电池剩余容量完全耗尽的速度相比,操作窗口绰绰有余。

5. 充电管理和电量监测的工程化细节

5.1 充电参数设置

充电参数不是“照着典型值抄”就行,要结合输入方式和热设计。插电脑 USB,输入限流先按 100mA,枚举后切到 500mA,充电电流我设成 400mA,留 100mA 给系统负载。插适配器,输入限流可以放到 1A,但充电电流还是控制在 600mA。原因很简单:这颗芯片的封装不大,充电电流产生的热量集中在裸片上,600mA 快充连续工作二十分钟,芯片表面温度会明显升高,内置热折返会悄悄把充电电流降下来。与其让它自己降,不如在参数上留余量,让充电时间可预期。

这里还有个参数陷阱:充电截止电压。同一颗电芯,4.2V 和 4.35V 的截止电压对容量影响很大,但 4.35V 电芯对充电精度要求更高。如果你的电芯规格书上写的是 4.2V,千万别为了容量去配 4.35V,循环寿命会肉眼可见地衰减掉。

5.2 NTC 温度窗口与常见翻车点

充电安全离不开温度窗口。芯片的 TS 引脚接电池组里的 NTC,常温下建议 0°C 到 45°C 才允许快充。这里有个特别容易翻车的细节:如果产品暂时没接热敏电阻,TS 引脚不能悬空,悬空时芯片可能误判温度异常,直接停充。要在硬件上用一个固定电阻网络模拟 25°C,让系统先跑起来,等电池组带 NTC 之后再改。

识别 NTC 分压阈值的寄存器组也可以配置迟滞电压,我建议默认值就行,不要试图把窗口收太窄,否则冬天在户外充电,经常会莫名其妙停充。

5.3 电量显示的务实方案

PCA9422 内置 ADC 能回读电池电压和充电电流,但它不是电量计,不能直接当 fuel gauge 用。对于这类成本敏感的便携设备,我用的方案是:电压-SOC 对照表加迟滞。具体做法是,用 10% 步进从数据手册或实测中取一条“静态电压 vs SOC”曲线存到 Flash,运行时每隔 30 秒采一次电压,查表得到电量,显示时加 5% 的迟滞防止跳变。

这个方案精度在 ±10% 左右,胜在零成本而且掉电不丢失。如果产品后续对电量精度有要求,可以再外挂一颗带库仑计的电量计芯片,通信接口走同一个 I2C 总线,固件不用大改。

5.4 充电状态的人机交互

状态指示我用一颗双色 LED:红色常亮等于充电中,绿色常亮等于充电完成,红绿交替等于故障,灭灯表示无输入且电池正常。实现上不是用 PMIC 的 STAT 引脚直驱,而是 MCU 读状态寄存器后驱动,这样所有显示逻辑统一在主控手里,以后加休眠、呼吸灯效果都不用改硬件。

6. 实测数据和踩坑记录:手册不会主动告诉你的那些事

6.1 寄存器默认值的坑

第一处坑是芯片的看门狗。某些 PMIC 加电后看门狗默认在跑,如果 MCU 在指定时间内(通常几十到几百毫秒)没有喂狗,芯片会自己复位,所有寄存器回到默认值。我试过一版固件,开机后先去跑传感器初始化,再回来配 PMIC,结果 500ms 后系统整个重来。解决办法很简单:复位后第一件事就是 I2C 配置,把看门狗关掉或改成最长超时,然后再做其它初始化。

第二处坑是 ADC 默认关闭。状态寄存器里能看到电压,但那是因为内部有快速粗采;如果要在运行中做电量估算,记得显式打开 ADC 并配置采样通道和周期,否则读到的一直是上一次的快照。

第三处坑是 I2C 设备地址。数据手册默认地址不一定是你买到的丝印版本,不同批次可能用不同引脚配置决定地址位。上电后先读设备 ID 寄存器,校验通过了再继续,别盲调。

6.2 I2C 波形与抗干扰

400kHz 下,10k 上拉基本是不行的,实测 SDA 上升沿明显变慢,偶尔出现 ACK 丢位。后来全部换成 2.2k 上拉,波形才干净。另外,升压电感附近的磁场会把噪声耦合到 I2C 线上,尤其是充电电流大、电感又是开磁路的时候,干扰会在 SCL 上打出毛刺,导致从设备误判时钟。Layout 上 I2C 走线尽量短、远离电感,不要为了省事穿到电源底下。实在躲不开就加 33Ω 串联电阻并减小上拉。

6.3 系统功耗实测

整机各状态实测数据如下(3.7V 电池、常温):

状态电流说明
运行 + 无线模块发送68mA峰值,持续 10ms
运行 + 无线模块待机21mA主控工作、传感器周期采样
低功耗待机0.4mAMCU SLEEP、模块休眠
关机20uAPMIC 维持最小系统
充电中(+系统运行)总输入 650mA600mA 充电 + 50mA 系统

低功耗待机里的 0.4mA 大部分是无线模块的休眠漏电,主控加 PCA9422 本身贡献很小。想再往下压,只能从模块选型下手,PMIC 这边基本到底了。

6.4 改版建议清单

做完两版之后,我把检查项固化成了清单,每次改板都过一遍:

  • 电池连接器附近放 100nF + 10uF 去耦,上电瞬间的插拔电流要靠它吸收。
  • 升压电感选屏蔽式,额定电流至少是最大负载的 1.5 倍。
  • PMIC 的散热焊盘必须打孔到地层,不要只靠顶层铜皮。
  • 按键引脚在 PMIC 上电期间的电平要确认,避免一插电池就误触发开机。
  • 所有使能脚配置成明确电平后再操作 I2C,防止外部器件在 MCU 复位期间浮空。

最后再分享一个小技巧:MCU 复位期间,所有 GPIO 会短暂处于高阻态,如果某个引脚正好连到外设的使能端,外设可能在上电瞬间被误启动。我在原理图阶段就把这类引脚加上下拉电阻,固定到安全电平,这个问题从此再没出现过。电源管理这种东西,大部分时间在跟不确定的时序和噪声搏斗,把这些边界条件提前焊死在硬件里,固件才能活得轻松。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/10 5:02:52

PCA9422与STM32F405RG电源管理方案设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/10 5:00:42

三阶张量HOSVD实战:Tucker分解降维、秩选择与重构误差避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/10 5:00:18

配电变压器检测图像数据集:3000幅VOC标注助你快速跑通目标检测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/10 4:59:42

别再理论搬运了!AI辅助人文社科写作的论证激活指南

好写作AI&#xff1a;别当“理论搬运工”&#xff01;人文社科论证的终极艺术——把理论用活前阵子帮一位朋友看论文&#xff0c;三十多页的稿件里&#xff0c;福柯、布迪厄、吉登斯轮番登场&#xff0c;几乎每段都有引文&#xff0c;注释密密麻麻。可通篇读下来&#xff0c;我…

作者头像 李华
网站建设 2026/10/10 4:57:13

有奖答题页源码拆解:多语言切换、答题状态机与抽奖概率控制

简介&#xff1a;一套基于HTML、CSS和JavaScript构建的有奖答题互动网页设计源码&#xff0c;同时融合多语言技术&#xff0c;可支持不同语言环境的知识竞赛与教育培训场景。压缩包共1645个文件&#xff0c;约60.48MB&#xff0c;其中以HTML/CSS/JS前端文件为主&#xff0c;包含…

作者头像 李华