Battery

Introduction

 

移动设备的锂电池

最高4.2-4.3v,最低2.7-2.9v,小于2.8v后“快速“衰减为0v,也称为DEADBATTERY,即休眠。低于3.0v属于过度放电,手机一般在3.3-3.5v关机。

 

电池温度一般为0-40度,获取电池内部温度用读取电池内的热敏电阻的电压值转换而来;电池容量一般以mAh为单位,现在也有用Wh作为单位的

 

充电器类型一般分为usb和ACadapt(也称为TA)

充电电流:usb2.0 5V最高500mA,usb3.0最高900mA。

 

电池充电特性

 

电池充电分为四个阶段:

涓流充电->恒流充电->恒压充电->二次充电(满电后再次充电)

每个阶段的电流和电压曲线不尽相同,如果恒压阶段的电流是逐渐减小,电压不变

电池容量和电压

电压4.5-4.2占10%电量

电压4.2-3.9占20%电量

电压3.9-3.8占60%电量

电压3.8-3.45占20%电量

Fast Charge

三个方面阻碍手机快速充电的标准的统一

Battery:充电电流过大,导致发热,并影响电池充放电寿命;

charger IC: 功率转换(例如,电源适配器输入的5V/2A转变成电池的4V/1.5A)效率与功耗的问题,若提高转化效率,必然导致功耗和发热量的提升

Adapter:高通QuickCharge是将电压提高,OPPO快冲方案是将电流提高(电流提高到4A需要用专用的线材,因为普通USB线在大电流下的内阻增加,发热量剧增,导致电气特性发生变化)

 

Qualcomm quick charge 2.0

电压:5V9V12V电流:1.6-2 A3300mAh充满:96 min

需求: 骁龙801,电源管理IC支持quick charge2.0标准, 定制充电器

 

摘录:手机上要实现快充功能需要满足三要素,三者缺一不可。充电器、电池、charge IC。充电器需要满足足够的输出电流以及输出电压,因为充电器的走线有很大的寄生电阻,如果要实现较大的充电电流,充电器的带载输出电压需要较高。以充电器的寄生电阻为1欧姆来估算,主板充电器接口VCHG到VBAT的路径电阻大概也有1欧姆左右,如果以1A快充的电流来简单计算的话,充电器的输出电阻需要在6.5V左右。

 

Wireless charge

- 2015.4.3 -

无线充电技术标准

主要就是两大类,一类是磁感应,它需要铁氧体来作屏蔽,高效高,但是支持的隔空距 离小于5mm,代理技术标准就是Qi;另一流派则是磁共振式,它实际上是射频的辐射方式,相对于来说优势是支持较大的空间距离,但是由于没有屏蔽,效率也 低很多。代表技术有PMA与A4WP

 

 

Battery Scope

 

Battery fuel/gas guage, like STMicroelectronics STC3115,STC3100

Battery Charger, like Texas Instruments BQ24xx, RichTekSS60xx

USB port switcher, programmable accessory and chargerdetection and swithcing data paths

battery management framework in kernel with charging policy,smooth battery capability, periodic monitor and so on(其中充电策略主要解决几个主要充电状态的迁移管理,比如discharging,charging, full, no_charging(init))(BAT F/W上面是power_supply子系统,下面是各个电源设备,如charger,gasguage。BATF/W是整个电池供电管理核心层,其中存在多个workqueue来分别管理周期上报电池信息,温度检测,电压检测,二次充电定时,充电定时检测等等,其中对下层电源设备提供获取各类信息的接口及回调,以及通讯接口用于上下层的控制信息传递,类似event+handler事件(通过))

Common batteryworkload

Enable charger and battery guage drivers in bootloader

Integration specific IC drivers to adapt battery frameworkin kernel including charger, FG and USB port swither

Calibration values of battery guage H/W characteristicparameters based on statistics data given by vendor

Modification of USB detection interface, including USB portswitcher or USB callback

In battery framework (kernel side) Tune and debug chargingpolicy and operation controller and so on

NOTE

关于电池电量计算(库伦计数)的算法和硬件,可以搜索:“fuel guaging algorithm”"库伦计"

 

 

充电芯片介绍和驱动

补充:除了充电芯片,一般还需要额外的电池监测(主要测量电池容量,类似库仑计数器)芯片,用于获取电池信息,如电压,电流,温度;当然通过ADC也可以软件推算出电池数据,但是不如单独芯片灵敏度和精度好。现在有SoC内部集成电池充电芯片和监测芯片的,也有单独单芯片的充电和监测芯片。

 

比如RichTekSS60xx移动设备线性单芯片li-on电池充电芯片来说,其功能是自动检测电压并实施不同的充电方,并提供过压(overvoltage)/低压(undervoltage)保护和温度保护等功能。一般低于2.5V进入pre-charge,否则进入CCmode,当电压达到4.2V,进入CVmode。

Pre-charge/CC/CV的充电切换由charger IC自动控制。Driver仅仅控制充电模式(USB100/USB500/ISET)和充电使能,另外re-charge二次充电(充满后一段时间再次充满)是driver控制的。

