Arduino 개발 플랫폼은 원래 2005 년에 예술 디자인 프로젝트를위한 사용하기 쉬운 프로그래밍 가능 장치로 개발되었습니다. 그 의도는 비 엔지니어가 프로그래밍 지식 없이도 기본 전자 장치와 마이크로 컨트롤러로 작업 할 수 있도록 돕는 것이 었습니다. 그러나 사용하기 쉬운 특성 때문에 곧 전 세계의 전자 공학 초보자와 애호가들에게 적용되었으며 오늘날에는 프로토 타입 개발 및 POC 개발에도 선호되고 있습니다.
Arduino로 시작하는 것은 좋지만 AVR, ARM, PIC, STM 등과 같은 핵심 마이크로 컨트롤러로 천천히 이동하고 기본 애플리케이션을 사용하여 프로그래밍하는 것이 중요합니다. 아두 이노 프로그래밍 언어 는 대부분의 작업이 digitalWrite (), AnalogWrite (), Delay () 등과 같은 미리 빌드 된 함수에 의해 수행 되기 때문에 매우 이해하기 쉽고 낮은 수준의 기계어가 숨겨져 있기 때문입니다. Arduino 프로그램은 레지스터 비트를 처리하고 프로그램의 논리에 따라 높거나 낮게 만드는 다른 Embedded C 코딩과 유사하지 않습니다.
지연없는 Arduino 타이머:
따라서 미리 빌드 된 함수 내에서 무슨 일이 일어나고 있는지 이해하려면 이러한 용어를 파헤쳐 야합니다. 예를 들어 delay () 함수를 사용 하면 ATmega 마이크로 컨트롤러 의 타이머 및 카운터 레지스터 비트 가 실제로 설정 됩니다.
이 arduino 타이머 자습서 에서는이 delay () 함수의 사용을 피하고 대신 실제로 레지스터 자체를 처리합니다. 좋은 점은이를 위해 동일한 Arduino IDE를 사용할 수 있다는 것입니다. 타이머 레지스터 비트를 설정하고 타이머 오버플로 인터럽트를 사용하여 인터럽트가 발생할 때마다 LED를 토글합니다. 타이머 비트의 프리 로더 값은 푸시 버튼을 사용하여 인터럽트가 발생하는 기간을 제어 할 수도 있습니다.
임베디드 전자 제품의 TIMER은 무엇입니까?
타이머는 일종의 인터럽트입니다. 이벤트의 시간 간격을 측정 할 수있는 단순한 시계와 같습니다. 모든 마이크로 컨트롤러에는 클럭 (오실레이터)이 있습니다. 예를 들어 Arduino Uno에서는 16Mhz입니다. 이것은 속도를 담당합니다. 클럭 주파수가 높을수록 처리 속도가 높아집니다. 타이머는 클럭 주파수에 따라 특정 속도로 카운트하는 카운터를 사용합니다. Arduino Uno에서 단일 카운트를 만드는 데 1/16000000 초 또는 62nano 초가 걸립니다. Arduino는 62 나노초마다 한 명령에서 다른 명령으로 이동합니다.
Arduino UNO의 타이머:
Arduino UNO에는 서로 다른 기능에 사용되는 세 개의 타이머가 있습니다.
타이머 0:
8 비트 타이머로 delay (), millis ()와 같은 타이머 함수에 사용됩니다.
타이머 1:
16 비트 타이머이며 서보 라이브러리에서 사용됩니다.
타이머 2:
8 비트 타이머이며 tone () 함수에 사용됩니다.
Arduino 타이머 레지스터
타이머 구성을 변경하기 위해 타이머 레지스터가 사용됩니다.
1. 타이머 / 카운터 제어 레지스터 (TCCRnA / B):
이 레지스터는 타이머의 주 제어 비트를 보유하고 타이머의 프리스케일러를 제어하는 데 사용됩니다. 또한 WGM 비트를 사용하여 타이머 모드를 제어 할 수 있습니다.
프레임 형식:
TCCR1A | 7 | 6 | 5 | 4 | 삼 | 2 | 1 | 0 |
COM1A1 | COM1A0 | COM1B1 | COM1B0 | COM1C1 | COM1C0 | WGM11 | WGM10 |
TCCR1B | 7 | 6 | 5 | 4 | 삼 | 2 | 1 | 0 |
ICNC1 | ICES1 | - | WGM13 | WGM12 | CS12 | CS11 | CS10 |
프리스케일러:
TCCR1B의 CS12, CS11, CS10 비트는 프리스케일러 값을 설정합니다. 프리스케일러는 타이머의 클럭 속도를 설정하는 데 사용됩니다. Arduino Uno에는 1, 8, 64, 256, 1024의 프리스케일러가 있습니다.
CS12 | CS11 | CS10 | 사용하다 |
0 | 0 | 0 | 시계 타이머 없음 STOP |
0 | 0 | 1 | CLCK i / o / 1 프리 스케일링 없음 |
0 | 1 | 0 | CLK i / o / 8 (프리스케일러에서) |
0 | 1 | 1 | CLK i / o / 64 (프리스케일러에서) |
1 | 0 | 0 | CLK i / o / 256 (프리스케일러에서) |
1 | 0 | 1 | CLK i / o / 1024 (프리스케일러에서) |
1 | 1 | 0 | T1 핀의 외부 클록 소스. 하강 에지에 시계 |
1 | 1 | 1 | T1 핀의 외부 클록 소스. 상승 에지에 시계. |
2. 타이머 / 카운터 레지스터 (TCNTn)
이 레지스터는 카운터 값을 제어하고 프리 로더 값을 설정하는 데 사용됩니다.
필요한 시간 (초)에 대한 프리 로더 값 공식:
TCNTn = 65535 – (16x10 10 xTime in sec / Prescaler Value)
2 초 동안 timer1에 대한 프리 로더 값을 계산하려면 다음을 수행하십시오.
TCNT1 = 65535 – (16x10 10 x2 / 1024) = 34285
Arduino 타이머 인터럽트
우리는 이전에 Arduino 인터럽트에 대해 배웠고 Timer 인터럽트가 일종의 소프트웨어 인터럽트라는 것을 보았습니다. Arduino에는 아래에 설명 된 다양한 타이머 인터럽트가 있습니다.타이머 오버플로 인터럽트:
타이머가 최대 값 (16 Bit-65535)에 도달 할 때마다 타이머 오버플로 인터럽트 가 발생합니다. 따라서 ISR 인터럽트 서비스 루틴은 타이머 인터럽트 마스크 레지스터 TIMSKx에있는 TOIEx에서 타이머 오버플로 인터럽트 비트가 활성화 될 때 호출됩니다.
ISR 형식:
ISR (TIMERx_OVF_vect) { }
출력 비교 레지스터 (OCRnA / B):
여기서 Output Compare Match Interrupt가 발생하면 인터럽트 서비스 ISR (TIMERx_COMPy_vect)이 호출되고 OCFxy 플래그 비트도 TIFRx 레지스터에 설정됩니다. 이 ISR은 TIMSKx 레지스터에있는 OCIExy에서 활성화 비트를 설정하여 활성화됩니다. TIMSKx는 Timer Interrupt Mask Register입니다.
타이머 입력 캡처:
다음으로 타이머 입력 캡처 인터럽트가 발생하면 인터럽트 서비스 ISR (TIMERx_CAPT_vect)이 호출되고 ICFx 플래그 비트도 TIFRx (타이머 인터럽트 플래그 레지스터)에 설정됩니다. 이 ISR은 TIMSKx 레지스터에있는 ICIEx의 활성화 비트를 설정하여 활성화됩니다.
필요한 구성 요소
- Arduino UNO
- 푸시 버튼 (2)
- LED (모든 색상)
- 10k 저항기 (2), 2.2k (1)
- 16x2 LCD 디스플레이
회로도
Arduino UNO와 16x2 LCD 디스플레이 간의 회로 연결:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
LCD의 콘트라스트 제어를위한 전위차계 중앙 핀에 |
RS |
8 |
RW |
GND |
이자형 |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
ㅏ |
+ 5V |
케이 |
GND |
10K의 풀다운 저항이있는 두 개의 푸시 버튼 은 Arduino 핀 2 및 4에 연결되고 LED는 2.2K 저항을 통해 Arduino의 PIN 7에 연결됩니다.
설정은 아래 이미지와 같습니다.
Arduino UNO 타이머 프로그래밍
이 튜토리얼에서는 TIMER OVERFLOW INTERRUPT 를 사용하고 푸시 버튼을 사용하여 프리 로더 값 (TCNT1)을 조정하여 특정 기간 동안 LED를 켜고 끄는 데 사용합니다. Arduino Timer에 대한 완전한 코드 가 마지막에 제공됩니다. 다음은 코드를 한 줄씩 설명합니다.
프로젝트에서 프리 로더 값을 표시하기 위해 16x2 LCD를 사용하므로 액정 라이브러리를 사용합니다.
#포함
Arduino 핀 7과 연결된 LED 양극 핀은 ledPin 으로 정의됩니다.
#define ledPin 7
다음으로 Arduino UNO에 연결된 LCD 핀 (RS, E, D4, D5, D6, D7)으로 Liquid Crystal 클래스에 액세스하기위한 객체를 선언합니다.
LiquidCrystal lcd (8,9,10,11,12,13);
그런 다음 4 초 동안 프리 로더 값 3035를 설정하십시오. 프리 로더 값을 계산하려면 위의 공식을 확인하십시오.
부동 값 = 3035;
다음으로 void setup ()에서 먼저 LCD를 16x2 모드로 설정하고 몇 초 동안 환영 메시지를 표시합니다.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO 타이머"); 지연 (2000); lcd.clear ();
다음으로 LED 핀을 OUTPUT 핀으로 설정하고 푸시 버튼을 INPUT 핀으로 설정합니다.
pinMode (ledPin, OUTPUT); pinMode (2, INPUT); pinMode (4, INPUT);
다음으로 모든 인터럽트를 비활성화합니다.
noInterrupts ();
다음으로 Timer1이 초기화됩니다.
TCCR1A = 0; TCCR1B = 0;
프리 로더 타이머 값이 설정됩니다 (초기에는 3035).
TCNT1 = 값;
그런 다음 Pre scaler 값 1024가 TCCR1B 레지스터에 설정됩니다.
TCCR1B-= (1 << CS10)-(1 << CS12);
타이머 오버 플로우 인터럽트는 ISR을 사용할 수 있도록 타이머 인터럽트 마스크 레지스터에서 활성화됩니다.
TIMSK1-= (1 << TOIE1);
마침내 모든 인터럽트가 활성화됩니다.
인터럽트 ();
이제 digitalWrite를 사용하여 LED를 켜고 끄는 역할을하는 Timer Overflow Interrupt에 대한 ISR을 작성합니다. 타이머 오버플로 인터럽트가 발생할 때마다 상태가 변경됩니다.
ISR (TIMER1_OVF_vect) { TCNT1 = 값; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
에서 보이드 루프 (12) 프리 로더의 값을 증가 또는 같은 값이 16 × LCD에 표시되는 누름 버튼과 입력을 사용하여 감소.
if (digitalRead (2) == HIGH) { 값 = 값 +10; // 예압 값 올리기 } if ( digitalRead (4) == HIGH) { value = value-10; // 예압 값 감소 } lcd.setCursor (0,0); lcd.print (값); }
그래서 이것이 Arduino 프로그램에서 타이머를 사용하여 지연을 생성하는 방법입니다. 푸시 버튼을 사용하여 프리 로더 값을 늘리고 줄임으로써 지연 변화를 시연 한 아래 비디오를 확인하십시오.