前言
本人使用BQ25713实现给电池充电的功能,这里大概讲解一下这个芯片的用法。
一、开发环境
mcu:stm32f072
软件:keil5
库:hal
二、BQ25713芯片
1.简介
这款芯片一般用来给电池充电,可给1S~4S的芯片充电,支持USB2.0,3.0,typec等输入设置。其他的电气属性我就不介绍了,有手册的看手册没有的可以在以下链接下载:
2.开发
1.芯片读写
首先需要将这个芯片的硬件电路设计为我们所需要的几S电池。这个芯片从实际的硬件电路来识别我们的电池的2S还是3S等。
我这里使用的是2S的锂电池,一节电池电压约4.2V。
首先我们需要熟悉以下这款芯片的通讯协议以及I2C的地址是多少。
这里我们看到和正常的I2C协议差不多,这样我们直接可以使用
stm的官方的I2C库函数直接进行读写,并且地址分别是0xD6;0xD7。
BQ读函数:
#define BQ25713_ADDR_READ (0XD7)
u8 Read_BQ(u8 Reg)
{
u8 *Reg_Read = read_buf;
return HAL_I2C_Mem_Read(&hi2c2,BQ25713_ADDR_READ,(u16)Reg,I2C_MEMADD_SIZE_8BIT,Reg_Read,2,0x10);
}
BQ寄存器是8位的且地址为0xD7,所以在读取寄存器的时候设置为8bit读取,一次读取两个字节。可根据自己需求做更改。
BQ写函数:
#define BQ25713_ADDR_WRITE (0XD6)
u8 Write_BQ(u8 Reg, u16 Data)
{
//data is big-endian
write_buf[0] = Data & 0xFF;
write_buf[1] = (Data>>8) & 0xFF;
if(!HAL_I2C_Mem_Write(&hi2c2,BQ25713_ADDR_WRITE,(u16)Reg,I2C_MEMADD_SIZE_8BIT,write_buf,2,0x10))
{
HAL_Delay(1);
return 0;
}
return 1;
}
BQ寄存器是8位的且地址为0xD6,所以在写寄存器的时候设置为8bit写,一次写两个字节。可根据自己需求做更改。
2.芯片初始化
芯片初始化需要先去看看自带的寄存器有哪些:
根据自己充电的需求去配置充电模式,实际中没用到可自行删减,这里我们给2S电池充电,主要配置了以下几个寄存器:(括号内为寄存器配置的值)
1、ChargeOption0(0x070E)
配置这个寄存器主要注意这一位PWM_FREQ,需要根据使用的 电感来设置开关频率,我这里设置的 0.8kHZ。
2、ChargeOption1(0xE210)
3、ChargeOption2(0x32BF)
4、ChargeOption3(0x0034)
5、ProchotOption0(0x4A65)
6、ProchotOption1(0x81FF)
7、MaxChargeVoltage(0x20D0)
这个寄存器设置最大的充电电压,我设置成了8.4V。
8、InputVoltage(0x1400)
9、MinSystemVoltage(0x1800)
2S最小系统电压为6144mV(文档中有)
10、IIN_HOST(0x4900)
配置输入电流为多少
11、ADCOption(0xA0FF)
配置ADC采集选项,如果需要读取电池电压和系统电压等需要配置
寄存器定义
#define BQ25713_REG_CHARGE_OPTION_0 0x00
#define BQ25713_REG_CHARGE_OPTION_1 0x30
#define BQ25713_REG_CHARGE_OPTION_2 0x32
#define BQ25713_REG_CHARGE_OPTION_3 0x34
#define BQ25713_REG_CHARGE_CURRENT 0x02
#define BQ25713_REG_MAX_CHARGE_VOLTAGE 0x04
#define BQ25713_REG_PROCHOT_OPTION_0 0x36
#define BQ25713_REG_PROCHOT_OPTION_1 0x38
#define BQ25713_REG_ADC_OPTION 0x3A
#define BQ25713_REG_CHARGER_STATUS 0x20
#define BQ25713_REG_PROCHOT_STATUS 0x22
#define BQ25713_REG_IIN_DPM 0x24
#define BQ25713_REG_ADC_VBUS_PSYS 0x26
#define BQ25713_REG_ADC_IBAT 0x28
#define BQ25713_REG_ADC_CMPIN_IIN 0x2A
#define BQ25713_REG_ADC_VSYS_VBAT 0x2C
#define BQ25713_REG_OTG_VOLTAGE 0x06
#define BQ25713_REG_OTG_CURRENT 0x08
#define BQ25713_REG_INPUT_VOLTAGE 0x0A
#define BQ25713_REG_MIN_SYSTEM_VOLTAGE 0x0C
#define BQ25713_REG_IIN_HOST 0x0E
#define BQ25713_REG_MANUFACTURER_ID 0x2E
#define BQ25713_REG_DEVICE_ADDRESS 0x2F
BQ初始化:
u8 BQ25713_Init(void)
{
if(Write_BQ(BQ25713_REG_CHARGE_OPTION_0,0x070E)) return 1;
if(Write_BQ(BQ25713_REG_MAX_CHARGE_VOLTAGE,0x20D0)) return 1;
if(Write_BQ(BQ25713_REG_INPUT_VOLTAGE,0x1400)) return 1;
if(Write_BQ(BQ25713_REG_MIN_SYSTEM_VOLTAGE,0x1800)) return 1;
if(Write_BQ(BQ25713_REG_IIN_HOST,0x4900)) return 1;
if(Write_BQ(BQ25713_REG_CHARGE_OPTION_1 ,0xE210)) return 1;
if(Write_BQ(BQ25713_REG_CHARGE_OPTION_2,0x32BF)) return 1;
if(Write_BQ(BQ25713_REG_CHARGE_OPTION_3,0x0034)) return 1;
if(Write_BQ(BQ25713_REG_PROCHOT_OPTION_0,0x4A65)) return 1;
if(Write_BQ(BQ25713_REG_PROCHOT_OPTION_1,0x81FF)) return 1;
if(Write_BQ(BQ25713_REG_ADC_OPTION,0xA0FF)) return 1;
return 0;
}
2.充电配置
这里我们给2S的电池充电,充电电压设置为8.4V,充电电流为1.5A左右。可根据自己的需求进行电压和电流的配置,切记功率不可调大了,否则充电可能会损坏。
充电电压设置:
u8 Set_Charge_Voltage(u16 Voltage_mV)
{
u16 buff=0;
if(Voltage_mV>12000) return 1;
if((Voltage_mV%8)==0)
{
buff=Voltage_mV/8;
}
else
{
buff=(u16)(Voltage_mV/8)+1;
}
if(Write_BQ(BQ25713_REG_CHARGE_CURRENT,(buff<<3))) return 1;
return 0;
}
根据寄存器每一位的电压宽度来进行计算,最后写入寄存器。
充电电流设置:
u8 Set_Charge_Current(u16 Current_mA)
{
u16 buff=0;
if(Current_mA>3000) return 1;
if((Current_mA%64)==0)
{
buff=Current_mA/64;
}
else
{
buff=(u16)(Current_mA/64)+1;
}
if(Write_BQ(BQ25713_REG_CHARGE_CURRENT,(buff<<6))) return 1;
return 0;
}
根据寄存器每一位的电流宽度来进行计算,最后写入寄存器。
总结
本节介绍的BQ芯片的初始化和寄存器的读写等配置,其他寄存器的使用暂时还没说明,有需要的小伙伴可私信我。