技术热线: 0755-86643915

新闻动态

单相电量计芯片 鼎盛合分享芯海ADC芯片

更新时间: 2023-05-16 12:26:12
阅读量:

 

1.电量计芯片

深圳鼎盛合科技系芯海一级代理商,代理芯海高精度ADC芯片,SOC芯片,wi代理芯海fi及蓝牙模块

2.电量计芯片 铅酸电池

第二次更新我以前是在中兴做手机的,后面基本一半以上的同事都跳槽去了oppo, vivo,三星这些做手机的公司,而且刚开始的时候,就是做充电相关的,虽然后面android系统不断演化,但是很多原理和理论部分都是差不多的。

3.电量计芯片 瑞萨

有电量计和没有电量计芯片代理芯海的不同手机里面,如果是比较好的手机,都会有一个芯片来管理电池电压,这个芯片叫做电量计,刚开始的时候,电池电压是直接通过主控的ADC来读取的什么是ADC呢?ADC就是模数转换,比如电池的电压是4.2V,我们可以通过ADC来读取到这个电压。

4.电量计芯片 库伦计

正常的电路如下:

5.电量计芯片 电动车

AD代理芯海C读取电池电压电路但是这样有一个什么问题呢?1、因为本身电池电压就不是稳定的所以直接用ADC来读取的时候,会出现读取不正确的问题,有时候读到4.2V,有时候读到3.9V,但是一点点的压差,就可能导致不一样的软件流程,特别在电池快没有电的时候,如果你不打开手机屏幕,你测量到的电压是3.8V,你一打开屏代理芯海幕,电池电压瞬间就会变成3.5V,这个就是电池里面的虚电,我们经常发现一个问题,本来手机快没电了,然后放一会,电量又回来了,但是这个电量可以使用的时间非常短。

6.电量计芯片 百科

2、还有一个问题就是,线性会做的不够好,什么是电池的线性呢?我给个比喻,如果3.7V到3.8V这个压差,可以让手机满负荷工代理芯海作20分钟,那么3.8到3.9V是不是应该也可以使用20分钟,但是实际上肯定不是这样的,有可能3.7~3.8V可以使用半个小时,3.8~3.9才可以使用5分钟,(这个是只是举个例子,实际需要测试哈)。

7.电量计芯片原理

然后我的很大一部分工作就是做什么呢?就是做充放电测试,因为电池充电过程就比较久,然代理芯海后放电过程更加久,每次测试花费的时间非常久,所以就只能加班了,加班后,我们老大看到我非常努力,他就给我涨了工资哈哈电池曲线是什么呢?

8.电量计芯片推荐

比如3.6~3.9可以使用半个小时,我们需要把电压转变成半分比,因为用户只需要关注我还有多少百分比的电量,不需要知道还有多少电压的电量而且,我们调电池代理芯海曲线,需要让用户知道,从100%使用到90%所花费的时间跟90%到80%所花费的时间是一样的,如果不一样的问题就会产生一个情况,你发现有一个时间段的电量能用的时间非常久,就像题主提问的问题了。

9.电量计芯片作用

因为调电池曲线非常麻烦,时间也非常久,电池在使用上电量消耗后,曲线会发生变化,所以只在co代理芯海stdown产品或者低端产品上这样用。如果是比价高成本的手机。就出现了一个芯片,叫做电量计芯片

10.电量计芯片与充电芯片配合

电量计芯片和手机CPU连接图电量计说实话,也是一个ADC芯片,这个芯片用来读取电池电压,但是电量计因为是专业的,他直接把电池电压转换成数字量,而且做得好的,都自己有一套自己的算代理芯海法,算法做的好的话,电量曲线都非常平滑,所以用起来非常好。

先说到这里,有时间再更新一波~先说结论因为你看到的1%是显示的电量,实际的电量跟显示的电量是人为调试出来的如果把电池当做一桶水,可能1%的电量表示的水量是 10% ,剩余的99%再平分90%的水1、锂电池介绍。

锂离子电池由日本索尼公司于199代理芯海0年最先开发成功它是把锂离子嵌入碳(石油焦炭和石墨)中形成负极(传统锂电池用锂或锂合金作负极)正极材料常用LixCoO2 ,也用 LixNiO2 ,和LixMnO4 ,电解液用LiPF6+二乙烯碳酸酯(EC)+二甲基碳酸酯(DMC)。

