手机充电常识

1.电池参数(电池规格书会提供 )

vbat  电池闭路电压

ocv 电池开路电压

常见的手机电池截止充电电压  4.20 V  4.35V  4.40  4.5V(比如4.2v的电池,软件上设置的充电电压一般为4.2v,充电时候量电池电压,一般就是实际的电池电压,充电ic的输出电压跟随电池电压动态变化,直到电池电压达到4.2v)

电池容量  电池储蓄电荷的能力   电流对时间的积分 如某块电池的容量是4200/4280(min/typ)mAH

放电时间  假设是4000maA的电池 以1000mA的电流恒流放电,完全放完理论需要4000/1000=4h

最大充电电流   电池支持的的最大充电电流    假设是0.5C5A,电池容量为4200maA,最大充电电流就是4200*0.5=2100mA

截止充电电流  充电电流小于某个值,电池截止充电  假设是0.02C5A,电池容量为4200maA,截止电流就是4200*0.02=84mA

所以充电电流达不到预设的电流时,注意下电池的最大充电电流,还有电池的电压(电压越高,电池能吸收的电流就越低)。

2.电池电量计算方式     

       A.根据电压与容量关系(zcv曲线),通过开路电压计算出电池容量

       B.电池快速放电时,由于锂离子的特性(需要放置一段时间),测量出ocv不能准确的反应出实际的ocv,导致算出的电池容量不准。所以另一种方案是库仑计计算电量。开机时,通过zcv曲线或rtc记录的电量作为初始电量,通过接在电池负极的库仑计计算流入/流出的电量,算出实际的电量。库仑计可以简单的理解为可以对电流进行积分的一个模块。如下图,通过对电阻的电流进行时间积分,算出电量。

3.充电ic常见参数

OREG/充电电压  不同电压的电池需要设置相应的充电电压,否则电池会充不满

Charge Current Limit/充电电流限制,根据贴的电阻(一般两种可选)不同,设置不同的充电电流

Termiation Current Limit/截止充电电流  随着电压的上升,充电电流会下降 ,低于某个值可以认为充满了点

ISAFE 安全充电电流(某些ic不一定有)

ISAFE 安全充电电压(某些ic不一定有,如果有需要设置,否则设置OREG无效)

充电ic的dpm(动态电源管理)

为了满足USB规范中的最大电流限制并避免过度加载适配器,该器件具有动态功能电源管理(DPM),持续监控输入电流和输入电压。
当输入源过载时,电流超过输入电流限制(REG00 [2:0])或电压低于输入电压限值(REG00 [6:3])。 然后,器件将充电电流降至输入电流
低于输入电流限制,输入电压高于输入电压限值。
当充电电流减小到零,但输入源仍然过载时,系统电压开始下降。 一旦系统电压低于电池电压,设备将自动进入补充BATFET开启且电池开始放电的模式,以便系统得到支持输入源和电池。

4.线性充电

     有些pmic集成有线性充电电路,如展讯的sc2721G,系统框图如下

通过调整R2的阻值,动态调整充电电流

充电电流变化图

5.开关充电

常见的芯片

bq24296规格书BQ24296 Datasheet(PDF) - Texas Instruments

fan54015,规格书FAN54015 Datasheet(PDF) - Fairchild Semiconductor

通过ILIM引脚的下拉电阻限制最大充电电流或R sense来选择充电档位,通过i2c来控制实际的充电电流,通过CE/DISABLE脚来控制充电。

6.线性充电与开关充电对比

线性充电在功能机或者小电池容量的设备上比较常见,开关充电在智能机上易见。

参考我应该使用线性充电器还是开关充电器? - 电源管理 - 技术文章 - E2E™ 设计支持

7.手机充电ic调试

手机充电ic(一般只有7个寄存器)调试比较简单,主要包括设置充电电压和充电电流。不同ic的充电电流等级有差异,需要进行适配。对于充电电流不达标的情况,确认相应的寄存器已配置成功,有安全寄存器的,要确认配置的电流值不高于安全寄存器里的值。调试过一款安全寄存器无法通过软件复位的充电ic,由于手机重启或者关机,充电ic都是供着电的,只有通过拔电池才能重新配置该寄存器。还不达标的,确认下当时电池的电量是否过高,充电器的输出能力,充电线的影响,充电时的温度(是否温度过高进行了限流)等情况。,

比如调试一款充电ic时,发现充电电流只有1.5A,设置的电流为2A,将充电ic所有寄存器值都打印出来,没发现异常。发现电池的引线有点长,将引线弄短一点,电流能达到1.7A。这时量到vbus的电压只有4.6V,应该是充电线阻和手机上的fpc引起的。但充电线已经比较好的了,没什么优化空间。这时,可以软件上设置非标准充电跟标准充电一样的电流,然后将手机的VBUS和GDN焊线出来,然后用稳压电源给手机充电,查看稳压电源里的电流值(充电电流),看能否达到标准值。如果充电电流正常,然后减低电压值到量到的电压值,再看下充电电流。对比下,就能确定是不是vbus电压太低引起充电电流过小。

