Tutorial do Timer Arduino

Arduino Timer Tutorial

Os temporizadores são uma característica essencial dos microcontroladores, permitindo que você execute tarefas em intervalos precisos sem depender de atrasos. O Arduino UNO possui três temporizadores de hardware embutidos (Timer0, Timer1 e Timer2) que podem ser configurados para várias funções, como gerar sinais de PWM, eventos de tempo ou tarefas de agendamento. Este tutorial o guiará através da compreensão e do uso de temporizadores Arduino.


O que você precisará

  1. Arduino Uno (ou uma placa compatível)
  2. Resistor LED e 220-OHM (para exemplos baseados em tempo)
  3. Fios de pão e jumper
  4. Arduino IDE instalado no seu computador

Etapa 1: Compreendendo os temporizadores do Arduino

O microcontrolador ATMEGA328P do Arduino UNO possui três temporizadores de hardware:

Timer Resolução de bits Uso primário
Timer0 8 bits Millis (), micros (), pwm nos pinos 5, 6
Timer1 16 bits Library Servo, PWM nos pinos 9, 10
Timer2 8 bits Tone () função, PWM nos pinos 3, 11

Principais características dos temporizadores

  • Os temporizadores podem gerar sinais PWM.
  • Os temporizadores podem desencadear interrupções.
  • Os temporizadores são usados ​​internamente por funções de Arduino como delay() e millis().

Etapa 2: gerando um sinal PWM simples

Os sinais de PWM (modulação de largura de pulso) são comumente usados ​​para controlar o brilho do LED ou a velocidade do motor. Vamos usar o Timer0 para criar um sinal PWM.

Código de exemplo: controle de brilho LED com PWM

#define ledPin 6 // Pin 6 uses Timer0 for PWM

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  for (int brightness = 0; brightness <= 255; brightness++) {
    analogWrite(ledPin, brightness); // Increase brightness
    delay(10);
  }

  for (int brightness = 255; brightness >= 0; brightness--) {
    analogWrite(ledPin, brightness); // Decrease brightness
    delay(10);
  }
}

Etapa 3: Usando temporizadores com interrupções

Você pode configurar os temporizadores para desencadear interrupções em intervalos regulares. Por exemplo, o timer1 pode ser configurado para alternar um LED a cada segundo.

Exemplo Código: Timer1 Interrupção

#define ledPin 13 // Built-in LED

void setup() {
  pinMode(ledPin, OUTPUT);

  // Configure Timer1
  noInterrupts(); // Disable interrupts during setup
  TCCR1A = 0;     // Clear Timer1 control registers
  TCCR1B = 0;
  TCNT1 = 0;      // Initialize counter value to 0

  OCR1A = 15624;  // Compare match register (1Hz at 16MHz with 1024 prescaler)
  TCCR1B |= (1 << WGM12); // CTC mode
  TCCR1B |= (1 << CS12) | (1 << CS10); // 1024 prescaler
  TIMSK1 |= (1 << OCIE1A); // Enable Timer1 compare interrupt

  interrupts(); // Enable interrupts
}

ISR(TIMER1_COMPA_vect) {
  digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle LED
}

void loop() {
  // Main loop does nothing; timer handles the LED
}

Etapa 4: Medindo o tempo com temporizadores

Você pode usar temporizadores para medir durações precisas. O timer2 é adequado para intervalos pequenos, porque é um temporizador de 8 bits.

Exemplo Código: Timer2 para medição de tempo

volatile unsigned long overflowCount = 0;

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

  // Configure Timer2
  noInterrupts();
  TCCR2A = 0;
  TCCR2B = 0;
  TCNT2 = 0;

  TCCR2B |= (1 << CS22); // Prescaler 64
  TIMSK2 |= (1 << TOIE2); // Enable Timer2 overflow interrupt

  interrupts();
}

ISR(TIMER2_OVF_vect) {
  overflowCount++;
}

void loop() {
  unsigned long timeElapsed = overflowCount * 16.384; // Each overflow = 16.384ms
  Serial.print("Time elapsed: ");
  Serial.print(timeElapsed);
  Serial.println(" ms");
  delay(1000);
}

Etapa 5: Usando bibliotecas de temporizador

Para simplificar o trabalho com temporizadores, você pode usar bibliotecas como Timerone ou TimerThree.

Usando a biblioteca timerone

  1. Instale a biblioteca timerone no Arduino IDE.
  2. Use -o para agendar tarefas facilmente:
#include <TimerOne.h>
#define ledPin 13

void toggleLED() {
  digitalWrite(ledPin, !digitalRead(ledPin));
}

void setup() {
  pinMode(ledPin, OUTPUT);
  Timer1.initialize(1000000); // Set timer to 1 second (1,000,000 microseconds)
  Timer1.attachInterrupt(toggleLED); // Attach the interrupt function
}

void loop() {
  // Main loop does nothing; Timer1 handles the LED
}

Aplicações de temporizadores

  1. Gerando sinais precisos de PWM para controle de motor
  2. Agendar tarefas sem bloquear o código (por exemplo, multitarefa)
  3. Medindo intervalos de tempo para eventos
  4. Criando atrasos precisos sem usar delay()
  5. Gerenciando ações periódicas como piscar LEDs ou enviar dados

Solução de problemas

  • Conflitos de cronômetro: Certifique -se de não usar o mesmo timer para várias funções (por exemplo, servo biblioteca e PWM).
  • Interromper não funcionando: Verifique se as interrupções estão ativadas com interrupts().
  • Comportamento inesperado: Verifique duas vezes o Prescaler e compare os valores correspondentes para o tempo correto.

Conclusão

Você aprendeu a usar os temporizadores do Arduino para gerar sinais de PWM, lidar com interrupções e medir o tempo. Mastering Timers desbloqueia recursos poderosos para criar projetos de Arduino eficientes e precisos. Experimente diferentes configurações e aplique temporizadores para otimizar seu próximo projeto!

Deixe um comentário

Notice an Issue? Have a Suggestion?
If you encounter a problem or have an idea for a new feature, let us know! Report a problem or request a feature here.