基于不平衡电桥电阻法的绝缘电阻检测软硬件设计与应用
一、引言
在新能源汽车产业蓬勃发展的当下,其安全运行面临着诸多挑战,而绝缘电阻检测无疑是保障车辆安全的关键防线。新能源汽车的电池组、电机驱动系统等核心部件,以及充电桩、换电站等配套设施,一旦出现绝缘性能下降,漏电、短路等风险将显著增加,甚至可能引发火灾等严重事故。随着新能源汽车保有量的快速增长以及充电设施的大规模普及,传统的绝缘检测方式已难以满足高效性与精准性的需求,对新型检测技术的探索与应用迫在眉睫。
不平衡电桥电阻法凭借高精度、高灵敏度以及简洁的电路架构脱颖而出,成为新能源汽车绝缘电阻检测领域的重要技术支撑。该方法不仅能够精准测量复杂车内电气系统的绝缘电阻,还可对各类充电设施进行快速检测,为新能源汽车的全产业链安全运行提供了可靠保障。本文将围绕基于不平衡电桥电阻法的绝缘电阻检测电路,深入剖析其软硬件设计要点,并结合多行业实际应用案例,全面展现该方法的实践价值与发展潜力。
二、不平衡电桥电阻法原理
2.1 电桥基本结构
电桥本质上是由四个电阻构成的四边形电路结构,其中相对的两个顶点用于连接电源,另外两个顶点则连接检测仪表,常见的检测仪表包括电压表或电流表。在基于不平衡电桥电阻法的绝缘电阻检测体系中,这四个电阻分别由已知标准电阻和待测绝缘电阻组成。为更直观地理解电桥结构,以下展示典型的平衡电桥结构示意图(图 1):
图 1:平衡电桥结构示意图
2.2 平衡电桥原理
在图 1 所示的电桥电路中,电桥由四个电阻R0、R1、R2和被测电阻Rx组成,电桥的电源电压为。
当电桥达到平衡状态时,即C、D两点的电位相等。根据基尔霍夫定律,推导得出:
R
x
=
R
0
R
1
R
2
R_x=\frac{R_0R_1}{R_2}
Rx=R2R0R1
当电桥处于不平衡状态时,检测仪表两端会产生电压差。通过基尔霍夫定律,同样可推导出不平衡状态下计算绝缘电阻Rx的公式。
2.3 不平衡电桥原理优化设计
图 2:不平衡电桥电阻法的绝缘电阻检测原理
在新能源汽车绝缘电阻检测的实际应用中,需对传统平衡电桥原理图进行优化。以动力电池 BMS 的绝缘电阻检测为例,其关键在于精准测量正极、负极与外壳之间的绝缘电阻,这直接关系到车辆的安全性能与稳定运行。改进后的不平衡电桥电阻法原理图如图 2 所示,以绝缘检测地(也就是车辆的壳体)作为对称中心,设计上下两个呈对称分布的不平衡电桥。通过控制开关 S1、S2 的闭合与关断,获取采样电压Up、Un;已知电阻R1=R4,R2=R3,且R1>>R2;带入公式即可实现对正极、负极与外壳之间绝缘电阻RI1和RI2的测量。
三、绝缘电阻计算与公式推导
对新能源汽车动力电池正极、负极与外壳之间的绝缘电阻,存在4种情况:
- 正极、负极绝缘良好;
- 正极绝缘异常,负极绝缘良好;
- 正极绝缘良好,负极异常;
- 正极、负极绝缘均异常;
以上四种情况均可通过S1、S2不同状态下的电压采样值Up、Un,结合已知电阻R1、R2等参数,运用相关电学公式进行推导计算。具体推导过程如下:
3.1不同开关状态情况
图3:S1和S2同时闭合
图4:S1闭合,S2断开
图5:S2闭合,S1断开
3.2 绝缘电阻计算公式推导
第一步、获取电池电压UBAT
有两种方法可以获取定义动力电池电压值:
-
通过车辆动力电池的BMS 获取;
-
通过不平衡电桥采样计算:同时闭合S1和S2(见上图3),根据电阻分压原理即可得到:
U B A T = U p 0 ( 1 + R 1 R 2 ) + U n 0 ( 1 + R 4 R 3 ) U_{BAT} = U_{p0}(1+\frac{ R_1}{R_2} )+U{n0}(1+\frac{ R_4}{R_3} ) UBAT=Up0(1+R2R1)+Un0(1+R3R4)
U B A T = ( U p 0 + U n 0 ) ∗ ( 1 + R 1 R 2 ) U_{BAT} = (U{p0}+U{n0})*(1+\frac{R_1}{R_2}) UBAT=(Up0+Un0)∗(1+R2R1)
为了简化程序,大多数使用第一个方法直接获取即可;后续的公式推导中,认为UBAT为 已知参数。
第二步、判断负极绝缘
当S1闭合,S2断开时(见上图4),R2两端电压为Up1,R3两端电压为Un1 ;由于S2断开,因此Un1 = 0V;
当Up1=0V时,负极绝缘电阻RI1无穷大,即负极绝缘良好。。
当Up1>0V时,根据电阻分压原理:
R I 1 / / ( R 1 + R 2 ) R I 2 = U p 1 ⋅ ( 1 + R 1 R 2 ) U B A T − U p 1 ⋅ ( 1 + R 1 R 2 ) . . . . . . 公式 1 \frac{R_{I1} // (R_1 + R_2)}{R_{I2}} = \frac{U_{p1} \cdot (1 + \frac{R_1}{R_2})}{U_{BAT} - U_{p1} \cdot (1 + \frac{R_1}{R_2})} ......公式1 RI2RI1//(R1+R2)=UBAT−Up1⋅(1+R2R1)Up1⋅(1+R2R1)......公式1
第三步、判断正极绝缘
当S2闭合,S1断开时(见上图5),R2两端电压为Up2,R3两端电压为Un2;由于S1断开,因此Up2 = 0V;
当Un2=0V时,正极绝缘电阻RI1无穷大,即正极绝缘良好。
当Un2>0V时,根据电阻分压原理:
R
I
1
R
I
2
/
/
(
R
3
+
R
4
)
=
U
B
A
T
−
U
n
2
⋅
(
1
+
R
4
R
3
)
U
n
2
⋅
(
1
+
R
4
R
3
)
.
.
.
.
.
.
公式
2
\frac{R_{I1}}{R_{I2} // (R_3 + R_4)} = \frac{U_{BAT} - U_{n2} \cdot (1 + \frac{R_4}{R_3})}{U_{n2} \cdot (1 + \frac{R_4}{R_3})} ...... 公式2
RI2//(R3+R4)RI1=Un2⋅(1+R3R4)UBAT−Un2⋅(1+R3R4)......公式2
第四步、绝缘公式推导
假定:
R
C
=
R
1
+
R
2
=
R
3
+
R
4
R{C} = R{1} + R{2} = R{3} + R{4}
RC=R1+R2=R3+R4
C
0
=
U
p
1
⋅
(
1
+
R
1
R
2
)
U
B
A
T
−
U
p
1
⋅
(
1
+
R
1
R
2
)
C0 = \frac{U{p1} \cdot (1 + \frac{R_1}{R_2})}{U{BAT} - U{p1} \cdot (1 + \frac{R_1}{R_2})}
C0=UBAT−Up1⋅(1+R2R1)Up1⋅(1+R2R1)
C
1
=
U
B
A
T
−
U
n
2
⋅
(
1
+
R
4
R
3
)
U
n
2
⋅
(
1
+
R
4
R
3
)
C1 = \frac{U{BAT} - U{n2} \cdot (1 + \frac{R_4}{R_3})}{U_{n2} \cdot (1 + \frac{R_4}{R_3})}
C1=Un2⋅(1+R3R4)UBAT−Un2⋅(1+R3R4)
当Up1=0V,Un2=0V时,正、负极绝缘RI1、RI2电阻无穷大,即正、负极绝缘均良好;
当 Up1=0V,Un2>0V时,负极绝缘良好,正极绝缘异常;此时,电阻RI2无穷大,带入公式2即得到:
R
I
1
=
R
C
⋅
C
1
R_{I1} = R_C \cdot C_1
RI1=RC⋅C1
当 Up1>0V,Un2=0V时,正极绝缘良好,负极绝缘异常;此时,电阻RI1无穷大,带入公式1即得到:
R
I
2
=
R
C
C
0
R_{I2} = \frac{R_C}{C_0}
RI2=C0RC
当 Up1>0V,Un2>0V时,正、负极绝缘均异常;公式1、2联立,方程式消元后,
正极绝缘电阻:
R
I
1
=
R
C
∗
C
1
−
C
0
1
+
C
0
R_{I1} = R_{C}* \frac{C_{1} - C_{0}}{1 + C_{0}}
RI1=RC∗1+C0C1−C0
负极绝缘电阻 :
R
I
2
=
R
C
∗
C
1
−
C
0
C
0
(
1
+
C
1
)
R_{I2}=R_{C}*\frac{C_{1}-C_{0}}{C_{0}(1 + C_{1})}
RI2=RC∗C0(1+C1)C1−C0
四、绝缘电阻检测硬件电路设计
4.1 原理框图
图6:不平衡电桥电阻法绝缘检测硬件框图
不平衡电桥电阻法绝缘检测硬件硬件框图如上图6所示,该硬件原理使用电气隔离的不平衡电桥检测方法,即用隔离元器件将绝缘检测电路部分和主控部分进行电气隔离,既保证不影响车辆的绝缘性能,又能够精准测量绝缘电阻,同时兼顾对主控器件的保护;该方法多应用于无12V辅助电池的新能源车辆上。
4.2硬件电路原理图设计解析
图7:不平衡电桥电阻法绝缘检测硬件原理图
基于不平衡电桥电阻法绝缘电阻检测电路主要由隔离电源电路、电桥电阻网络、信号放大电路、ADC 采集电路以及 I²C 隔离器组成。
4.2 电路核心构成元器件
-
隔离电源电路:正负极绝缘电阻检测需 ±5V 供电,采用通用封装的 B0505S-1WR3 模块生成 + 5V,再利用电荷泵 ME7660CS1G 产生 - 5V。
-
电桥电阻网络:选用 E96 精度 1% 的 1206 电阻搭建电桥,开关由光 MOS 器件 KAQY214STLD 承担。在被采样电阻两端并联一个电容和稳压二极管,以此降低干扰、提升采样精度,并保护采样端口。
-
信号放大电路:采用 2 片国产 3Peak 高压运算放大器 TP2582-VR,组成 2 组仪表放大器,分别用于采集不平衡电桥正负极采样电阻两端的电压值。仪表放大器具备高输入阻抗、高共模抑制比、低失调电压和低噪声等特性,用于微弱信号的放大。
-
ADC 采集电路:选用国产瑞盟 MS1112,该芯片拥有 16 位高精度分辨率,可将电桥输出的模拟信号精确转换为 I²C 数字信号,且具备低功耗优势。
-
I²C 隔离器:采用国产 3Peak 的 I²C 隔离器 TPT72617-SO1R。
4.3 关键参数优化设计
4.3.1 电桥电阻选型策略:
-
由绝缘电阻计算公式可以看出,电阻精度是绝缘电阻计算的主要影响因素之一,因此电阻选择精度1%甚至更高的电阻;
-
采样电阻需要承受耐压等测试,采用多个电阻串联用来增加耐压程度;
-
电阻阻值确定原则,采样电阻满足R2<<R1、 ;其中Uref为ADC芯片参考电压,G为信号放大电路增益;
-
滤波电容根据需要选择10nF~1uF之间即可;
4.3.1 隔离电源优化策略
-
预算充足的情况下,可以选择+5V输入,隔离输出±5V的隔离电源模块;
-
更高的精度要求下,可以在DCDC输出后端再加入LDO输出以提高电源精度纹波,降低噪声。
4.3.1 信号放大电路运放选型原则
-
为了可能承受可能存在的脉冲电压,共模输入电压要高;为了减少电桥电阻间的相互影响,偏置电流要小,为了降低外部干扰,信噪比高的运放;
-
预算充足的情况下,可以选择专用仪表运放,比如3PEAK的TPA1286;
-
不使用单个运放构成差分放大的原因正负极绝缘采样电阻会通过两个负反馈形成回路,产生非采样误差电压,且无法消除;
-
不使用隔离运放的原因是因为隔离运放的偏置电流大部分都是uA级别,在采样电阻上产生的压差无法消除;
4.3.1 ADC芯片的选择
- ADC 芯片的性能直接关乎采样精度,应选用精度不低于 12Bit 的芯片,同时转换速度也需契合实际应用需求。
五、绝缘电阻检测软件程序设计
4.1 软件功能架构
绝缘电阻检测软件程序主要涵盖数据采集、信号处理、绝缘电阻计算以及结果显示等核心功能模块。
-
数据采集模块:通过配置 ADC 的相关寄存器,实现对电桥输出信号的精准采集。支持多通道同步采集,可同时采集多个检测点的信号。具备采集数据的实时校验功能,若发现数据异常,立即触发重新采集,并记录异常信息。
-
信号处理模块:采用数字滤波算法,对采集到的数据进行去噪处理。同时,对信号进行零点校准和增益校准,消除电路元件误差和环境因素对信号的影响。
-
绝缘电阻计算模块:内置多种不平衡电桥电阻法计算模型(当前只针对一种做介绍),根据实际电路结构和测量条件自动选择合适的计算公式。
-
**结果处理上传:**将计算得出的绝缘电阻值上传,并由主机判断绝状态,下发响应处理指令。
4.2 程序设计流程
图8:软件流程图
软件程序设计流程涵盖系统初始化、数据采集、信号处理、绝缘电阻计算及结果显示等关键环节。
系统初始化:程序启动时,对微处理器、ADC、硬件设备初始化配置。具体包括设定微处理器工作模式,初始化 ADC 采样频率与分辨率等,以此保障各硬件模块处于正常运行状态。
数据采集:依照既定采样频率,借助 ADC 实时采集电桥输出信号,并将采集到的模拟信号转化为数字信号,通过IIC隔离器将信号传给MCU。
信号处理:对采集的数字信号实施滤波处理,以消除噪声干扰。依据信号处理算法的运算结果,对信号进行校准与补偿,提升信号准确性。将处理后的数据予以存储,为后续绝缘电阻计算提供可靠依据。
绝缘电阻计算:依据选定的计算模型及处理后的数据,结合已知的标准电阻阻值,计算待测绝缘电阻数值。对计算结果进行精度验证与误差分析,若误差超出允许范围,则重新进行信号处理与计算。
结果处理上传:将计算得出的绝缘电阻值上传,并由主机判断绝状态,下发响应处理指令。
六、绝缘电阻检测电路实现与调试
6.1 硬件电路设计
依照电路设计,精选优质元件搭建硬件电路。焊接时采用回流焊,保障焊接质量,杜绝虚焊、短路等隐患。依据 EMC 原则布局电路,将电源与信号处理模块分开,降低电源噪声干扰。敏感信号线路采用屏蔽线,关键部位加设屏蔽罩,增强电路抗干扰能力。
图9:硬件图_部分
6.2 绝缘检测部分软件设计
软件程序采用 C 语言编写,遵循模块化、结构化编程思想,以提升可读性与可维护性。
软件外设配置及其初始化这里不再赘述;以下代码经过AI优化,仅做参考!
#include "stm32f10x.h"
typedef struct {
float up_rr;
float up_r;
float un_rr;
float un_r;
float ChipGain;
} BMS_Insulation_Params;
typedef struct {
BMS_Insulation_Params insulasion;
} Global_Params;
Global_Params g_parameter;
typedef struct {
uint8_t en_insulation;
uint16_t input2data_up[10];
uint16_t input2data_un[10];
uint8_t tpc6160adc_ok;
float insulation_dc;
float insulation_rP;
float insulation_rN;
} Global_Data;
Global_Data g_data;
#define infR 100000000.0f
void en_up(void);
void dis_up(void);
void en_un(void);
void dis_un(void);
void ADC_Read(uint16_t* data);
const uint8_t filtertime = 5;
const uint8_t samptime = 2;
volatile uint8_t delay_cnt = 0;
volatile uint16_t stp = 0;
volatile uint16_t insulation_time = 0;
volatile uint32_t adcsum = 0;
float dcp = 0, dcn = 0, dc = 0;
float C0 = 0, C1 = 0, C2 = 0;
float Vp = 0, Vn = 0;
float UvbP = 0, UvbN = 0, DvbP = 0, DvbN = 0;
float rP = 0, rN = 0;
float BattV = 0;
void insulation_detection(void) {
if (g_data.en_insulation == 1) {
if (++delay_cnt < 3) {
return;
}
delay_cnt = 0;
insulation_time++;
stp++;
switch (stp) {
case 1:
en_up();
en_un();
break;
case 1 + filtertime - samptime:
g_data.input2data_up[filtertime - 1] = 0;
g_data.input2data_un[filtertime - 1] = 0;
g_data.tpc6160adc_ok = 0;
break;
case 1 + filtertime:
if (g_data.tpc6160adc_ok == (filtertime - 1 | (1 << 7))) {
adcsum = g_data.input2data_up[filtertime - 1] + g_data.input2data_un[filtertime - 1];
dcp = (float)g_data.input2data_up[filtertime - 1] * (1 + (float)g_parameter.insulasion.un_rr / g_parameter.insulasion.un_r) / 100 / (g_parameter.insulasion.ChipGain / 100);
dcn = (float)g_data.input2data_un[filtertime - 1] * (1 + (float)g_parameter.insulasion.un_rr / g_parameter.insulasion.un_r) / 100 / (g_parameter.insulasion.ChipGain / 100);
dc = dcp + dcn;
g_data.insulation_dc = dc;
C2 = dcp / dcn;
BattV = dc;
} else {
stp = stp - filtertime;
}
break;
case 1 + filtertime + 1:
en_up();
dis_un();
break;
case 1 + filtertime + 1 + filtertime - samptime:
g_data.input2data_up[filtertime - 1] = 0;
g_data.tpc6160adc_ok = 0;
break;
case 1 + filtertime + 1 + filtertime:
if (g_data.tpc6160adc_ok == (filtertime - 1 | (1 << 7))) {
Vp = ((float)g_data.input2data_up[filtertime - 1]) / (g_parameter.insulasion.ChipGain / 100) * (1 + (float)g_parameter.insulasion.un_rr / g_parameter.insulasion.un_r);
UvbP = ((float)g_data.input2data_up[filtertime - 1]) / (g_parameter.insulasion.ChipGain / 100) * (1 + (float)g_parameter.insulasion.un_rr / g_parameter.insulasion.un_r) / 100;
if (UvbP + 1 > BattV) UvbP = BattV;
UvbN = BattV - UvbP;
} else {
stp = stp - filtertime;
}
break;
case 1 + filtertime + 1 + filtertime + 1:
dis_up();
en_un();
break;
case 1 + filtertime + 1 + filtertime + 1 + filtertime - samptime:
g_data.input2data_un[filtertime - 1] = 0;
g_data.tpc6160adc_ok = 0;
break;
case 1 + filtertime + 1 + filtertime + 1 + filtertime:
if (g_data.tpc6160adc_ok == (filtertime - 1 | (1 << 7))) {
Vn = ((float)g_data.input2data_un[filtertime - 1]) / (g_parameter.insulasion.ChipGain / 100) * (1 + (float)g_parameter.insulasion.un_rr / g_parameter.insulasion.un_r);
DvbN = ((float)g_data.input2data_un[filtertime - 1]) / (g_parameter.insulasion.ChipGain / 100) * (1 + (float)g_parameter.insulasion.un_rr / g_parameter.insulasion.un_r) / 100;
if (DvbN + 1 > BattV) DvbN = BattV;
DvbP = BattV - DvbN;
if (UvbN < 0.000001) UvbN = 0.000001;
if (DvbN < 0.000001) DvbN = 0.000001;
C1 = UvbP / UvbN;
C0 = DvbP / DvbN;
if (0 == Vp && 0 == Vn) {
rP = infR;
rN = infR;
} else if (0 == Vp && Vn) {
rP = ((g_parameter.insulasion.up_rr + g_parameter.insulasion.up_r) * ((C0 - C1) / (1 + C1)));
rN = ((g_parameter.insulasion.up_rr + g_parameter.insulasion.up_r) * ((C0 - C1) / (C1 * (1 + C0))));
rN = infR;
} else if (0 == Vn && Vp) {
rP = ((g_parameter.insulasion.up_rr + g_parameter.insulasion.up_r) * ((C0 - C1) / (1 + C1)));
rN = ((g_parameter.insulasion.up_rr + g_parameter.insulasion.up_r) * ((C0 - C1) / (C1 * (1 + C0))));
rP = infR;
if (C0 == 0) rN = ((g_parameter.insulasion.up_rr + g_parameter.insulasion.up_r) * ((C2 / C1) - 1));
} else if (Vp && Vn) {
rP = ((g_parameter.insulasion.up_rr + g_parameter.insulasion.up_r) * ((C0 - C1) / (1 + C1)));
rN = ((g_parameter.insulasion.up_rr + g_parameter.insulasion.up_r) * ((C0 - C1) / (C1 * (1 + C0))));
}
} else {
stp = stp - filtertime;
}
break;
case 1 + filtertime + 1 + filtertime + 1 + filtertime + 1:
break;
case 1 + filtertime + 1 + filtertime + 1 + filtertime + 1 + 1:
g_data.insulation_rP = rP >= 0? rP : infR;
g_data.insulation_rN = rN >= 0? rN : infR;
stp = 0;
break;
}
}
}
6.2 测试验证结果
因为不平衡电桥电阻法绝缘检测设计偏向工程应用,测试流程及其图片省略;分别测试了24V、80V、156V新能源工业车辆绝缘检测情况,结果如下:
图10:实际测试结果
七、小结
本文探讨了不平衡电桥电阻法在新能源领域的绝缘电阻检测应用。文章深入剖析了平衡与不平衡电桥的工作原理,针对新能源汽车动力电池的检测需求,优化传统电桥设计,并推导了不同工况下的绝缘电阻计算公式。硬件设计方面,涵盖隔离电源、电阻网络等关键模块,阐述了选型与参数优化策略;软件设计则包括数据采集与信号处理,确保精准分析检测数据。
以工业新能源汽车为例,该方法能实时监测绝缘电阻,保障电气安全,减少发电效率损失。不平衡电桥电阻法凭借科学的原理和精心设计的软硬件,为新能源设备的安全运行提供了可靠保障,展现出显著的技术优势和广阔的应用前景。
以上内容如有不足之处,还请不吝指正!