1. 项目背景与核心需求
在锂离子电池应用领域,过压保护电路的设计至关重要。两节串联锂离子电池组的工作电压范围通常在6V至8.4V之间,当单节电池电压超过4.2V时,就可能引发热失控甚至爆炸风险。这就是为什么我们需要专门的保护芯片配合MCU实现精准的电压监控和保护。
BQ29200是TI推出的专用保护芯片,具有以下关键特性:
- 支持2节串联电池组
- 集成高精度电压检测(±25mV精度)
- 内置自动电量平衡功能
- 二级过压保护机制
STM32F107VCT6作为主控MCU,其优势在于:
- 内置12位ADC(1μs转换时间)
- 丰富的外设接口(I2C、SPI等)
- 72MHz主频满足实时性要求
- 低功耗特性适合电池供电场景
2. 硬件设计要点
2.1 电路连接方案
典型连接示意图:
电池组+ → BQ29200 VDD │ ├─ OV1 → STM32 ADC1_IN0 ├─ OV2 → STM32 ADC1_IN1 ├─ SDA → STM32 I2C1_SDA ├─ SCL → STM32 I2C1_SCL 电池组- → GND2.2 关键参数计算
- 分压电阻选择: 对于4.2V过压点,使用公式:
R1 = (Vbat_max - Vov) / (Vov / R2)推荐值:R1=100kΩ, R2=200kΩ(精度1%)
滤波电容: 在OV引脚添加100nF陶瓷电容,可有效抑制高频噪声。
PCB布局建议:
- 保护芯片尽量靠近电池连接器
- 模拟走线远离数字信号线
- 采用星型接地布局
3. 软件实现流程
3.1 初始化配置
// STM32硬件初始化 void BQ29200_Init(void) { // I2C初始化 I2C_InitTypeDef i2c_init; i2c_init.I2C_ClockSpeed = 100000; i2c_init.I2C_Mode = I2C_Mode_I2C; I2C_Init(I2C1, &i2c_init); // ADC初始化 ADC_InitTypeDef adc_init; adc_init.ADC_ScanConvMode = ENABLE; adc_init.ADC_ContinuousConvMode = ENABLE; ADC_Init(ADC1, &adc_init); // 配置BQ29200寄存器 BQ29200_WriteReg(CONTROL_REG, 0x1F); // 使能所有保护功能 }3.2 电压监测逻辑
#define OV_THRESHOLD 4200 // 4.2V in mV void CheckVoltage(void) { uint16_t cell1 = ADC_GetValue(ADC1, 0); uint16_t cell2 = ADC_GetValue(ADC1, 1); // 转换为实际电压值(假设12位ADC,参考电压3.3V) float voltage1 = cell1 * (3.3/4095) * (R1+R2)/R2; float voltage2 = cell2 * (3.3/4095) * (R1+R2)/R2; if(voltage1 > OV_THRESHOLD || voltage2 > OV_THRESHOLD) { TriggerProtection(); } }3.3 保护触发机制
void TriggerProtection(void) { // 1. 通过I2C发送保护命令 BQ29200_WriteReg(PROTECTION_CTRL, 0x01); // 2. 控制外部MOSFET断开 GPIO_ResetBits(GPIOB, GPIO_Pin_5); // 3. 记录故障日志 LogFault(GetTickCount(), cell1, cell2); // 4. 进入低功耗模式 PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); }4. 调试与优化技巧
4.1 常见问题排查
- ADC读数不稳定:
- 检查参考电压稳定性
- 增加软件滤波(推荐移动平均滤波)
#define SAMPLE_SIZE 8 uint16_t GetFilteredADC(uint8_t channel) { static uint16_t buffer[SAMPLE_SIZE] = {0}; static uint8_t index = 0; buffer[index] = ADC_GetValue(ADC1, channel); index = (index + 1) % SAMPLE_SIZE; uint32_t sum = 0; for(int i=0; i<SAMPLE_SIZE; i++) { sum += buffer[i]; } return sum / SAMPLE_SIZE; }- I2C通信失败:
- 检查上拉电阻(通常4.7kΩ)
- 用逻辑分析仪捕获波形
- 确保地址正确(BQ29200默认0x6A)
4.2 参数优化建议
- 响应时间测试:
- 从过压触发到MOSFET断开应<100ms
- 可通过示波器监控保护引脚电平变化
- 电量平衡优化:
void BalanceCells(void) { float delta = voltage1 - voltage2; if(fabs(delta) > 50) { // 50mV差异 BQ29200_WriteReg(BALANCE_CTRL, delta>0 ? 0x01 : 0x02); } }5. 进阶功能扩展
- SOC估算实现:
// 简化库仑计算法 float EstimateSOC(float current, float voltage) { static float capacity = 2000; // mAh static float remaining = capacity; remaining -= current * (1.0/3600); // 假设current单位为mA,1秒周期 // 电压补偿 if(voltage > 4.1) remaining *= 0.99; else if(voltage < 3.5) remaining *= 1.01; return (remaining/capacity)*100; }- 温度保护集成:
void CheckTemperature(void) { float temp = ReadNTC(); if(temp > 45.0) { BQ29200_WriteReg(PROTECTION_CTRL, 0x03); } }6. 实测数据参考
典型性能指标:
| 参数 | 指标值 | 测试条件 |
|---|---|---|
| 过压检测精度 | ±25mV | 25°C |
| 响应时间 | 80ms | 4.3V触发 |
| 静态电流 | 15μA | 睡眠模式 |
| 平衡电流 | 50mA | 100mV差异 |
在实际项目中,这个方案已经成功应用于便携式医疗设备,实现了零过压事故记录。关键是要注意定期校准ADC基准电压,我们建议每100次循环执行一次自动校准。