- O que é TIMER em eletrônicos incorporados?
- Registros de cronômetro do Arduino
- Interrupções do cronômetro do Arduino
- Componentes necessários
- Diagrama de circuito
- Programação de temporizadores Arduino UNO
A plataforma de desenvolvimento Arduino foi originalmente desenvolvida em 2005 como um dispositivo programável fácil de usar para projetos de design de arte. Sua intenção era ajudar não engenheiros a trabalhar com eletrônica básica e microcontroladores sem muito conhecimento de programação. Mas então, devido à sua natureza fácil de usar, ele logo foi adaptado por iniciantes em eletrônica e amadores em todo o mundo e hoje é até preferido para desenvolvimento de protótipos e desenvolvimento de POC.
Embora seja normal começar com o Arduino, é importante mover-se lentamente para os microcontroladores centrais como AVR, ARM, PIC, STM etc. e programá-los usando seus aplicativos nativos. Isso ocorre porque a linguagem de programação do Arduino é muito fácil de entender, pois a maior parte do trabalho é feita por funções pré-construídas como digitalWrite (), AnalogWrite (), Delay () etc. enquanto a linguagem de máquina de baixo nível está oculta por trás delas. Os programas do Arduino não são semelhantes a outros códigos Embedded C, onde lidamos com bits de registro e os tornamos altos ou baixos com base na lógica de nosso programa.
Arduino Timers sem demora:
Portanto, para entender o que está acontecendo dentro das funções pré-construídas, precisamos cavar por trás desses termos. Por exemplo, quando uma função delay () é usada, ela configura os bits de registro de temporizador e contador do microcontrolador ATmega.
Neste tutorial do temporizador do Arduino, vamos evitar o uso dessa função delay () e, em vez disso, lidaremos com os próprios Registradores. O bom é que você pode usar o mesmo IDE do Arduino para isso. Vamos definir nossos bits de registro do temporizador e usar a interrupção de estouro do temporizador para alternar um LED toda vez que ocorrer a interrupção. O valor do pré-carregador do bit do temporizador também pode ser ajustado usando botões para controlar a duração na qual a interrupção ocorre.
O que é TIMER em eletrônicos incorporados?
O cronômetro é uma espécie de interrupção. É como um relógio simples que pode medir o intervalo de tempo de um evento. Todo microcontrolador tem um relógio (oscilador), digamos que no Arduino Uno é de 16Mhz. Isso é responsável pela velocidade. Quanto maior a freqüência do clock, maior será a velocidade de processamento. Um cronômetro usa um contador que conta em certa velocidade dependendo da freqüência do relógio. No Arduino Uno, leva 1/16000000 segundos ou 62nano segundos para fazer uma única contagem. O que significa que o Arduino passa de uma instrução para outra a cada 62 nanossegundos.
Temporizadores no Arduino UNO:
No Arduino UNO, existem três temporizadores usados para funções diferentes.
Timer0:
É um temporizador de 8 bits e usado em funções de temporizador, como delay (), millis ().
Timer1:
É um temporizador de 16 bits e usado na biblioteca de servo.
Timer2:
É um temporizador de 8 bits e é usado na função tone ().
Registros de cronômetro do Arduino
Para alterar a configuração dos temporizadores, são usados registros de temporizadores.
1. Registros de controle de temporizador / contador (TCCRnA / B):
Este registro contém os bits de controle principais do temporizador e é usado para controlar os prescalers do temporizador. Também permite controlar o modo do temporizador usando os bits WGM.
Formato do quadro:
TCCR1A | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
COM1A1 | COM1A0 | COM1B1 | COM1B0 | COM1C1 | COM1C0 | WGM11 | WGM10 |
TCCR1B | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ICNC1 | ICES1 | - | WGM13 | WGM12 | CS12 | CS11 | CS10 |
Prescaler:
Os bits CS12, CS11, CS10 em TCCR1B definem o valor do prescaler. Um prescaler é usado para configurar a velocidade do clock do temporizador. O Arduino Uno possui prescalers de 1, 8, 64, 256, 1024.
CS12 | CS11 | CS10 | USAR |
0 | 0 | 0 | Sem cronômetro STOP |
0 | 0 | 1 | CLCK i / o / 1 sem pré-escala |
0 | 1 | 0 | CLK i / o / 8 (do Prescaler) |
0 | 1 | 1 | CLK i / o / 64 (do Prescaler) |
1 | 0 | 0 | CLK i / o / 256 (do Prescaler) |
1 | 0 | 1 | CLK i / o / 1024 (do Prescaler) |
1 | 1 | 0 | Fonte de relógio externo no pino T1. Relógio caindo |
1 | 1 | 1 | Fonte de relógio externo no pino T1. Relógio na borda ascendente. |
2. Registro de cronômetro / contador (TCNTn)
Este registro é usado para controlar o valor do contador e definir um valor do pré-carregador.
Fórmula para o valor do pré-carregador para o tempo necessário em segundos:
TCNTn = 65535 - (16x10 10 xTime em seg / Valor do pré-escalador)
Para calcular o valor do pré-carregador para o temporizador1 por um tempo de 2 segundos:
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
Interrupções do cronômetro do Arduino
Aprendemos anteriormente sobre as interrupções do Arduino e vimos que as interrupções do cronômetro são uma espécie de interrupção de software. Existem várias interrupções de temporizador no Arduino, explicadas a seguir.Interrupção de estouro do temporizador:
Sempre que o temporizador atinge seu valor máximo, por exemplo (16 bits-65535), ocorre a interrupção de estouro do temporizador . Assim, uma rotina de serviço de interrupção ISR é chamada quando o bit de interrupção de estouro de temporizador habilitado no TOIEx presente no registro de máscara de interrupção de temporizador TIMSKx.
Formato ISR:
ISR (TIMERx_OVF_vect) { }
Registro de comparação de saída (OCRnA / B):
Aqui, quando ocorre a interrupção de comparação de correspondência de saída, o serviço de interrupção ISR (TIMERx_COMPy_vect) é chamado e também o bit de sinalizador OCFxy será definido no registro TIFRx. Este ISR é habilitado configurando o bit de habilitação em OCIExy presente no registro TIMSKx. Onde TIMSKx é o registro da máscara de interrupção do temporizador.
Captura de entrada do temporizador:
Em seguida, quando a interrupção de captura de entrada do temporizador ocorre, o serviço de interrupção ISR (TIMERx_CAPT_vect) é chamado e também o bit de sinalizador ICFx será definido em TIFRx (Registro de sinalizador de interrupção do temporizador). Este ISR é habilitado configurando o bit habilitado em ICIEx presente no registro TIMSKx.
Componentes necessários
- Arduino UNO
- Botões de pressão (2)
- LED (qualquer cor)
- Resistor de 10k (2), 2,2k (1)
- Display LCD 16x2
Diagrama de circuito
Conexões de circuito entre o Arduino UNO e a tela LCD 16x2:
LCD 16x2 |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Para o pino central do potenciômetro para controle de contraste do LCD |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
UMA |
+ 5V |
K |
GND |
Dois botões de pressão com resistores pull down de 10K são conectados aos pinos 2 e 4 do Arduino e um LED é conectado ao PIN 7 do Arduino por meio de um resistor 2.2K.
A configuração será semelhante à imagem abaixo.
Programação de temporizadores Arduino UNO
Neste tutorial vamos usar o TIMER OVERFLOW INTERRUPT e usá-lo para piscar o LED ON e OFF por uma certa duração, ajustando o valor do pré-carregador (TCNT1) usando botões. O código completo para o Arduino Timer é fornecido no final. Aqui estamos explicando o código linha por linha:
Como o LCD 16x2 é usado no projeto para exibir o valor do pré-carregador, a biblioteca de cristal líquido é usada.
#incluir
O pino ânodo do LED que está conectado ao pino 7 do Arduino é definido como ledPin .
#define ledPin 7
Em seguida, o objeto para acessar a classe Liquid Crystal é declarado com os pinos do LCD (RS, E, D4, D5, D6, D7) que estão conectados ao Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Em seguida, defina o valor do pré-carregador 3035 por 4 segundos. Verifique a fórmula acima para calcular o valor do pré-carregador.
valor flutuante = 3035;
Em seguida, em void setup (), primeiro defina o LCD no modo 16x2 e exiba uma mensagem de boas-vindas por alguns segundos.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO TIMERS"); atraso (2000); lcd.clear ();
Em seguida, defina o pino do LED como pino de SAÍDA e os botões de pressão são definidos como pinos de ENTRADA
pinMode (ledPin, OUTPUT); pinMode (2, INPUT); pinMode (4, INPUT);
Em seguida, desative todas as interrupções:
noInterrupts ();
Em seguida, o Timer1 é inicializado.
TCCR1A = 0; TCCR1B = 0;
O valor do temporizador do pré-carregador é definido (inicialmente como 3035).
TCNT1 = valor;
Em seguida, o valor do pré scaler 1024 é definido no registro TCCR1B.
TCCR1B - = (1 << CS10) - (1 << CS12);
A interrupção de estouro do temporizador é habilitada no registro Máscara de interrupção do temporizador para que o ISR possa ser usado.
TIMSK1 - = (1 << TOIE1);
Por fim, todas as interrupções estão habilitadas.
interrupções ();
Agora escreva o ISR para a interrupção de estouro do temporizador, que é responsável por ligar e desligar o LED usando digitalWrite . O estado muda sempre que ocorre a interrupção de estouro do temporizador.
ISR (TIMER1_OVF_vect) { TCNT1 = valor; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
No loop void (), o valor do pré-carregador é aumentado ou diminuído usando as entradas do botão de pressão e também o valor é exibido no LCD 16x2.
if (digitalRead (2) == HIGH) { valor = valor + 10; // Valor de pré-carga do incremento } if (digitalRead (4) == HIGH) { value = value-10; // Diminui o valor da pré-carga } lcd.setCursor (0,0); lcd.print (valor); }
Então é assim que um cronômetro pode ser usado para produzir atraso no programa Arduino. Confira o vídeo abaixo, onde demonstramos a mudança no atraso aumentando e diminuindo o valor do pré-carregador usando os botões de pressão.