主题中讨论的其他器件:BQSTUDIO、 EV2400
您好!
我们使用 BQ27411-G1A 来监控电池的 SOC。 我们将手动设置 ROM 中的所有值。 除了电量监测计在为电池充电时测量的电流外、一切都正常。
放电时、fuell 电池可非常精确地测量流经10m Ω 电阻器的电流。 然而、当电池正在充电时、fuell 电池报告的电流大约是流经电阻器的电流的两倍。 我们测量了电阻器两端的压降、还测量了流经电阻器的电流、并将其与电量监测计报告的值进行比较、从而得到下表:
我们尝试了两种不同的器件、结果相同、分别为"Equipo A"和"Equipo B"。 V Bat 测试仪是测试仪报告的电池电压、V Bat FG 是电量监测计(FG)报告的电压。 V R14是使用测试仪测量的10m Ω 电阻器中的压降。
如您所见、FG 报告的正电流值不正确(电池正在充电)。 我们还确保它读取的电流不正确、因为在为电量监测计报告的剩余电量充电时、电量监测计会增加到设计容量的大约两倍。 在文件"serial_20181222_144052_carga.txt"中、我们监控了 FG 在完全放电充电时的行为。
e2e.ti.com/.../serial_5F00_20181222_5F00_144052_5F00_carga.txt
我们使用两节并联的锂离子3.7V 680mAh 电池。 以下是我们有关电量监测计的设计原理图:
此外、使用此函数、我们将写入 ROM 中配置的值:
void FG_WRITE_DATA_memory2 (void){
unsigned char UC;
int cs;
FG_WRITE (0x00、0x00);//取消密封
FG_WRITE (0x01、 0x80);
FG_WRITE (0x00、0x00);
FG_WRITE (0x01、0x80);
FG_WRITE (0x00、0x13);// SET_CFGUPDATE
FG_WRITE (0x01、0x00);
uC = FG_READ_UNsigned_byte (0x06);
while ((uC & 0x10)==0){
_delay_ms (100);
uC = FG_READ_unsigned_byte (0x06);
}
FG_WRITE (FG_BLOCKDATACONTROL、0x00);// BlockDataControl
cs = 0;
FG_CLASS (2);// SAFG_BLOCK
(0);550_WORD
、FG_DATA = 550、FG_WRITE_WORD cs);
cs = FG_WRITE_DATA_WORD (2、0、cs);
cs = FG_WRITE_DATA_BYTE (4、 50、cs);
FG_CHECKSUM_WRITE (~cs);
//
FG_CLASS (36);//充电终止
FG_BLOCK (0);
cs = FG_WRITE_DATA_WORD (0、25、cs);
cs = FG_WRITE_DATA_BYTE (2、 40、cs);
cs = FG_WRITE_DATA_BYTE (3、99、cs);
cs = FG_WRITE_DATA_BYTE (4、95、cs);
cs = FG_WRITE_DATA_BYTE (5、-1、 cs);
cs = FG_WRITE_DATA_BYTE (6、98、cs);
cs = FG_WRITE_DATA_WORD (7、 50、cs);
FG_CHECKSUM_WRITE (~cs);
//
FG_CLASS (48);//数据
FG_BLOCK (0);
cs = FG_WRITE_DATA_BYTE_Dummy();
cs = FG_WRITE_DATA_BYTE (2、-13、cs);//非默认
值 cs = FG_WRITE_DATA_WORD (3、-500、cs);//非默认
FG_CHECKSUM_WRITE (~cs);
//
FG_CLASS (49);//放电
FG_BLOCK (0
、FG_WRITE_0、FG_DATA (byte); cs);
cs = FG_WRITE_DATA_BYTE (1、15、cs);
cs = FG_WRITE_DATA_BYTE (2、 2、cs);
cs = FG_WRITE_DATA_BYTE (3、5、cs);
FG_CHECKSUM_WRITE (~C);
//
FG_CLASS (64);//寄存
器 FG_BLOCK (0);
cs = FG_WRITE_DATA_WORD (0、0x25F8、 cs);
cs = FG_WRITE_DATA_BYTE (2、0x0F、cs);
cs = FG_WRITE_DATA_BYTE (3、 0x80、cs);
FG_CHECKSUM_WRITE (~cs);
//
FG_CLASS (68);//电源
FG_BLOCK (0);
cs = FG_WRITE_DATA_BYTE_Dummy();
cs = FG_WRITE_DATA_WORD (7、3、cs);
cs = FG_WRITE_DATA_WORD (9、 2800、cs);
cs = FG_WRITE_DATA_BYTE (11、1、cs);
FG_CHECKSUM_WRITE (~cs);
//
FG_CLASS (80);// IT cfg
FG_BLOCK (0);
cs = FG_WRITE_DATA_BYTE_Dummy_();
cs = FG_WRITE_DATA_WORD (4、30、cs);
cs = FG_WRITE_DATA_BYTE (10、8、cs);
cs = FG_WRITE_DATA_BYTE (17、70、 cs);
cs = FG_WRITE_DATA_BYTE (19、20、cs);
cs = FG_WRITE_DATA_BYTE (20、 5、cs);
cs = FG_WRITE_DATA_WORD (22、800、cs);
CS = FG_WRITE_DATA_BYTE (28、10、cs);
FG_CHECKSUM_WRITE (~C);
//
FG_BLOCK (1);
cs = FG_WRITE_DATA_BYTE_Dummy();
cs = FG_WRITE_DATA_BYTE (35、92、cs);
cs = FG_WRITE_DATA_BYTE (36、 96、cs);
cs = FG_WRITE_DATA_WORD (37、125、cs);
cs = FG_WRITE_DATA_WORD (39、4、cs);
cs = FG_WRITE_DATA_BYTE (41、3、 cs);
cs = FG_WRITE_DATA_BYTE (42、25、cs);
cs = FG_WRITE_DATA_BYTE (44、 15、cs);
cs = FG_WRITE_DATA_BYTE (45、20、cs);
cs = FG_WRITE_DATA_WORD (48、500、cs);
cs = FG_WRITE_DATA_WORD (52、0、 cs);
cs = FG_WRITE_DATA_WORD (54、0、cs);
cs = FG_WRITE_DATA_BYTE (59、 1、cs);
cs = FG_WRITE_DATA_BYTE (60、20、cs);
CS = FG_WRITE_DATA_WORD (61、11、cs);
FG_CHECKSUM_WRITE (~C);
//
FG_BLOCK (2);
cs = FG_WRITE_DATA_BYTE_Dummy();
cs = FG_WRITE_DATA_WORD (70、0、cs);
cs = FG_WRITE_DATA_WORD (72、 200、cs);
cs = FG_WRITE_DATA_WORD (74、100、cs);
CS = FG_WRITE_DATA_BYTE (76、2、cs);
FG_CHECKSUM_WRITE (~C);
//
FG_CLASS (81); //当前阈值
FG_BLOCK (0);
cs = FG_WRITE_DATA_WORD (0、167、cs);
cs = FG_WRITE_DATA_WORD (2、 100、cs);
cs = FG_WRITE_DATA_WORD (4、250、cs);
cs = FG_WRITE_DATA_WORD (6、60、cs);
cs = FG_WRITE_DATA_BYTE (8、60、 cs);
cs = FG_WRITE_DATA_BYTE (9、1、cs);
cs = FG_WRITE_DATA_BYTE (10、 179、cs);
cs = FG_WRITE_DATA_BYTE (11、179、cs);
CS = FG_WRITE_DATA_WORD (12、400、cs);
FG_CHECKSUM_WRITE (~C);
//
FG_CLASS (82); //状态
FG_BLOCK (0);
cs = FG_WRITE_DATA_BYTE_Dummy();
cs = FG_WRITE_DATA_WORD (0、16384、cs); //此处出现错误
cs = FG_WRITE_DATA_BYTE (2、0x00、cs);
cs = FG_WRITE_DATA_WORD (3、0、 CS);//?
CS = FG_WRITE_DATA_BYTE (5、0x81、cs);
CS = FG_WRITE_DATA_WORD (6、3803、 cs);
cs = FG_WRITE_DATA_WORD (8、3752、cs);
cs = FG_WRITE_DATA_WORD (10、 1360、cs);//设计容量680+680mAh
cs = FG_WRITE_DATA_WORD (12、5032、cs);//设计能量1360mAh * 3.7V
cs = FG_WRITE_DATA_WORD (14、1340、cs);
cs = FG_WRITE_DATA_WORD (16、3200、 CS);//终止电压3200mV
cs = FG_WRITE_DATA_BYTE (26、1、cs);
cs = FG_WRITE_DATA_WORD (27、25、 CS);// Tapper 速率= 10*1032/CHARGE_CURRENT
cs = FG_WRITE_DATA_WORD (29、4100、cs);
cs = FG_WRITE_DATA_BYTE (31、10、 cs);//睡眠电流
FG_CHECKSUM_WRITE (~cs);
//
FG_BLOCK (1);
cs = FG_WRITE_DATA_BYTE_Dummy_();
cs = FG_WRITE_DATA_WORD (33、4190、 cs);//错误?
cs = FG_WRITE_DATA_WORD (35、-50、cs);
cs = FG_WRITE_DATA_WORD (37、-50、 cs);
cs = FG_WRITE_DATA_WORD (39、1、cs);
FG_CHECKSUM_WRITE (~cs);
//
FG_CLASS (104);//数据
FG_BLOCK (0);
cs = FG_WRITE_DATA_BYTE_Dummy();
cs = FG_WRITE_DATA_BYTE (0、0、 cs);
cs = FG_WRITE_DATA_BYTE (1、0、cs);
cs = FG_WRITE_DATA_BYTE (2、 0、cs);
FG_CHECKSUM_WRITE (~C);
FG_CLASS (107);// Current
FG_Block (0);
cs = FG_WRITE_DATA_BYTE_Dummy();
cs = FG_WRITE_DATA_BYTE (1、5、cs);
FG_CHECKSUM_WRITE (~cs);
FG_WRITE (0x00、0x42);// SOFT_RESET
FG_WRITE (0x01、0x00);
uC = FG_READ_UNsigned_byte (0x06);
serial_printf_P (PSTR ("标志%02x\n")、uC);
while ((uC & 0x10)!= 0){
_delay_ms (100);
uC = FG_READ_UNsigned_byte (0x06);
}
uC = FG_READ_UNsigned_byte (0x06);
serial_printf_p (PSTR
)(0x20、写入标志(0x20);uC //密封
FG_WRITE (0x01、0x00);
return;
}
有什么想法?
谢谢、Tomás


