第4章 电源管理设计:电池选型与充电管理

电源管理,说白了就是给剃须刀找个靠谱的「心脏」。我做了这么多年嵌入式,见过太多产品死在电源设计上。今天咱们就聊聊电池选型、充电芯片、升压降压,还有低功耗那些事儿。

4.1 电池选型:锂电池 vs 镍氢电池

选电池,我习惯先问三个问题:
1. 客户想要多长的续航?
2. 成本预算多少?
3. 产品生命周期多长?

咱们直接对比一下这两种电池:

对比项 锂电池(3.7V) 镍氢电池(1.2V)
标称电压 3.7V 1.2V
能量密度 高(200-260Wh/kg) 低(60-120Wh/kg)
自放电率 低(每月约2-5%) 高(每月约20-30%)
循环寿命 300-500次 500-1000次
成本 较高 较低
安全性 需保护电路 较安全

我个人建议:如果是高端剃须刀,选锂电池。能量密度高,同样体积下续航更长。我做过一个项目,客户非要省成本用镍氢电池,结果用户反馈「充一次电用不了两次」,后来还是换回了锂电池。

避坑指南:我曾经在选型时忽略了一个细节——锂电池的放电平台。3.7V只是标称电压,实际放电范围是4.2V到3.0V。如果你的MCU需要3.3V供电,那电池电压低于3.3V时就得升压,否则系统会突然掉电。

4.2 充电管理芯片:TP4056

TP4056,这芯片我用了不下十年。便宜、稳定、外围电路简单。你想想看,一个SOP-8封装的芯片,加上几个电阻电容,就能搞定锂电池充电。

典型电路如下:

// TP4056 典型应用电路
// BAT+ 接锂电池正极
// BAT- 接锂电池负极
// PROG 引脚接电阻Rprog到GND,设定充电电流
// CHRG 引脚接LED指示充电状态
// STDBY 引脚接LED指示充满状态

// 充电电流计算公式:
// I_CHARGE = 1000V / Rprog
// 例如:Rprog = 1.2kΩ,则充电电流 = 1000/1.2 ≈ 833mA

// 实际项目中我常用1kΩ电阻,充电电流约1A
// 注意:散热问题!大电流充电时芯片会发热

关键参数

  • 充电电压:4.2V ± 1%
  • 充电电流:最大1A(由Rprog设定)
  • 涓流充电:当电池电压低于2.9V时,自动进入涓流模式
  • 温度保护:芯片内部有过温保护,超过125°C会停止充电
我的经验:TP4056的PROG引脚不要悬空。我见过有人为了省电阻直接短接到GND,结果充电电流失控,电池鼓包了。嗯,这个教训挺深刻的。

4.3 升压/降压电路

剃须刀里,电机需要的是恒定电压。锂电池电压从4.2V降到3.0V,电机转速会明显变慢。所以我们需要一个稳压电路。

两种方案

  1. 升压(Boost):把电池电压升到5V或更高,再给电机供电
  2. 降压(Buck):如果电池电压高于电机额定电压,就用降压

我习惯用升压方案。因为锂电池放电末期电压只有3.0V,而很多电机需要5V才能正常工作。升压芯片我推荐MT3608,便宜又好用。

// MT3608 升压电路设计要点
// 输入电压:2.5V - 5.5V
// 输出电压:最高28V(由分压电阻设定)
// 开关频率:1.2MHz

// 输出电压计算公式:
// Vout = 0.6V * (1 + R1/R2)
// 例如:R1=100kΩ, R2=12kΩ
// Vout = 0.6 * (1 + 100/12) ≈ 5.6V

// 电感选择:22μH,饱和电流大于峰值电流
// 输出电容:22μF陶瓷电容,耐压16V
注意:升压电路的空载功耗不容忽视。我做过测试,MT3608空载时静态电流约0.5mA。如果电池容量是1000mAh,光这个静态电流就能让待机时间缩短不少。所以低功耗设计时,要加一个负载开关。

4.4 低功耗设计策略

低功耗,说白了就是「该睡的时候睡,该醒的时候醒」。剃须刀不是一直工作的,大部分时间都在待机。怎么把待机功耗降到最低?

我的策略

  • MCU休眠:选择支持深度睡眠的MCU,比如STM32L0系列,休眠电流可以到0.3μA
  • 电源分段:把电机驱动、充电电路、MCU的电源分开,用MOS管控制
  • 按键唤醒:用外部中断唤醒MCU,而不是轮询按键
  • 关闭不用的外设:ADC、定时器、SPI,不用就关掉
// 低功耗代码示例(伪代码)
void enter_sleep_mode(void)
{
    // 关闭所有外设时钟
    RCC->AHBENR &= ~(RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN);
    
    // 设置GPIO为模拟输入,减少漏电流
    GPIOA->MODER = 0xFFFFFFFF;
    GPIOB->MODER = 0xFFFFFFFF;
    
    // 进入深度睡眠模式
    PWR->CR |= PWR_CR_LPDS;
    SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
    __WFI();  // 等待中断唤醒
}

// 唤醒后恢复外设时钟
void wake_up(void)
{
    RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN;
    // 重新配置GPIO模式
}
关键数据
我实测过,一个典型的剃须刀方案:
- 工作模式:电机运行,电流约500mA
- 待机模式:MCU休眠,电流约5μA
- 如果每天使用2分钟,待机22小时,平均电流约:
(500mA * 2/60 + 0.005mA * 22) / 24 ≈ 0.7mA
用1000mAh电池,理论续航约60天。

你想想看,如果待机电流做到5μA以下,电池自放电都比这个高。所以低功耗设计的关键,其实是「把不用的东西彻底关掉」。

避坑指南:我曾经在低功耗设计时忽略了一个细节——GPIO的上下拉电阻。如果GPIO浮空,会有漏电流。正确的做法是:不用的GPIO要么拉高,要么拉低,要么设为模拟输入。嗯,这个坑我踩过两次。

好了,电源管理这块就聊到这儿。下一章咱们聊聊电机驱动和PWM控制,那又是另一番天地了。