平衡电桥检测高压绝缘电阻的原理

2023-12-13 12:13:18

高压拓扑

检测绝缘漏电的高压拓扑如下:

BMU需要连接BAT+,BAT-和PE线,并测量电池总压(Ubatt)和负母线电压(Un),并计算出正母线电压(Up)。

检测原理

BMU采用的是平衡电桥的方法检测绝缘电阻的。

BMU在硬件电路上设计了投切电桥R1、R2和投切开关K1、K2,还有一个固定电桥R3和R4。

当排除外界干扰时,正母线电压和负母线电压的比例关系取决于正母线对地等效电阻和负母线对地等效电阻。

当投切开关都断开时,测量出正负母线的电压,可以得到一组正负母线等效电阻的方程,当改变投切开关时,再次测量出此时的正负母线电压,又可以得到一组正负母线等效电阻的方程。通过这个二元一次方程组,可以计算出正负母线绝缘电阻值。

计算公式

假定电池高压正母线对地的绝缘电阻为Rx,高压负母线对地的绝缘电阻为Ry。这两个是未知数。

当上桥臂投切开关断开时,上桥臂加在正母线的等效电阻R上断=R3.

当上桥臂投切开关闭合时,上桥臂加在正母线的等效电阻R上闭=R1||R3.

当下桥臂投切开关断开时,下桥臂加在正母线的等效电阻R下断=R4.

当下桥臂投切开关闭合时,下桥臂加在正母线的等效电阻R下闭=R2||R4.

上下桥臂都断开

当上下桥臂都断开时,假设此时测得的正负母线电压为Up1和Un1,则有:

上下桥臂都闭合

当上下桥臂都闭合时,假设此时测得的正负母线电压为Up2和Un2,则有:

上桥臂闭合,下桥臂断开

当上桥臂闭合,下桥臂断开时,假设此时测得的正负母线电压为Up3和Un3,则有:

上桥臂断开,下桥臂闭合

当上桥臂断开,下桥臂闭合时,假设此时测得的正负母线电压为Up4和Un4,则有:

计算方法

上述有4个方程,两个未知数,只需要取其中两条方程就能解出Rx和Ry。实际应用中,一个方程取上下桥臂都闭合的方程式(2),另一个方程则根据Up2和Un2的关系决定,若Up2>Un2,取(3)式,若Up2<Un2,取(4)式。

另外,一般电路设计中,上下桥臂的电阻参数相等,所以:

R上断=R下断,R上闭=R下闭

假设Up2>Un2,由方程式(2)和(3)可计算出绝缘电阻为:

假设Up2<Un2,由方程式(2)和(4)同理可计算出Rx和Ry。

参考代码


