手机充电原理分析及问题总结

(1)充电流程介绍:当充电器插入时,亦即为PMIC充电模块提供了Vcharge电压,这时会产生一个充电中断信号到CPU,通知CPU现在已经进入充电状态。CPU开始启动如下模块:

1,ADC采样,主要是采集Vchrg,Vbat及从MOSFET漏极输出的电压,可以算出充电电压和充电电流;

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

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

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

(2)充电状态转换介绍:电池的电压只影响充电状态(比如是预充还是恒流充电),如果电池电压较低,只是预充的时间稍长一些,最多一两个小时应该可以完成充电!一般电池都有自保护,不会把电放到0V的!我做过试验把电池放到2.5V时,在往下放电已经很难了,负载刚接上时还是可以有电流放出,但很快就停止放电了!所以如果电池是一块合格的电池不应该会出现是0V的情况!

        充电分三个过程:预充电、恒流充电、恒压充电
1,当Vbat<3.3V  属于预充阶段,处于预充电状态时,以150mA 电流涓流充电。PMIC不能提供Vcore、Vdd等电压,CPU处于关机状态,这时CPU是不工作的!

2,当3.3V<bat<4.2V  PMIC的LDO开始输出电压,从而cpu开始工作,这是进入恒流充电阶段,以大概600mA 电流快速充电。

3,Vbat>4.2V 进入恒压充电阶段,这个阶段电流逐渐变小,电压维持不变!当电流减小到接近为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)电池功能测试中的一些技巧

        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);
        }
        else if(crap == 1)             //如果是累加得到的,显示带闪电表示的满进度条画面
        { 
                show_logo(5);
                crap = 0;                    //清标志
        }
 }
 mt65xx_disp_update();        //刷屏

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
停车场管理系统 浙江农林大学地理信息科学171班 HMc、FZ、HHb、XHc、ZLl、CC小组 模块 模块名 命名空间 介绍 完成度 模型模块 Park.Model 提供数据库模型 99% 服务模块 Park.Service 提供业务处理方法 99% 管理模块 Park.Admin 提供管理页面供管理员对各种信息进行管理、查看和汇总 80% 用户模块 Park.Mobile 提供手机网站,供用户进行查看账户信息和停车场信息 80% 接口模块 Park.API 为停车场硬件设施和Park.Mobile提供API 80% 车位设计模块 Park.Designer 用于设计停车位地图。由于技术不够,故使用WPF作为设计器框架。 99% 测试模块 Park.Test 用于测试,非单元测试 - 日志 20200329 设计器 基本完成车位设计器的主要功能: 画板网格显示 鼠标绘制停车位、通道 停车区的选择 停车区的新增、删除、重命名 使用鼠标浏览画板 使用鼠标选取对象 配置文件的导入导出 配置文件的自动保存和恢复 20200330 设计器 将通道从矩形改为线 通道支持了非横纵方向 通道支持了朝左上方拉伸 通道支持按Shift进行约束 停车位新增支持旋转 鼠标悬浮样式改为图形显示阴影 支持了删除功能 20200331 管理端 搭建了对车主管理表格的基本页面 核心 增加了停车场业务处理相关方法 测试 增加了测试类 20200401 核心 增加了交易充值业务处理相关方法 测试 增加了非会员进出、会员进出的测试方法 20200402 核心 为数据库添加了显式外键声明 管理端 基本完成车主管理表格 基本完成车位管理表格 20200403 核心 支持了从Json文件(设计器导出)导入停车位的功能 基本完成停车区地图的显示(To Bitmap) 20200404 管理端 显示了车主拥有的车辆数量、交易订单数量,点击车辆数量可以跳转到车辆表 提升了”表格模型“基类和js方法,方便之后的编写 基本完成了停车记录表格 20200406 管理端 完成交易记录表格 重新分离编写停车区和停车位管理页面 核心 增加了”墙体“模型 设计器 支持了”墙体“模型 设备接口 做好准备 20200407 管理端 基本完成模拟界面和逻辑 设备接口 基本完成门卫接口、车位传感器接口 20200410 管理端 新增了一个图表 修改数据库初始化代码,符合本系统 基本完成权限角色的分配 新增数据库管理页面 模型 新增了车主的注册时间、最后登录时间字段,新增车辆的准入字段 服务 分离了数据库创建与生成测试数据 进入停车场返回复合类型 20200501 手机 修改为前后端分离项目,前端使用Vue进行编写,后端使用Park.API 20200502 手机 基本完成主页 完成账户验证 完成车辆管理界面和查看停车记录 20200503 模型 新增Config类型,删除了定价策略的停车区字段 服务 将某些服务的参数CarOwner改为CarOwnerID 手机 完成了车辆的删除和新增功能 新增“充值”页,支持了充值和充月卡 20200504 服务 修复了数据库生成的一些时序问题和没有应用定价策略的问题 手机 基本完成交易记录界面 完成停车场地图的显示 完成账户的注销 20200505 服务 修复了数据库生成的一些时序问题,停车记录时间为1-01-01 8:05的问题 手机 修复了一些小BUG,例如格式化代码不正确、宽度过窄等问题 新增点击标题栏文字返回主页 20200515 管理端 完成了导入停车场设计器生成的JSON的功能 20200605 服务 将用户初始化时的用户名改为非随机、顺序的。 修复了设置密码时,有些加了盐有些没加的BUG 管理端 修改初始化密码为1234而非123456 手机 修复了充值金额可以为负数、非数字、很大的数字的BUG 新增修改密码界面 20200610 服务 优化测试数据创建流程,修改了数量、停车记录生成的时间 管理端 完成了首页的数据大屏 20200611 服务 优化测试数据创建流程,支持设置添加用户数量,支持了停车时修改停车位状态,修改模拟当前时间 管理端 数据大屏新增停车场名称标题、新增每个停车区的车位状态饼状图 新增停车场设置界面 数据库管理界面增加了生成测试数据的用户数量输入框 20200616 管理端 删除了车主界面的新建按钮(没写功能)和停车记录、交易记录页面的删除按钮(防止外键出错) 修改了登录页和菜单的图标 设置强制设置指定的主题,删除主题按钮 删除了一些搜索框 20200616 管理端 在车主管理界面新增了管理按钮,可以一键打开用户手机端界面,并修改用户的一些数据 出自 © 2021 GitHub, Inc.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值