最近,一直在负责公司所有产品的电源/充电/库仑这块,先说说库仑,它是集成在电池里面的一个芯片,用来准确的返回电池的信息的,因为一般的电池的信息是通过adc返回的数据,这样的数据不是很精确,为了做到对电池的信息的精确处理,所以公司的大多产品都用到了库仑计,底层页就是通过I2C读取寄存器的数据实现的。
1:有库仑计和一般电池的区别
有库仑计的电池,一共有6个脚,而一般的电池只有三个脚;
有库仑计的电池,读取到的数据比没库仑计的电池读取到的电池信息更精确。
先贴图:
如图中看到的,通过SCL和SDA读取6B地址处的数据,就可以精确拿到电池的信息。
通过下面的bq27541_level()读取电池的电量等级,也就是百分数,而通过bq7541_vol()读取到的即是电池的电量,其实最底层就是通过i2c_smbus_xfer实现的。
int bq27541_level(void)
{
int ret;
short data;
ret = i2c_smbus_read_word_data(chip->client, bq27541CMD_SOC_LSB);
if (ret >= 0) {
data = (short)ret;
//printk("level:%d
",data);
bq27541_debug(chip, "POWER_SUPPLY_PROP_CAPACITY = %d
", data);
} else {
pr_info("get bat_info POWER_SUPPLY_PROP_CAPACITY on bq27541CMD_SOC_LSB error
");
return -1;
}
return data;
}
int bq27541_vol(void)
{
int ret;
short data;
ret = i2c_smbus_read_word_data(chip->client, bq27541CMD_VOLT_LSB);
if (ret >= 0) {
data = (short)ret;
//printk("vol:%d
",data);
bq27541_debug(chip, "POWER_SUPPLY_PROP_VOLTAGE_NOW = %dmV
", data);
} else {
pr_info("get bat_info POWER_SUPPLY_PROP_VOLTAGE_NOW on bq27541CMD_VOLT_LSB error
");
return -1;
}
return data;
}
下面这个图,就是在备电电量低的时候,用来给备电充电的,在备电电量低的时候(会有一个中断)或者usb或者AC充电的时候,会给AUXBAT_CHGEN这个引脚一个高电平,来启动备电充电,XEINT4-AuxBATCHG_DET这个引脚是备电满标志,平时会因为上拉电阻,而呈现高电平,在充电的过程中,会保持低电平,而备电满以后,这个引脚会由低变高。在变高的同时会清除AUXBAT_CHGEN这个引脚为低电平。