IoT (7) - DS1307 RTC (Real-Time Counter) 제어

Updated:

7. DS1307 RTC (Real-Time Counter) 제어 (with nRF52840-DK)

7.1 Real-Time Counter

RTC (Real-Time Counter)란 임베디드 기기에서 시간 및 날짜 정보를 지속적으로 갱신하기 위해 사용하는 모듈이다. 해당 모듈에는 클럭 생성 회로가 포함되어 있으며 이를 이용해서 대개 1초 단위의 시간을 정밀하게 계산 및 기록하는 역할을 수행한다. 또한, 작은 크기의 코인 셀 (coin cell) 배터리만으로도 저전력으로 구동되기 때문에 외부 시스템 전원이 꺼져있는 동안에도 장시간 시간을 계수 (counting)하는 것이 가능하다.

일반적으로 (🤔?) RTC 모듈로써 동작하기 위해서는 1초 라는 시간을 count 할 수 있어야 한다. 이를 위해 대표적으로 사용되는 클럭 주파수 값은 32.768 kHz 이다. 임베디드 시스템에서는 주로 더 높은 주파수의 클럭을 분기 (divide)해서 32.768 kHz 주파수를 생성하거나, 메인 프로세서 주변에 32.768 kHz 의 진동수를 생성하는 외부 크리스탈 (Crystal) 발진기 (Oscillator)를 연결해 사용하기도 한다.

32.768 kHz 의 주파수로 생성되는 클럭의 한 주기는 약 30.52 us 이므로, 꽤 정밀하게 1초 라는 시간을 count 할 수 있다. nRF52 BLE 프로세서에서는 소프트웨어적으로 RTC 를 구현하기 위해 32.768 kHz 의 클럭 주파수를 내부의 PRESCALER 레지스터 값을 이용해서 328 로 다시 한 번 분기한다.

f = 32.768 kHz/328 = 99.90244 Hz

따라서, 최종적으로는 약 100 Hz 정도의 클럭 주파수를 생성할 수 있으며, 해당 클럭의 한 주기는 10 ms 에 해당하므로 1초 라는 시간을 counting 할 수 있게 된다 ⏱.


7.2 DS1307 제어하기

7.2.1 준비 과정

다음으로 DS1307 이라는 RTC 모듈 제어하는 방법을 간단하게 소개하고자 한다. 구체적인 소스 코드는 없으나, 데이터 시트를 보면서 어떤 식으로 DS1307 모듈을 제어해야 하는지에 대해 소개하고자 한다 📜.

DS1307 RTC DataSheet 링크: https://datasheets.maximintegrated.com/en/ds/DS1307.pdf

RTC 예제를 검색해보면 아두이노 보드를 가지고 DS1302 RTC 모듈을 제어하는 예제가 많은데, 본인의 경우 nRF52840-DK 보드를 이용해 RTC 모듈을 제어하려고 했기 때문에 I2C 통신으로 제어가 가능한 DS1307 모듈을 이용했다.

아두이노 계열 보드의 경우 단순히 예제 찾아서 동작시키는데는 문제가 없는데 라이브러리가 아두이노 IDE 환경에 맞게 설계되어있다 보니 원래의 소스 코드를 다시 분석해서 이를 제어하기 위한 별도의 라이브러리를 구축하는게 여가 귀찮은 일이 아니다.

아무튼 여차저차해서 DS1307 RTC 모듈을 구매했는데 구글에 검색해보면 가격이 너무 저렴해서 (중간에 880 원은 뭐야) 제대로 동작하기는 하는 건지 의심부터 든다. 일단 구매후 아래와 같이 전원과 GND, 그리고 I2C 통신을 위한 SDA, SDL 라인을 연결해주었다.

NOTICE: DS1307 데이터시트를 보면 권장되는 Supply voltage 값은 5V 이지만 nRF52840-DK 보드의 시스템 제어 레벨이 0 ~ VDD 이므로, 위 그림에서는 RTC 전원을 VDD 에 연결해주었다 (nRF52840-DK 보드의 VDD 핀 전압은 약 2.95 ~ 3 V 정도). 또한, nRF 보드의 경우 내부의 풀업 저항 (pull-up resistor) 가 내장되어 있으므로 곧바로 SDA, SDL 라인을 연결했지만, 풀업 저항이 없는 프로세서를 이용하는 경우 연결해줘야 정상적인 I2C 통신이 가능하다

7.2.2 DS1307 주요 레지스터

DS1307I2C 슬레이브 주소 (slave address) 값은 0x68 이며, 주요 레지스터 주소는 다음의 그림과 같다 (데이터시트 참조).

처음 구동 시, RTC 모듈을 연결해서 위 그림의 레지스터 주소 값들을 읽어 보면 아래 그림처럼 고정된 값만 계속 읽히는 것을 확인할 수 있을 것이다. 해당 내용 관련해서는 데이터 시트에 명시되어 있는데, “0번 주소” BIT7 (MSB) 값이 ‘1’ 로 설정되어 있는 경우 RTC 모듈의 counting 기능이 비활성화 된다.

따라서, 처음 RTC 구동 후 “0 ~ 6번 주소” 의 레지스터에 현재 시간 정보를 입력해주어야하고, 이 과정에서 0번 레지스터의 BIT7 값도 ‘0’ 으로 설정해줘야 한다.

다음의 그림은 RTC 레지스터에 현재 시간 정보를 입력한 이후 1분 간격으로 시간 정보를 읽은 결과를 보여준다. 그림에서 빨간색으로 표시한 영역이 분 (minute) 영역의 데이터에 해당하며, 정상적으로 RTC 모듈이 활성화 된 것을 확인할 수 있다.


7.3 DS1307 소비 전류

nRF-PPK 보드를 이용해 DS1307 모듈의 소비 전류를 측정해본 결과 외부 전원 (VDD)이 공급되는 경우에는 약 1.6 uA 의 전류를 소모하고, 외부 전원이 차단되는 경우에는 평균적으로 2 uA 정도의 전류를 소모한다.

DS1307 구매시 제품과 함께 동봉되어 온 코인 셀 배터리 CR2032 의 용량이 약 220 mAh 전후인데, 이는 평균 전류 소모량이 220 mA 일 때 대략적으로 한 시간 정도 연속으로 동작이 가능한 정도의 용량임을 가리킨다. 따라서, DS1307 RTC 모듈을 CR2032 코인 셀과 함께 사용하는 경우, 2 uA = 0.002 mA 이므로 무려 110,000 시간동안 시간을 기록할 수 있다. 이는 해당 코인 셀 하나로 DS1307 모듈을 약 12년 간 구동시킬 수 있음을 의미한다. (제대로 계산한 거 맞나..? 이 정도면 중간에 코인 셀이 먼저 방전되겠는데…)

Comments