芯片特性
引脚说明

电池连接方法:

VC5 ~ 1 只要有一个供电,那么芯片就会工作。
LDO 输出
报警输出
报警引脚 Alert,高电平有效,可外接下拉电阻防止不确定的电平。
当 OV、UV、OCD、SCD 时,Alert 引脚拉高,并自动关闭充电或放电。
当电流处于连续测量模式时,Alert 引脚也会拉高,来通知MCU读取电流。
I2C 通信
设备地址:0x08,速率:100kHz
读取多字节,寄存器地址递增。
主站写入时:若 BQ769X0 检测到数据的 CRC 错误,将发送 NACK 给主站,结束此次通信。
主站读取时:若主站检测到数据的 CRC 错误,可发送 NACK 给 BQ769X0,结束此次通信。
为了提高通信的准确性,使用 CRC 校验,CRC 多项式为 x8 + x2 + x + 1,初始值为 0。
写入时 CRC 计算规则:
单字节写入:计算从机地址、寄存器地址、数据
块写入:
第一个数据字节的 CRC:从机地址、寄存器地址、第一个数据字节
后续数据字节的 CRC:仅计算每个数据字节
读取时 CRC 计算规则:
单字节读取:在 Restart 后,从机地址、数据
块读取:
第一个字节 CRC:在 Restart 后,从机地址、第一个数据字节
后续字节 CRC:仅计算每个数据字节
写时序:
起始 - 写地址 - ACK - 寄存器地址 - ACK - 数据 - ACK - CRC - ACK - 停止

读时序:
起始 - 写地址 - ACK - 寄存器地址 - ACK - 重启 - 读地址 - ACK - 数据 - ACK - CRC - NACK - 停止

读时序(不使用 Restart):
起始 - 写地址 - ACK - 寄存器地址 - ACK - 停止 - 起始 - 读地址 - ACK - 数据 - ACK - CRC - NACK - 停止

工作模式
(1)正常模式 NORMAL MODE
所有功能。
在正常模式下进入停止模式,按顺序写入:
SYS_CTRL1 [ SHUT_A ] = 0, SYS_CTRL1 [ SHUT_B ] = 1
SYS_CTRL1 [ SHUT_A ] = 1, SYS_CTRL1 [ SHUT_B ] = 0
(2)停止模式 SHIP MODE
上电复位(POR Event)后就处于该模式。
唤醒条件:TS1 引脚电压大于 1 V(V_{BOOT}),持续时间大于 2 ms
ADC 计算
14 位 ADC
GAIN = 量程(V) / 2^{ADC位数}
ADCGAIN:单位 μV/LSB,一个数代表多少电压。(寄存器的值为二进制,要转换为十进制再乘以 GAIN)
ADCOFFSET 偏移:这个从寄存器读出来就是带符号的 mV 值,表示当输入电压为 0 V 时,ADC 的读到的 mV 值。
从 ADC 到电压:
V = ADC × Gain + Offset从电压到 ADC:
ADC = (V - Offset) / Gain
芯片在出厂时会校准 ADC 并写入到下面的寄存器中,在程序中读取。
读取 GAIN:


读取偏移量:


寄存器说明
测量
温度
寄存器值为 ADC 采集的电压值。

其内部 10K 上拉电阻接 3.3V,要使用 10K 的 NTC 热敏电阻并接地。
切换温度源后,要等待 2s
(1)计算当前电压
ADC 精度 382 µV/LSB
(2)计算 NTC 阻值
(3)查表获取温度
内部电阻呢?
电芯电压

若一组内的电芯没有均衡的,一个电芯测量50ms,也就是250ms更新所有的值。
当一组内有电芯均衡时,一个电芯测量12.5ms,其余时间用于均衡,虽然测量精度略微下降,但依然能保证UV/OV保护功能。
因为平衡开关导通时,电池的电压会略微下降,所以芯片要关掉平衡再测量,以获取真实的电压值。
电池电压

电流检测配置

必须设置为 0x19
不清楚为什么是固定值,还要弄个寄存器。
电流

16 位 ADC,GAIN = 8.44 μV/LSB
这个寄存器的值为检流电阻的电压,范围 +-270mV,芯片推荐最大使用 +-200mV
电流计算:
当前电流(A) = (寄存器值 * 8.44 * 0.000001) / 检流电阻阻值(R)有两种测量模式:
ALWAYS 连续测量模式:
条件:SYS_CTRL2 [ CC_EN ] = 1
行为:每 250ms刷新值,值可读时 SYS_STAT [ CC_READY ] 位置 1,并且 ALERT 引脚会拉高来通知 MCU
1-SHOT 单次测量模式:
条件:SYS_CTRL2 [ CC_EN ] = 0 并且 SYS_CTRL2 [ CC_ONESHOT ] = 1
行为:测量一次需 250ms,值可读时 SYS_STAT [ CC_READY ] 位置 1,SYS_CTRL2 [ CC_ONESHOT ] 自动清零
控制
系统状态标志位

