배터리 셀은 개체 차이가 있다. 같은 배치에서 나온 셀도 용량이 조금씩 다르다.
그래서 충방전 반복하면 셀 간 전압 편차가 벌어진다. 이걸 맞춰주는 게 밸런싱.
패시브 vs 액티브
밸런싱 방식은 두 가지:
패시브: 높은 셀을 저항으로 방전 (에너지 버림) 액티브: 높은 셀 에너지를 낮은 셀로 이동 (효율적)
AD7280A는 패시브 방식 지원. 셀당 내부 스위치가 있다.
액티브는 외부 회로가 복잡하고 비싸서, 보통 패시브로 충분하다.
내부 구조
Cell+ ──┬──────────────── Cell Voltage Input
│
├──[내부 스위치]──┬── CB 핀 (밸런싱 출력)
│ │
Cell- ──┴────────────────┴──
CB 핀에 외부 저항 연결하면 된다. 스위치 ON 하면 셀이 저항으로 방전.
Cell ──┬──[33Ω]──┐
│ │
[SW] │
│ │
└─────────┘
방전 전류 계산
저항값으로 방전 전류 결정:
I = V / R
3.3V / 33Ω = 100mA
100mA면 무난하다. 너무 크면 발열, 너무 작으면 밸런싱 느림.
전력도 계산:
P = V² / R = 3.3² / 33 = 0.33W
저항 정격이 0.5W 이상이어야 안전하다. 나는 1W짜리 사용.
밸런싱 ON/OFF
CELL_BALANCE 레지스터(0x14)로 제어:
void AD7280A_SetBalance(uint8_t device, uint8_t cell_mask) {
AD7280A_Write(device, AD7280A_CELL_BAL, cell_mask);
}
// Cell 1, 3 밸런싱 ON
AD7280A_SetBalance(0, 0x05); // 0b00000101
// 밸런싱 OFF
AD7280A_SetBalance(0, 0x00);
비트 0이 Cell 1, 비트 5가 Cell 6.
밸런싱 타이밍
계속 밸런싱하면 안 된다. 셀 전압 측정이 부정확해진다.
방전 전류 때문에 전압 강하가 생겨서 실제보다 낮게 읽힌다.
밸런싱 ON 상태에서 측정:
실제 전압: 3.350V
측정 전압: 3.320V (30mV 낮음)
밸런싱 OFF → 안정화 대기 → 측정 → 밸런싱 ON
void BMS_MeasureAndBalance(void) {
// 밸런싱 OFF
for (int i = 0; i < 4; i++) {
AD7280A_SetBalance(i, 0x00);
}
HAL_Delay(100); // 안정화 대기
// 전압 측정
BMS_ReadAllCellVoltages();
// 밸런싱 결정 및 ON
BMS_UpdateBalancing();
}
첫 테스트

12셀 연결해서 테스트.
측정 결과:
Cell 0: 3.351V (max)
Cell 1: 3.320V
Cell 2: 3.315V
Cell 3: 3.348V
Cell 4: 3.312V (min)
Cell 5: 3.325V
Cell 0이 제일 높으니까 Cell 0만 밸런싱.
AD7280A_SetBalance(0, 0x01); // Cell 1(index 0) ON
30분 후:
Cell 0: 3.325V (39mV 감소)
Cell 1: 3.320V
...
동작한다!
발열 문제
33Ω에서 0.33W 발열. 저항이 뜨거워진다.
24셀 전부 밸런싱하면 0.33W × 24 = 8W. 보드가 뜨거워진다.
체커보드 패턴으로 분산:
// 홀수 셀만 먼저
AD7280A_SetBalance(0, 0x15); // Cell 1, 3, 5
// 1초 후 짝수 셀
AD7280A_SetBalance(0, 0x2A); // Cell 2, 4, 6
동시에 전부 켜지 않고 번갈아가며. 발열 분산.
정리
- 패시브 밸런싱: 저항으로 방전
- 33Ω → 100mA, 0.33W
- 밸런싱 OFF 후 측정 (전압 강하 방지)
- 발열 관리: 체커보드 패턴
다음은 밸런싱 알고리즘. 언제 어떤 셀을 밸런싱할지 결정하는 로직.