当前位置:首页 >> 信息与通信 >>

基于M6575平台电池系统分析


基于MT6575平台电池系统分析

柴路

SW2 2012-05.22

Agenda
一:电池系统架构 二:监控原理 三:电量检测原理

电池系统架构

一:电池系统工作流程: DRV不停的把电池系统相关信息写入相关文件,然后上报。上层监听到后读取文件。

/>
涉及到的文件较多,比如读取
/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在

alps/kernel/drivers/power/*.*
MTK为了客制化,把与自己平台相关的code放在了 alps/mediatek/platform/mt6575/kernel/drivers/power/*.* 二:以添加/sys/class/power_supply/battery/ChargerTest文件为例子
1,在Power_supply.h文件添加POWER_SUPPLY_PROP_ChargerTest.

2,在Power_supply_sysfs.c文件添加。上面两步表示总共可以支持的文 件。

3,修改mt6575_battery.c文件,mt6575_battery_props[ ]表示
/sys/class/power_supply/battery/文件夹下所支持的文件

4,系统默认文件是只读的,如果文件可读可写。需要添加如下地方

下面分析文件建立过程。
static int mt6575_battery_probe(struct platform_device *dev) { ret = power_supply_register(&(dev->dev), &mt6575_ac_main.psy); ret = power_supply_register(&(dev->dev), &mt6575_usb_main.psy); ret = power_supply_register(&(dev->dev), &mt6575_battery_main.psy); } 在开机的时候当执行到mt6575_battery_probe()函数的时候,会注册ac,usb,battery。以 注册mt6575_battery_main.psy为例,当执行完毕注册函数的时候, 文件 /sys/devices/platform/mt6575-battery/power_supply/battery/*.*建立完成并且 sys/class/power_supply/battery/*.* 建立对应的连接。

主要工作是在函数power_supply_register()完成的。其中建立文件的过程如下

power_supply_register() → device_add() → device_add_attrs() → device_add_groups() →sysfs_create_group() →internal_create_group() → create_files()

Line66: “grp” 对应Power_supply_sysfs.c中的
static struct attribute_group power_supply_attr_group = {

.attrs = __power_supply_attrs,
.is_visible = power_supply_attr_is_visible, }; grp->attrs 就是 __power_supply_attrs。里面记录了所支持的所有文件名信息。 Line 75:执行Power_supply_sysfs.c中的power_supply_attr_is_visible()函数,该函 数会判断需要建立的具体文件是否符合要求,如果符合要求则建立,否则不建立

Line 79:建立文件

Line238: psy->properties对应如下,即判断需要建立的属性文件是否符 合要求,以及读写属性设置。

一:在BAT_thread()函数中通过如下函数上报信息的 mt6575_ac_update(&mt6575_ac_main); mt6575_usb_update(&mt6575_usb_main); mt6575_battery_update(&mt6575_battery_main);

信息上报告

二:BAT_thread()的触发条件
1,10s的定时器 2, 插拔充电器 三:mt6575_battery_update()函数里面会完成写文件和通知上层两个功能, 写文件就是 更新bat_data->XX. 上层读取的时候就是读取这些数据,当所有的数据更新完毕 调用 power_supply_changed()函数上报。

当上层监听到底层的上报信息后,会读取文件容 com_android_server_BatteryService.cpp是JNI层。解析出需要读取 的文件。读取文件的时候通过一些列调用最终会调用到 Power_supply_sysfs.c的 power_supply_show_property()函数。
该函数最终会调用psy->get_property(psy, off, &value)完成读取功能 以读取/sys/class/power_supply/battery/文件为例子。

上层读取文件

监控原理
一:充电原理
充电是软硬件协同完成的。软硬件的关系好比主奴关系。软件在充电 中担当主人的角色,主要完成监控功能。硬件好比奴隶,主要是干活 的,完成充电的主要工作。 二:软件的监即监督,就是时刻测量充电参数,比如电池电压,充电电 流,电池温度等。 控即控制,用的最多的控制就是使能,禁止充电, 设定充电电流大小。

硬件充电原理

1,上图红色线代表充电的时候电流流动的方向,一部分流向电池,一部 分流向系统,虚线电流流向是三极管的基极控制电流,这个电流非常 小,分析的时候可以忽略。 2,DXT790AP5是三极管: 通过三极管可以开启,关闭充电功能,开 启充电的时候调节三极 管的基级电流可以控制流过三极管CE端的电流从而实现充电电流大 小的设置。 Rsense采样电阻: 对于软件来说可以测量充电电流的大小:电流计算方法: (ISENSE – BATSNS)/Rsense. 对于PMU来说通过Rsense可以实现电流控制。比如要实现1A的 充电电流,Rsense为0.2欧。PMU实现该电流的方法就是设法一直保 证Rsense两端的电压是0.2V。

如果把电压比作水压,电流比作水流。则三极管的作用就是调节阀 (水龙头),调剂三极管的基极电流好比转动水龙头的把手。则 Rsense就好比流量检测仪。

充电硬件有自己的一套预充,恒流,恒压流程,软件也有自己的一套预 充,恒流,恒压流程。靠两者协同合作完成整个充电工作。

硬件预充过程如下:

BAT_ON在充电中的作用 1,检测电池是否存在。电压必须小于1.062V,否则认为电池不存在不 能充电,硬件行为,软件无法关闭此功能 2,高温检测,电池电压必须大于0.2V,否则认为电池温度过高不能充电, 硬件行为,软件可以关闭此功能 3,软件检测电池温度。

充电器插入拔出检测 PMU会检测VCDT PIN的电压,如果电压低于一定数值(4.3V)或 者高于一定数值(charger ovp 软件可设定电压)则认为充电器没 有插入,否则认为充电器插入。当PMU检测到有充电器插入或者 拔出动作的时候,则会触发中断,然后触发BAT_thread线程。

充电器识别 可以识别出四种类型:前两者属于USB calbe,后两个属于充电器

可参考函数hw_charger_type_detection(void)

充电器类型判断。

UVLO(Under-voltage lockout)

VTHH 3.2V,不可修改,如果电池电压低于VTHH则不开机 VTHL 2.9V,此电压软件可修改,当开机后,电池电压低于VTHL则强 行断电关机

ADC测量相关
ADC:

与充电相关的ADC集成在PMU内, 主要测量温度,电池电压,电流, 充电器。
ADC精度 10bit。已经校准好。 ADC电压范围 0 – 1.2V

电池电压算法:比如测得ADC为x,电池电压为y则: Y = (1.2*x/1024) * N N表示分压系数,N = 4。

Vcharger:比如测得ADC为x,Vcharger为y则: Y = (1.2*x/1024) * N 其中 N代表分压系数

N = (39 + 330)/39

充电电流计算: 不充电的时候计算 gADC_I_SENSE_offset = BATSENS – ISENSE 目地消除底噪误差。 充电的时候连续测量20次BATSENS和ISENSE的电压,然后把测量 的电压减去两个最大数值和最小数值其余的做平均。最后计算充电电 流

(ISENSE - BATSENS + gADC_I_SENSE_offset)/Rsense

温度测量

电量计算
两种电量测量方法 1,开路电压法。电池在开路状态下电池容量与电压具有一定的关系,计 算出电压查表可以得到容量 优点:简单,可以计算初始电池电量 缺点:需花30分钟以上等待电压回升

积分法:电流计算公式 I = Q/t 优点:适用于各种电池 缺点:初始电量无法获取

电流测试硬件原理

开路电压法
开机的时候利用开路电压法得到电池电量初始值

算法原理:
在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度表格就可以计算出当前的电池容量。

开路电压计算方法:
AB端的电压是开路电压 如果电池处于放电状态 则Vab = Vbat + I * (R + 20mOhm) 同理,在电池充电的时候电池开路电压是 Vab = Vbat - I * (R + 20mOhm)

Vbat是软件测量的电池电压
A B

I是流过电池的电流 R 是电池内阻 20mOhm是采样电阻

电池内组的计算方法: 提供四个表格如下。根据当前温度计算出当前温度的电池内租电压关系 表格,然后根据电压查找表格找出电池内组。

r_profile_t0[ ] // -10度电池内租与电压对应关系
r_profile_t1[ ] // 0度电池内租与电压对应关系 r_profile_t2[ ] // 25度电池内租与电压对应关系 r_profile_t3[ ] // 50度电池内租与电压对应关系

积分法
积分法 PMU内部集成积分电路。通过读寄存器然后计算可以得到流入流 出电池的电量,然后校准后得到最终的电量。

dvalue_CAR = ((dvalue_CAR*CAR_TUNE_VALUE)/100);
CAR_TUNE_VALUE是客制化的校准参数,用于电量/电流校准。 电量百分比算法如下: ((gFG_columb*100)/gFG_BATT_CAPACITY_aging); gFG_BATT_CAPACITY_aging为25度时候的电池电量

Q_MAX_POS_25。 该值在充满电后会适当调整。

电量上报的时候还要进行电量算法,参考 mt6575_battery_update() 函数

12

10

8

6

列 1 列 2 列 3

4

2

0 行 1 行 2 行 3 行 4

Q&A

Thank You


相关文章:
测量电池电动势和内阻的系统误差分析
测量电池电动势和内阻的系统误差分析(Ⅰ)问题提出在“用伏特表和安培表测量电池电动势和内阻” 的实验中, 由于伏特表和安培表的接入会对电路产生影响,所以测量结果...
更多相关标签:
成绩分析系统平台 | 电商平台系统分析 | 大数据分析平台系统 | 电池平台较低分析 | bms电池管理系统 | 电池管理系统 | 蓄电池在线监测系统 | 锂电池管理系统 |