Battery 学习文档
一:电池系统架构
电池系统工作流程:
驱动不停的把电池系统相关信息写入相关文件,然后上报。上层监听到后读取文件。
涉及到的文件较多,比如读取
/sys/class/power_supply/battery/BatterySenseVoltage可以获取电池电压
/sys/class/power_supply/battery/ChargerVoltage可以获取充电器电压
/sys/class/power_supply/battery/batt_tem可以获取电池温度 等等。
要理解电池系统架构需要需要解决三个问题:
1.相关文件是如何建立的?
2.是什么触发驱动更新文件内容以及驱动是如何上报的?
3.用户空间是如何读取文件里面的信息的?
电池系统文件建立
电池系统架构基于linux kernel,相关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)(struct power_supply *psy, enum power_supply_property psp);
文件建立:
power_supply_register(&(dev->dev), &battery_main.psy);
信息上报:
static void battery_update(struct battery_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 常用的有TI BQ24296 , 增加额外的硬件成本 充电电流大, 充电效率高 。
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.
signed int battery_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.电量计
硬件Fuel Gauge(电压法+电流法),
软件Fuel Gauge(电压法)
五 常见问题:
5.1 修改充电电流
kernel-3.18/drivers/misc/mediatek/include/mt-plat/mt6580/include/mach/mt_charging.h
分别对应 USB充电 标准充电器 非标准充电器
USB charging current 默认使用500mA 电流档位,根据硬测和客户需求更改.
AC(Adapter Charger)充电电流默认1000mA,可灵活克制化,根据硬测和客户需求更改.
NON_STD_AC_CHARGER_CURRENT 默认使用500mA 电流档位
充电器分为3种分别是USB充电器,标准充电器,非标准充电器。
USB充电器,D+,D-会有15K的下拉电阻,
标准充电器,D+,D-短接,
非标准充电器,D+,D-悬空。
MTK BB芯片内部,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(MTK FG电量算法相关代码)
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
¥29.8
¥9.9
¥59.8