第05章 电池管理模块初始化配置
约 1177 字大约 4 分钟
2026-07-21
5.1 应用层增加电池管理模块
新建 App_Battery.h 和 App_Battery.c,添加初始化函数,并在任务模块中新建Bat任务。
5.2 读取增益值和偏移量
① 增益值(GAIN)和偏移量(OFFSET)介绍
后续计算电压需要使用芯片中计算出的增益值和偏移量。

增益系数和偏移量是用来修正测量值的。由于每个芯片在制作时工艺受到不同程度的影响,厂家在制作芯片时把这两个修正参数烧录在只读存储器中。每次芯片启动时,BMS程序应先把这两个值取出来,作为后续计算的参数。
② GAIN的获取
从 ADCGAIN1 和 ADCGAIN2 寄存器读取12位增益值,计算公式:
GAIN(mV/LSB) = (365 + adc_gain) / 1000


③ OFFSET的获取
从 ADCOFFSET 寄存器直接读取偏移量(有符号的8位值)。

5.3 设置配置寄存器
SYS_CTRL1 寄存器



| 位 | 名称 | 说明 |
|---|---|---|
| ADC_EN | ADC使能 | 0: 禁用电压和温度读取;1: 启用 |
| TEMP_SEL | 温度源选择 | 0: 内部芯片温度;1: 外部热敏电阻(TSx引脚) |
SYS_CTRL2 寄存器

| 位 | 名称 | 说明 |
|---|---|---|
| CC_EN | 库仑计模式 | 0: 单次读取;1: 持续读取 |
| DSG_ON | 放电开关 | 0: 关闭放电;1: 开启放电 |
| CHG_ON | 充电开关 | 0: 关闭充电;1: 开启充电 |
5.4 短路保护设置
通过 PROTECT1 寄存器配置:



| 参数 | 说明 |
|---|---|
| RSNS | 检流电阻范围选择:0=低范围(10mΩ-20mΩ);1=高范围(10mΩ以下) |
| SCD_DELAY | 短路延迟时间,建议400μs |
| SCD_THRESH | 短路阈值,例如0x7=200mV,5mΩ电阻对应40A电流 |
5.5 过流保护设置
通过 PROTECT2 寄存器配置:



| 参数 | 说明 |
|---|---|
| OCD_DELAY | 过流延时,最大1280ms |
| OCD_THRESH | 过流阈值,最大0xF=100mV,5mΩ电阻对应20A电流 |
5.6 过压欠压保护设置
PROTECT3 寄存器(延时设置)
- UV_DELAY:欠压时间延时
- OV_DELAY:过压时间延时

阈值配置
通过 OV_TRIP(过压阈值)和 UV_TRIP(欠压阈值)寄存器设置。


建议值:
#define TLB_OV_PROTECT 4.25 // 单体过压保护电压 (V)
#define TLB_OV_RELIEVE 4.10 // 单体过压恢复电压 (V)
#define TLB_UV_PROTECT 2.80 // 单体欠压保护电压 (V)
#define TLB_UV_RELIEVE 3.00 // 单体欠压恢复电压 (V)
#define TLB_SHUTDOWN_VOLTAGE 2.80 // 自动关机电压 (V)
#define TLB_BALANCE_VOLTAGE 3.30 // 均衡起始电压 (V)5.7 库伦计数器工作参数设置
CC_CFG 寄存器用于配置电池管理芯片中与电流计量(Coulomb Counter)相关的参数。数据手册建议上电后将低6位设置为 0x19(0b011001)以获得最佳性能。

