Arduino Timer: 프로젝트에서 타이밍을 가지고 놀기

타이머 기능 Arduino UNO

얼마 전에 우리는 에 대한 더 많은 정보를 발표했습니다. 밀리() 함수 de 아두 이노이제 우리는 더 깊이 파고들 것입니다 아두이노 타이머, 기능에 대한 이 기능을 시작하려면 이 보드가 MCU와 함께 시간을 관리하는 방법과 millis() 이외의 다른 기능을 이해하십시오.

아두이노 타이머란?

아두이노 타이머

El Arduino 타이머 또는 타이머, 클럭 덕분에 임시 이벤트를 제어할 수 있는 하드웨어(마이크로컨트롤러에서 클럭 펄스를 생성하고 "리듬"을 설정하는 "리듬"을 설정하는 마이크로컨트롤러에서)로 구현된 기능입니다. 내부의. 예를 들어, 스케치 코드와 별도로 작업을 간격으로 수행하고 정확한 시간 측정 등을 수행합니다.

코모 Arduino UNO 그것은 16Mhz에서 작동하는 MCU 칩을 가지고 있으며 16.000.000초에 16을 실행할 수 있습니다. 명령어를 실행하려면 X 사이클이 필요하며 모든 명령어가 동일한 클록 사이클에서 실행되는 것은 아닙니다. 예를 들어 XNUMX비트 명령어는 이 AVR 아키텍처에서 더 많은 사이클이 필요합니다.

사용한다고 상상해보십시오. 지연() 함수, 이것은 지정된 시간이 경과할 때까지 Arduino MCU에서 실행을 차단한 다음 프로그램을 계속하지만 타이머는 차단하지 않습니다. MCU가 계속해서 다른 명령을 동시에 실행하기 때문에 타이밍이 됩니다. 그것이 큰 장점입니다.

타이머는 다음과 관련이 있습니다. 방해 특정 작업에 참석하기 위해 Arduino를 통해 실행될 것이기 때문입니다. 즉, 아두이노 타이머는 특정 시간에 트리거되어 인터럽트 기능을 실행하는 기능입니다. 그렇기 때문에 이러한 중단에 대해 아는 것도 중요합니다.

모 도스

아두이노 타이머는 2 가지 작동 모드, 다음에서 사용할 수 있습니다.

  • PWM 신호: 제어할 수 있습니다. 아두이노 핀(~).
  • CTC(비교 시 타이머 지우기): 카운터 내부의 시간을 카운트하고 타이머의 레지스터에 지정된 값에 도달하면 인터럽트를 실행합니다.

몇 개의 타이머가 있습니까? 타이머의 종류

Arduino UNO 밀리 함수

그곳에 3 타이머 접시에 Arduino UNO, 다른 상판에 더 있을 수 있지만:

  • 타이머 0: 8비트, 0에서 255까지 셀 수 있습니다(256개의 가능한 값). delay(), millis() 및 micros()와 같은 함수에서 사용됩니다. 프로그램을 변경하지 않도록 수정하지 않는 것이 좋습니다.
  • 타이머 1: 타이머 0과 같습니다. UNO의 서보 라이브러리에서 사용합니다(MEGA의 경우 타이머 5).
  • 타이머 2: 16비트이며 0에서 65.525(65.536개의 가능한 값) 범위일 수 있습니다. tone() 함수에 사용되며, 사용하지 않을 경우 애플리케이션에 자유롭게 사용할 수 있습니다.
  • 타이머 3, 4, 5(Arduino MEGA에만 해당): 모두 16비트.

Arduino 타이머는 어떻게 작동합니까?

타이머, 타이머

가능하려면 Arduino 타이머로 작업, 이 모든 것이 이 개발 보드의 MCU에서 전자적으로 어떻게 작동하는지 아는 것이 중요합니다.

  • 클럭 주파수: 16초에 개발할 수 있는 사이클 수이며, 아두이노의 경우 16.000.000Mhz이며, 클럭 신호가 XNUMX초에 XNUMX번 진동합니다(주기).
  • 마침표: 는 T로 표시되며 초 단위로 측정되며 주기의 역수입니다. 예를 들어 T=1/C는 1/16000000 = 0.0000000625가 되며 각 주기가 완료되는 데 걸리는 시간입니다. 그리고 주파수는 주기의 역수이므로 f = 1/T입니다.
  • 주기: 단위 시간당 발생하는 신호의 각 반복입니다. Arduino에서는 16초에 16M이 됩니다. 또는 같은 경우, 이 경우 625만 사이클이 지나면 XNUMX초가 경과합니다. 따라서 한 주기는 XNUMXns가 소요된다고 할 수 있습니다.
  • 신호의 가장자리: 클럭 신호는 정사각형이며 에지가 상승 또는 하강할 수 있습니다. 에지는 다음에서 변경될 때 신호의 직선입니다.
    • 0(낮음) ~ 1(높음): 상승 에지.
    • 1(높음) ~ 0(낮음): 하강 에지.

Arduino 타이머는 신호 에지에서 주기를 측정하기 때문에 에지가 중요합니다. 가) 예 엘 콘타도르 주기마다 증가하며 레지스터 값에 도달하면 인터럽트가 실행됩니다.

