BMS - 桥阻法测绝缘

BMS - 桥阻法测绝缘

1. 国标法测绝缘电阻
在这里插入图片描述

由于在检测过程中K1和K2两个开关交替导通,其实分为了四种状态,
A、K1和K2都断开:正常状态 ,此时电路尚没有工作
B、K1闭合,K2断开,上桥臂测量
C、K1断开,K2闭合,下桥臂测量
D、K1和K2都闭合:诊断状态,数值需要与断开状态相比较
E、得到Rx, Ry后,按照需求输出,一般取小
精度 0 --100k, < 15%, 100k --10M, < 10%

2. 影响绝缘精度的因素:
X/Y 电容,主要是Y电容,X电容影响预充
U1/2 绝缘电压采集精度
桥阻法本身存在的缺陷:待测电阻不能接近,只能测量特定范围等。

3. X/Y电容来源:
X电容:电池总正对总负, uF,
内部主要来自包内寄生电容,如电芯之间 几个uF,BMS高压采集端口、正负采样线之间并联的滤波电容, 几个nF。
外部主要来自外部高压设备,如MCU\DCDC等的输入电容,一般几百uF到上千uF,取决与整车需求。
Y电容:总正/负对地,nF
内部主要来自BMS上的滤波电容 几个nF, 用于改善EMC;电芯之间的等效寄生电容, 整个Pack 大概几十nF到几百nF。
在这里插入图片描述

外部主要来自其它高压设备的滤波电容,由于零部件太多,我们按照正常的控制和分布参数的影响建立一个初始的电路模型。 总体而言,每个部件都包括一个绝缘电阻和Y电容。实际的情况:
a. 逆变器端Y电容较大;
b. DCDC端Y电容较大;
c. 快充部分完全不可控,实际的情况比较特殊
在这里插入图片描述
4. Y电容对绝缘精度的影响:
电桥法中,它延迟了稳态建立的时间,若使用未收敛的电压值去计算,得出的绝缘阻值结果也是不准确的。

5. Y电容大小的规定:
在标准《GB 18384-2020 电动汽车安全要求》是有要求的,如下图,标准中规定了 Y 电容最大存储的能量 0.2J。
在这里插入图片描述
6. 电容耦合计算公式:
在这里插入图片描述

