手机充电原理

来源:互联网 发布:有赞 知乎 编辑:程序博客网 时间:2024/05/16 18:19

一、MTK平台手机充电

当充电器插入时,亦即为PMIC充电模块提供了Vcharge电压,只要把PMIC的BATDET脚接地即可启动充电模块,这时会产生一个充电中断信号到CPU,通知CPU现在已经进入充电状态。这时PMIC会产生一个中断给CPU,CPU开始启动如下模块:

1、ADC采样,主要是采集Vchrg,Vbat及从MOSFET漏极输出的电压,通过Vbat和Vd(MOSFET漏极)及Rsense的值,可以算出充电电压和充电电流;

2、发消息给MMI层,让它显示充电状态及一些采样数据;

3、检测电池电压有没有超过保护电压及电池连接是否连接正确,如果有问题即可通过CHRCTRL切断充电电路;

4、平时显示“充电器没有连接”警告,是因为PMIC的BATDET脚float,MOSFET没有打开,从而没有充电电流引起的。

PMIC通过电池的BAT ID脚来判断要不要给电池充电,通过BATUSE脚来区别是锂电还是镍氢电池,低电平是选择锂电。插充电器后,只要把PMIC的BATDET脚接地,就可以保证有电流流入了,电池的电压只影响充电状态(比如是预充还是恒流充电),如果电池电压较低,只是预充的时间稍长一些,最多一两个小时应该可以完成预充电,进入恒流充电状态。一般电池都有自保护,不会把电放到0V的。

二、充电过程

预充电——恒流充电——恒压充电——二次充电

1、预充电

电池电压低于设定门限电压值(3.4V)时以小电流保护性充电,只要BATDET接地即可。此时PMIC不能提供Vcore、Vdd等电压,CPU处于关机状态,这时CPU是不工作的!纯粹是硬件电路充电,充电电流Ipre = 10mV/Rsense

2、恒流充电

当电池电压达到门限电压后进入恒流充电,恒流充电过程中充电器以恒定的最大电流向电池充电,电池电压快速上升。此时PMIC的LDO输出电压,CPU开始工作。Icc = 160mV/Rsense

3、恒压充电

当电池电压上升到一定值时(4.1V左右),此时充电电压保持不变,充电电流随时间增加而下降,当电流减小到接近0或某个较小阈值时,CPU发出控制信号停止充电。

4、二次充电

充电完成后充电电流降至0mA,如果充电器一直连接,此时手机待机耗电会使电池电压缓慢下降,当降低至4.1V时会启动二次充电。


三、手机充电器的分类

通常情况下,程序中一般有四种充电器设定,分别是:USB HOST,CHARGING HOST,STANDARD CHARGER,NON-STANDARD CHARGER。


如上:USBHOST,CHARGING HOST的差别在于左图,两者用的都是PC的USB口,其中USBHOST居多。STANDARD CHARGER,NON-STANDARD CHARGER差别在于前者的DP跟DM有短接,后者没有。所以通过对DP/DM的判断,就可以分辨出充电器类别。

四、电压跟电量转化的算法

VBAT_TO_PERCENT Batt_VoltToPercent_Table[] = {

 /*BattVolt,BattPercent*/

 {3350,0},

 {3685,10},

 {3746,20},

 {3784,30},

 {3812,40},

 {3858,50},

 {3951,60},

 {4024,70},

 {4124,80},

 {4235,90},

 {4335,100},

};

 

 

UINT32 BattVoltToPercent(UINT16 dwVoltage) 

    UINT32 m=0; 

    UINT32VBAT1=0,VBAT2=0; 

    UINT32bPercntResult=0,bPercnt1=0,bPercnt2=0; 

        

   if(dwVoltage<=Batt_VoltToPercent_Table[0].BattVolt) 

    { 

        bPercntResult =Batt_VoltToPercent_Table[0].BattPercent; 

        returnbPercntResult; 

    } 

    else if (dwVoltage>=Batt_VoltToPercent_Table[10].BattVolt) 

    { 

        bPercntResult =Batt_VoltToPercent_Table[10].BattPercent; 

        returnbPercntResult; 

    } 

    else 

    {         

        VBAT1 =Batt_VoltToPercent_Table[0].BattVolt; 

        bPercnt1 =Batt_VoltToPercent_Table[0].BattPercent; 

       for(m=1;m<=10;m++) 

        { 

           if(dwVoltage<=Batt_VoltToPercent_Table[m].BattVolt) 

            { 

                VBAT2 =Batt_VoltToPercent_Table[m].BattVolt; 

                bPercnt2 =Batt_VoltToPercent_Table[m].BattPercent; 

                break; 

            } 

            else 

            { 

                VBAT1 =Batt_VoltToPercent_Table[m].BattVolt; 

                bPercnt1 =Batt_VoltToPercent_Table[m].BattPercent;     

            } 

        } 

    } 

     

   bPercntResult = (((dwVoltage-VBAT1)*bPercnt2)+((VBAT2-dwVoltage)*bPercnt1) ) /(VBAT2-VBAT1);     

    return bPercntResult;     

 

五、普通电池的charging iv curve图

电池容量被定义为:用设定的电流把电池放电至设定的电压所给出的电量。也可以说电池容量是:用设定的电流把电池放电至设定的电压所经历的时间和这个电流的乘积。


如上图,蓝色线的是电压变化,黑色线是电流变化,横轴是时间轴采样点。可见电池一开始从较低电压充电过程中,是恒流1007mA充电,随着电压升高后面慢慢变成恒压充电,此时充电电流慢慢变小,变小到cut off电流196mA后,充电电流彻底变成0,即充满停止充电。之后,使用电池变成4.07V的recharging电压后,只要充电器没有拔出,会继续给电池充电,此时仍是恒压充电,重复前一个过程。

综上,如果测算一个电池的容量,也可采用类似的时间轴跟电流曲线结合面积的算法。比如每隔5分钟读取充电电流,得到的c1,c2,以计算梯形面积的公式,(c1+c2)*(5/60)/2,充电电流是渐渐减小的,当充电电流截止到0,整个计算过程结束。讲这些小面积累加起来,就是电池容量(mAh)。

六、充放电效率 

比如一个容量450mAh的电池,能充进去多少,并不意味着能放出那么多,中间有个转化效率的问题。如下一个充放电曲线图,左边电压刻度,,右边电流刻度,以225mA恒流充电到4.2V,搁置,再以150mA放电,再搁置。


测试结果


充进去450mAh,释放出来的能量只有388mAh。

0 0
原创粉丝点击