데이터시트가 60페이지다. 처음엔 다 읽으려고 했는데 포기했다.

실제로 자주 쓰는 레지스터만 정리.


주요 레지스터

주소이름용도
0x00Cell Voltage 1셀 1 전압 (읽기 전용)
0x01Cell Voltage 2셀 2 전압
0x05Cell Voltage 6셀 6 전압
0x06AUX ADC 1보조 ADC (온도 등)
0x0DSelf Test자가 진단 결과
0x0EControl HB제어 레지스터 상위
0x0FControl LB제어 레지스터 하위
0x10Cell OV과전압 임계값
0x11Cell UV저전압 임계값
0x14Cell Balance밸런싱 제어

셀 전압 읽고, 밸런싱 하고, 알람 설정하는 게 전부다. 10개 레지스터면 BMS 기본 기능 다 된다.


Control 레지스터

CTRL_HB (0x0E):

Bit 7-6: Conversion input (00=Cell, 01=AUX, ...)
Bit 5: Conversion start method
Bit 4: Read type
Bit 3: Averaging enable
Bit 2-0: Reserved

CTRL_LB (0x0F):

Bit 7: Software reset
Bit 6: PD (Power Down)
Bit 5: Acquisition time
Bit 4: Thermistor enable
Bit 3-2: Increment device addr
Bit 1: Must set 1
Bit 0: ADDR_RD_EN

처음엔 이게 뭔 소린가 싶었는데, 필요할 때마다 찾아보면 된다.

자주 쓰는 설정:

#define CTRL_HB_CONV_CELL    0x00  // 셀 전압 변환
#define CTRL_HB_CONV_AUX     0x40  // AUX ADC 변환
#define CTRL_HB_READ_ALL     0x10  // 전체 읽기

#define CTRL_LB_RESET        0x80  // 소프트웨어 리셋
#define CTRL_LB_THERM_EN     0x10  // 서미스터 활성화
#define CTRL_LB_MUST_SET     0x02  // 항상 1로 설정

셀 전압 레지스터

0x000x05가 Cell 16 전압.

12비트 값이 들어있다. mV로 변환하려면:

// 12bit raw → mV
// 공식: V = (raw * 0.976mV) + 1000mV
uint16_t raw = ReadRegister(CELL_VOLTAGE_1);
float voltage_mv = raw * 0.976f + 1000.0f;

AD7280A는 1V5V 범위를 측정한다. 리튬 셀이 보통 2.5V4.2V니까 충분하다.


밸런싱 레지스터

CELL_BALANCE (0x14):

Bit 5: CB6 (Cell 6 밸런싱)
Bit 4: CB5
Bit 3: CB4
Bit 2: CB3
Bit 1: CB2
Bit 0: CB1

해당 비트 1로 설정하면 그 셀의 밸런싱 스위치가 ON.

// Cell 1, 3 밸런싱 ON
WriteRegister(CELL_BALANCE, 0x05);  // 0b00000101

내부에 밸런싱 스위치가 있어서 외부 저항만 달면 된다. 편하다.


Alert 레지스터

CELL_OV (0x10): 과전압 임계값 CELL_UV (0x11): 저전압 임계값

// 임계값 계산
// 값 = (전압mV - 1000) / 6
// 예: 4.2V → (4200 - 1000) / 6 = 533

#define OV_4V2  533  // 4.2V
#define UV_2V5  250  // 2.5V

임계값 넘으면 Alert 핀이 Low로 떨어진다.


레지스터 정의

코드에서 쓰기 편하게 define:

// Cell Voltage Registers
#define AD7280A_CELL_V1      0x00
#define AD7280A_CELL_V2      0x01
#define AD7280A_CELL_V3      0x02
#define AD7280A_CELL_V4      0x03
#define AD7280A_CELL_V5      0x04
#define AD7280A_CELL_V6      0x05

// AUX ADC
#define AD7280A_AUX_ADC1     0x06
#define AD7280A_AUX_ADC2     0x07

// Control
#define AD7280A_CTRL_HB      0x0E
#define AD7280A_CTRL_LB      0x0F

// Threshold
#define AD7280A_CELL_OV      0x10
#define AD7280A_CELL_UV      0x11

// Balance
#define AD7280A_CELL_BAL     0x14

// Alert
#define AD7280A_ALERT        0x18

다음은 프레임 구조. 32비트 안에 주소, 데이터, CRC가 어떻게 들어가는지.

#5 - 프레임 구조