그러므로 이것을 알고 나면 Arduino MCU의 16Mhz, 그리고 8비트 타이머를 사용하면 인터럽트가 16μs(256/16000000) 또는 4비트(16/65536)의 경우 16000000ms마다 발생한다고 말할 수 있습니다. 따라서 값이 16인 65535비트 카운터 레지스터를 최대값으로 설정하면 인터럽트가 4ms에서 발생하여 작업이 무엇이든 실행됩니다.

카운터가 가능한 최대값에 도달하면 다시 0으로 돌아갑니다. 즉, 오버플로가 발생하고 처음부터 다시 카운트됩니다.

타이머의 증가 속도를 제어하려면 다음을 사용할 수도 있습니다. 프리스케일러, 1, 8, 64, 256 및 1024 값을 취하고 다음과 같이 타이밍을 변경합니다.

타이머 속도(Hz) = Arduino / Prescaler의 클럭 주파수

프리스케일러가 1이면 컨트롤러가 16Mhz로, 8~2Mhz이면 64~250kHz이면 컨트롤러가 증가하는 식입니다. 카운터와 프리스케일러의 값이 같아질 때까지 비교한 다음 작업을 실행하는 타이머 카운터 상태 비교기가 있음을 기억하십시오. 그래서, 인터럽트 주파수 공식에 의해 주어진다:

+1은 카운터 레지스터가 0에서 인덱싱되기 때문입니다. 즉, 1에서 계산을 시작하지 않고 0에서 시작합니다.

인터럽트 속도(Hz) = Arduino / 프리스케일러 클럭 주파수(비교기 레지스터 값 + 1)

다행히도 우리는 기록 수정 우리가 코드에서 사용하는 라이브러리에 의해 처리될 것이기 때문입니다. 그러나 사용하지 않는 경우 구성해야 합니다.

Arduino IDE의 예

Arduino IDE, 데이터 유형, 프로그래밍

이 모든 것을 조금 더 잘 이해하기 위해 여기에서는 타이머 사용을 경험할 수 있는 Arduino IDE에 대한 두 가지 스케치 코드를 보여줍니다. 첫 번째는 Arduino 핀 8에 연결된 LED를 XNUMX초마다 깜박이는 코드입니다.

#define ledPin 8
void setup()
{
  pinMode(ledPin, OUTPUT);
  // Configurar Timer1
  TCCR1A = 0;                        //Registro control A a 0, pines OC1A y OC1B deshabilitados
  TCCR1B = 0;                        //Limpia el registrador
  TCCR1B |= (1<<CS10)|(1 << CS12);   //Configura prescaler a 1024: CS12 = 1 y CS10 = 1
  TCNT1 = 0xC2F8;                    //Iniciar timer para desbordamiento a 1 segundo
                                     //65536-(16MHz/1024/1Hz - 1) = 49912 = 0xC2F8 en hexadecimal
  
  TIMSK1 |= (1 << TOIE1);           //Habilitar interrupción para Timer1
}
void loop()
{
}
ISR(TIMER1_OVF_vect)                              //Interrupción del TIMER1 
{
  TCNT1 = 0xC2F7;                                 // Reniciar Timer1
  digitalWrite(ledPin, digitalRead(ledPin) ^ 1); //Invierte el estado del LED
}

이전의 경우와 같이 LED의 깜박임 또는 깜박임을 매초 프로그래밍하지만 이번에는 다음을 사용하여 CTC 즉 비교:

#define ledPin 8
void setup()
{
  pinMode(ledPin, OUTPUT);
  
  // Configuración Timer1
  TCCR1A = 0;                //Registro de control A a 0
  TCCR1B = 0;                //Limpiar registro
  TCNT1  = 0;                //Inicializar el temporizador
  OCR1A = 0x3D08;            //Carga el valor del registro de comparación: 16MHz/1024/1Hz -1 = 15624 = 0X3D08
  TCCR1B |= (1 << WGM12)|(1<<CS10)|(1 << CS12);   //Modo CTC, prescaler de 1024: CS12 = 1 y CS10 = 1  
  TIMSK1 |= (1 << OCIE1A);  //Habilita interrupción por igualdad de comparación
}
void loop()
{
}
ISR(TIMER1_COMPA_vect)          //Interrupción por igualdad de comparación en TIMER1
{
  digitalWrite(ledPin, digitalRead(ledPin) ^ 1);   //Invierte el estado del LED
}

Arduino 프로그래밍에 대한 추가 정보

접시를 사다 Arduino UNO 개정판 3

코멘트를 첫번째로 올려

코멘트를 남겨주세요

귀하의 이메일 주소는 공개되지 않습니다. 필수 필드가 표시되어 있습니다 *

*

*

  1. 데이터 책임자 : Miguel Ángel Gatón
  2. 데이터의 목적 : 스팸 제어, 댓글 관리.
  3. 합법성 : 귀하의 동의
  4. 데이터 전달 : 법적 의무에 의한 경우를 제외하고 데이터는 제 XNUMX 자에게 전달되지 않습니다.
  5. 데이터 저장소 : Occentus Networks (EU)에서 호스팅하는 데이터베이스
  6. 권리 : 귀하는 언제든지 귀하의 정보를 제한, 복구 및 삭제할 수 있습니다.