石油焦炭和石墨作负极材料无毒,且资源充足,锂离子嵌入碳中,克服了锂代理芯海的高活性,解决了传统锂电池存在的安全问题,正极LixCoO2在充、放电性能和寿命上均能达到较高水平,使成本降低,总之锂离子电池的综合性能提高了。

预计21世纪锂离子电池将会占有很大的市场锂离子二次电池充、放电时的反应式为LiCoO2+C=Li1-xCoO2+LixC

上图是锂电池容量和电压的对比图,可以代理芯海看到当容量为0%时,电压最大,容量为100%时,电压最小,容量指的是电池还可以装下多少电量的意思过放:锂电池如果电压低于一定的门限,是不能够还原的,就假设,你有一个手机,放着几个月一直没有充电,如果电池电芯没有过放保护,那你的手机想再次充电就不行了。

过充:电池爆炸,大部分因为过充引起的,电芯做的不好代理芯海,锂电池已经充满电了,没有做好门限保护,导致爆炸,但是爆炸的原因不只是这个,比如充电器短路,手机内部短路。

2、Android电池管理框架问题:有时候我们发现我电量50%掉到30%用了一个小时,但是同样的使用方法20%到关机,可能只用了半个小时,这就是涉及电池曲线或者电量器的问题电池曲线:有点低成本手代理芯海机,或者平板电脑,没有电量器,就只能用ADC的值通过自己的算法来调整电池百分比,如果这个电池曲线调整的不好,就会出现上述问题。

电量器:电量器也是用来计算电量的,但是有个芯片专门做这个事情,理论肯定比上面没有电量器的效果好Android电池整体框架

2.1. Kernel 层本层属于电池的驱动部分,负责代理芯海与硬件进行交互,当电池电量信息发生变化时,生成相应的uevent,上报给用户层。主要相关代码路径:

深圳鼎盛合科技系芯海一级代理商,代理芯海高精度ADC芯片,SOC芯片,wifi及蓝牙模块

2.2. Healthd守护进程本层在Android中属于Native层,healthd中运行一个系统服务batt代理芯海eryproperties,负责监听Kernel中上报的uevent,对电池电量进行实时监控。

主要相关代码路径:

2.3. BatteryService系统服务本层提供了C++/Java两套接口来访问batteryproperties系统服务 本层的系统服务battery使用Java代码写成,运行在f代理芯海wk的中SystemServer进程。

该系统服务的主要作用是:监听batteryproperties服务中的电池信息变化消息,并将该消息以系统广播的形式转发至Android系统中各处主要相关代码路径:\frameworks\native\services\。

batteryservice\IBatte代理芯海ryPropertiesRegistrar.cpp \frameworks\native\services\batteryservice\IBatteryPropertiesListener.cpp \frameworks\native\services\batter代理芯海yservice\BatteryProperties.cpp \frameworks\base\core\java\android\os\IBatteryPropertiesRegistrar.aidl \frameworks\base\core\java\andro代理芯海id\os\IBatteryPropertiesListener.aidl \frameworks\base\core\java\android\os\BatteryProperties.java \frameworks\base\services\core\java代理芯海\com\android\server\BatteryService.java

2.4. SystemUI 应用该部分属于电量上报的最后的环节其主要工作是:监听系统广播Intent.ACTION_BATTERY_CHANGED,并对UI作出相应更新主要相关代码路径\frameworks\base\pa代理芯海ckages\SystemUI\src\com\android\systemui\power\PowerUI.java 。

3、u-boot到kernel关机充电流程Android充电有很多场景,关机充电是比较重要的一个需要了解的。开机流程:

充电检测开机流程:

u-boot代码:在u-b代理芯海oot里面,我们很多时候需要把一些信息传给kernel,目前用到的方法是command_line,开机方式也是这样的u-boot代码如下代码如下,kernel解析部分代码请到init/main.c下面去找。

以后抽个文章专门说明下510 #ifdef CONFIG_RK_SDCARD_BOOT_EN 代理芯海 511 if (StorageSDCardUpdateMode()) { /* sdcard undate */ 512

