'분해능'에 해당되는 글 2건

  1. 2017.03.19 아날로그 입력 및 온도계 예제
  2. 2017.03.18 아날로그 입력
Embedded Lecture/Arduino2017. 3. 19. 10:07


아날로그 입력 핀에 온도 센서를 연결하여 실시간으로 Arduino IDE 환경의 PC 모니터링 창에 실시간으로 현재의 온도를 일정 시간 간격으로 보여주는 예제입니다. 사용할 온도 센서는 LM35-DZ인데, 이는 3단자 소자로 전원공급 단자, GND 그리고 출력단자로 구성되며 제조사가 제공하는 간단한 응용회로는 다음과 같습니다.


 


이 소자는 0~100˚C를 측정할 수 있는 센서로 5V의 전원전압을 공급하면 섭씨 1˚C 변화에 10mV의 전압을 출력합니다. 따라서 현재 온도가 섭씨 100˚C라면 출력전압은 100˚C*10mV=1V가 됩니다. 결국 온도 센서는 LM35-DZ는 0~100˚C 사이의 섭씨 온도 변화에 대해서 비례적으로 0~1V의 출력전압을 내보내게 됩니다.


void setup() {

    Serial.begin(9600);

}


void loop() {

    Serial.println(getTemp());

    delay(1000); // 1s에 시간지연을 줍니다.

}


float getTemp() {

    short sVal = analogRead(A0); // Default 모드로 최대 5V를 1024 레벨의 값으로 읽습니다.

    float voltage = sVal*5.0/1024; // 실제로 읽어드린 아날로그 값으로 변환합니다.

    return voltage*100; // 섭씨 온도로 환산하여 반환합니다.

}


위 코드는 결국 온도 센서를 이용하여 매 1s마다 측정된 섭씨 온도를 Arduino IDE 환경의 PC 모니터 창에 지속적으로 보여주게 됩니다.


<1초마다 온도를 감지하여 표시하는 결과 화면>


만일 ADC의 기준 전압으로 내부 전압인 1.1V를 사용한다면 분해능(resolution)은 약 5배 정도 개선되는 효과를 얻을 수 있으므로 위의 코드를 기준 전압을 내부 전압으로 사용하는 코드로 수정하였습니다. 단, 온도 센서는 100˚C까지만 유효하고 따라서 센서의 최대 전압은 1V까지만 유효하게 됩니다.


#define SUPPLY_VOLTAGE 1.1


void setup() {

    Serial.begin(9600);

    analogReference(INTERNAL); // ADC의 기준 전압을 내부 전압 1.1V로 사용함을 지정합니다.

}


void loop() {

    Serial.println(getTemp());

    delay(1000);

}


float getTemp() {

    short sVal = analogRead(A0);

    float voltage = sVal*SUPPLY_VOLTAGE/1024;

    return voltage*100;

}



'Embedded Lecture > Arduino' 카테고리의 다른 글

아두이노 라이브러리의 설치  (0) 2017.04.11
아날로그 출력(PWM)  (0) 2017.03.20
아날로그 입력  (0) 2017.03.18
인터럽트와 volatile 지시자  (1) 2017.03.18
아두이노의 TWI(I2C) 통신  (0) 2017.03.18
Posted by Nature & Life
Embedded Lecture/Arduino2017. 3. 18. 17:19


Arduino Uno 보드의 A0~A5까지 6개의 핀을 이용하여 아날로그 입력을 받을 수 있습니다. 디지털 핀은 '0'과 '1'의 논리적 값만을 받을 수 있는 것과는 달리, 아날로그 입력은 전압을 그대로 읽고 이를 1024개의 레벨로 구분하고 0~1023 중의 정수값으로 읽어들인다는 것입니다.



이것이 가능한 이유는 ATmega328 칩 내부에는 10bit A/D 컨버터(analog-to-digital converter, ADC)를 내장하고 있기 때문이며, 2^10=1024개의 레벨로 구분할 수 있다는 것은 이 컨버터의 분해능(resolution)이 전원전압 5V를 기준으로 0.0049V(4.9mV = 5V/1024)라는 말이며, 아날로그 전압을 읽어들이는 명령은 analogRead() 함수입니다.


ananlogRead(pin)


인수로는 아날로그 입력 핀의 번호를 지정하고 반환값은 int 형으로 0~1023 값 중의 하나가 됩니다. 이때 입력 핀은 0~5 혹은 A0~A5, 14~19로 지정할 수 있으며, 여기서 핀 번호 0과 A0, 14는 같은 핀을 의미합니다. A/D 변환 시간은 100us인데, 이는 사실 느린 편으로 간단한 비교만을 원할 때는 칩 내부에 포함된 빠른 비교기(comparator)를 대신 사용하게 됩니다. 아날로그 핀은 디지털 핀과 달리 기본적으로 입력으로 설정되어 있으므로 별도로 입력을 설정하는 과정이 필요 없습니다.


아날로그 핀에 연결된 A/D Converter(혹은 ADC)의 기준 전압을 바꿀 수 있는데, 이때 analogReference() 함수를 사용합니다.


ananlogReference(type)

  

A/D Converter의 기준 전압은 아날로그 입력값이 1023으로 읽히는 최대 전압 값을 의미합니다. 위 함수로 지정하지 않으면 디폴트(DEFAULT)로 Arduino의 동작 전압이며, 외부 전압(EXTERNAL)을 사용할 경우에는 아날로그 핀의 전압을 읽기 전에 반드시 미리 설정해야 합니다. 내부 전압(INTERNAL) 1.1V를 사용할 경우에 가장 안정된 기준전압을 제공함을 기억해야 합니다.


DEFAULT : Arduino의 동작 전압(Uno는 5V 이고 보드에 따라서 3.3V일 수도 있습니다.)

INTERNAL : 내장 전압 (Uno는 1.1V)

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


INTERNAL로 설정되어 기준 전압이 1.1V이면 디폴트보다 더 높은 분해능(0.0011V)을 얻을 수 있습니다. 만일 3.3V를 기준 전압으로 사용하고 싶다면 Arduino Uno 보드상의 3.3V핀과 AREF 핀을 연결 후 EXTERNAL 옵션을 설정하면 됩니다. 이 경우에 분해능은 0.0032V로 분해능이 개선될 수 있습니다. 보드의 3.3V 핀은 7~12V의 외부 전원을 연결한 경우 뿐만 아니라 USB만 연결한 경우에도 레귤레이터(regulator)를 사용하여 정확히 3.3V 전압을 출력합니다. 만일 Uno 보드의 동작 전압인 5V보다 높은 전압을 읽을 경우에는 외부에서 [정밀] 저항으로 voltage divider를 결선해야 합니다.



'Embedded Lecture > Arduino' 카테고리의 다른 글

아날로그 출력(PWM)  (0) 2017.03.20
아날로그 입력 및 온도계 예제  (0) 2017.03.19
인터럽트와 volatile 지시자  (1) 2017.03.18
아두이노의 TWI(I2C) 통신  (0) 2017.03.18
아두이노의 시리얼 통신  (0) 2017.03.18
Posted by Nature & Life