首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

关于充电器电气规格的差异

关于充电器电气规格的差异

(7)关于充电器电气规格的差异
        最近碰到一个奇怪的现象。新款手机用5V1A的充电器可以充,用5V500MA的充电器是充不进去电,用PC的USB却是一直可以充。经过打印充电信息的trace发现,是由充电电流的差异引起。AP程序中对充电器的电压下限是4.4V,如果判断充电器电压小于这个值,则AP会自己关掉充电模块。那为什么1A的充电器可以而500MA的充电器不行呢?可以假设前者的内阻比后者的内阻小,那么暂不管真实的充电电流是多少,前者自身分配的压降肯定小于后者自身分配的压降,所以后者最终的充电器供给电压会更低。
        以程序中默认的800MA充电时,5V500MA的充电器会被拉低至3.8V,所以AP会认为充电器不正常就关掉自身的充电模块。但是如果是5V1A时,由于充电器内阻较小,就算供电端被拉低也不会低于4.4V,所以它仍然是可以工作的(测得实际充电电流640MA)。
       想让手机兼容500MA的充电器,此时需要做个处理:在判断充电器电压小于4.4V时不返回错误,同时将充电电流设定成400MA(对于同一个充电器,充电电流越小,充电器自身压降更小,供给更大),让它仍然可以充电只不过充的会慢点。此时的程序段如下:
A,设置一个电流改变标志,默认为FALSE。
static BOOL  CurrentChangeFlag = FALSE;                  
B,在设置电流的地方判断该标志,注意:该电流设定是过个时间间隔就循环执行。
if(CurrentChangeFlag == TRUE)
        g_temp_CC_value = Cust_CC_400MA;                              //如果改变,就以400MA充电
else
        g_temp_CC_value = AC_CHARGER_CURRENT;             //如果不改变,就以默认电流800MA充电
C,循环检测充电器电压,并改变电流的程序段:

if (BMT_status.charger_vol <= V_CHARGER_MIN )              //充电器电压小于4.4V
{
          printf("[BATTERY]Charger under voltage!! CurrentChangeFlag=%d\r\n",CurrentChangeFlag);         
          if(CurrentChangeFlag == TRUE)
          {
                  CurrentChangeFlag = FALSE;
                  leds_battery_no_charging(); //zhangcheng
                  BMT_status.bat_charging_state = CHR_ERROR;
                  return PMU_STATUS_FAIL;  
          }
          CurrentChangeFlag = TRUE;  
}

以上的逻辑是:当第一次检测电流时,充电器默认以800MA充电,此时充电器被拉低。之后进入该条件,接着执行CurrentChangeFlag = TRUE。在上述B中完成设定电流为400MA,如果设定完之后充电器正常的话,就不会再进入这个判断了,充电器持续充电;如果设定400MA之后还是会进入该判断,说明充电器不合格,此时要关掉充电功能,所以执行返回电失败的那段。注意:如果此时客户不管充电电压正确与否,仍然要求继续充电,只需要将if(CurrentChangeFlag == TRUE) 程序段屏蔽掉就行。
(8)电池功能测试中的一些技巧
        A, 对于数字电源用数字电源模拟电池,通过其电流值可以知道手机的工作状态,比如电流值为正就是手机耗电的多少;插入外部充电器之后,如果电流值为负,则是手机正在充电。另一方面,对于用数字电源模拟充电器的,通过其电流值就可以知道供给外部的充电电流是多少,如果读数很小说明没有充电。
        B,对于电池的温控脚,一般是要接的。如果需要外接温控脚,记住一定要跟电源公地。单独的一个温控脚是不会起作用的。
        C,电池的快速放电。很多时候我们需要测试电池低电压时的状况,得到电池低电压是比较缓慢的一个过程。有个好方法就是利用数字电源,电压设置成3V,电流设置成800MA,然后把电源跟电池连接,即可实现电池的快速放电。
        D,电池的充电。当我们在没有手机的情况下要对一块电池进行充电,可以用数字电源完成这个功能。设置电源是4.2V,电流要限流在800MA以内,接上对应的电极就可以了,不需要接温控脚。需要注意的是:一开始的充电电流会很大(提示LIMITED),如果不限流会更大,这样会影响电池寿命及安全性。随着电池电压慢慢增高,电流会慢慢变小,直到充满时的0ma左右。最后OFF掉电源,发现电压显示跟电压源之前设定的一样,说明已经充满。
(9)关机充电时低电压警告的状态图
                                         
关于电池低电压状况的一个说明:很多时候手机因为低电压关机后,只要没有取出电池,手机仍然在消耗电池的电量,这个很容易理解就像接了个未耗电的电阻。这会造成一个现象,电池电量会持续降低,所以再充电时需要冲入一段时间,才会进入正常的充电提示和LED报警提示,之前是不会有任何动作的。
(10)full charging的LOGO显示差别
         手机在使用中会碰到这种情况:手机充电画面是动态的进度条,然后到充满一直显示满进度条,结论就是对于满电画面始终可以用同一幅图片;如果动态进度条的满电显示是带闪电标识,真正充满的满电是不带闪电标识,那么在根据电量进行show图片显示时,是要区分100%电量是从累加得到的还是真正的电量充满?所以,下面的程序段完成该功能。
static unsigned int crap = 0;         //一个区别标志
if(capacity == 0)                              //5个图片,分四个档:100/4=25
      show_logo(1);
else if(capacity == 25)
      show_logo(2);
else if(capacity == 50)
      show_logo(3);
else if(capacity == 75)
{
       show_logo(4);                         //如果是累加得到100,必然经过该步,置标志
       crap = 1;
}
else if(capacity == 100)
{
        if(crap == 0)                            //如果是真正的满电,直接显示不带闪电标识的满进度条画面
        {
                show_logo(8);
        }
返回列表