snprintf(command_line, sizeof(command_line), 513 "%s %s", command_代理芯海line, "sdfwupdate"); 514 } 515 #endif 516 517 #ifdef CONFIG_RK_UMS_BOOT_EN 518 if (StorageUMSUpdateMode()) { /代理芯海* ums update */ 519 snprintf(command_line, sizeof(command_line), 520 "%s %s", command_line, "usbfwupdate"); 521 } 522 代理芯海#endif 523 524 #ifdef CONFIG_POWER_RK818 525 if (is_rk81x_fg_init() != 0) { 526 snprintf(command_line, sizeof(command_代理芯海line), 527 "%s %s", command_line, "loader_charged"); 528 } 529 #endif 530 if (charge) { 531 snprintf(command_l代理芯海ine, sizeof(command_line), 532 "%s %s", command_line, "androidboot.mode=charger"); 533 } 534 535 #if defined(CONFIG_LC代理芯海D) && defined(CONFIG_RK_FB_DDREND) 536 /* 537 * uboot fb commandline: uboot_logo=@[:] 538 * size - fb size, address - fb addre代理芯海ss, offset - kernel bmp logo offset. 539 * offset is optional, depend on resource image has kernel_logo.bmp. 540 */ 541 if (g_代理芯海logo_on_state != 0) { 542 snprintf(command_line, sizeof(command_line), 543 "%s uboot_logo=0x%08x@0x%08lx", command_line, CONFIG_RK_LCD代理芯海_SIZE, gd->fb_base); 544 #if defined(CONFIG_KERNEL_LOGO) 545 if (g_rk_fb_size != -1) 546 snprintf(command_line, sizeof(command代理芯海_line), 547 "%s:0x%08x", command_line, g_rk_fb_size); 548 #endif /* CONFIG_KERNEL_LOGO */ 549 } 550 #endif /* CONFIG_R代理芯海K_FB_DDREND */ 551 552 #if defined(CONFIG_RK_DEVICEINFO) 553 if (g_is_devinfo_load) 554 snprintf(command_line, sizeof(代理芯海command_line), 555 "%s stb_devinfo=0x%08x@0x%08x", 556 command_line, SZ_8K, CONFIG_RKHDMI_PARAM_ADDR); 557 #endif /* CONFIG_RK代理芯海_DEVICEINFO*/ 558 559 snprintf(command_line, sizeof(command_line), "./common/cmd_bootrk.c" 709L, 19309C

4、充电电流电池充电有几个阶段

在软件上需要根据代理芯海电池厂家的的不同阶段来给设置充电电流大小举个栗子:我们用USB先连接PC机给手机充电,这时候适配器不是DC模式,充电电流如果设置过大,就会导致PC蓝屏而不同的电源适配器,D+ D- 的状态不同,被识别的状态也不一样,流程也会不同。

之前做的一个功能是,在恒压充电下,为了提高充电速度,我每间隔50ma提代理芯海高充电电流,同时去检查电池两端的电压大小,如果电压降低到一定程度,就不会再增加充电电流5、kernel充电曲线代码上面提到的问题,如果没有电量器的情况下,我们需要用数组来计算电池百分比,贴上这部分代码给大家看看,这部分代码可以适用于很多地方。

