- ¿Qué es TIMER en electrónica embebida?
- Registros de temporizador de Arduino
- Interrupciones del temporizador de Arduino
- Componentes requeridos
- Diagrama de circuito
- Programación de temporizadores Arduino UNO
La plataforma de desarrollo Arduino se desarrolló originalmente en 2005 como un dispositivo programable fácil de usar para proyectos de diseño artístico. Su intención era ayudar a los no ingenieros a trabajar con electrónica básica y microcontroladores sin muchos conocimientos de programación. Pero luego, debido a su naturaleza fácil de usar, pronto fue adaptado por principiantes y aficionados a la electrónica de todo el mundo y hoy en día incluso se prefiere para el desarrollo de prototipos y desarrollos de POC.
Si bien está bien comenzar con Arduino, es importante moverse lentamente hacia los microcontroladores centrales como AVR, ARM, PIC, STM, etc. y programarlo usando sus aplicaciones nativas. Esto se debe a que el lenguaje de programación Arduino es muy fácil de entender, ya que la mayor parte del trabajo se realiza mediante funciones predefinidas como digitalWrite (), AnalogWrite (), Delay (), etc., mientras que el lenguaje de máquina de bajo nivel está oculto detrás de ellos. Los programas de Arduino no son similares a otros códigos de C Embedded donde tratamos con bits de registro y los hacemos altos o bajos según la lógica de nuestro programa.
Temporizadores Arduino sin demora:
Por lo tanto, para comprender lo que está sucediendo dentro de las funciones predefinidas, debemos profundizar en estos términos. Por ejemplo, cuando se usa una función delay (), esta configura los bits de Timer y Counter Register del microcontrolador ATmega.
En este tutorial de temporizador arduino vamos a evitar el uso de esta función delay () y, en su lugar, nos ocuparemos de los registros mismos. Lo bueno es que puede usar el mismo IDE de Arduino para esto. Configuraremos nuestros bits de registro de temporizador y usaremos la interrupción de desbordamiento del temporizador para alternar un LED cada vez que ocurra la interrupción. El valor del precargador del bit de temporizador también se puede ajustar usando botones para controlar la duración en la que ocurre la interrupción.
¿Qué es TIMER en electrónica embebida?
El temporizador es una especie de interrupción. Es como un simple reloj que puede medir el intervalo de tiempo de un evento. Cada microcontrolador tiene un reloj (oscilador), digamos que en Arduino Uno es 16Mhz. Esto es responsable de la velocidad. Cuanto mayor sea la frecuencia del reloj, mayor será la velocidad de procesamiento. Un temporizador usa un contador que cuenta a cierta velocidad dependiendo de la frecuencia del reloj. En Arduino Uno, se necesitan 1/16000000 segundos o 62 nano segundos para hacer un solo recuento. Lo que significa que Arduino se mueve de una instrucción a otra instrucción por cada 62 nano segundos.
Temporizadores en Arduino UNO:
En Arduino UNO hay tres temporizadores que se utilizan para diferentes funciones.
Temporizador0:
Es un temporizador de 8 bits y se utiliza en funciones de temporizador como delay (), millis ().
Temporizador1:
Es un temporizador de 16 bits y se utiliza en la biblioteca de servos.
Temporizador2:
Es un temporizador de 8 bits y se utiliza en la función tone ().
Registros de temporizador de Arduino
Para cambiar la configuración de los temporizadores, se utilizan registros de temporizadores.
1. Registros de control de temporizador / contador (TCCRnA / B):
Este registro contiene los bits de control principales del temporizador y se utiliza para controlar los preescaladores del temporizador. También permite controlar el modo de temporizador utilizando los bits WGM.
Formato de cuadro:
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:
Los bits CS12, CS11, CS10 en TCCR1B establecen el valor del preescalador. Se utiliza un preescalador para configurar la velocidad del reloj del temporizador. Arduino Uno tiene prescalers de 1, 8, 64, 256, 1024.
CS12 | CS11 | CS10 | UTILIZAR |
0 | 0 | 0 | Sin reloj temporizador STOP |
0 | 0 | 1 | CLCK i / o / 1 sin preescalado |
0 | 1 | 0 | CLK i / o / 8 (desde Prescaler) |
0 | 1 | 1 | CLK i / o / 64 (desde Prescaler) |
1 | 0 | 0 | CLK i / o / 256 (desde Prescaler) |
1 | 0 | 1 | CLK i / o / 1024 (desde Prescaler) |
1 | 1 | 0 | Fuente de reloj externa en el pin T1. Reloj en borde descendente |
1 | 1 | 1 | Fuente de reloj externa en el pin T1. Reloj en flanco ascendente. |
2. Registro de temporizador / contador (TCNTn)
Este registro se utiliza para controlar el valor del contador y establecer un valor de precargador.
Fórmula para el valor del precargador para el tiempo requerido en segundos:
TCNTn = 65535 - (16x10 10 xTiempo en segundos / Valor de preescalador)
Para calcular el valor del precargador para el temporizador 1 durante un tiempo de 2 segundos:
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
Interrupciones del temporizador de Arduino
Anteriormente aprendimos sobre las interrupciones de Arduino y hemos visto que las interrupciones del temporizador son una especie de interrupciones de software. Hay varias interrupciones del temporizador en Arduino que se explican a continuación.Interrupción de desbordamiento del temporizador:
Siempre que el temporizador alcanza su valor máximo, por ejemplo (16 Bit-65535), se produce la interrupción de desbordamiento del temporizador . Por lo tanto, se llama a una rutina de servicio de interrupción ISR cuando el bit de interrupción de desbordamiento del temporizador está habilitado en el TOIEx presente en el registro de máscara de interrupción del temporizador TIMSKx.
Formato ISR:
ISR (TIMERx_OVF_vect) { }
Registro de comparación de salida (OCRnA / B):
Aquí, cuando se produce la interrupción de coincidencia de comparación de salida, se llama al servicio de interrupción ISR (TIMERx_COMPy_vect) y también se establecerá el bit indicador OCFxy en el registro TIFRx. Este ISR se habilita estableciendo el bit de habilitación en OCIExy presente en el registro TIMSKx. Donde TIMSKx es el registro de máscara de interrupción del temporizador.
Captura de entrada del temporizador:
A continuación, cuando se produce la interrupción de captura de entrada del temporizador, se llama al servicio de interrupción ISR (TIMERx_CAPT_vect) y también el bit de bandera ICFx se establecerá en TIFRx (registro de bandera de interrupción de temporizador). Este ISR se habilita estableciendo el bit de habilitación en ICIEx presente en el registro TIMSKx.
Componentes requeridos
- Arduino UNO
- Botones pulsadores (2)
- LED (cualquier color)
- Resistencia de 10k (2), 2.2k (1)
- Pantalla LCD 16x2
Diagrama de circuito
Conexiones de circuito entre Arduino UNO y pantalla LCD 16x2:
LCD de 16x2 |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Al pin central del potenciómetro para controlar el contraste de la pantalla LCD |
RS |
8 |
RW |
GND |
mi |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
UN |
+ 5V |
K |
GND |
Dos pulsadores con resistencias desplegables de 10K están conectados con los pines 2 y 4 de Arduino y un LED está conectado al PIN 7 de Arduino a través de una resistencia de 2.2K.
La configuración se verá como la siguiente imagen.
Programación de temporizadores Arduino UNO
En este tutorial usaremos el TIMER OVERFLOW INTERRUPT y lo usaremos para hacer parpadear el LED ENCENDIDO y APAGADO por cierta duración ajustando el valor del precargador (TCNT1) usando botones. El código completo para Arduino Timer se proporciona al final. Aquí estamos explicando el código línea por línea:
Como en el proyecto se utiliza una pantalla LCD de 16x2 para mostrar el valor del precargador, se utiliza la biblioteca de cristal líquido.
#incluir
El pin del ánodo LED que está conectado con el pin 7 de Arduino se define como ledPin .
#define ledPin 7
A continuación, se declara el objeto para acceder a la clase de cristal líquido con los pines LCD (RS, E, D4, D5, D6, D7) que están conectados con Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Luego, establezca el valor de precargador 3035 durante 4 segundos. Verifique la fórmula anterior para calcular el valor del precargador.
valor flotante = 3035;
A continuación, en la configuración de vacío (), primero configure la pantalla LCD en modo 16x2 y muestre un mensaje de bienvenida durante unos segundos.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("TEMPORIZADORES ARDUINO"); retraso (2000); lcd.clear ();
A continuación, configure el pin de LED como pin de SALIDA y los botones pulsadores se establecen como pines de ENTRADA
pinMode (ledPin, SALIDA); pinMode (2, ENTRADA); pinMode (4, ENTRADA);
A continuación, deshabilite todas las interrupciones:
noInterrupts ();
A continuación, se inicializa el Timer1.
TCCR1A = 0; TCCR1B = 0;
El valor del temporizador del precargador se establece (inicialmente como 3035).
TCNT1 = valor;
Luego, el valor 1024 del preescalador se establece en el registro TCCR1B.
TCCR1B - = (1 << CS10) - (1 << CS12);
La interrupción de desbordamiento del temporizador se habilita en el registro de máscara de interrupción del temporizador para que se pueda utilizar el ISR.
TIMSK1 - = (1 << TOIE1);
Por fin, todas las interrupciones están habilitadas.
interrumpe ();
Ahora escriba el ISR para la interrupción de desbordamiento del temporizador, que es responsable de encender y apagar el LED mediante digitalWrite . El estado cambia cada vez que se produce la interrupción por desbordamiento del temporizador.
ISR (TIMER1_OVF_vect) { TCNT1 = valor; escritura digital (ledPin, digitalRead (ledPin) ^ 1); }
En el bucle vacío (), el valor del precargador se incrementa o disminuye mediante el uso de las entradas del botón pulsador y también el valor se muestra en la pantalla LCD de 16x2.
if (digitalRead (2) == HIGH) { valor = valor + 10; // Valor de precarga de incienso } if (digitalRead (4) == HIGH) { value = value-10; // Disminuye el valor de precarga } lcd.setCursor (0,0); lcd.print (valor); }
Así es como se puede usar un temporizador para producir un retraso en el programa Arduino. Vea el video a continuación donde hemos demostrado el cambio en la demora aumentando y disminuyendo el valor del precargador usando los botones pulsadores.