void CalcResistance(void)
{
	float fV0P;
	float fV0N;
	float fV1P;
	float fV1N;

	float fREqualOpen, fREqualClose;
	float fResX, fResY;

	float fResi;

	UINT16 uiOpenCode;

	ST_JY_BUS_CODE *pBusCode = &g_stSampleVar.stBusCode;

	uiOpenCode = 500;	// 5V

	fV0P = (SINT16)pBusCode->auiPBusCode[ALL_BRIDGE_CLOSE];
	fV0N = (SINT16)pBusCode->auiNBusCode[ALL_BRIDGE_CLOSE];

	// 未接采集线:两边电压都很小
	if ((fV0P < uiOpenCode) && (fV0N < uiOpenCode))
	{
		DB_SetUint16(VID_SYS_PBUS_RES, JY_BUS_OPEN_RESI);
		DB_SetUint16(VID_SYS_NBUS_RES, JY_BUS_OPEN_RESI);

		return;
	}

	// 直接接地判断:一边很大,一边很小
	// 负接地
	if ((fV0P > fV0N * JY_BUS_MULTI)
		&& (fV0P > uiOpenCode)
		&& (fV0N < uiOpenCode))
	{
		DB_SetUint16(VID_SYS_PBUS_RES, JY_BUS_OPEN_RESI);
		DB_SetUint16(VID_SYS_NBUS_RES, 0);

		return;
	}

	// 正接地
	if ((fV0N > fV0P * JY_BUS_MULTI)
		&& (fV0N > uiOpenCode)
		&& (fV0P < uiOpenCode))
	{
		DB_SetUint16(VID_SYS_PBUS_RES, 0);
		DB_SetUint16(VID_SYS_NBUS_RES, JY_BUS_OPEN_RESI);

		return;
	}

	fREqualOpen = GetJyEqualResi(TRUE, 0);
	fREqualClose = GetJyEqualResi(FALSE, 0);

	// 如果正母线电压高,则先计算负电阻
	if (pBusCode->auiPBusCode[ALL_BRIDGE_CLOSE] > pBusCode->auiNBusCode[ALL_BRIDGE_CLOSE])
	{
		fV1P = pBusCode->auiPBusCode[UP_BRIDGE_CLOSE];
		fV1N = pBusCode->auiNBusCode[UP_BRIDGE_CLOSE];

		//fResX = fREqualOpen * fREqualClose * (fV0P * fV1N - fV0N * fV1P)
		//	/ (fREqualOpen * fV0N * fV1P - fREqualClose * fV0P * fV1N);

		//fResY = fREqualOpen * fResX * fV0N
		//	/ (fREqualOpen * fV0P + (fV0P - fV0N) * fResX);

		fResY = fREqualOpen * fREqualClose * (fV0P * fV1N - fV0N * fV1P)
			/ (fREqualOpen * fV0N * fV1P - fREqualClose * fV0P * fV1N);

		fResX = fREqualClose * fResY * fV0P
			/ (fREqualClose * fV0N + (fV0N - fV0P) * fResY);
	}
	else
	{
		fV1P = pBusCode->auiPBusCode[DN_BRIDGE_CLOSE];
		fV1N = pBusCode->auiNBusCode[DN_BRIDGE_CLOSE];

		//fResY = fREqualOpen * fREqualClose * (fV0P * fV1N - fV0N * fV1P)
		//	/ (fREqualClose * fV0N * fV1P - fREqualOpen * fV0P * fV1N);

		//fResX = fREqualOpen * fResY * fV0P
		//	/ (fREqualOpen * fV0N + (fV0N - fV0P) * fResY);

		fResX = fREqualOpen * fREqualClose * (fV0P * fV1N - fV0N * fV1P)
			/ (fREqualClose * fV0N * fV1P - fREqualOpen * fV0P * fV1N);

		fResY = fREqualClose * fResX * fV0N
			/ (fREqualClose * fV0P + (fV0P - fV0N) * fResX);
	}

	// 特殊情况处理
	if (fResX > 3000)
	{
		fResi = 30000;
	}
	else if (fResX <= 0)
	{
		fResi = 29990;
	}
	else
	{
		fResi = fResX * 10;
	}
	DB_SetUint16(VID_SYS_PBUS_RES, (UINT16)fResi);

	if (fResY > 3000)
	{
		fResi = 30000;
	}
	else if (fResY <= 0)
	{
		fResi = 29990;
	}
	else
	{
		fResi = fResY * 10;
	}
	DB_SetUint16(VID_SYS_NBUS_RES, (UINT16)fResi);
}

void CalcLeakCurrent(void)
{
	UINT16 uiPResi;
	UINT16 uiNResi;

	UINT16 uiBattVolt;
	float fResi;

	float fLeakCurr;

	uiPResi = DB_GetUint16(VID_SYS_PBUS_RES);
	uiNResi = DB_GetUint16(VID_SYS_NBUS_RES);

	if ((uiPResi == 0) || (uiNResi == 0))
	{
		fLeakCurr = 1000;		// 接地电流为100mA
		fResi = 0;
	}
	else
	{
		uiBattVolt = DB_GetUint16(VID_SYS_BUS_VOLT);

		fResi = (float)uiPResi * uiNResi / (uiPResi + uiNResi);
		fLeakCurr = uiBattVolt / fResi;
		fLeakCurr *= 10.0f;
	}

	DB_SetUint16(VID_SYS_LEAK_CURR, (UINT16)(fLeakCurr + 0.5f));
	DB_SetUint16(VID_SYS_ISO_RES, fResi);
}

文章来源:https://blog.csdn.net/booksyhay/article/details/134963414
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。