공대생과 공부하기/전기공학 실험 보고서

[전기전자공학 실험] 아두이노 타이머(Timer) 기초 : 예비보고서

전기과 팡팡이 2019. 9. 26. 19:13
728x90

실험 과정과 결과는 아래 링크로 들어가서 보시면 됩니다.

https://dailypangpang.tistory.com/15

 

아두이노 <타이머(Timer) 기초> : 실험 결과 보고서

<실험 결과> 1) 실험에서 작성한 각 프로그램의 작성, 실행 및 디버깅 과정을 순서대로 자세히 기술한다. 2) 프로그램 실행 후 회로가 어떻게 동작 하는 지와, 관련된 측정 결과로 최대한 정확히 묘사해 기술한다...

dailypangpang.tistory.com


1. 개요

 아두이노에서 지원하는 타이머 기능과 관련된 기초적인 실험을 해보고 작동 원리를 이해한 후 멀티태스킹을 위한 응용 방법에 관해 학습한다.

 

2. 관련 이론

 

<타이머>

 정학한 시간의 측정은 많은 공학 문제에서 반드시 필요로 하는 기능 중 하나이다. 임베디드 시스템에서는 타이머가 이 시간 측정의 일을 담당하며, 정해진 클럭 펄스의 개수를 세는 방식으로 정확하게 시간을 잴 수 있다. 이 타이머는 측정이 필요한 시간을 밀리 레지스터에 설정을 해 두고, 다른 작업과 병행하게 이 타이머가 동작하다가, 설정한 조건에서 인터럽트를 발생시킴으로써 측정이 종료된다.

 

<SimpleTimer 라이브러리>

 아두이노에서는 복잡한 타이머 레지스터와 인터럽트를 몰라도 타이머를 손쉽게 사용할 수 있도록 라이브러리를 제공하고 있는데, 가장 널리 쓰이는 라이브러리가 SimpleTimer 라이브러리이다.

 

<타이머 인터럽트>

 특정 시간이 지난 후에 진행하고 있는 내용을 중지하고 입력한 프로그램을 실행시키거나 똑같은 간격으로 움직이도록 하기 위해 사용한다.

 * 인터럽트의 처리과정

  주 프로그램 실행 -> 인터럽트 발생 -> 복귀 주소 저장 -> 인터럽트 벡터로 점프 -> 인터럽트 처리 -> 복귀주소 로드 -> 마지막 실행 주소로 점프 -> 주 프로그램 실행

 

<SimpelTimer 라이브러리's Function>

아두이노 사이트에 가시면 라이브러리의 함수가 뭐가 있는지 직접 확인하실 수도 있습니다.

https://arduino.cc/

 

1) SimpleTimer()

  : 일반적으로 스케치에는 하나의 SimpleTimer 객체만 필요하다.

SimpleTimer timer;

 

2) int setInterval(long d, timer_callback f)

  : d 밀리초마다 함수 f를 호출한다. 콜백 함수는 void f()로 선언해야 한다.

void repeatMe() {
  //do something
}
timerId = timer.setInterval(1000, repeatMe);

 

3) int setTimeout(long d, timer_callback f)

  : d 밀리초 후에 함수 f를 한 번 호출한다. 콜백 함수는 void f()로 선언해야 한다. f가 호출된 후, 간격이 삭제되므로 timerId 값이 유효하지 않다.

void callMeLater() {
  //do something
}
timerId = timer.setTimeout(1000, callMeLater);

 

4) int setTimer(long d, timer_callback f, int n)

  : n초 동안 d 밀리초 마다 함수 f를 호출한다. 콜백 함수는 void f()로 선언해야 한다. f가 지정된 횟수만큼 호출된 후, 간격이 삭제되므로 timerId 값은 유효하지 않다.

void repeatMeFiveTimes() {
  //do something
}
timerId = timer.setTimer(1000, repeatMeFiveTimes, 5);

 

5) boolean isEnabled(int timerId)

  : 지정된 타이머가 활성화 된 경우 true를 반환한다.

if(timer.isEnabled(timerId)) {
  //do something
}

 

6) void enable(int timerId)

  : 지정된 타이머를 활성화 시킨다.

timer.enable(timerId);

 

7) void disable(int timerId)

  : 지정된 타이머를 비활성화시킨다.

timer.disable(timerId);

 

8) void toggle(int timerId)

  : 지정된 타이머가 비활성화되어 있다면 활성화시킨다. 그 반대의 경우도 마찬가지다.

timer.toggle(timerId);

 

