본문 바로가기
Hardware/MCU(Arduino,ESP8266)

analogRead() & AREF핀 사용법

by lovey25 2020. 8. 28.
반응형

아두이노에서 아날로그 전압값을 읽어야 할 때 더 정확하게 측정할 수 있도록 도와주는 AREF(Analog Reference) 단자의 사용방법 알아보겠습니다.

analogRead()

아두이노 보드에는 10비트 아날로그-디지털 컨버터가 있어서 입력되는 값을 10비트 그러니까 1024개로 쪼개서 그 정도를 0에서 1023의 디지털로 표시하게 됩니다.

아두이노 우노 보드를 예로 들면 6 채널 AD 컨버터가 있어서 A0~A5핀을 아날로그 입력 핀으로 사용할 수 있으며 5V로 동작하는 보드이기 때문에 0~5V 값을 읽을 수 있습니다. 만약 아날로그 핀에 0V가 걸리면 0이 그리고 5V가 걸리면 1023이라는 숫자를 읽어오게 되고 그 이상의 전압이 걸리게 되면 1023으로만 표시됩니다. 그래서 숫자 "1"이 의미하는 전압의 해상도는 4.9mV(5V ÷ 1024 = 4.88mV)가 됩니다. 참고로 값을 측정하는데 걸리는 시간은 약 100ms이라고 하네요. 그리고 아날로그 핀들은 필요에 따라서 디지탈 핀으로도 사용될 수 있습니다.

이렇게 아날로그 핀의 전압값을 읽어오는 데 사용되는 함수는 "analogRead(pin)"이며 "pin"에 읽고자 하는 핀의 번호를 써주면 됩니다. 이때 측정하는 전압은 절댓값이 아니며 상대 전압을 측정하게 되는데요. 별다른 설정이 없는 경우 보드의 동작전압이 기준이 되기 때문에 입력되는 전원의 전압이 조금 모자라서 보드가 4.5V에서 동작하고 있다고 가정하면 아날로그 핀에 걸리는 전압이 4.5V라면 analogRead() 함수는 5V를 의미하는 1023을 반환할 수도 있습니다.

AREF 핀은 언제 사용할까?

AREF는 말 그대로 아날로그의 기준이라는 건데 아두이노 보드에서 아날로그 신호를 읽어올 때 외부의 전압값을 기준으로 삼을 때 사용하는 핀입니다. 그러니까 앞에서 예를 든 것처럼 보드의 동작 전압이 어떤 요인으로 기대하는 값과 다른 경우 이를 보정하는 용도로 정확한 기준을 만들 때 사용할 수 있습니다.

아두이노 나노보드는 동작 전압이 5V이지만 스펙상 외부 전원을 이용할 경우 7V 이상의 전압을 사용할 것을 권장하고 있습니다. 하지만 위 사진처럼 9V의 외부 전압이 인가되고 있지만 아두이노 나노 보드의 5V핀과 3.3V 핀에는 각각 3.18, 4.95V가 걸리고 있습니다.

제가 사용하는 나노 보드가 짝퉁이라서 그 차이가 더 클지도 모르지만 아무튼 보드의 동작 전압이 5V라고 기대하고 어떤 센서의 전압을 측정하는 스케치를 코딩했다면 실제 전압과는 오차가 발생하게 됩니다. 그래서 위의 사진처럼 analogRead() 함수로 측정한 전압과 실제 전압에 오차가 발생할 수 있는데 이를 보정하기 위한 기준 전압을 설정하는데 AREF 핀을 사용합니다.

analogReference() 

앞에서 아날로그 핀의 신호를 읽을 때 아두이노 우노의 경우 5V를 기준으로 0~5를 1024개로 쪼개서 그 정도를 측정한다고 했는데요. 여기서 5V가 기준 전압(Reference Voltage)이 됩니다. 이 기준 전압을 필요에 따라서 변경하기도 하는데 그때 analogReference(ref) 함수를 이용합니다. 함수의 "ref"인자에 사용할 수 있는 옵션은 다음과 같습니다.

DEFAULT: 기본 설정 (5V 보드에서는 5V, 3.3V 보드에서는 3.3V) 
INTERNAL: 보드의 내장 기준값을 사용 (ATmega168, 328P = 1.1V; ATmega32U4, ATmega8 = 2.56V; Arduino Mega는 미지원)
INTERNAL1V1: 내장 1.1V 기준값 사용 (Arduino Mega 전용)
INTERNAL2V56: 내장 2.56V 기준값 사용 (Arduino Mega 전용)
EXTERNAL: AREF 핀에 인가되는 전압을 기준값으로 사용 (0 ~ 5V 범위에서만 사용 가능)

