Dominando Timers Internos do Arduino para Temporização Precisa
Componentes e Materiais
| Componente | Quantidade |
|---|---|
| Arduino UNO | 1 |
| LED (genérico) | 1 |
| Resistor 220 Ω | 1 |
Sobre o Projeto
Visão Geral
Se você precisa contar tempo com precisão, deve usar um timer. Porém, usar os timers internos do Arduino não costuma ser fácil. Neste tutorial, explico de forma simples como utilizá-los.
É importante usar timers porque durante delay() você não pode fazer nada; com timer, o programa continua rodando e, quando o tempo chega, uma interrupção é ativada.
Usarei o TIMER0 por ser o mais simples. No futuro, posso explicar os outros.
Como Funciona
Consulte o datasheet do ATmega328P. O diagrama de blocos do contador mostra:
- O prescaler recebe pulsos do clock e repassa à Lógica de Controle.
- A Lógica de Controle incrementa o registrador
TCNTn. - Comparamos
TCNTncom um valor no registradorOCRn. Quando igualam, ocorre compare match e a flagTOVngera uma interrupção. - Esse modo é chamado CTC (Clear Timer on Compare).
O prescaler divide o clock de 16 MHz. A configuração dos bits CS02:0 no registrador TCCR0B define a divisão (ex: 1/64).
Para calcular o valor de OCR0A para um tempo desejado:
Frequência do clock = 16 MHz
Prescaler = 64
Clock do timer = 16.000.000 / 64 = 250.000 Hz (período = 4 µs)
Para 1 ms: 1 ms / 4 µs = 250 ciclos → OCR0A = 249 (0xF9)
Exemplo Prático: Pisca LED a Cada 1 Segundo via Timer0
/* Pisca LED no pino 13 a cada 1 segundo usando Timer0 em modo CTC */
int timer = 0;
bool state = 0;
void setup() {
pinMode(13, OUTPUT);
TCCR0A = (1 << WGM01); // Modo CTC
OCR0A = 0xF9; // 249 → 1 ms
TIMSK0 |= (1 << OCIE0A); // Habilita interrupção Compare Match A
sei(); // Habilita interrupções globais
TCCR0B |= (1 << CS01) | (1 << CS00); // Prescaler 64 (inicia contagem)
}
void loop() {
if (timer >= 1000) { // 1000 * 1 ms = 1 s
state = !state;
timer = 0;
}
digitalWrite(13, state);
}
ISR(TIMER0_COMPA_vect) {
timer++; // Incrementado a cada 1 ms
}
Importante: Configure o prescaler por último, pois o timer começa a contar imediatamente. Para parar, zere todos os bits de TCCR0B.
Esquemático
LED no pino 13 com resistor 220Ω para GND.
Processo de manufatura
- Construa um Spybot Controlado por Bluetooth com Arduino
- FlickMote: Controle Remoto IR por Gestos para Casa Inteligente
- DIY Arduino TV B-Gone: Controle Remoto Universal para Todas as TVs
- Construa um Relógio Mestre LED Personalizado com Alarme – Visível a 12 Metros
- Find Me: Localizador Inteligente de Objetos com Arduino e Bluetooth
- Soluções de Energia Otimizadas para Projetos Arduino
- Jogo da Velha com Arduino, Matriz LED MAX7219 e Caixa de Papelão
- Construa um Robô Quadrúpede Inteligente com Arduino: Guia Passo a Passo
- Volante Joystick Arduino Personalizado para Jogos
- Construa uma Máquina CNC Totalmente Funcional com Arduino Nano R3