9) void restartTimer(int timerId)

  : 지정된 타이머가 "지금"부터 카운트를 시작한다. (ex. restartTimer가 호출되는 순간) 타이머 콜백이 발생하지 않는다. 이 기능의 사용 사례는 워치독 타이머이며 코드는 다음과 같다.

void wdCallback() {
   사용자에게 경고하거나 프로그램 상태를 복원하는 작업 수행 (ex. 마이크로 프로세서 재설정)
}

wd_timer_id;

void setup() {
  wd_timer_id = timer.setInterval(10000, wdCallback);
}

void loop() {
  timer.run();
    크고 복잡한 중요 코드
  timer.restartTimer(wd_timmer_id);
}

 

10) void deleteTimer(int timerId)

  : 지정된 timerId 슬롯을 비운다. 더 이상 필요하지 않은 간격 슬롯이 있는 경우에만 이를 호출해야 한다. 지정된 반복 횟수가 실행되면 다른 타이머 유형은 자동으로 삭제된다.

 

11) void getNumTimers()

  : 타이머 객체에서 사용한 슬롯 수를 반환한다.

n = timer. getNumTimers();

 

3. 실험 기기

  랩톱 PC, 아두이노 우노 보드, 브레드보드, 전선, 저항, 스위치, LED, 오실로스코프

 

4. 예비 보고서 문제풀이

 

1) 시간 측정을 위해 타이머를 사용하는 대신, 정해진 시간 동안 동작을 멈추는 기능을 하는 함수인 delay() 함수를 사용해도 문제가 없는지 생각해보고, 문제가 있다며 무엇이 문제이며 타이머를 사용하면 왜 문제가 해결되는지 논리적으로 자세히 기술하시오.

 시간 측정을 위해서는 연속적인 값을 읽어 들이거나 출력할 수 있어야 한다. 반면에  delay() 함수는 비동기식 함수로서 순차적으로 동작하기 때문에 이 함수의 실행이 끝난 시점인 단면적인 시간만 확인할 수 있다. 즉, 연속적인 값을 확인할 수 없기 때문에 시간 측정에는 부적절하다.

 아두이노는 자체적인 타이머가 있는데, millis() 함수를 이용하여 아두이노의 타이머를 활용할 수 있다. 이 함수는 프로그램 실행 후 시간을 ms 단위로 반환하는 함수이다. 프로그램을 실행 후 경과한 시간을 곧바로 시리얼 모니터에 출력하는 코드를 예로 들면,

unsigned long time;

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

void loop() {
  time = millis();
  Serial.println(time);
}

 이를 업로드하고 실행하면 시리얼모니터에 1ms가 지날 때마다 그 값이 출력되어 확인할 수 있다. 이처럼 시간의 경과를 연속적인 값으로 읽어 들이고 출력이 가능하기 때문에 타이머를 사용해야 한다.

 

2) 타이머를 사용하면 왜 멀티태스킹이 가능한지 그 이유를 생각해보고 논리적으로 기술하시오.

 어떤 함수를 타이머를 사용하여 지정된 시간에 실행한다고 한다면 주 프로그램이 동작 중에 잠시 멈추어 인터럽트한다. 지정된 함수를 처리하고 콜백이 되면, 다시 주프로그램으로 돌아오게 된다. 그렇다면 주프로그램은 정지되어 있지만 지정된 시간에 따라 다른 여러 함수의 실행이 가능하다. 각각의 함수들이 타이머로 동작한다면 주프로그램이 정지하였더라도 여러 가지 동작을 수행할 수 있게 된다.

 

3) 타이머가 동작하는 원리를, LED가 1초마다 toggle 되는 기능을 예로 들어, 자세한 순서도 그림을 이용해 설명하시오. (프로그램이 아닌 순서 도임을 유의)

 프로그램이 실행되고 1초가 경과하기 전에는 toggle 되는 함수로 인터럽트 하지 않고, 1초가 경과하면 주 프로그램의 현재 실행 중이던 주소를 저장하여 toggle 되는 함수로 점프하여 LED를 toggle 시킨다. 이 함수의 실행이 끝나면 다시 저장했던 주소로 복귀하여 주프로그램의 동작을 실행한다.

 

4) 스위치 입력을 매 0.1초마다 인식하여, 스위치가 ON인 동안에는 LED가 0.5초에 한 번 toggle 되고, OFF인 동안에는 2초에 한 번 toggle 되는 기능을 구현하기 위한 자세한 순서도 그림을 그리시오.