72V면 직접 만지면 위험하다. 차체(GND)랑 배터리 사이 절연이 중요하다.
절연 불량이면 감전 사고, 누설 전류로 인한 화재 위험.
절연 저항
배터리 +/-와 차체(새시 GND) 사이 저항.
Battery+ ─────┐
│
[R_iso+]
│
Chassis ─── 새시 GND
│
[R_iso-]
│
Battery- ─────┘
신품 절연 저항: 수 MΩ 위험 수준: 100kΩ 이하
측정 원리
배터리와 새시 사이에 알려진 저항 연결하고 전압 측정.
Battery+ ──[Rm]──┬── ADC
│
Chassis
// 측정 저항 Rm = 1MΩ
// ADC 전압 Vadc
// 절연 저항 계산
// R_iso = Rm × Vadc / (Vbat - Vadc)
간단한 구현
#define R_MEASURE_OHM 1000000 // 1MΩ
typedef struct {
uint32_t r_iso_pos; // + 측 절연 저항
uint32_t r_iso_neg; // - 측 절연 저항
bool fault;
} IsoMonitor_t;
void ISO_Measure(void) {
// + 측 측정
GPIO_SwitchToPositive();
HAL_Delay(100); // RC 안정화
uint16_t v_pos = ADC_Read();
// - 측 측정
GPIO_SwitchToNegative();
HAL_Delay(100);
uint16_t v_neg = ADC_Read();
// 절연 저항 계산
float v_bat = g_bms.pack_voltage_mv / 1000.0f;
float v_p = v_pos * 3.3f / 4096;
float v_n = v_neg * 3.3f / 4096;
if (v_p > 0.1f) {
g_iso.r_iso_pos = R_MEASURE_OHM * v_p / (v_bat - v_p);
}
if (v_n > 0.1f) {
g_iso.r_iso_neg = R_MEASURE_OHM * v_n / (v_bat - v_n);
}
}
폴트 판정
#define ISO_FAULT_THRESHOLD 100000 // 100kΩ
#define ISO_WARNING_THRESHOLD 500000 // 500kΩ
void ISO_Check(void) {
uint32_t r_min = min(g_iso.r_iso_pos, g_iso.r_iso_neg);
if (r_min < ISO_FAULT_THRESHOLD) {
g_iso.fault = true;
BMS_SetFault(FAULT_ISOLATION);
}
else if (r_min < ISO_WARNING_THRESHOLD) {
BMS_SetWarning(WARN_ISOLATION_LOW);
}
}
전용 IC
정확한 측정이 필요하면 전용 IMD(Insulation Monitoring Device) IC 사용.
Bender ISOMETER, Littelfuse 등.
나는 간단한 용도라 자체 구현했는데, 자동차용은 전용 IC 쓰는 게 좋다.
주의사항
절연 측정 시 배터리에서 새시로 전류가 흐른다. 아주 작지만.
- 측정 중 아닐 때는 스위치 OFF
- 측정 주기 길게 (1분에 1회 정도)
- 고전압 작업 시 안전 주의
정리
- 절연 저항: 배터리↔새시 사이
- 100kΩ 이하면 위험
- 알려진 저항으로 분압 측정
- 정밀 측정은 전용 IC
Part 7 고급 기능편 끝.
다음은 실전 적용편.