多口智能手机充电器地原理
- 格式:doc
- 大小:172.05 KB
- 文档页数:9
STW三鑫天威首席工程师:刘经理(研发设计总监)
智能手机充电器,在未来两年,充电技术还会有令人不可想象的变化。
智能多口手机充电器原理:
(1)充电流程介绍:当充电器插入时,亦即为PMIC充电模块提供了Vcharge电压,这时会产生一个充电中断信号到CPU,通知CPU现在已经进入充电状态。CPU开始启动如下模块:
1,ADC采样,主要是采集Vchrg,Vbat及从MOSFET漏极输出的电压,可以算出充电电压和充电电流;
2,发消息给MMI层,让它显示充电状态及一些采样数据;
3,检测电池电压有没有超过保护电压及电池连接是否连接正确,如果有问题即可通过CHRCTRL切断充电电路;
4,平时显示“充电器没有连接”警告,是因为PMIC的BATDET脚和MOSFET没有打开,从而没有充电电流引起的。
(2)充电状态转换介绍:如果电池电压较低,只是预充的时间稍长一些,最多一两个小时应该可以完成充电!一般电池都有自保护,不会把电放到0V的!
充电分三个过程:预充电、恒流充电、恒压充电
1,当Vbat<3.3V 属于预充阶段,处于预充电状态时,以150mA 电流涓流充电。PMIC不能提供Vcore、Vdd等电压,CPU处于关机状态,这时CPU是不工作的!纯粹是硬件电路充电
2,当3.3V 3,Vbat>4.2V 进入恒压充电阶段(属于TOPOFF的一个点,如下图),这个阶段电流逐渐变小,电压维持不变!当电流减小到接近为0(或者某个较小阀值)时,CPU发出控制信号这时停止充电! 以状态机的方框图说明如下: (3)一个普通的充电器电路如下: 一个普通的USB充电图: 如上,VBUS是USB供电;VCDT是通过分压电阻测试充电电压的测试点;CHR_LDO跟VDRV共同完成开关切换功能,实现对电池的开关充电(充9S停1S);IBENBE跟BATSNS完成端电压除以RSENSE测得充电电流;BAT_ON提供电池电压测试。 (4)LED与充电状态的配合实例: 开机后,插入USB充电时显示橙色灯,拔掉USB不充电时灭灯,充满电后显示绿灯。充电时,系统在一个线程里面循环检测电量,当电量满置绿灯。需要注意的是,显示绿灯后,就禁止充电了以防止过充。所以在电量变满后,就应该SetCharger(off),但此时有个矛盾:充电开橙色灯的操作在SetCharger(on)中,灭灯的操作在SetCharger(off)中,这样会造成一个BUG:一旦电量满后,关闭充电功能时也会灭灯,这样就搞的橙色灯闪了下就灭了,显然这不是我要的效果。 我要的效果是变绿后,除非我拔掉USB线,才会灭灯。所以需要在电满时加标志A,在SetCharger(off)中加判断语句A,跳过灭灯的处理而仅仅关掉充电,同时打开另一个标志B。同时在USB插拔的操作中处理B,表示当灯变绿时,优先处理B,在B后面添加灭灯语句,仅仅处理这一块就可以了。 (5)关于标准USB充电器和非标准USB充电器,是跟USB的插座构造有关的。 (6)关于手机充电器的分类 通常情况下,程序中一般有四种充电器设定,分别是:USB HOST,CHARGING HOST,STANDARD CHARGER,NON-STANDARD CHARGER。 如上:USB HOST,CHARGING HOST的差别在于左图,两者用的都是PC的USB口,其中USB HOST 居多。STANDARD CHARGER,NON-STANDARD CHARGER差别在于 前者的DP跟DM有短接,后者没有。所以通过对DP/DM的判断,就可以分辨出充电器类别。(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)电池功能测试中的一些技巧