写 1 清零,写 0 无效。
CC_READY:
1:电流值可读
0:电流值不可读,还在测量中。
DEVICE_XREADY:
0:芯片正常
1:检测到芯片内部异常
OVRD_ALERT:检测 ALERT 引脚是否被外部电路强制拉高
0:ALERT 引脚由芯片内部正常控制
1:检测到外部电路强制拉高 ALERT 引脚
OV:充电过压标志位
UV:放电欠压标志位
SCD:放电短路标志位
OCD:放电过流标志位
系统控制

LOAD_PRESENT:负载检测。
0 没有负载:
充电模式 [CHG_ON] = 1
CHG 引脚电压 < V_{LOAD\_DETECT}(0.4 ~ 1V,通常 0.7V,每个芯片不一样)
1 有负载:非充电模式,并且 CHG 引脚电压 > V_{LOAD\_DETECT}
ADC_EN:ADC使能位
1:开启电压和温度 ADC 测量,同时会开启 OV 过压保护。
0:关闭电压和温度 ADC 测量,同时会关闭 OV 过压保护。
TEMP_SEL:电阻 or 电压???
1:TSx_HI 和 TSx_LO 寄存器中保存的是外部热敏电阻的数值。
0:TSx_HI 和 TSx_LO 寄存器中保存的是内部
SHUT_A、SHUT_B:进入 SHIP 模式,必须以一定的序列写入才会生效。

DELAY_DIS:
CC_EN:
1:电流连续测量模式
CC_ONESHOT:
电流单次测量模式,注意 CC_EN 要置 0
DSG_ON:1 放电
CHG_ON:1 充电
被动均衡控制

置 1 打开均衡。
MCU 获取各个电芯的电压,然后手动开启某个电芯的被动均衡。
对于 BQ76920,使用内部的均衡控制器就行了,就是外面不用MOS管,这种情况下最大均衡电流为50mA。
对于 BQ76930、40,推荐使用外部的均衡控制器,可实现更大的均衡电流。
同一组内,相邻的电芯不能同时均衡。

电芯正常的均衡,它不会自己停止,要使用 MCU 控制,除非以下事件会导致均衡被自动关闭:
从 SHIP 到 NORMAL 模式
DEVICE_XREADY 置位

保护
这款芯片硬件上能保护什么:
充电过压
放电欠压
放电过流
放电短路
对于充电过流保护,可以共用那个采样电阻,这种方法实际上用的是放电过流保护功能。
缺点是充放电阈值相同,不灵活,比如充电2A,放电1.5A,那充电的时候就会触发过流保护。
能这样做的原理是,BQ76920 内部测量电流的机制,本质上是一个差分电压检测器。它只关心 SRP 和 SRN 两个引脚之间的电压差绝对值,而不会在硬件上主动区分这个电压是“正”还是“负”(即电流方向)。
高温、低温保护在软件上实现。
(1)保护延迟是什么意思?
当芯片检测到异常(过压、欠压、过流、短路等)时,不会立刻动作,而是等一个设定的时间后才触发保护。
(2)为什么要有延迟?
防止短时间的电气噪声或瞬态波动误触发。
比如电机启动、电池插拔、强电磁干扰等,可能会引起一瞬间的电压/电流跳动。如果没有延迟,芯片会立刻判断异常并切断充放电,非常影响使用体验。有了延迟后,只有当异常持续超过设定时间,芯片才会认定是真故障。但这个时间不宜过程,否则就失去了良好的保护效果。
放电短路延时、放电短路检测阈值

RSNS:放电过流和放电短路阈值范围
0:小范围,适合对电流敏感的。
1:大范围。
放电短路延时 [ 4 : 3 ]

短路检测是根据检流电阻两端的压降来判断的。
首先明确系统短路的触发电流,假设为 10 A,这是个经验值
若检流电阻 5 mA,则发生短路时电压为 10 A * 5 mV = 50 mV
根据表格应该向下取值,44 mV 算出来 8.8 A,符号要求。而 56 mV 算出来 11.2A,超过了最大支持的 10 A,那10A时就无法保护了。

放电过流延时、放电过流检测阈值

放电过流保护延时:

放电过流检测阈值:
和放电短路检测阈值一个计算思路。
过流值 2.2 A * 检流电阻 5 mV = 11 mV


充电过压、放电欠压延时

欠压延时 [ 7 : 6 ]

过压延时 [ 5 : 4 ]

充电过压阈值
默认值: 0xAC

这两个寄存器的值不是电压值,而是 ADC 值。
完整的值有 14 位,前 2 位固定为 10,后 4 位固定为 1000,中间的 8 位为寄存器的值,也就是限制了值的范围为 3.15 ~ 4.7 V。
计算方法:
先从目标电压计算出ADC值,再提取中间的 8 位。
(uint8_t)((((uint16_t)((目标过压值(单位mV) - Adcoffset) / Gain ) - OV_THRESH_BASE) >> 4) & 0xFF);- OV_THRESH_BASE 是因为它有最小值,是在这个基础上的增加量。

放电欠压阈值
默认值:0x97

完整的值有 14 位,前 2 位固定为 01,后 4 位固定为 0000,中间的 8 位为寄存器的值,也就是限制了值的范围为 1.58 ~ 3.1 V。
(uint8_t)((((uint16_t)((目标欠压值(单位mV) - Adcoffset) / Gain) - UV_THRESH_BASE) >> 4) & 0xFF);寄存器列表

