Arduino Timer: brinque com o tempo em seus projetos

Cronômetro Arduino UNO

Algum tempo atrás publicamos mais informações sobre o função millis() de ArduinoAgora vamos aprofundar o Temporizador Arduino, para começar com esse recurso para o recurso, entenda como essa placa com MCU gerencia o tempo, além de outras funções além do millis().

O que é o temporizador Arduino?

temporizador de arduino

El Temporizador Arduino ou temporizador, é uma função implementada por hardware (no microcontrolador, com a ajuda do cristal de quartzo que gera os pulsos de clock e que define o "ritmo", sem a necessidade de hardware externo ou ICs 555) que permite controlar eventos temporários graças aos clocks interno. Por exemplo, fazer uma tarefa acontecer em intervalos, fazer medições precisas de tempo, etc., independentemente do código do esboço.

Como Arduino UNO Possui um chip MCU que funciona a 16 Mhz, podendo ser executados 16.000.000 a cada segundo. As instruções precisam de X ciclos para serem executadas, nem todas são executadas nos mesmos ciclos de clock, por exemplo, as de 16 bits precisam de mais ciclos nesta arquitetura AVR.

Imagine que você usa o função atraso(), isso bloqueará a execução no Arduino MCU até que o tempo especificado tenha decorrido e, em seguida, continue com o programa, mas o temporizador não bloqueará. Será cronometrado enquanto o MCU continua a executar outras instruções simultaneamente. Essa é a grande vantagem.

O temporizador está relacionado com interrupções do Arduino, uma vez que serão executados através deles para atender alguma tarefa específica. Em outras palavras, o Arduino Timer é uma função que é acionada em um determinado momento, executando uma função de interrupção. É por isso que também é importante saber sobre essas interrupções.

modos

O temporizador Arduino tem 2 modos de operação, podendo ser usado em:

  • Sinal PWM: Você pode controlar o Pinos do Arduino (~).
  • CTC (Limpar timer na partida de comparação): conta o tempo dentro de um contador e quando atinge o valor especificado em um registro dos temporizadores, a interrupção é executada.

Quantos temporizadores tem? Tipos de temporizadores

Arduino UNO funções millis

3 temporizadores nas placas Arduino UNO, embora possa haver mais em outras placas superiores:

  • Cronômetro 0: 8 bits, pode contar de 0 a 255 (256 valores possíveis). Usado por funções como delay(), millis() e micros(). Sua modificação não é recomendada para não alterar os programas.
  • Cronômetro 1: igual a Timer 0. Usado pela biblioteca Servo em UNO (Timer 5 para MEGA).
  • Cronômetro 2: 16 bits e pode variar de 0 a 65.525 (65.536 valores possíveis). Usado para a função tone(), se não for usado, pode ser usado livremente para sua aplicação.
  • Temporizador 3, 4, 5 (somente no Arduino MEGA): todos de 16 bits.

Como funciona o temporizador do Arduino?

temporizadores, temporizadores

Para trabalhar com um temporizador Arduino, é fundamental saber como tudo isso funciona eletronicamente no MCU desta placa de desenvolvimento:

  • Freqüência de relógio: é o número de ciclos por segundo que ele é capaz de desenvolver, no caso do Arduino é 16 Mhz, ou seja, o sinal do clock oscila 16.000.000 vezes por segundo (ciclos).
  • Período: é representado pelo T, e é medido em segundos, e é o inverso dos ciclos. Por exemplo, T=1/C, que resultaria em 1/16000000 = 0.0000000625, o tempo que levaria para cada ciclo ser concluído. E a frequência é o inverso do período, então f = 1/T.
  • Ciclo: é cada uma das repetições do sinal que ocorrem por unidade de tempo. No Arduino seriam 16M em um segundo. Ou o que é o mesmo, neste caso, quando 16 milhões de ciclos se passaram, um segundo se passou. Portanto, pode-se dizer que um ciclo leva 625 ns.
  • borda de um sinal: Os sinais do relógio são quadrados e as bordas podem estar subindo ou descendo. Uma aresta é a linha reta do sinal quando muda de:
    • 0 (baixo) a 1 (alto): borda ascendente.
    • 1 (alto) a 0 (baixo): borda de queda.

As bordas são importantes porque os temporizadores do Arduino medem os ciclos das bordas do sinal. A) Sim o contador ele incrementa a cada ciclo e quando atinge o valor do registrador, a interrupção é executada.

Portanto, uma vez que você sabe disso, se você tiver 16Mhz no Arduino MCU, e um Timer de 8 bits é usado, pode-se dizer que as interrupções ocorrerão a cada 16 μs (256/16000000) ou 4 ms para 16 bits (65536/16000000). Portanto, se você definir o registrador do contador de 16 bits no máximo, com o valor 65535, a interrupção ocorrerá em 4 ms para executar qualquer tarefa.

Quando o contador atinge o valor máximo possível, vai voltar a 0 novamente. Ou seja, ocorre um estouro e ele será contado desde o início.

Para controlar a taxa de aumento do temporizador, você também pode usar um prescaler, que recebe os valores 1, 8, 64, 256 e 1024 e altera o tempo assim:

Velocidade do Temporizador (Hz) = Frequência do Relógio do Arduino/Prescaler

Se for 1 o prescaler o controlador aumentará para 16 Mhz, se for 8 a 2 Mhz, se for 64 a 250 kHz, e assim por diante. Lembre-se que haverá um comparador de estado do contador temporizador para comparar o valor do contador e do prescaler até que sejam iguais e então executar uma ação. Por tanto, frequência de interrupção é dado pela fórmula:

+1 é porque o registrador do contador está indexado em 0, ou seja, ele não começa a contar em 1, mas em 0.

Velocidade de interrupção (Hz) = Arduino / Prescaler Clock Frequency (valor do registrador comparador + 1)

Felizmente, não devemos modificar registros dos Temporizadores do Arduino, pois será atendido pelas bibliotecas que usamos no código. Mas se eles não forem usados, eles devem ser configurados.

Exemplos na IDE do Arduino

Arduino IDE, tipos de dados, programação

Para entender um pouco melhor tudo isso, aqui mostro dois códigos de esboço para Arduino IDE com os quais você pode experimentar o uso de temporizadores. O primeiro é o código que piscará um LED conectado ao pino 8 do Arduino a cada segundo:

#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
}

Programe o piscar ou piscar do LED, como no caso anterior a cada segundo, mas desta vez usando CTC, ou seja, comparação:

#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
}

Mais sobre a programação do Arduino

compre um prato Arduino UNO Rev3

Seja o primeiro a comentar

Deixe um comentário

Seu endereço de email não será publicado. Campos obrigatórios são marcados com *

*

*

  1. Responsável pelos dados: Miguel Ángel Gatón
  2. Finalidade dos dados: Controle de SPAM, gerenciamento de comentários.
  3. Legitimação: Seu consentimento
  4. Comunicação de dados: Os dados não serão comunicados a terceiros, exceto por obrigação legal.
  5. Armazenamento de dados: banco de dados hospedado pela Occentus Networks (UE)
  6. Direitos: A qualquer momento você pode limitar, recuperar e excluir suas informações.