아두이노 타이머 인터럽트 : MsTimer2
라이브러리 설치 방법, MsTimer2 라이브러리 사용 방법과 예제
에 대해 작성하였습니다.아두이노 타이머
Arduino Uno Board에 사용되는 메인 컨트롤러는 Atmega328입니다. Atmega328를 3개의 타이머를 가지고 있습니다. 아두이노는 이 타이머 3개를 가공하여, PWM 출력 및 시간 관련 함수들을 제공합니다.
- Timer0 - 8Bit : PWM 5/6핀, 시간 관련 함수 (
delay(),millis()등) - Timer1 - 16Bit : PWM 9/10핀 👉 외부 라이브러리
Servo.h와 함께 사용 불가 - Timer2 - 8Bit : PWM 3/11핀 👉 외부 라이브러리
MsTimer2.h와 함께 사용 불가
타이머 인터럽트 사용 방법
아두이노 라이브러리 매니저에서 제공되는 MsTimer2 라이브러리를 사용하면, 손쉽게 타이머 인터럽트를 구성 할 수 있습니다. MsTimer2 라이브러리에서 Timer Interrupt 와 관련된 함수는 아래와 같습니다.
MsTimer2::set()타이머 인터럽트 발생 시간 설정 - 최대 약 49.7日MsTimer2::start()타이머 인터럽트 활성화MsTimer3::stop()타이머 인터럽트 비활성화
MsTimer2 라이브러리 설치 방법
MsTiemr2 라이브러리는 Arduino IDE 의 라이브러리 매니저를 사용하면 쉽게 설치가 가능합니다. 설치 방법은 아래의 그림을 참고해주세요.
MsTimer2::set()
MsTimer2::set() 함수는 타이머 인터럽트 발생 시간과, 타이머 인터럽트 발생시 실행 될 함수명을 설정합니다.
Syntax
- MsTimer2::set(unsinged long ms, void (*f)())
Parameters
- ms : 타이머 인터럽트를 발생 시킬 ms 단위의 시간 (Datatype : unsigned long)
- void (*f)() : ms 시간 간격으로 실행 될 함수 명 - 반환 값이 없는 함수
Returns : 없음
Example
MsTimer2::set(100, timerIRQ): 100ms 마다void timerIRQ()함수를 실행하도록 설정
MsTimer2::start()
MsTimer2::start() 함수는 타이머 인터럽트를 활성화 합니다. 이 코드가 작성된 시간일 기준으로 시간 측정을 진행 합니다.
Syntax
- MsTimer2:start()
MsTimer2::stop()
MsTimer2::stop() 함수는 타이머 인터럽트를 비활성화 합니다.
Syntax
- MsTimer2::stop()
타이머 인터럽트 써먹기
예제 : 아두이노 내장 보드 점멸
아래는 500ms 간격으로 Arduino Uno 보드 내장 LED 를 점멸 하는 코드와 실행 결과 입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <MsTimer2.h> const int ledPin = 13; volatile boolean state = true; void setup(){ pinMode(ledPin, OUTPUT); MsTimer2::set(500, ledBlink); MsTimer2::start(); } void loop(){ //statement1~ //statement2 } void ledBlink(){ digitalWrite(ledPin, state); state = !state; } | cs |
blink 예제 비교
아래의 3가지 코드는 500ms 마다 LED 가 점멸 하는 코드 입니다. 각각 delay(), millis(), Timer Interrupt 로 구성된 코드 입니다. LED 를 점멸하는 한 가지 기능만 있는 경우 모두 동일하게 동작하겠지만, 다른 기능들이 추가되는 경우 어떤 방식으로 구현 하는 것이 좋을지 선택이 필요합니다.
LED blink 코드 구현 방법 3가지
코드 종류별 순서도
delay()로 구현delay()는 시간 지연을 하는 함수로, 여러가지 기능 구현하는 코드 작성에는 지양해야 할 함수millis()로 구현- statement1 와 statement2 의 수행 시간에 따라 LED toggle 기능 약간의 지연이 발생 할 수 있음
- Timer2를 다른 용도로 사용해서 MsTimer2를 사용하지 못하는 경우 대안이 가능
Timer Interrupt로 구현- 타이머 인터럽트 처리 문이 Loop() 문의 기능보다 우선순위가 높아 500ms 간격으로 LED toggle 가능
더 세분화된 타이머 설정
본 포스트에서 소개한 MsTimer2 라이브러리는 최소 ms 단위의 시간으로 타이머 인터럽트 발생이 가능합니다. ms시간 단위보다 더 세분화된 타이머 설정이 필요하면 1FlexiTimer2.h 라이브러리를 사용하는 방법이 있습니다. FlexiTiemr2.h 를 사용하면 최대 1/3ms 단위로 타이머 설정이 가능합니다. 사용법은 MsTimer2.h 와 유사하니, 필요하시면 각주를 참조해주세요.
마무리
본 포스트에서는 외부 라이브러리 추가 방법, 아두이노의 타이머 사용처에 대해 알아보고, MsTimer2 라이브러리를 사용하여 타이머 인터럽트 구현 방법과, 사용 예제에 대해 작성하였습니다.
끝까지 읽어 주셔서 감사합니다.^^
- 더 센분화된 타이머 인터럽트 설정 : https://playground.arduino.cc/Main/FlexiTimer2/ [본문으로]
'Embedded > Arduino' 카테고리의 다른 글
아두이노 팁 #2. Visual Studio Code로 아두이노 프로그래밍 장점 (feat. Arduino IDE 불편해) (1) | 2020.07.15 |
---|---|
아두이노 강좌 #15 시리얼 통신 포트 추가로 사용하기 SoftwareSerial.h (0) | 2020.07.14 |
아두이노 강좌 #13 아날로그 출력 PWM 와 analogWrite() (0) | 2020.07.11 |
아두이노 강좌 #12 아날로그 입력 analogRead() 와 map() 함수 (1) | 2020.07.11 |
아두이노 강좌 #11 시리얼 UART 수신 인터럽트 serialEvent() (5) | 2020.07.10 |