<think>好的,我现在要分析用户提供的这个C语言函数`float SOHPack(BQ76920_t *BMS)`,并解释它的功能。首先,我需要逐行理解代码的作用,然后整理出各个部分的逻辑,最后综合起来解释整个函数的目的和实现方式。 首先,函数的名字是SOHPack,SOH通常代表State of Health(健康状态),所以这个函数可能是用来计算电池包的健康状态的。参数是一个指向BQ76920_t结构体的指针BMS,这可能是一个电池管理系统(BMS)的数据结构,里面包含各种电池相关的信息。 函数开始部分定义了三个变量: 1. `int32_t EnergyCapacity = grossCapacity * 3600 * 4 * nominalPackV;` - `grossCapacity`可能是电池的总容量,单位可能是安时(Ah)。乘以3600将安时转换为库仑(因为1Ah=3600C),然后乘以4可能表示有4个电芯串联或并联?再乘以`nominalPackV`标称电压,得到总能量容量,单位应该是焦耳(J),因为能量(J)= 电压(V)* 电荷量(C)。 2. `int32_t AmpereCapacity = grossCapacity * 3600 * 4;` - 这里计算的是总电荷量,单位库仑,同样假设grossCapacity是Ah,乘以3600得到C,乘以4可能也是串联数或其他系数。 3. `float FullOCV = netOV;` - `FullOCV`可能是指充满电时的开路电压(Open Circuit Voltage),`netOV`可能是当前得的OCV或者其他预定义的值。 接下来是一个循环,从i=0到3,检查每个电芯的电压`BMS->Vcell[i]`,找到最小的那个作为`BMS->smallestV`。但这里有个问题,初始的`FullOCV`被赋值为`netOV`,然后在循环中如果发现某个电芯电压小于FullOCV,就将该电芯电压赋值给`BMS->smallestV`。看起来是要找到当前电芯中的最低电压,但初始的FullOCV可能应该是充满时的OCV,所以这里可能是在比较当前电芯电压与充满时的OCV,找出最低的那个,但逻辑是否正确需要确认。例如,如果所有电芯电压都高于FullOCV,那么smallestV不会被更新,可能导致错误。不过可能实际情况中,电芯电压在充满时应该接近FullOCV,所以这个循环可能是在寻找当前最低的电芯电压,用于后续计算。 然后是三个SOH的计算: 1. `BMS->SOHEnergy = (BMS->wattUsage * 100.0f / EnergyCapacity);` - 使用消耗的能量(wattUsage,单位可能是焦耳)占EnergyCapacity的百分比,得到能量相关的SOH。 2. `BMS->SOHCapacity = (BMS->currentUsage * 100.0f / AmpereCapacity);` - 消耗的电荷量(currentUsage,单位库仑)占AmpereCapacity的百分比,得到容量相关的SOH。 3. `BMS->SOHOCV = (BMS->smallestV * 100.0f / FullOCV);` - 最小电芯电压占FullOCV的百分比,得到基于电压的SOH。 接下来使用卡尔曼滤波器(Kalman Filter)对三个SOH值进行融合。初始化卡尔曼滤波器后,先更新SOHCapacity,再更新SOHOCV,得到最终的fused_soh,赋值给BMS->SOH。这里可能假设SOHEnergy作为初始估计,然后依次用其他两个量值来修正。 最后,重置wattUsage和currentUsage为0,并返回计算出的SOH。 可能的疑问点: - grossCapacity、nominalPackV、netOV这些变量的来源和单位是否明确? - 电芯数量是否真的是4个?循环到i<=3,即4个电芯(0-3)。 - 为什么在计算EnergyCapacity和AmpereCapacity时要乘以4?可能是电池组中有4个并联的模块,每个模块的容量为grossCapacity,所以总容量是grossCapacity*4? - Kalman Filter的参数设置是否合理?初始误差协方差为1.0,过程噪声和量噪声均为0.05,可能需要根据实际情况调整。 - 在寻找smallestV时,初始的FullOCV可能应该是充满电的OCV,而循环中比较的是当前电芯电压是否小于FullOCV,如果是,就将当前电压设为smallestV。但这样可能实际上是在找比FullOCV低的电压中的最小值,可能意图是找到当前电芯的最低电压,然后计算其相对于FullOCV的比例,从而判断健康状态。例如,如果电池老化,充满电时的电压会下降,所以SOHOCV就是当前最低电压与标称充满电压的比值。 可能的错误点: - 在寻找smallestV的循环中,初始的BMS->smallestV是否有初始值?如果BMS->Vcell[i]都大于FullOCV,那么BMS->smallestV不会被赋值,可能导致使用未初始化的值。应该初始化为FullOCV或者在循环中取最小值。例如,正确的逻辑应该是初始化smallestV为一个很大的值,然后循环中找到最小的Vcell[i]。或者这里的逻辑是相反的,可能用户代码有误? 假设BMS->smallestV在进入函数前已经被正确初始化,或者这里的逻辑是找到比FullOCV低的电压中最小的,否则可能保留之前的smallestV?但这样可能有逻辑问题,需要进一步确认。 总结:这个函数通过能量消耗、电荷消耗和电压下降三个指标来计算电池的健康状态,然后使用卡尔曼滤波器进行数据融合,得到最终的SOH估计值,并重置累计的使用量。</think>以下是对函数 `SOHPack` 的逐步解释: --- ### **功能概述** 此函数用于计算电池管理系统(BMS)的健康状态(State of Health, SOH),通过 **能量衰减**、**容量衰减** 和 **电压衰减** 三个指标,最终通过卡尔曼滤波融合后返回综合 SOH 值。 --- ### **代码逐段解析** #### **1. 计算基准容量** ```c int32_t EnergyCapacity = grossCapacity * 3600 * 4 * nominalPackV; int32_t AmpereCapacity = grossCapacity * 3600 * 4; float FullOCV = netOV; ``` - **EnergyCapacity**:电池总能量容量(单位:焦耳),计算方式: $$ \text{grossCapacity (Ah)} \times 3600 \times 4 \times \text{nominalPackV (V)} $$ 其中 `3600` 将安时(Ah)转换为库仑(C),`4` 可能是串联电芯数量。 - **AmpereCapacity**:电池总电荷容量(单位:库仑),计算方式: $$ \text{grossCapacity (Ah)} \times 3600 \times 4 $$ - **FullOCV**:充满电时的开路电压(假设 `netOV` 为标称满电电压)。 --- #### **2. 查找最低电芯电压** ```c for (int i = 0; i <= 3; i++) { if (BMS->Vcell[i] < FullOCV) { BMS->smallestV = BMS->Vcell[i]; } } ``` - 遍历 4 个电芯(假设电池组由 4 个串联电芯组成),找到 **电压低于标称满电电压** 的最低电芯电压。 - **潜在问题**:若所有电芯电压均高于 `FullOCV`,`smallestV` 可能未被正确更新,需确保初始值合理。 --- #### **3. 计算三种 SOH 指标** ```c BMS->SOHEnergy = (BMS->wattUsage * 100.0f / EnergyCapacity); BMS->SOHCapacity = (BMS->currentUsage * 100.0f / AmpereCapacity); BMS->SOHOCV = (BMS->smallestV * 100.0f / FullOCV); ``` - **SOHEnergy**:能量衰减比例(已消耗能量占总能量的百分比)。 - **SOHCapacity**:容量衰减比例(已消耗电荷占总容量的百分比)。 - **SOHOCV**:电压衰减比例(最低电芯电压占标称满电电压的百分比)。 --- #### **4. 卡尔曼滤波融合** ```c KalmanFilter kf_soh; kalman_filter_init(&kf_soh, BMS->SOHEnergy, 1.0f, 0.05f); float fused_soh = kalman_filter_update(&kf_soh, BMS->SOHCapacity, 0.05f); fused_soh = kalman_filter_update(&kf_soh, BMS->SOHOCV, 0.05f); BMS->SOH = fused_soh; ``` - 初始化卡尔曼滤波器,以 `SOHEnergy` 作为初始估计。 - 依次用 `SOHCapacity` 和 `SOHOCV` 更新滤波值,最终输出融合后的 SOH。 - **参数说明**: - `1.0f`:初始估计误差协方差(需根据系统调整)。 - `0.05f`:过程噪声和量噪声(控制滤波器的敏感度)。 --- #### **5. 重置累计值** ```c BMS->wattUsage = 0; BMS->currentUsage = 0; ``` - 清空能量和电荷的累计使用量,为下一周期做准备。 --- ### **关键参数说明** | 参数名 | 含义 | 单位 | |--------------------|--------------------------|-----------| | `grossCapacity` | 电芯标称容量 | 安时 (Ah) | | `nominalPackV` | 电池组标称电压 | 伏特 (V) | | `netOV` | 标称满电开路电压 | 伏特 (V) | | `wattUsage` | 累计能量消耗 | 焦耳 (J) | | `currentUsage` | 累计电荷消耗 | 库仑 (C) | --- ### **潜在改进点** 1. **电压最小值逻辑**:应初始化 `smallestV` 为极大值(如 `FLT_MAX`),再通过循环更新最小值,避免未初始化问题。 2. **电池配置参数**:`4` 需明确含义(如串联数或并联数),建议用宏定义或变量名替代。 3. **卡尔曼滤波参数**:需根据实际噪声特性调整 `0.05f` 和 `1.0f` 参数。 --- ### **总结** 此函数通过多维度指标评估电池健康状态,结合滤波算法提高可靠性,适用于电池管理系统中的 SOH 实时估算。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值