Timers internos do Arduino
Componentes e suprimentos
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 |
Sobre este projeto
Visão geral
Se você precisa contar o tempo com precisão, você precisa usar um cronômetro, mas geralmente não é tão fácil usar os cronômetros internos do Arduino, então neste tutorial tento explicar como usá-los de uma maneira fácil.
É muito importante usar temporizadores porque durante a função delay () você não pode fazer nada, mas com um temporizador você pode fazer tudo porque quando chega o momento, ele ativa a interrupção.
Eu uso o TIMER0 porque é o temporizador mais fácil, talvez no futuro eu possa explicar os outros temporizadores.
Como funciona
A primeira coisa que você precisa ver é a folha de dados do ATmega328P.

Este é o diagrama de blocos do contador e, olhando para ele, você pode entender como funciona.
O prescaler recebe um pulso de um ciclo de clock e então o passa para a Lógica de Controle, portanto, a Lógica de Controle incrementa o registrador TCNTn em 1.
Agora podemos comparar o valor de TCNTn com um valor específico. Quando o registro TCNTn chega a este valor, você sabe que passou um tempo específico.
Este método é denominado modo CTC para "Clear Timer on Compare". O valor do registro TCNTn é comparado ao registro OCRn, quando ocorre uma comparação, o TOVn gera uma interrupção.
Outra coisa importante é o prescaler, com ele você pode criar diferentes divisões do clock, na verdade 16MHz é demais mas, graças ao prescaler, você pode criar alguns submúltiplos dele. Isso depende da configuração do registro TCCR0B.


Outra coisa importante é determinar o valor do registrador OCRn para contar um tempo específico, você precisa de um pouco de matemática.

Sei que tudo isso pode parecer muito complicado, mas tenho certeza de que o código a seguir esclarecerá todas as perguntas.
Nesse caso, ativamos uma solicitação de interrupção a cada 0,001 segundos.
TCCR0A | =(1 <
É importante configurar o prescaler no final porque após esta instrução o temporizador começa a contar, se você precisar pará-lo, deve zerar todos os bits de TCCR0B.
Abaixo está um exemplo.
Código
- cronômetro interno
Temporizador interno Arduino
/ * Este programa liga e desliga um LED no pino 13 a cada 1 segundo usando um temporizador interno * / int temporizador =0; bool state =0; void setup () {pinMode (13, OUTPUT); TCCR0A =(1 <=1000) {state =! state; temporizador =0; } digitalWrite (13, estado); } ISR (TIMER0_COMPA_vect) {// Este é o temporizador de solicitação de interrupção ++;}
Esquemas

Processo de manufatura