预充电:pre-chargemode,门限电压2.5V,USB100mode下,预冲电流为95mA,其他模式为CCmode电流的20%。

快充电(恒流充电):fastcharge,即CCmode,提供100mA,500mA和ISET mA,三种模式下的充电电流分别为:95mA,395mA和ISET设定电流

恒压充电:constant voltage mode,即CVmode,电压固定在4.2V

NOTE:

在batterycharger电路中,一般设计有过压保护(PositiveOvervoltage Protection Controller)和静电保护(ESD-protection),transient voltage suppressor(forUSB-OTG)等芯片

NOTE:

如何获取电池当前容量:从battery guage中读取soc值后,经过“转换”和平均得到

如何判断电池是否在线:battery guage提供直接接口,或者提供电池pin的ADC,通过ADC数值是否在合理范围内判定电池状态

NOTE:

fuel guage其中提供一种CG(current sensce detect)功能,表面看起来是检测电流,但实际上是检测电压,然后软件可以通过电压值和连接的电阻(一般很小0.01欧姆)计算出电流值

 

Main initializationprocedure of charger driver

1.    Register platformdevice for charger, register power_supply device

2.    Init GPIO pinconfig (e.g. output mode) for charger specific function, like enable?interrupt? etc?

3.    Register batteryframework callback of “enable/disable charge” and “monitor status”

4.    Request interruptfor battery controlling operation

5.    Adding sysfs filelike current, voltage, capability

 

NOTE:

Device will not enter sleep mode while plugging in USB/TA,just one core awake and others cores shutdown/offline; but battery periodic (e.g.30 seconds) check voltage and temperature will wakeup devices when device isfully sleep down

 

 

 

Android Battery Upper layerinterface

 

Key portions of receive batteryinformation update in Andriod side.

Procedure: power_supply send battery status update (uevent)to BatteryService, then BatteryService receive update event by “procy -UEventObserver”to invoke power_supply sysfs interface to fetch batteryinformation.

 

//SystemServer startbatteryservice thread

frameworks/base/services/java/com/android/server/SystemServer.java

           Slog.i(TAG, "Battery Service");

            battery =new BatteryService(context, lights);

            ServiceManager.addService("battery",battery);

//BatteryService serviceregister UEventObserver with onUEvent callback handler

//onUEvent is callback, invokedwhen specific uevent is received

frameworks/base/services/java/com/android/server/BatteryService.java

    privateUEventObserver mPowerSupplyObserver = new UEventObserver() {

        @Override

        public void onUEvent(UEventObserver.UEvent event) {

            update(); 

        }

};

//start observer

申明一个observer对象,然后调用startObserving启动对该对象的监视。

mPowerSupplyObserver.startObserving("SUBSYSTEM=power_supply");

frameworks/base/core/java/android/os/UEventObserver.java

最终会调用到UEventObserver的addObserver

该函数最终会将”SUBSYSTEM=power_supply”增加到匹配序列中,当kernel发送具有该字符串的数据时,就返回匹配成功,然后调用mPowerSupplyObserver的onUEvent函数

 

 

    private synchronized final void update() {

       Slog.d(TAG, "update start");

        native_update();            //i.e. native function android_server_BatteryService_update(),shown as below

        processValues();             //primary process of batteryinformation update, including low battery detection and broadcastd Intent withbattery info. to other Android application

    }

 

//BatteryService service nativecode

frameworks/base/services/jni/com_android_server_BatteryService.cpp

in android_server_BatteryService_update()

    setIntField(env,obj, gPaths.batteryCapacityPath, gFieldIds.mBatteryLevel);

   setVoltageField(env, obj, gPaths.batteryVoltagePath,gFieldIds.mBatteryVoltage);

setIntField(env, obj,gPaths.batteryTemperaturePath, gFieldIds.mBatteryTemperature);

以上就是batteryservice从sysfs获取battery的信息,并记录和给上层使用

 

 

//how to recive uevent fromkernel space

//UEventObserver main loop

#frameworks/base/core/java/android/os/UEventObserver.java (Android 5.0 is different!!)

SR: (NOT sure correct): each manager(like battery manager) create instance of UEventObserver along with UEventThread(belong to specific manayer),

Each manager process uevent he or she concern in their own UEventThread, rather than common unique UEventThread.

        public void run() {

            native_setup();

 

            byte[] buffer = new byte[1024];

            int len;

            while (true) {

                len = next_event(buffer);

                if (len > 0) {

                    String bufferStr = newString(buffer, 0, len);  // easier tosearch a String

                    synchronized (mObservers) {

                        for (int i = 0; i <mObservers.size(); i += 2) {

                            if(bufferStr.indexOf((String)mObservers.get(i)) != -1) {

                               ((UEventObserver)mObservers.get(i+1))

                                        .onUEvent(newUEvent(bufferStr));

                            }

                        }

                    }

                }

            }

        }

frameworks/base/core/jni/android_os_UEventObserver.cpp

