아날로그핀에 연결된 ADC의 기준 전압을 바꿀 수 있는데  analogReference() 함수를 이용하면 된다.


ananlogReference(type)

 

ADC 기준 전압은 아날로그 입력값이 1023로 읽히는 최대 전압 값을 의미하며 이 전압값을 설정해 주는 함수이다. 우노의 경우 따로 설정해 주지 않으면 5V이지만 이 함수를 이용하여 다른 값을 설정해 줄 수 있다. type의 종류는 다음과 같다.


  • DEFAULT : 아두이노의 동작 전압(우노는 5V 이고 보드에 따라서 3.3V일 수 있다.)

  • INTERNAL : 내장 전압 (우노는 1.1V)

  • EXTERNAL : AREF핀에 인가된 전압 (0~ 5V 사이어야 됨)

  • INTERNAL1V1 : 내장된 1.1V (Arduino Mega에서만 사용된다.)

  • INTERNAL2V56 : 내장 2.56V (Arduino Mega 에서만 사용됨)


아두이노 우노와 관련된 옵션은 DAFAULT, INTERNAL, EXTERNAL 세 개 이며 별도로 설정하지 않는다면 기본적으로 DEFAULT가 사용된다.


 만약 INTERNAL로 설정하면 기준 전압이 1.1V이므로 기본 모드보다 더 높은 분해능(0.0011V)을 얻을 수 있으며 약 4.5배(=5/1.1)의 증폭효과가 있다.


 만약 3.3V를 기준 전압으로 사용하고 싶다면 우노 보드상의 3.3V핀과 AREF 핀을 결선한 후 EXTERNAL 옵션을 설정하면 된다. (다음 그림 참조) 이 경우 분해능은 0.0032V 이고 5V를 기준 전압으로 사용하는 경우 대비 약 1.5배의 증폭 효과가 있다. 아두이노 우노의 3.3V 핀은 외부 전원(7V~12V)을 연결한 경우뿐만 아니라 USB만 연결한 경우에도 정확히 3.3V 전압을 출력하므로 편리하게 사용할 수 있다.



<그림 2> 3.3V 와 AREF 연결도

♦ 만약 아날로그 핀의 기준 전압을 3.3V를 사용하고 싶다면 그림과 같이 연결한 후 setup()함수 내에서

         analogReference(EXTERNAL);

로 설정한다. 5V 기준 전압에 비해서 약 1.5배의 증폭 효과가 있다.

♦ 아두이노 우노의 3.3V 핀은 외부 전원(7V~12V)을 연결한 경우뿐만 아니라 USB만 연결한 경우에도 정확히 3.3V 전압을 갖는다.



아두이노 강좌 전체 목록 (TOP) >>>

C++ 언어 전체 강좌 목록 >>>

c{ard},n{ad020}

Posted by 살레시오
,

 아두이노 우노의 A0부터 A5 까지 6개의 핀을 이용하여 아날로그 입력을 받을 수 있는데 디지털 핀이 0과 1 두 값 만을 입출력으로 가지는 것과는 달리 아날로그 핀은 그 전압을 0~1023 의 정수값으로 변환하여 읽어들인다.


[그림 1] A0~A5 핀과 AREF핀

A0~A5핀으로 아날로그 입력을 받는다.

AREF핀은 아날로그 기준 전압을 설정한다.


아날로그 핀은 0~5V 사이의 전압 값을 0~1023 사이의 정수값으로 변환시킨다. 이것을 A/D변환(analog-to-digital conversion)이라고 한다. 따라서 분해능은 0.0049V (4.9mV = 5V/1024)이며 이 때 사용되는 함수가 analogRead()함수이다.


ananlogRead(pin)


입력 인수로 0(또는 A0), 1(또는 A1), … 5(또는 A5)를 주고 리턴값은 int형으로서 앞에서 언급한 대로 0~1023 값이다. 변환 시간은 100micro-sec 으로서 이론상으로는 1초에 10000번 정도 변환이 가능하다. 아날로그 핀은 디지털 핀과 달리 기본적으로 입력으로 설정되어 있으므로 별도로 입력을 설정하는 과정 없이 바로 위의 함수를 이용할 수 있다.


 한 가지 알아두어야 할 점은 아두이노 우노의 경우 다음 세 가지 방법은 같은 동작을 수행한다.


