Battery学习文档.docx
《Battery学习文档.docx》由会员分享,可在线阅读,更多相关《Battery学习文档.docx(23页珍藏版)》请在冰豆网上搜索。
![Battery学习文档.docx](https://file1.bdocx.com/fileroot1/2023-2/1/2a040f26-e2c4-4271-87ba-eb4fc7a41961/2a040f26-e2c4-4271-87ba-eb4fc7a419611.gif)
Battery学习文档
Battery学习文档
一:
电池系统架构
电池系统工作流程:
驱动不停的把电池系统相关信息写入相关文件,然后上报。
上层监听到后读取文件。
涉及到的文件较多,比如读取
/sys/class/power_supply/battery/BatterySenseVoltage可以获取电池电压
/sys/class/power_supply/battery/ChargerVoltage可以获取充电器电压
/sys/class/power_supply/battery/batt_tem可以获取电池温度等等。
要理解电池系统架构需要需要解决三个问题:
1.相关文件是如何建立的?
2.是什么触发驱动更新文件内容以及驱动是如何上报的?
3.用户空间是如何读取文件里面的信息的?
电池系统文件建立
电池系统架构基于linuxkernel,相关code在
kernel/drivers/power/*.*
MTK客制化相关的code放在了
kernel/drivers/power/mediatek/*.*
kernel-3.18/drivers/misc/mediatek/power/mt6580
支持的文件:
Include/linux/power_supply.h
Kernel/drivers/power/power_supply_sysfs.c
在kernel/drivers/power/mediatek/battery_common.c
是/sys/class/power_supply/battery文件夹下面支持的文件
文件默认只读,要支持写操作,需要实现
int(*property_is_writeable)(structpower_supply*psy,enumpower_supply_propertypsp);
文件建立:
power_supply_register(&(dev->dev),&battery_main.psy);
信息上报:
staticvoidbattery_update(structbattery_data*bat_data);
BAT_thread();
BAT_thread()的触发条件:
10s的定时器
battery_update函数里面会完成写文件和通知上层两个功能,写文件就是更新bat_data->XX.上层读取的时候就是读取这些数据,当所有的数据更新完毕调用power_supply_changed()函数上报:
power_supply_changed()→schedule_work()→power_supply_changed_work()→
kobject_uevent()
上层读取文件
当上层监听到底层的上报信息后,读取文件的时候通过一些列调用最终会调用到Power_supply_sysfs.c的power_supply_show_property()函数。
该函数最终会调用psy->get_property(psy,off,&value)完成读取功能
二:
监控原理
充电原理
充电是软硬件协同完成的。
软件主要完成监控功能。
硬件完成充电的主要工作。
软件的监即监督,就是时刻测量充电参数,比如电池电压,充电电流,电池温度等。
控即控制,用的最多的控制就是使能,禁止充电,设定充电电流大小。
MTK平台充电有分为两种linear充电switch充电两种:
linear充电:
硬件上使用MTK的PMU充电,硬件成本低,充电电流小,转换效率不高。
switch充电:
硬件上使用外挂充电IC常用的有TIBQ24296,增加额外的硬件成本充电电流大,充电效率高。
VBUS:
USB线正极或者AC充电器的正极。
VCDT:
充电器电压检测脚。
ISENSE:
检流电阻正极。
此方案的检测电阻为220毫欧。
BATSNS:
检流电阻负极。
VBAT:
电池正极引脚。
BAT_ON:
电池NTC(热敏电阻)引脚。
用于电池是否在位检测,以及电池温度检测。
通过battery_meter_ctrl读取PMIC的寄存器直接可读到V-batsns、V-isense、VCharger、Vbat_temp
1,一部分流向电池,一部分流向系统.
2,充电的时候调节VDRV,通过调节三极管的be端电流可以控制流过ce端的电流从而实现充电电流大小的设置。
Rsense检流电阻:
对于软件来说可以测量充电电流的大小:
电流计算方法:
(ISENSE–BATSNS)/Rsense.
signedintbattery_meter_get_charging_current(void);
线性充电过程
CHR_PRE预充状态小电流充电激活电池
CHR_CC恒流充电充电过程中电流恒定电压不断上升
CHR_TOP_OFF(switch充电BB没有这个状态)恒压充电,电压基本不变,电流缓慢下降
CHR_BATFULL电池充满
CHR_ERROR异常状态,关闭充电
这几种状态的转换关系如下
预充电阶段,设置充电9s,停止1s。
当电压大于3.4V时,就会进入恒流充电阶段。
恒流充电阶段,设置充电9s,停止1s。
当电压大于4.25V时,就会进入topoff充电阶段。
TOPOFF充电阶段,没有了充9s停1s的设置。
此阶段会通过两个判断条件(充电电流是否连续6次小于截止电流和恒压充电时间是否大于3小时),来判断电池电压是否充满。
二次回冲阶段,充满后二次回冲电压小于4.25V时,会启动二次回冲。
充电hold状态,MTK做了一个功能,当充电时打电话,此时电压若大于3.8V,则会暂停充电,进入hold状态。
当电压小于3.8V时,会启动充电。
从而减小发热。
三:
电量检测原理
两种电量测量方法
1.开路电压法。
电池在开路状态下电池容量与电压具有一定的关系,计算出电压查表可以得到容量
优点:
简单,可以计算初始电池电量
缺点:
需花30分钟以上等待电压回升
开机的时候利用开路电压法得到电池电量初始值
算法原理:
在cust_fuel_gauge.h中定义了四种温度下电池开路电压与电池剩余容量的对应表格,如下:
battery_profile_t0[]//-10度
battery_profile_t1[]//-0度
battery_profile_t2[]//25度
battery_profile_t3[]//50度
软件计算电池温度和开路电压。
比如计算当前温度是40读,则会根据25度和50度的表格插值生成一个40度的开路电压与电池剩余容量的表格。
然后根据开路电压查找40度表格就可以计算出当前的电池容量。
2.积分法:
电流法
优点:
适用于各种电池
缺点:
初始电量无法获取
PMU内部集成积分电路。
通过读寄存器然后计算可以得到流入流出电池的电量,然后校准后得到最终的电量。
dvalue_CAR=((dvalue_CAR*CAR_TUNE_VALUE)/100);
CAR_TUNE_VALUE是客制化的校准参数,用于电量/电流校准。
电量百分比算法如下:
((gFG_columb*100)/gFG_BATT_CAPACITY_aging);
3.电量计
硬件FuelGauge(电压法+电流法),
软件FuelGauge(电压法)
五常见问题:
5.1修改充电电流
kernel-3.18/drivers/misc/mediatek/include/mt-plat/mt6580/include/mach/mt_charging.h
分别对应USB充电标准充电器非标准充电器
USBchargingcurrent默认使用500mA电流档位,根据硬测和客户需求更改.
AC(AdapterCharger)充电电流默认1000mA,可灵活克制化,根据硬测和客户需求更改.
NON_STD_AC_CHARGER_CURRENT默认使用500mA电流档位
充电器分为3种分别是USB充电器,标准充电器,非标准充电器。
USB充电器,D+,D-会有15K的下拉电阻,
标准充电器,D+,D-短接,
非标准充电器,D+,D-悬空。
MTKBB芯片内部,D+有1.5K上拉电阻,D-有100K上拉和15K下拉,根据需要选择。
当充电器插入后,MTK芯片内部会打开D-线上的100K上拉电阻,检测D-的状态,D-为低电平,则为USB充电线,因为有15K下拉的缘故。
下一步检测标准和非标准充电器:
打开芯片内部D+的1.5K上拉电阻和D-的15K下拉电阻。
检测D-的电压,如果是高电平,则为标准充电器,否则,即为非标准充电器。
5.2导入电池曲线
kernel-3.18/drivers/misc/mediatek/include/mt-plat/mt6580/include/mach/mt_battery_meter.h
kernel-3.18/drivers/misc/mediatek/include/mt-plat/mt6580/include/mach/mt_battery_meter_table.h
5.3高压电池修改
kernel-3.18/drivers/misc/mediatek/include/mt-plat/mt6580/include/mach/mt_charging.h
5.4充电时间长修改
kernel-3.18/drivers/misc/mediatek/include/mt-plat/mt6580/include/mach/mt_charging.h
1/充电电流提升到1A,注意测试确认温升情况是否能够满足我们标准和客户需求
2/提高CV值,以加长CC阶段的充电时间
3/截止电流设置大些,,注意测试确认截止充电时的电池电压,确保能够充满
5.5充电温度报警值
kernel-3.18/drivers/misc/mediatek/include/mt-plat/mt6580/include/mach/mt_charging.h
电池温度,根据对应表将读出的电压ADC转换成温度值。
5.6检流电阻修改
kernel-3.18/drivers/misc/mediatek/include/mt-plat/mt6580/include/mach/mt_battery_meter.h
二代码路径:
以6580M平台为例,主要的内核代码如下:
kernel/drivers/power/mediatek/battery_common.c(充电代码的主架构)
kernel/drivers/power/mediatek/battery_meter.c(MTKFG电量算法相关代码)
kernel/drivers/power/mediatek/linear_charging.c(线性充电相关代码)
kernel/drivers/power/mediatek/switch_charging.c(外置充电IC相关代码)
需要经常克制化的参数:
kernel-3.18\drivers\misc\mediatek\include\mt-plat\mt6580\include\mach\mt_battery_meter.h
kernel-3.18\drivers\misc\mediatek\include\mt-plat\mt6580\include\mach\mt_battery_meter_table.h
kernel-3.18\drivers\misc\mediatek\include\mt-plat\mt6580\include\mach\mt_charging.h
与硬件相关的代码
kernel-3.18\drivers\misc\mediatek\power\mt6580