Arduino 타이머, 카운터

이도현·2023년 8월 9일
0

아두이노 학습

목록 보기
9/34

1. 500ms초마다 LED 토글

#include <Led.h>

Led led(8);
boolean led_val = LOW;

void setup(){
}

void loop(){
	delay(500);
	led_val = !led_val;
	led.setValue(led_val);
}

  • PWM(펄스 폭 변조): 가장 일반적인 전압 제어방법. 일정한 주기에서, 출력이 필요로 하는 만큼의 전력을 스위치 ON하여 입력으로부터 공급 받습니다.

2. 타이머

1) Timer0

  • 8비트 타이버
  • delay(), millis(), micros()에서 사용

2) Timer1

  • 16비트 타이버
  • 우노보드의 경우 서보모터 라이브러리(Servo) 함수에서 사용
  • Timer1 인터럽트 사용 시에는 서보 모토 관련 함수 사용 불가
  • D9핀과 D10핀의 PWM 출력 기능도 사용 불가

3) Timer2

  • 8비트 타이머
  • tone() 함수 등에 사용
  • Timer2 인터럽트 사용 시에는 tone() 함수 사용 불가
  • D3핀과 D11핀의 PWM 출력 기능 사용 불가

3. Timer2

1) 라이브러리 매니저로 MsTimer2 검색 후 설치
2) MsTimer2::set(unsigned long ms, void(*F)())

  • 기능: 타이머2의 인터럽트 주기를 ms 단위로 설정하여, 설정된 시간이 경과되면 함수 f가 실행된다. 따라서. 설정된 시간마다 계속 함수 f가 실행된다.
  • 매개변수
    ms
    f
// 타이머2 인터럽트 이용 LED 1초마다 토글
#include <Led.h>
#include <MsTimer2.h>

boolean led_val = LOW;
Led led(8);

void setup(){
	// 타이머2 인터럽트 설정 및 동작시작
	MsTimer::set(500, flash);
	MsTimer::start();
}

void loop(){
}

//타이머2 인터럽트 함수, 500ms 마다 자동 실행
void flash()
{
	led_val = !led_val;
	led.setValue(led_val);
}

4. Timer1

1) 라이브러리 매니저에서 TimerOne 검색 후 설치
2) void Timer1.initilalize(unsgined long perion)

  • 기능: 타이머1을 초기화하며, 타이머1 라이브러리에서 제공하는 함수들을 사용하기 위해서는 이 함수를 우선 실행해야 한다. us단위로 타이머의 인터럽트 주기를 지정할 수 있다.(PMW 출력핀 ~9, ~10의 PWM 출력기능은 사용할 수 없다.)
  • 매개변수
    period: us 단위의 주기 값(unsigned long)


// LED 1초마다 토글, 타이머1 인터럽트 이용
#include <Led.h>
#include <TimerOne.h>

boolean led_val = LOW;
Led led(8);

void setup(){
	//타이머 1 인터럽트 시작
	Timer1.initialize(500000); // 500 ms 초
	Timer1.attachinterrupt(false);
}

void loop(){
}

// 타이머 1 인터럽트 함수, 
void flash(){
	led_val = !led_val;
	Led.setValue(led_val);
}

5. SimpleTimer

1) https://github.com/jfturcot/SimpleTimer 설치

  • millis()를 기반으로 동작 → 1mS 해상도를 가짐
  • polling 방식 사용
  • loop()함수에서 run() 메서드를 호출
  • 콜백함수가 실행되었을 때 정확한 동작을 보장하지 않음
  • SimpleTimer 한번 실행 시 5mS가 소요
    (인터벌을 2mS로 지정하면 제대로 작동하지 않음)
    (인터벌 타이머로 사용시에는 최소 5mS 이상의 인터벌 설정이 필요)

2) 주요 메서드

  • SimpleTimer(): 생성자

  • int setInerval(long d, timer_callback f)

    d 밀리초마다 함수 f를 호출
    f 의 sigature: void f()
    Timer ID 리턴

  • int setTimeout(long d, timer_callback f)

    d 밀리초 후에 함수 f 호출
    한 번만 호출

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

    d 밀리초마다 함수 f를 호출하되, n번 호출 이후 삭제됨

#include <SimplerTimer.h>

SimpleTimer timer;

//callback 함수
void repeatMe(){
	Serial.print("Uptime (s): ");
	Serial.println(millis() / 1000);
]

void setup(){
	serial.begin(9600);
	timer.setInterval(1000),repeatMe);
}

void loop(){
	timer.run();
}
profile
좋은 지식 나누어요

0개의 댓글