[표 1] 아두이노 우노의 analogRead()함수 동작에 사용되는 상수

방법1

방법2

방법3

비고

analogRead(0)

analogRead(A0)

analogRead(14)

A0 == 14

analogRead(1)

analogRead(A1)

analogRead(15)

A1 == 15

analogRead(2)

analogRead(A2)

analogRead(16)

A2 == 16

analogRead(3)

analogRead(A3)

analogRead(17)

A3 == 17

analogRead(4)

analogRead(A4)

analogRead(18)

A4 == 18

analogRead(5)

analogRead(A5)

analogRead(19)

A5 == 19


즉, analogRead(0)과 analogRead(A0) 그리고 analogRead(14) 는 내부적으로 같은 동작을 수행한다. 왜냐면 상수 A0, A1, …, A5 는 내부적으로 다음과 같이 14,15,...,19로 정의되어 있기 때문이다.


              #define A0  14

              #define A1  15

              ….

              #define A5  19


(필자는 처음에 상수 A0 는 내부적으로 0으로 정의되었을 것으로 짐작을 했었는데 그게 아니었다.) 보통은 [표 1]의 <방법1> 혹은 <방법2> 를 사용하고 <방법3>은 사용하지 않지만 내부적으로 A0상수가 14값을 갖는 다는 것은 알아두는 것이 좋은데 그 이유는 아날로그 핀을 디지털 핀으로 사용할 때 이 상수가 사용되기 때문이다. 디지털 핀이 13번 까지 있으므로 그 다음 숫자부터 아날로그 핀에 할당되었다는 것을 알 수 있다.


아두이노 강좌 전체 목록 (TOP) >>>

C++ 언어 전체 강좌 목록 >>>

c{ard},n{ad019}

Posted by 살레시오
,

 여기에서는 이전 포스트에 이어서 다른 인터럽트 방식에 대한 디바운싱 방법에 대해서 알아보도록 하겠다.

rising edge 의 경우 디바운싱

 이전과 같이 INT0핀에 택스위치를 연결하고, 이번에는 라이징 에지에 인터럽트가 걸리도록 설정되었다고 하자.


attachInterrupt(INT0, toggleLed, RISING);


앞의 경우와 반대로 ISR의 함수 처음에 일정시간 지연시킨 후 스위치 신호가 LOW일 때 그냥 리턴시키는데 그 이유는 falling edge에서 발생한 것이 때문이다.


void isr() {
   _delay_ms(80);
   if (digitalRead(SW)==LOW) return;
   …
   <실제 인터럽트 처리 루틴>
}


changing edge 의 경우 디바운싱

 이번에는 changing edge, 즉 falling과 rising edge 모두에서  인터럽트가 걸리도록 설정되었다고 하자.


attachInterrupt(INT0, toggleLed, CHANGE);


이 경우는 하나의 에지에서 두 개 이상의 인터럽트가 걸리는 것을 막기 위해서 단순히  지연시키는 것으로 충분하다.


void isr() {
   _delay_ms(80);
   <실제 인터럽트 처리 루틴>
   ….
}


low 인터럽트 의 경우 디바운싱

 마지막으로  low 신호에서  인터럽트가 걸리도록 설정되었다고 하자. 이 인터럽트는 핀 신호가 low 이면 몇 번이고 반복해서 인터럽트가 걸리도록 하려는 의도로 설정되는 것이다. 즉 INT0핀이 low 상태이면 ISR을 수행한 후 그래도 low상태이면 ISR이 바로 다시 수행된다. 이런 식으로 low 상태일 경우에는 계속 ISR이 반복으로 수행된다.


attachInterrupt(INT0, toggleLed, LOW);


따라서 이 경우는 별도의 디바운싱이 필요치 않다.


아두이노 강좌 전체 목록 (TOP) >>>

C++ 언어 전체 강좌 목록 >>>

c{ard},n{ad018}

Posted by 살레시오
,