static struct batt_vol_cal ba代理芯海tt_table[BATT_NUM] = { {3400,3520}, {3610,3715}, {3672,3790}, {3705,3825}, {3734,3841}, {3764,3864}, 代理芯海 {3808,3930}, {3845,3997}, {3964,4047}, {4034,4144}, {4120,4200}, }; static int rk29_adc_battery代理芯海_voltage_to_capacity(struct rk29_adc_battery_data *bat, int BatVoltage) { int i = 0; int capacity = 0; struct batt_vo代理芯海l_cal *p; p = batt_table; if (rk29_adc_battery_get_charge_level(bat)){ //charge if(BatVoltage >= (p[BATT_NUM - 1].charge_vol)代理芯海){ capacity = 100; } else{ if(BatVoltage <= (p[0].charge_vol)){ capacity = 0; } else{ 代理芯海for(i = 0; i < BATT_NUM - 1; i++){ if(((p[i].charge_vol) <= BatVoltage) && (BatVoltage = (p[BATT_NUM - 1].

dis_charge_vol)){ capacity 代理芯海= 100; } else{ if(BatVoltage <= (p[0].dis_charge_vol)){ capacity = 0; } else{ for(i = 0; i < B代理芯海ATT_NUM - 1; i++){ if(((p[i].dis_charge_vol) <= BatVoltage) && (BatVoltage < (p[i+1].dis_charge_vol))){ capacity = i * 10 + ((BatVolta代理芯海ge - p[i].dis_charge_vol) * 10) / (p[i+1].

dis_charge_vol- p[i].dis_charge_vol); ; break; } } } } } 代理芯海 return capacity; } static void rk29_adc_battery_capacity_samples(struct rk29_adc_battery_data *bat) { int cap代理芯海acity = 0; struct rk29_adc_

battery_platform_data *pdata = bat->pdata; //充放电状态变化后,Buffer填满之前,不更新 if (bat->bat_status_cnt gBatC代理芯海apacityDisChargeCnt = 0; bat->gBatCapacityChargeCnt = 0; return; } capacity = rk29_adc_battery_voltage_to_capacity(ba代理芯海t, bat->bat_voltage); if (rk29_

adc_battery_get_charge_level(bat)){ if (capacity > bat->bat_capacity){ //实际采样到的容量比显示的容量大,逐级上升 代理芯海 if (++(bat->gBatCapacityDisChargeCnt) >= NUM_CHARGE_MIN_SAMPLE){ bat->gBatCapacityDisChargeCnt = 0; if (bat->bat_capacity bat_代理芯海capacity++; bat->bat_change = 1; } } bat->gBatCapacityChargeCnt = 0; } else{ // 实际的容量比采样比 显示的容量小 代理芯海 bat->gBatCapacityDisChargeCnt = 0; (bat->gBatCapacityChargeCnt)++; if (pdata->charge_ok_pin != INVALID_GPIO){ if (gpio_get代理芯海_value(pdata->charge_ok_pin) == pdata->charge_ok_level){ //检测到电池充满标志,同时长时间内充电电压无变化,开始启动计时充电,快速上升容量 if (bat->gBatCapacityChargeCnt >= N代理芯海UM_CHARGE_MIN_SAMPLE){ bat->gBatCapacityChargeCnt = 0; if (bat->bat_capacity bat_capacity++; bat->bat_change = 1; } 代理芯海 } } else{ #if 0 if (capacity > capacitytmp){ //过程中如果电压有增长,定时器复位,防止定时器模拟充电比实际充电快 gBatCapacityChar代理芯海geCnt = 0; } else if (/*bat->

bat_capacity >= 85) &&*/ (gBatCapacityChargeCnt > NUM_CHARGE_MAX_SAMPLE)){ gBatCapacityChargeCnt 代理芯海= (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE); if (bat->bat_capacity bat_capacity++; bat->bat_change = 1; } } 代理芯海 } #else // 防止电池老化后出现冲不满的情况, if (capacity > bat->capacitytmp){ //过程中如果电压有增长,定时器复位,防止定时器模拟充电比实际充电快 bat->gBatCapacit代理芯海yChargeCnt = 0; } else{ if ((bat->bat_capacity >= 85) &&((bat->gBatCapacityChargeCnt) > NUM_CHARGE_MAX_SAMPLE)){ bat-代理芯海>gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE); if (bat->bat_capacity bat_capacity++; bat->bat_change = 1; 代理芯海 } } } } #endif } else{ //没有充电满检测脚,长时间内电压无变化,定时器模拟充电 if (capacity > bat->capac代理芯海itytmp){ //过程中如果电压有增长,定时器复位,防止定时器模拟充电比实际充电快 bat->gBatCapacityChargeCnt = 0; } else{ if ((bat->bat_capacity >=代理芯海 85) &&(bat->gBatCapacityChargeCnt > NUM_CHARGE_MAX_SAMPLE)){ bat->gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE); 代理芯海 if (bat->bat_capacity bat_capacity++; bat->bat_change = 1; } } } } } } else{ 代理芯海 //放电时,只允许电压下降 if (capacity bat_capacity){ if (++(bat->gBatCapacityDisChargeCnt) >= NUM_DISCHARGE_MIN_SAMPLE){ bat->gBa代理芯海tCapacityDisChargeCnt = 0; if (bat->bat_capacity > 0){ bat->bat_capacity-- ; bat->bat_change = 1; } } 代理芯海} else{ bat->gBatCapacityDisChargeCnt = 0; } bat->gBatCapacityChargeCnt = 0; } bat->capacitytmp = capa代理芯海city; }

好了今天就这么多,具体问题还是要具体分析去看代码

深圳鼎盛合科技系芯海一级代理商,代理芯海高精度ADC芯片,SOC芯片,wifi及蓝牙模块