5.8 完整代码
App_Bat.h
#ifndef __APP_BAT_H__
#define __APP_BAT_H__
#include "Int_BQ769.h"
#define TLB_OV_PROTECT 4.25
#define TLB_OV_RELIEVE 4.10
#define TLB_UV_PROTECT 2.80
#define TLB_UV_RELIEVE 3.00
#define TLB_SHUTDOWN_VOLTAGE 2.80
#define TLB_BALANCE_VOLTAGE 3.30
void App_Bat_Init(void);
#endifApp_Bat.c
#include "App_Bat.h"
float g_bq_gain = 0.0f; // 增益值
int8_t g_bq_offset = 0; // 偏移量
// 获取增益和偏移量
static void App_Bat_GetGainAndOffset(void)
{
// 1. 读取增益高位和低位
uint8_t adc_gain_high = 0, adc_gain_low = 0;
Int_BQ769_ReadRegs(BQ_ADCGAIN1, 1, &adc_gain_high);
Int_BQ769_ReadRegs(BQ_ADCGAIN2, 1, &adc_gain_low);
uint16_t adc_gain = ((adc_gain_high & 0x0C) << 1) | (adc_gain_low >> 5);
g_bq_gain = (365 + adc_gain * 1) / 1000.0;
// 2. 读取偏移量
Int_BQ769_ReadRegs(BQ_ADCOFFSET, 1, (uint8_t *)&g_bq_offset);
}
// 电池管理模块基本配置
static void App_Bat_Config(void)
{
// 1. 启用ADC、选择外部温度源
bq769_reg_group.SysCtrl1.SysCtrl1Bit.ADC_EN = 1;
bq769_reg_group.SysCtrl1.SysCtrl1Bit.TEMP_SEL = 1;
Int_BQ769_WriteReg(BQ_SYS_CTRL1, bq769_reg_group.SysCtrl1.SysCtrl1Byte);
// 2. 启用库仑计、充电、放电
bq769_reg_group.SysCtrl2.SysCtrl2Bit.CC_EN = 1;
bq769_reg_group.SysCtrl2.SysCtrl2Bit.CHG_ON = 1;
bq769_reg_group.SysCtrl2.SysCtrl2Bit.DSG_ON = 1;
Int_BQ769_WriteReg(BQ_SYS_CTRL2, bq769_reg_group.SysCtrl2.SysCtrl2Byte);
// 3. 短路保护配置
bq769_reg_group.Protect1.Protect1Bit.SCD_DELAY = BMS_SCD_DELAY_400us;
bq769_reg_group.Protect1.Protect1Bit.SCD_THRESH = 0x7;
bq769_reg_group.Protect1.Protect1Bit.RSNS = 1;
Int_BQ769_WriteReg(BQ_PROTECT1, bq769_reg_group.Protect1.Protect1Byte);
// 4. 过流保护配置
bq769_reg_group.Protect2.Protect2Bit.OCD_DELAY = BMS_OCD_DELAY_1280ms;
bq769_reg_group.Protect2.Protect2Bit.OCD_THRESH = 0xF;
Int_BQ769_WriteReg(BQ_PROTECT2, bq769_reg_group.Protect2.Protect2Byte);
// 5. 过压欠压保护配置
bq769_reg_group.Protect3.Protect3Bit.UV_DELAY = BMS_UV_DELAY_4s;
bq769_reg_group.Protect3.Protect3Bit.OV_DELAY = BMS_OV_DELAY_2s;
Int_BQ769_WriteReg(BQ_PROTECT3, bq769_reg_group.Protect3.Protect3Byte);
// 设置过压阈值
uint16_t ov_adc = (TLB_OV_PROTECT * 1000.0 - g_bq_offset) / g_bq_gain;
Int_BQ769_WriteReg(BQ_OV_TRIP, (uint8_t)((ov_adc >> 4) & 0xFF));
// 设置欠压阈值
uint16_t uv_adc = (TLB_UV_PROTECT * 1000.0 - g_bq_offset) / g_bq_gain;
Int_BQ769_WriteReg(BQ_UV_TRIP, (uint8_t)((uv_adc >> 4) & 0xFF));
// 6. 设置库伦计数器(推荐值0x19)
Int_BQ769_WriteReg(BQ_CC_CFG, 0x19);
}
void App_Bat_Init(void)
{
Int_BQ769_Init(); // 初始化BQ769芯片
App_Bat_GetGainAndOffset(); // 获取增益和偏移量
App_Bat_Config(); // 基本配置
}文档生成于: 2026-07-21
