BMS-绝缘检测

一、为什么要进行绝缘检测

前言:BMS绝缘检测是指对电池组与车体之间的绝缘状态进行实时监测和检测。为了确保电池组与车体之间的绝缘性能良好,防止漏电和短路等安全隐患,BMS绝缘检测系统能够及时发现绝缘故障,并采取相应的措施进行处理。

BMS绝缘检测的原理是基于电阻测量的方法。绝缘检测装置通过测量电池组与车体之间的电阻值来判断绝缘状态。在正常情况下,电池组与车体之间的电阻值应该是无穷大,即电流无法通过。而当发生绝缘故障时,电池组与车体之间会出现漏电现象,电阻值就会变小

总结:

1、绝缘检测是判断动力(正、负)总线与外壳“地”是否存在连接

2、理想状态下,电池包的高压+ 和 高压- 对 车身地的绝缘阻值应该 ∞

二、绝缘检测国标标准

当BMS工作时,绝缘电阻的要求如下。 

耐电压测试条件如下图(GB/T 18384.3),如果动力电池标称电压500V,那么需要2000VAC来进行测试。

三、绝缘检测不平衡电桥方法

 

1、闭合S3和S4,等待继电器吸合(延时)

2、闭合S2,等待继电器吸合(延时)

3、读取R4两端的电压,记作U1

4、断开S2,等待继电器断开(延时)

5、闭合S1和S2,等待继电器吸合(延时)

6、读取R4两端的电压,记作U2

7、根据Rz和Rf求出Rx和Ry(Rx是Rz和R5并联电阻,Ry同理)

四、公式计算精确度处理

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define uint64_t unsigned long long

/**************************************************************
//闭合K1b(JY_IO3)及K2b(JY_IO4)
//VBAT:电池电压
//U1:K4b(JY_IO2)闭合后的采样电压值
//U2:K4b(JY_IO2)、K3b(JY_IO1)都闭合后的采样电压值
//Ra:6M+20K = 6020K
//R2:499K*6 = 2994K
//a:20K/(6M+20K)=0.003322
//负极对地的电阻:Rf=(2*Ra*R2*a*VBAT*(U1-U2))/(a*VBAT*Ra*(a*VBAT+U2-U1)+2*a*VBAT*R2*(U2-U1)-Ra*U1*U2)
//正极对地的电阻:Rz=(2*(a*VBAT-U2)*Ra*R2*Rf)/(Rf*(2*R2*U2+2*Ra*U2)+2*Ra*R2*U2)

//测试完成后断开K1b(JY_IO3)、K2b(JY_IO4)、K4b(JY_IO2)、K3b(JY_IO1)
*******************************************************************/

uint64_t vbat=0x1b6d;
uint64_t u1=0x1b58;
uint64_t u2=0x1a73;

