在电源管理实际设计中,充电管理是重要的一环,电池充电需要依据实际电芯的容量曲线,充电特性要求来匹配充电电压和充电电流,以及整个充电周期的充电算法以及温度管理.

前面已经介绍过一款纯硬件的充电控制器,现在这款充电控制器是带I2C接口,可以编程电压和电流的,以及读取必要数据.特点如下:

• 可编程工作频率 615kHz 750kHz 885kHz NMOS-NMOS 同步降压转换器

• 适用于锂离子或锂聚合物电池的独立充电器

• 工作输入范围为 5V 至 28V VCC,支持 1 节至 6 节电池 (BQ24610)

• 工作输入范围为 5V 至 24V VCC,支持 1 节至 5 节电池 (BQ24617)

• 充电电流和适配器电流高达 10A

• 高精度电压和电流调节

– 充电电压精度为 ±0.5%

– 充电电流精度为 ±3%

– 适配器电流精度为 ±3%

• 集成 – 自动选择适配器或电池作为系统电源

– 非电源路径可选,可降低总 BOM 成本

– 内部环路补偿和软启动

– 动态电源管理

• 安全保护 – 输入过压保护

– 电池热敏电阻可感应高温和低温充电暂停

– 电池检测 – FET 提供反向输入保护

– 可编程安全计时器

– 充电过流保护

– 电池短路保护

– 电池过压保护

– 热关断保护


forum.jpg

特点介绍


forum.jpg

典型电路1


forum.jpg

典型电路2

继续看看启动波形


forum.jpg


forum.jpg


forum.jpg

效率图

更多时候,我们应该多看看电路框图,了解整个IC里面的布局和端口对应逻辑


forum.jpg

由于这款是可以用MCU来配置参数,所以我们也要多了解I2C协议和寄存器定义


forum.jpg


forum.jpg

具体设计的时候也应该多计算,并形成一个良好的有理论支撑的电路体系


forum.jpg


forum.jpg

实际LAYOUT的时候更是要了解电流路径和开尔文走线,以及开关电源的三圈两地的注意


forum.jpg


forum.jpg


forum.jpg

必要的程序也是需要的,可以很多MCU来驱动,这里用MSP430G来示例:

#include <Wire.h>

#define BQ24725_ADDRESS 0x6B

void setup() {
Wire.begin(); // 初始化I2C总线
Serial.begin(9600); // 初始化串口通信
}

void loop() {
float voltage, current, temperature;

// 读取电压
voltage = readVoltage();
Serial.print("Voltage: ");
Serial.print(voltage);
Serial.println(" V");

// 读取电流
current = readCurrent();
Serial.print("Current: ");
Serial.print(current);
Serial.println(" A");

// 读取温度
temperature = readTemperature();
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");

delay(1000); // 延迟1秒
}

float readVoltage() {
Wire.beginTransmission(BQ24725_ADDRESS);
Wire.write(0x08); // 电压寄存器地址
Wire.endTransmission(false);

Wire.requestFrom(BQ24725_ADDRESS, 2); // 读取2个字节的数据
byte msb = Wire.read();
byte lsb = Wire.read();

int rawValue = (msb << 8) | lsb;
float voltage = rawValue * 0.008;
return voltage;
}

float readCurrent() {
Wire.beginTransmission(BQ24725_ADDRESS);
Wire.write(0x0E); // 电流寄存器地址
Wire.endTransmission(false);

Wire.requestFrom(BQ24725_ADDRESS, 2); // 读取2个字节的数据
byte msb = Wire.read();
byte lsb = Wire.read();

int rawValue = (msb << 8) | lsb;
float current = rawValue * 0.05;
return current;
}

float readTemperature() {
Wire.beginTransmission(BQ24725_ADDRESS);
Wire.write(0x0C); // 温度寄存器地址
Wire.endTransmission(false);

Wire.requestFrom(BQ24725_ADDRESS, 2); // 读取2个字节的数据
byte msb = Wire.read();
byte lsb = Wire.read();

int rawValue = (msb << 8) | lsb;
float temperature = rawValue * 0.1;
return temperature;
}

最后来一段EXCEL参数计算的过程看看,基于计算的电源管理更加精确,细致,能快速优化电路


forum.jpg