没志青年
发布于 2025-08-04 / 43 阅读
0

BMS 前端 AFE - BQ769x0

芯片特性

引脚说明

电池连接方法:

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

V_T = 寄存器值 * 382 * 0.000001 \;\;V

(2)计算 NTC 阻值

R = \frac{V_T}{(3.3 - V_T) / 10k}=\frac{V_T*10k}{3.3-V_T}

(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 ]

短路检测是根据检流电阻两端的压降来判断的。

  1. 首先明确系统短路的触发电流,假设为 10 A,这是个经验值

  2. 若检流电阻 5 mA,则发生短路时电压为 10 A * 5 mV = 50 mV

  3. 根据表格应该向下取值,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);

寄存器列表