这种算法应用在低成本的无界面的移动产品上,不依于赖库伦计,纯电压计算电压的方法。
首先,设置一些基本的变量:
struct capacity {
int capacity;
int min;
int max;
int offset;
int hysteresis;
};
struct battery_capacity {
struct capacity *tables;
int size;
};
struct battery {
......
struct device *dev;
struct wake_lock wlock;
struct power_supply psy;
struct battery_monitor monitor;
struct battery_property props;
struct battery_parameter params;
......
};
再通过电池厂商提供的电池曲线制作成:
static struct capacity battery_capacity_tables[]= {
/*percentage, min, max, hysteresis*/
{0, 3306, 3426, 0, 10},
{1, 3427, 3638, 0, 10},
{10,3639, 3697, 0, 10},
{20,3698, 3729, 0, 10},
{30,3730, 3748, 0, 10},
{40,3749, 3776, 0, 10},
{50,3777, 3827, 0, 10},
{60,3828, 3895, 0, 10},
{70,3896, 3954, 0, 10},
{80,3955, 4050, 0, 10},
{90,4051, 4119, 0, 10},
{100,4120,4240, 0, 10},
};
此处稍作解释一下:
在选取电压时,厂商提供的电压有OCV/CV两种,我选取的是CV作为上述表中的数据,这样做的目的是可以让电池尽早的充满,同时也保护电池,防止电压过高。但是MTK与高通的制作电池曲线中都是以OCV作为计算基础的。
定义两个全局变量:
......
static struct capacity *battery_capacity_tables = battery_capacity_tables;
static int cap_size = ARRAY_SI