/*
1、电阻精确到KΩ,电压精确到MV,计算结果不变(因为公式中完美抵消)
2、U1和U2精确到10mv,为防止溢出,每一小步计算完后精确度恢复到1mv
3、求Rf和Rz最后一步分子除以分母时,为提高精确度,让分子扩大十倍在除以分母,最后结果缩小10倍
4、根据多处例子可知,精确度还可以
*/
void InsulationResCheck(void)
{
	uint64_t  VBAT=vbat*112.687;	//vbat/65535*6.144*12.02/0.02*2*1000; 单位是1mv
	uint64_t  U1=u1*10*0.1875;		//1000/65535*6.144*2; 单位是10mv
	uint64_t  U2=u2*10*0.1875;
	uint64_t  Ra=6020; //单位KΩ
	uint64_t  R2=3000; //单位KΩ	double  a=0.003322;	
	uint64_t  Rf=0,Rz=0,Rx=0,Ry=0; //正负极对地电阻(kΩ)	
	uint64_t  tempdat1=0,tempdat2=0,tempdat3=0,tempdat4=0,tempdat5=0,tempdat6=0,tempdat7=0;
		
	//Rf=(2*Ra*R2*a*VBAT*(U1-U2))/(a*VBAT*Ra*(a*VBAT+U2-U1)-2*a*VBAT*R2*(U1-U2)-Ra*U1*U2);//break;	//step9:计算负极对地的电阻
	/求出分子(缩小10000倍)
	tempdat1 = 2*Ra*a*R2;  
	printf("tempdat1 : %lld\r\n",tempdat1);

	tempdat2 = VBAT*(U1-U2)/10;
	printf("tempdat2 : %lld\r\n",tempdat2);

	tempdat1 = tempdat1/100; 
	printf("tempdat1 : %lld\r\n",tempdat1);

	tempdat2 = tempdat2/100;
	printf("tempdat2 : %lld\r\n",tempdat2);

	tempdat3 = tempdat1*tempdat2;
	printf("tempdat3 : %lld\r\n",tempdat3);

	/求出分母(缩小10000倍)				
	tempdat4 = a*VBAT*Ra*(a*VBAT-(U1-U2)/10);	
	printf("tempdat4 : %lld\r\n",tempdat4);

	tempdat5 = 2*a*VBAT*R2*(U1-U2)/10;     				
	printf("tempdat5 : %lld\r\n",tempdat5);
	
	tempdat6 = Ra*U1/10*U2/10;   //溢出
	printf("tempdat6 : %lld\r\n",tempdat6);
	
	tempdat7 = (tempdat4-tempdat5-tempdat6)/10000;
	printf("tempdat7 : %lld\r\n",tempdat7);

	/BAT-对地电阻(缩小倍数抵消)								
	Rf = tempdat3*10/tempdat7; 
	printf("Rf : %lld\r\n",Rf);
	//Rz=(2*(a*VBAT-U2)*Ra*R2*Rf)/(Rf*(2*R2*U2+2*Ra*U2)+2*Ra*R2*U2);//break;	//step8:计算正极对地的电阻	
	/求出分子(缩小10000倍)
	tempdat1 = 2*(a*VBAT-U2/10)*Ra;  
	printf("tempdat1 : %lld\r\n",tempdat1);

	tempdat2 = R2*Rf/10;
	printf("tempdat2 : %lld\r\n",tempdat2);

	tempdat1 = tempdat1/100; 
	printf("tempdat1 : %lld\r\n",tempdat1);

	tempdat2 = tempdat2/100;
	printf("tempdat2 : %lld\r\n",tempdat2);

	tempdat3 = tempdat1*tempdat2;	
	printf("tempdat3 : %lld\r\n",tempdat3);		
				
	/求出分母(缩小10000倍)				
	tempdat4 = (2*R2*U2/10+2*Ra*U2/10)/10000;	
	printf("tempdat4 : %lld\r\n",tempdat4);

	tempdat5 = Rf/10*tempdat4; 
	printf("tempdat5 : %lld\r\n",tempdat5);
	
	tempdat6 = 2*Ra*R2/10000;
	printf("tempdat6 : %lld\r\n",tempdat6);

	tempdat6 = tempdat6*U2/10;
	printf("tempdat6 : %lld\r\n",tempdat6);
	
	tempdat7 = tempdat5+tempdat6; 
	printf("tempdat7 : %lld\r\n",tempdat7);

	/BAT+对地电阻(缩小倍数抵消)								
	Rz = tempdat3*10/tempdat7; 
	printf("Rz : %lld\r\n",Rz);

	if(Rz==2000) 
	{		Rx=0;
	}
	else
	{
		Rx = ((Rz*2000)/abs(2000-Rz)) / 10;
	}
	if(Rf==2000) 
	{
		Ry=0;
	}
	else
	{
		Ry = ((Rf*2000)/abs(2000-Rf)) / 10;
	}
	printf("\nVBAT = %lld mv\n" ,VBAT);				
	printf("U1   = %lld mv\n" ,U1);		
	printf("U2   = %lld mv\n" ,U2);		
	printf("Rx   = %lld kΩ\n" ,Rx);	
	printf("Ry   = %lld kΩ\n" ,Ry);	
}

int main()
{
	InsulationResCheck();
	while(1);
	return 0;
}

五、电压采样之SGM58031(16位精度)

GD32F303RET6读取SGM58031电压值-CSDN博客

六、如何测试绝缘检测

单板调试,分别测量正对地,负对地,正负对地加不同的电阻值以及读出的电阻值,如果误差小于20%,说明满足国标标准

上电过程,绝缘检测测量正对地电阻和负对地电阻,如果电阻>(电压*100Ω),说明可以上电。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值