android充电架构的分析

本文分析了Android设备的充电原理和架构,包括基本的充电过程、硬件架构和软件架构。硬件部分涉及电源输入、充电模块和电量计模块,软件部分重点介绍了power supply架构。在kernel层,充电信息通过/sys/class/power_supply路径传递给上层应用,实现充电状态的监测和显示。
摘要由CSDN通过智能技术生成

前言

目前android设备越来越多,对于快速充电和长时间待机的需求就不言而喻。对应于此的就是各大手机厂商不断突破大功率充电新闻频繁的出现。在个人目前遇到的快充方案中,基本上在大的架构下属于同一种类型。故分析记录下来。

基本原理

充电简单粗暴点来说就是把电流灌到电池里面去。那么最简单的方法就是直接拿一个电源接在电池的正负极。只要电源电压高于电池电压就可以把电流灌进去。就如同直接打开水龙头开关接水一样。

但是这样会存在很多问题。例如:电池此时的电压很小,电源电压很高,一怼上电池上的电流就会变得非常大,很可能烧坏电池。所以需要根据电池的电压来调节输入电源的电压。这样又会出现充一会后就调一下电压,太麻烦了。因此可以使用计算机来完成这些动作,通过一颗锂电池充放电芯片来管理充放电的过程。

使用锂电池充电芯片,整个充电过程大致分成了三个阶段:分别是预充、恒流、恒压。
在这里插入图片描述
上图是各个阶段电池电流,电压的状态。
但是该方案存在转化效率较低的问题,特别是在大功率的情况下,损耗太大。因此在手机里不常采用这个方案,不过无论怎样,基本的充电曲线还是和上图保持一致的。

基本硬件架构

现在手机充电的基本架构如下图所示
在这里插入图片描述

电源输入

首先是电源的输入。目前手机上输入电源普遍支持有线和无线两种方式。在该架构下并不是简单让电源输入一个固定电压完成充电。而在由ap在不同阶段调节输入电源的功率。因此电源的提供需要支持调压的过程。现在在无线中常使用qi协议,而有线中常使用pd协议。

充电模块

充电模块现在主要由main charger(充电芯片)和charger pump(电荷泵芯片)构成,因为charger pump在大电流的情况下效率很高。整个充电过程依旧和上面的充电曲线基本一致。只不过此时的cc阶段和前半段的cv阶段由charger pump来完成,其余的由main charger来完成

main charger芯片在自身集成了数字逻辑,所以可以自动的切换各个阶段。而charger pump则不是这样,它只是一个模拟器件,我们可以把它理解成一个开关(经过它以后电流升一倍,电压降一半。譬如输入10v,5a输出就是5v,10a)

故在使用过程中通过ap的程序来模拟充电阶段。比如我们规定在cc阶段下的电流是6a,而此时ap采集到的电流是4a。那我们就通过协议去增大电源的输入;采集到的电流大于6a则降低电源的输入。

电量计模块

电量计模块主要是获取电池的电量信息。然后上层可以获得电池剩余电量百分比等。

软件架构

android手机内核采用的是linux内核,android有很多层。单单对于充电功能来说可以把它分为2层,一层是kernel里的驱动和逻辑实现,另一层是上层。android界面上显示和充电相关的信息就需要从kernel这一层拿。

在内核中一切皆文件,那对于充电这部分来说也不例外。上层获取的信息都是从/sys/class/power supply路径获取的。这个路径是由代码决定的(源码路径:/system/core/healthd/BatteryMonitor.cpp)
在这里插入图片描述
在充电信息发生改变的时候kernel就会调用uevent,上层就会接收到,然后执行下面的函数更新状态。

bool BatteryMonitor::update(void) {
   
    bool logthis;

    initBatteryProperties(&props);

    if (!mHealthdConfig->batteryPresentPath.isEmpty())
        props.batteryPresent = getBooleanField(mHealthdConfig->batteryPresentPath);
    else
        props.batteryPresent = mBatteryDevicePresent;

    props.batteryLevel = mBatteryFixedCapacity ?
        mBatteryFixedCapacity :
        getIntField(mHealthdConfig->batteryCapacityPath);
    props.batteryVoltage = getIntField(mHealthdConfig->batteryVoltagePath) / 1000;

    if (!mHealthdConfig->batteryCurrentNowPath.isEmpty())
        props.batteryCurrent = getIntField(mHealthdConfig->batteryCurrentNowPath) / 1000;

    if (!mHealthdConfig->batteryFullChargePath.isEmpty())
        props.batteryFullCharge = getIntField(mHealthdConfig->batteryFullChargePath);

    if (
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
安卓设备的充电流程一般包括以下步骤: 1. 插入充电器并连接电源 当用户将充电器插入安卓设备并连接电源时,系统会检测到电源连接事件,然后启动相应的服务和线程来处理充电流程。 2. 开始充电流程 系统会根据充电器的类型和电池的状态,选择合适的充电模式,并开始充电流程。在此过程中,系统会监测电池的状态,包括电量、温度、电压等,并动态调整充电电流和电压等参数,以保证充电过程的安全和稳定。 3. 监测充电状态 系统会持续监测充电状态,包括电池电量、充电电流、充电电压等,并将这些信息通知给用户和应用程序。用户可以通过系统设置界面或者充电图标来查看电池电量和充电状态,应用程序可以通过BatteryManager类获取电池状态信息。 4. 充电完成 当电池充满电时,系统会停止充电流程,并通知用户和应用程序。通常情况下,系统会将充电电流降低到一个很小的值,以防止电池过充或者损坏。 5. 断开电源 当用户拔出充电器或者电源故障时,系统会检测到电源断开事件,并停止充电流程。此时,系统会根据电池的状态和充电模式,选择合适的电池管理策略,例如保持当前电量、降低电量等级、关闭不必要的应用程序等。 总的来说,安卓设备的充电流程是一个复杂的系统过程,需要多个服务和线程协同工作,以保证充电过程的安全、稳定和高效。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值