一、前言
不平衡电桥测绝缘电阻技术是一项常见的测量技术;本文分享将不平衡电桥测绝缘电阻从理论到实际产品应用的整个过程,深入剖析软硬件设计要点。(之前写过一篇,发现被抖音科普博主精炼拿去做成了短视频,连图片都不带改一下的,我都惊呆了,,,,,,索性我也精简一下,作为在EEPW上BMS保护板硬件技术分享系列的第二篇吧!)
二、不平衡电桥电阻法原理
2.1 电桥基本结构
电桥本质上是由四个电阻构成的四边形电路结构,其中相对的两个顶点用于连接电源,另外两个顶点则连接检测仪表,常见的检测仪表包括电压表或电流表。在基于不平衡电桥电阻法的绝缘电阻检测体系中,这四个电阻分别由已知标准电阻和待测绝缘电阻组成。为更直观地理解电桥结构,以下展示典型的平衡电桥结构示意图(图 1):

图 1:平衡电桥结构示意图
2.2 平衡电桥原理
在图 1 所示的电桥电路中,电桥由四个电阻R0、R1、R2和被测电阻Rx组成,电桥的电源电压为。
当电桥达到平衡状态时,即C、D两点的电位相等。根据基尔霍夫定律,推导得出:

当电桥处于不平衡状态时,检测仪表两端会产生电压差。通过基尔霍夫定律,同样可推导出不平衡状态下计算绝缘电阻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不同开关状态情况
- S1和S2同时闭合,定义此时测量到的R2两端电压Up0,R3两端电压Un0;

图3:S1和S2同时闭合
- S1闭合,S2关闭,定义此时测量到的R2两端电压Up1 ,R3两端电压Un1 ;
图4:S1闭合,S2断开

- S1关闭,S2闭合,定义此时测量到的R2两端电压Up2,R3两端电压Un2;
图5:S2闭合,S1断开
3.2 绝缘电阻计算公式推导

有两种方法可以获取定义动力电池电压值:
通过车辆动力电池的BMS 获取;
通过不平衡电桥采样计算:同时闭合S1和S2(见上图3),根据电阻分压原理即可得到:

为了简化程序,大多数使用第一个方法直接获取即可;后续的公式推导中,认为UBAT为 已知参数。
当S1闭合,S2断开时(见上图4),R2两端电压为Up1,R3两端电压为Un1 ;由于S2断开,因此Un1 = 0V;
当Up1=0V时,负极绝缘电阻RI1无穷大,即负极绝缘良好。。
当Up1>0V时,根据电阻分压原理:

当S2闭合,S1断开时(见上图5),R2两端电压为Up2,R3两端电压为Un2;由于S1断开,因此Up2 = 0V;
当Un2=0V时,正极绝缘电阻RI1无穷大,即正极绝缘良好。
当Un2>0V时,根据电阻分压原理:

假定:

当Up1=0V,Un2=0V时,正、负极绝缘RI1、RI2电阻无穷大,即正、负极绝缘均良好;
当 Up1=0V,Un2>0V时,负极绝缘良好,正极绝缘异常;此时,电阻RI2无穷大,带入公式2即得到:

当 Up1>0V,Un2=0V时,正极绝缘良好,负极绝缘异常;此时,电阻RI1无穷大,带入公式1即得到:

当 Up1>0V,Un2>0V时,正、负极绝缘均异常;公式1、2联立,方程式消元后,
正极绝缘电阻:

负极绝缘电阻 :

四、绝缘电阻检测硬件电路设计
4.1 原理框图

图6:不平衡电桥电阻法绝缘检测硬件框图
不平衡电桥电阻法绝缘检测硬件硬件框图如上图6所示。
4.2硬件电路原理图设计解析
图7:不平衡电桥电阻法绝缘检测硬件原理图
基于不平衡电桥电阻法绝缘电阻检测电路主要由隔离电源电路、电桥电阻网络、信号放大电路、ADC 采集电路以及 I²C 隔离器组成。
4.2 电路核心构成元器件
隔离电源电路:正负极绝缘电阻检测需 ±5V 供电,用B0505S-1WR3 模块生成 + 5V,再用电荷泵 ME7660CS1G 产生 - 5V。
电桥电阻网络:固态继电器 KAQY214STLD是关键,需要根据系统绝缘耐压进行选择,这里隔离电压440V;
信号放大电路:如果预算充足,选择仪表放大器;分立高精度运放也能搭建。
ADC 采集电路:选用国产瑞盟 MS1112,该芯片拥有 16 位高精度分辨率,将电桥输出的模拟信号精确转换为 I²C 数字信号。
I²C 隔离器:采用国产 3Peak 的 I²C 隔离器 TPT72617-SO1R。
五、绝缘电阻检测软件程序设计
4.1 软件功能架构
绝缘电阻检测软件程序主要涵盖数据采集、信号处理、绝缘电阻计算以及结果显示等核心功能。
4.2 程序设计流程
图8:软件流程图
软件程序设计流程涵盖系统初始化、数据采集、信号处理、绝缘电阻计算及结果显示等关键环节。
系统初始化:程序启动时,对微处理器、ADC、硬件设备初始化配置。具体包括设定微处理器工作模式,初始化 ADC 采样频率与分辨率等,以此保障各硬件模块处于正常运行状态。
数据采集:依照既定采样频率,借助 ADC 实时采集电桥输出信号,并将采集到的模拟信号转化为数字信号,通过IIC隔离器将信号传给MCU。
信号处理:对采集的数字信号实施滤波处理,以消除噪声干扰。依据信号处理算法的运算结果,对信号进行校准与补偿,提升信号准确性。将处理后的数据予以存储,为后续绝缘电阻计算提供可靠依据。
绝缘电阻计算:依据选定的计算模型及处理后的数据,结合已知的标准电阻阻值,计算待测绝缘电阻数值。对计算结果进行精度验证与误差分析,若误差超出允许范围,则重新进行信号处理与计算。
结果处理上传:将计算得出的绝缘电阻值上传,并由主机判断绝状态,下发响应处理指令。
六、绝缘电阻检测电路实现与调试
6.1 硬件电路设计

图9:硬件图_部分
6.2 绝缘检测部分软件设计
软件外设配置及其初始化不再赘述;以下代码经过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:实际测试结果
七、小结
本文分享不平衡电桥电阻法在新能源领域的绝缘电阻检测应用。针对不平衡电桥的工作原理,推导了不同工况下的绝缘电阻计算公式。并通过软硬件设计,在新能源工业车辆上实现并验证。
实际项目中会出现各种问题,包括误差,干扰,偏置,器件选值等等!本人最开始做就走偏了,使用隔离差分运放,,,,,,
工程项目道阻且长,行则将至!以上是个人在2023年期间主导将该技术由参考论文应用于新能源工业车辆BMS保护板绝缘电阻检测的过程。
我要赚赏金
