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á
- Arduino Uno (ou uma placa compatível)
- Resistor LED e 220-OHM (para exemplos baseados em tempo)
- Fios de pão e jumper
- 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()
emillis()
.
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
- Instale a biblioteca timerone no Arduino IDE.
- 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
- Gerando sinais precisos de PWM para controle de motor
- Agendar tarefas sem bloquear o código (por exemplo, multitarefa)
- Medindo intervalos de tempo para eventos
- Criando atrasos precisos sem usar
delay()
- 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!