출처: www.arduino.cc/reference/en/language/functions/analog-io/analogreference/

별도로 기준 전압을 설정하지 않는 경우가 DEFAULT인데 보드의 동작전압과 동일합니다. 그리고 INTERNAL옵션은 보드 내장 기준 전압값을 사용하는 옵션이며 1.1V, 2.56V 등 사용이 가능합니다.

AREF를 사용한 아날로그 값 비교

AREF를 사용했을 때 어떤 차이가 있는지 확인해 봤습니다. 먼터 실험을 위해서 아두이노 나노 보드를 사용했습니다. 그리고 배터리와 Step-up 모듈을 이용해서 아두이노 나노 보드에 5V의 일정한 전압 공급을 할 수 있도록 준비했습니다. (Step-up 모듈은 이전 글에서 일정한 전압 공급이 가능함을 확인하기도 했었죠.)

먼저 실험 조건을 확인해보겠습니다. 이미 1차적으로 사용을 다한 AAA 건전지 3개를 묶어서 재활용을 했는데요. 여기서 약 3.3V의 전압이 나오고 있습니다. 그리고 이 전압을 Step-up 모듈로 승압해서 5V 전압이 나오도록 조절되어 있습니다. 이런 조건을 만든 이유는 이전에 포스팅했던 리튬 폴리머 배터리를 이용한 휴대용 미세먼지 측정기 만들기 프로젝트에서 배터리의 잔량을 측정하기 위한 기능을 추가하려고 생각하고 있어서 유사한 조건으로 실험을 하기 위해서입니다.

그리고 전압값을 측정하기 위한 소스는 간단하게 아두이노 나노의 3.3V 단자를 이용하고 3.3V 단자를 아날로그 단자로 연결해서 전압값을 측정해보겠습니다. 우선 5V의 외부 전압이 공급되고 있는 상황에서는 약 3.18V의 전압이 측정되고 있는데 다음 3가지 조건에서 이 3.3V 핀 전압을 analogRead() 함수로 읽어서 그 값이 어떻게 측정되는지 확인해 보겠습니다.

CASE 1 - AREF 핀을 사용하지 않고 USB 전원만 사용

float val=0.0;

void setup() {
    Serial.begin(9600);
    analogReference(DEFAULT);
}

void loop() {
    Serial.println(analogRead(2));
    val = 5 / 1024.0 * analogRead(2);
    Serial.println(val);
    
    delay(1000);
}

실제 전압 = 3.17V, 측정값 = 3.37V

CASE 2 - AREF핀을 사용하지 않고 외부 전원 5V를 연결

float val=0.0;

void setup() {
    Serial.begin(9600);
    analogReference(DEFAULT); 
}

void loop() {
    Serial.println(analogRead(2));
    val = 5 / 1024.0 * analogRead(2);
    Serial.println(val);
    
    delay(1000);
}

실제 전압 = 3.17V, 측정값 = 3.14 ~ 3.15V

CASE 3 - AREF핀을 사용하고 외부전원 5V를 연결

float val=0.0;

void setup() {
    Serial.begin(9600);
    analogReference(EXTERNAL);
}

void loop() {
    Serial.println(analogRead(2));
    val = 5 / 1024.0 * analogRead(2);
    Serial.println(val);
    
    delay(1000);
}

실제 전압 = 3.17V, 측정값 = 3.14 ~ 3.15V

결과

AREF를 사용하지 않고 USB 전원만 사용한 1번 케이스에서는 실제 전압값과 측정값에 큰 차이가 있었습니다. 제 경우 USB 전원이 5V에 미치지 못해서 아날로그 값을 측정하는 기준이 낮았기 때문에 실제보다 더 큰 전압이 계산된 것 같습니다. 하지만 AREF핀을 사용해서 거의 정확한 5V의 기준값이 설정되었을 때는 실제 전압과 거의 비슷한 수준으로 측정이 되었습니다. 그리고 AREF핀을 사용하지 않았지만 외부 전원으로 정확한 5V가 공급되고 있는 2번 케이스에서도 AREF로 5V를 사용할 때와 차이가 없는 것을 확인하였습니다. 

결론적으로 정확하고 안정적이면서 전압을 정확히 알 수 있는 외부 전원을 사용하는 경우라면 analogRead() 함수로 측정된 값을 전압으로 변환할 때는 실제와 근사한 값을 계산해 낼 수 있지만 그렇지 않은 경우 AREF핀에 기준 전압을 설정하여 정확한 값으로 보정할 수 있음을 알 수 있었습니다.

 

끝!

반응형

댓글