如果5v(vbus)是通过fpc连接到手机上的,注意fpc上的线有没有特意加粗,如果没加粗,会导致充电电流小。

对于调试复杂的充电问题(如有两个充电ic) ,因为充电时,是无法连接adb的,但可以在串口里输入或者使用无线adb。先看下充电ic的驱动,然后实现reg接口,然后实时查看或者寄存器的值。

static ssize_t bq2560x_reg_show(struct device *dev,struct device_attribute *attr, char *buf)
{
	u8 reg_val;
	int ret;
	int i;
	int len=0;
	struct i2c_client *client = container_of(dev, struct i2c_client, dev);
	struct bq2560x_charger_info *info= i2c_get_clientdata(client);
	for(i=0;i<0xc;i++){
		ret = bq2560x_read(info, i, &reg_val);
		len+=sprintf(buf+len, "reg %x=0x%x\n", i ,reg_val);
	}

	return len;
}

static ssize_t bq2560x_reg_store(struct device *dev,struct device_attribute *attr,const char *buf, size_t count)
{
	u8 reg,data;
	char *buffer[6];
	char *options;
	int i=0;
	int ret;
	struct i2c_client *client = container_of(dev, struct i2c_client, dev);
	struct bq2560x_charger_info *info= i2c_get_clientdata(client);
	pr_info("buf=%s count=%d role=%d\n",buf,count,info->role);
	options = kstrdup(buf, GFP_KERNEL);
	if (!options)
		return -ENOMEM;
    while((buffer[i++] = strsep(&options, " ")) != NULL);
	if(i!=3){
		pr_info("i=%d %s  %s  %s\n",i,buffer[0],buffer[1],buffer[2]);
		return -EAGAIN;
	}
	reg=simple_strtol(buffer[0],0,0);
	data=simple_strtol(buffer[1],0,0);
	pr_info("data=0x%x reg=0x%x",data,reg);
	ret = bq2560x_update_bits(info, reg , 0xff , data);
	return count;
}

static DEVICE_ATTR(bq2569x_reg, S_IRUGO | S_IWUSR, bq2560x_reg_show , bq2560x_reg_store);

static struct attribute *bq2560x_attrs[] = {
	&dev_attr_bq2569x_reg.attr,
	NULL,
};

static const struct attribute_group bq2560x_attribute_group = {
	.name = "bq2560x",
	.attrs = bq2560x_attrs,
};

i2c_set_clientdata(client, info);
ret = sysfs_create_group(&dev->kobj, &bq2560x_attribute_group);
if (ret){
	dev_err(dev, "failed to register bq2560x sysfs\n");
	return ret;
}

个人推荐使用无线adb的方式无线adb调试_Android开发-CSDN博客

当然有个更好的方式,定时打印充电ic寄存器的值,如

void dump_bq2560x_reg(void){
    int i;
    int tmp;
    unsigned char reg_val[20];
    if(master_charger_info!=NULL){
        for(i=0;i<0xc;i++){
            bq2560x_read(master_charger_info, i, &reg_val[i]);
            if(i==8){
                tmp=(reg_val[8]&0x18);
                if(tmp==0x11){
                    pr_info("master charger full\n");
                }
            }
        }
        print_hex_dump(KERN_DEBUG,"reg_m:",DUMP_PREFIX_NONE,16, 1,reg_val,0xc,0);
    }
}
EXPORT_SYMBOL(dump_bq2560x_reg);

8.手机充电电流流向图

手机充电电流流向图_Android开发-CSDN博客

9.USB BC1.2的三种端口

10.高通平台USB2.0和3.0接口充电器识别原理

11.锂电池电量检测原理详细介绍

12.电池无法充满电

电池无法充满电,检查下满电条件,一般很容易发现问题。

遇到一款充电ic(sgm41511)不支持4.2v充电的情况,接近4.2v的充电电压有4.176v和4.208v,dts设置4.2v,程序上计算出的电压为4.176v,这个一般不容易发现,需要打印充电ic的寄存器才能发现问题。

 13.充电ic并联

为了散热或者提供充电电流,会有充电ic并联的情况,注意sys只需要接一路,两个充电ic的sys不要短路在一起,否则会出现两个充电ic相互影响的情况。(A和B两个网络只需一路连接到系统)

14.手机电池形态

单电芯:可用于67w的快充项目

电芯串联: 80w以上的快充项目

电芯并联:折叠屏结构问题,用在折叠屏比较多

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值