一、关于BQ4050
BQ4050器件是一款基于电池组的单芯片全集成解决方案,针对1、2、3、4节串联锂离子或者锂聚合物电池组提供电量监测、保护认证等一系列丰富的功能。
TI电池管理芯片BQ40Z50,通信协议是SMBUS,类似IIC,速率要求10-100KHz。
二、BQ4050接线
其中:
黑色:GND
红色:SCL
白色:SDA
三、BQ4050登录
正常接线后,打开电池管理软件
1、选择设备类型
2、选择设备地址,默认是0x16
四、BQ4050界面及操作
以下为BQ4050的主界面,在这个界面里,我们可以看到电池相关信息。
主要就是电池电压、电流、剩余电量等信息
五、BQ4050操作
进入bq4050的指令数据读取界面,这里,我们除了可以通过界面直观查看电池信息,还可以通过指令来读取电池的信息
这里简单罗列下主要一些指令命令
#define BQ4050_REG_TEMP 0x08 //Temperature U2
#define BQ4050_REG_VOLT 0x09 //Voltage U2#define BQ4050_REG_CURRENT 0x0A //CURRENT I2
#define BQ4050_REG_RSOC 0x0D //RelativeStateOfCharge U1
#define BQ4050_REG_FCC 0x10 //FullChargeCapacity U2
#define BQ4050_REG_TTE 0x12 //TimeToEmpty U2
#define BQ4050_REG_TTF 0x13 //TimeToFull U2
#define BQ4050_REG_RMC 0x0F ///* Remaining Capacity */
接下来我们简单示范下操作,比如命令0x09是读取电池电压
发送0x09命令后,电池返回值为0x2BBF,转换后值为11199,即电压为11.199V
可以通过界面查看,验证数据正确性
最后,贴上部分电池读取的代码
记住:IIC电池读取的时候,指令与指令间延时多一点,保证能够正常稳定读取数据。
数据发送
void Bat_IIC_Send_Byte(uint8_t txd)
{
uint8_t t;
BAT_SDA_OUT();
BAT_IIC_SCL(0); //ÀµÍʱÖÓ¿ªÊ¼Êý¾Ý´«Êä
for(t=0;t<8;t++)
{
BAT_IIC_SDA((txd&0x80)>>7);
txd<<=1;
delay_us(BAT_DELAY_TIME); //¶ÔTEA5767ÕâÈý¸öÑÓʱ¶¼ÊDZØÐëµÄ
BAT_IIC_SCL(1);
delay_us(BAT_DELAY_TIME);
BAT_IIC_SCL(0);
delay_us(BAT_DELAY_TIME);
}
}
数据读取
uint8_t Bat_IIC_Read_Byte(uint8_t ack)
{
uint8_t i,receive=0;
BAT_SDA_IN(); /*SDAÉèÖÃΪÊäÈë*/
for(i=0;i<8;i++ )
{
BAT_IIC_SCL(0);
delay_us(BAT_DELAY_TIME);
BAT_IIC_SCL(1);
receive<<=1;
if(BAT_READ_SDA)receive++;
delay_us(BAT_DELAY_TIME);
}
if (!ack)
Bat_IIC_NAck(); /*·¢ËÍnACK*/
else
Bat_IIC_Ack(); /*·¢ËÍACK*/
return receive;
}
电池信息读取
void Bq4050_Get_Cmd_Info(uint8_t slaveAddr,uint8_t cmd,uint8_t *data,uint8_t len)
{
uint8_t t=0;
int ret = 0;
Bat_IIc_Start();
Bat_IIC_Send_Byte(slaveAddr);
ret = Bat_IIC_Wait_Ack();
if(ret==1)
printf("ack slaveAddr %d failed \r\n",slaveAddr);
else
printf("ack slaveAddr %d success \r\n",slaveAddr);
delay_us(100);
Bat_IIC_Send_Byte(cmd);
ret = Bat_IIC_Wait_Ack();
if(ret==1)
printf("ack cmd %d failed \r\n",cmd);
else
printf("ack cmd %d success \r\n",cmd);
delay_us(100);
delay_us(750); /*±ØÐëÒªÓÐ*/
Bat_IIc_Start();
Bat_IIC_Send_Byte(slaveAddr+1);
ret = Bat_IIC_Wait_Ack();
if(ret==1)
printf("ack slaveAddr+1 %d failed \r\n",slaveAddr+1);
else
printf("ack slaveAddr+1 %d success \r\n",slaveAddr+1);
delay_us(100);
delay_us(50);
for(t=0;t<len;t++)
{
data[t] = Bat_IIC_Read_Byte(1);
delay_us(250);
}
Bat_IIC_Stop();
}