在电源管理实际设计中,充电管理是重要的一环,电池充电需要依据实际电芯的容量曲线,充电特性要求来匹配充电电压和充电电流,以及整个充电周期的充电算法以及温度管理.
前面已经介绍过一款纯硬件的充电控制器,现在这款充电控制器是带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 提供反向输入保护
– 可编程安全计时器
– 充电过流保护
– 电池短路保护
– 电池过压保护
– 热关断保护
特点介绍
典型电路1
典型电路2
继续看看启动波形
效率图
更多时候,我们应该多看看电路框图,了解整个IC里面的布局和端口对应逻辑
由于这款是可以用MCU来配置参数,所以我们也要多了解I2C协议和寄存器定义
具体设计的时候也应该多计算,并形成一个良好的有理论支撑的电路体系
实际LAYOUT的时候更是要了解电流路径和开尔文走线,以及开关电源的三圈两地的注意
必要的程序也是需要的,可以很多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参数计算的过程看看,基于计算的电源管理更加精确,细致,能快速优化电路