//next_event映射为JNI Native方法android_os_UEventObserver_next_event,最终调用uevent_next_event函数(hardware/libhardware_legacy/uevent/uevent.c),其中不断Poll接收socket PF_NETLINK的数据,代码如下:

73 int uevent_next_event(char*buffer, int buffer_length)                                                                                                   

 74 {                                                                                                                                                        

 75    while (1) {                                                                                                                                           

 76        struct pollfd fds;                                                                                                                               

 77        int nr;                                                                                                                                          

 78                                                                                                                                                          

 79        fds.fd = fd;                                                                                                                                     

 80        fds.events = POLLIN;                                                                                                                              

 81        fds.revents = 0;                                                                                                                                 

 82        nr = poll(&fds, 1, -1);                                                                                                                           

 83                                                                                                                                                          

 84        if(nr > 0 && fds.revents == POLLIN) {                                                                                                            

 85            int count = recv(fd, buffer,buffer_length, 0);                                                                                              

 86            if (count > 0) {                                                                                                                             

 87                 struct uevent_handler *h;                                                                                                                

 88                 pthread_mutex_lock(&uevent_handler_list_lock);                                                                                           

 89                 LIST_FOREACH(h,&uevent_handler_list, list)                                                                                              

 90                    h->handler(h->handler_data, buffer, buffer_length);                                                                                  

 91                pthread_mutex_unlock(&uevent_handler_list_lock);                                                                                          

 92                                                                                                                                                          

 93                 return count;                                                                                                                            

 94            }                                                                                                                                            

 95        }                                                                                                                                                

 96    }                                                                                                                                                     

 97                                                                                                                                                          

 98    // won't get here                                                                                                                                    

 99    return 0;                                                                                                                                            

100 }                          

 

其中底层的socket初始化代码在hardware/libhardware_legacy/uevent/uevent.c               [libhardware_legacy.so], uevent_init中,s = socket(PF_NETLINK, SOCK_DGRAM,NETLINK_KOBJECT_UEVENT);

 

In additional, kernel uevent core function is shown below.

 

//Kernel side

Kernel/lib/Kobject_uevent.c

kobject_uevent_env()

---> netlink_broadcast_filtered(….)                           //domain = AF_NETLINK

 

 

 

 

Fatebattery for phone current consumption test

 

真电池的中间pin脚

真电池内部构造图可以自行搜索到,其中间pin脚是用于电池侦测,内部有对地NTC(Negative Temprature Coefficient)热敏电阻,外部一般接对地电阻,阻值一般就是10K\100K等

热敏电阻的特性是其阻值会根据温度的变化而变化(温度越高阻值越小,一般是10K),,利用这一特性在手机内部电路中,通过ADC(注意:ADC一般是检测电压值)检测到电池中间pin脚的电压(为何要检测电压就能推算出热敏电阻值?电阻的分压特性),从而得到电池内部热敏电阻的阻值,再根据电池厂商预设的热敏电阻“阻值-温度”的曲线关系表,最终计算出电池的温度。

假电池

(1)假电池会在正负级并联电容,起到滤波和稳压的作用,尤其是在测试最大通话电流时,避免瞬间电流变大而导致powersupply的供电不足问题。(电容规格:6.3v耐压值,1000uF)

(2)假电池的中间pin脚接对地电阻:

当我们需要直接利用Powersupply来供电时,如果电池中间pin悬空,会导致手机内部的ADC检测到的value值不在有效范围内,从而某些battery驱动中可能会认为Batterybad,而notifyAndroid Battery is absent。因此我们需要在假电池上加入对地电阻(比如10K欧的电阻,根据电池的SPEC来定,保证ADCvalue的数值有效即可),电阻一端接假电池中间pin,一端连接负极

NOTE

当连接USB进行充电时,charger驱动会加wake_lock来阻止system进入suspend,因为还要检测电池状态,保护电池,,,画充电图标之类的

1 Introduction 1.1 General This compliance plan enables test and certification of USB Portable Devices, Charge rs and Charging Ports, Micro - ACAs, Standard - ACAs and ACA - Docks to USB 2.0 specification and to Battery Charging specification revision 1.2. Charging Ports include Dedicated Charging Ports and Charging Downstream Ports as defined in the Battery Charging Sp ecification revision 1.2. A USB Charger is a device with a Dedicated Charging Port, such as a wall adapter or car power adapter. Herein, USB Chargers are referred to as Dedicated Charging Ports as functionally they are identical. Previously a USB Portable Device with a battery and charging capability simply took power from a USB port without any control. With BC 1.2, a Portable Device can get more power and the battery can be charged faster. It is important to verify that a Portable Device complies with the BC 1.2 specification while communicating with a Charging Downstream Port and identifying a Dedicated Charger, and ensuring that it continues to operate as a functional USB device . Many existing dedicated chargers have offered a USB compliant physical conn ection but lacked a USB compliance program. This led to many chargers having characteristics incompatible with USB specifications. As well, even though PC host ports go through an extensive certification process, future PCs that claim a USB compliant Charg ing Port in their feature list will be required to pass compliance checks described in this document. These checks are in addition to those required for a USB compliant Standard Downstream Port.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值