밸런싱까지 됐으니 이제 보호 기능. 과충전/과방전 되면 알람 띄우고 차단해야 한다.
AD7280A에 하드웨어 알람 기능이 있다. 임계값 설정해두면 자동으로 Alert 핀이 떨어진다.
임계값 레지스터
- CELL_OV (0x10): 과전압 임계값
- CELL_UV (0x11): 저전압 임계값
8비트 값. 전압 계산 공식:
임계값(mV) = 레지스터값 × 6 + 1000
레지스터값 = (임계값 - 1000) / 6
LFP 기준 설정
LiFePO4 기준:
- 과전압: 3.65V (만충)
- 저전압: 2.5V (방전 종지)
약간의 마진을 두고:
// 과전압: 3.7V
#define OV_THRESHOLD_MV 3700
#define OV_REG_VALUE ((3700 - 1000) / 6) // = 450
// 저전압: 2.4V
#define UV_THRESHOLD_MV 2400
#define UV_REG_VALUE ((2400 - 1000) / 6) // = 233
설정 코드
void AD7280A_SetAlarmThresholds(uint8_t device) {
// 과전압 설정
AD7280A_Write(device, AD7280A_CELL_OV, OV_REG_VALUE);
// 저전압 설정
AD7280A_Write(device, AD7280A_CELL_UV, UV_REG_VALUE);
}
void BMS_InitAlarms(void) {
// 모든 디바이스에 설정 (브로드캐스트)
AD7280A_Write(0x1F, AD7280A_CELL_OV, OV_REG_VALUE);
AD7280A_Write(0x1F, AD7280A_CELL_UV, UV_REG_VALUE);
}
해상도 문제
6mV 단위라서 정밀하게 못 맞춘다.
원하는 값: 3650mV
계산: (3650 - 1000) / 6 = 441.67 → 441
실제 값: 441 × 6 + 1000 = 3646mV
4mV 오차. 큰 문제는 아닌데 알고는 있어야 한다.
AUX 임계값
온도 알람용 AUX 임계값도 있다:
- AUX_OV (0x12): AUX 과전압
- AUX_UV (0x13): AUX 저전압
NTC 전압 범위에 맞춰 설정하면 과열/저온 알람으로 쓸 수 있다.
// 과열 (60°C): NTC 전압 약 1.5V
#define AUX_OV_VALUE ((1500 - 1000) / 6) // 약 83
// 저온 (0°C): NTC 전압 약 3.8V
#define AUX_UV_VALUE ((3800 - 1000) / 6) // 약 466
근데 나는 AUX 알람은 안 쓰고 소프트웨어로 처리했다. 더 유연해서.
테스트
파워서플라이로 셀 하나에 과전압 인가:
설정: OV = 3.7V
인가: 3.8V
결과: Alert 핀 Low
동작한다.
정리
- OV/UV 레지스터로 임계값 설정
- 공식: mV = reg × 6 + 1000
- 6mV 해상도
- 브로드캐스트로 전체 설정 가능
다음은 Alert 핀 인터럽트 처리.