timer con arduino interrupciones internas creatividad codificada

Timer con Arduino o interrupciones internas

Arduino

El manejo de un timer o interrupciones internas es un tema muy útil en Arduino, nos ayudara a realizar proyectos que necesiten medir el tiempo con mayor precisión y realizar alguna tarea específica que requiera precisión, como sabemos Arduino no integra de forma nativa una librería para el manejo de timers .

Así podemos tener mas información sobre el manejo correcto de estos timers o temporizadores.

En los microcontroladores los timers generan una señal cuadrada que es determinada por la frecuencia que trabaja el microcontrolador.

Arduino UNO es una de las tarjetas más usadas, tiene 3 timers y trabaja con una frecuencia de 16MHZ, en el caso un Arduino MEGA tiene 6 timers.

Modos de operación de los timers en Arduino

Según el datashet del microcontrolador Atmega328p que esta presente en la placa Arduino UNO nos dice que existen 4 modos de funcionamientos y son:

Modo normal.- Es el modo más simple de operar, la dirección de conteo siempre se incrementa y cuando llega a desbordarse llegando a su valor máximo de 8 bits se reinicia el conteo.

Modo CTC. – En este modo el contador se borra y se reinicia a cero cuando el valor de TCNTn es igual al valor de OCRnA, esto nos ayuda a contar los eventos externos.

Modo PWM rápido (Fast PWM).- Con este modo podemos trabajar con una onda PWM de alta frecuencia, en este modo el contador cuenta desde abajo hasta arriba, el contador se incrementa hasta que el valor del contador es igual al valor de arriba (OCRnA) y se borra en el siguiente ciclo.

Modo PWM de fase correcta (Phase Correct PWM Mode).- Gracias a este modo podemos trabajar con una onda PWM de alta resolución y está basada en una doble pendiente, este contador cuenta desde abajo hasta arriba y luego de arriba hacia abajo,este modo de doble pendiente son muy utilizados para aplicaciones de control de motores.

Tipos de Timers en Arduino

Al no tener la suficiente información sobre los Timers debemos usar los datashets de los microcontroladores que Arduino usa en sus placas, esto hace que el tratamiento no sea siempre igual en todas las placas de Arduino, por lo cual debemos tomar en cuenta que siempre existirá diferencias entre un microcontrolador y otro.

Los microcontroladores Atmega168 y Atmega328 cuentan con 3 Timers pero claro no son los únicos que usamos entre otros microcontroladores mas usadas esta el Atmega1280 y Atmega2560 que tienen 6 Timers para poder desarrollar nuestros proyectos.

Timer0.- Trabaja con 8 bits, esto quiere decir que podemos trabajar hasta un valor máximo de 255, este temporizador o Timer es usada para el buen funcionamiento de las funciones de tiempo.

Timer1.- Trabaja con 16 bits con valores de hasta 65535, la librería <Servo.h> es usada para manejar servos y hace uso del Timer1.

Esto hace que si estamos usando esta librería, para manejar servos y modificamos el funcionamiento del Timer1 posiblemente no funcione de forma correcta nuestro proyecto con servos.

Timer2.- Este Timer también es de 8 bits, Arduino lo usa para reproducir sonidos mediante ondas cuadradas con la función tone(), esto es muy útil cuando deseamos realizar algún proyecto sonoro, pero si no vamos a usar la función tone().     

Timer3, 4 ,5.- Estos Timers están presentes en los microcontroladores Atmega1280 y Atmega2560, son de 16 bits por lo cual podemos trabajar con valores de hasta 65535.

Prescaler en los timers en Arduino

Cuando hablamos de Timer o temporizador siempre lo relacionamos con un prescaler, este es un circuito capaz de reducir aquella señal de alta frecuencia a una de menor frecuencia mediante un divisor, su principal función es regular el tiempo a una velocidad óptima para nuestro proyecto.

Arduino Uno tiene un cristal de 16MHz que trabaja directamente con el microcontrolador Atmega128P, esto implica que las interrupciones serian cada 4.1ms con un timer de 16 bits, y 15.94µs si usamos un Timer de 8 bits, esto generaría una interrupción demasiada rápida y no sería muy práctico.

Prescaler de un timer con arduino

El prescaler nos ayuda a ampliar el tiempo de trabajo, para este caso usaremos el modo CTC que consiste en realizar una comparación, esto hace que exista un desbordamiento del registro, si queremos hacer el calculo del valor de comparación y almacenarlo en el registro OCRnA, a continuación haremos un ejemplo sencillo para un segundo.

Calculo del periodo del prescaler

Si el resultado sobrepasa los 255 utilizaremos el Timer1 ya que admite hasta un valor de 65535.

Los Timer 0 y 2 solo admiten hasta un máximo de 255, lo primero que debemos hacer, es obtener la frecuencia mínima requerida y guardarlo en registro TCCRnB y el prescaler se habilitara, solo podemos trabajar con prescaler de 1, 8, 32, 64, 256 y 1024, el microcontrolador Atmega128P utiliza la siguiente formula, en caso de usar otro debe consultar su hoja de datos.

Donde OCRnx sera igual a 0 para obtener la máxima frecuencia posible y N representa el número del es el prescaler, con esto podemos ya podemos empezar a realizar nuestros cálculos.

En este caso obtendremos la máxima frecuencia con el prescaler de 1024 y si creemos que es óptimo para nuestro proyecto, entonces habilitaremos el prescaler en el registro TCCRnB.

Esto nos genera un periodo de 0.0000128 segundos.

Con este periodo de tiempo tendremos una interrupción por desbordamiento cada 32.64ms.

Como vemos aun es pequeño el tiempo pero podemos utilizar un acumulador para almacenar un valor en cada interrupción por desbordamiento, necesitaríamos alrededor de 30 ciclos para llegar lo más cerca de un segundo (0.03264s * 30 = 0.9792s), esta sería una solución en caso que deseemos trabajar con el Timer de 8bits.

Configuración de Timers en Arduino

Hasta ahora ya sabemos cómo obtener los tiempos para el Timer que deseamos usar, pero es hora de configurar en nuestro código y para esto necesitamos básicamente 4 instrucciones, TCCRnA/B, TCNTn, OCRnA y TIMSKn.

TCCRnA/B.- Es un registro para configurar el modo de funcionamiento del Timer.

TCNTN.- Es el registro  contador.

OCRnA.- Es un registro que lo usamos para realizar la comparación de los valores ya mencionados anteriormente y así realizar el desbordamiento y realizar las interrupciones.

TIMSKn.- Este registro es usado para configurar nuestra interrupción.

Funcion ISR(interrupcion)

Esta función es usada para realizar subrutinas que se ejecutaran en cada interrupción de nuestro Timer, el vector de interrupciones del microcontrolador Atmega328P tiene 10 posibles interrupciones para trabajar con el Timer.

2 comentarios sobre “Timer con Arduino o interrupciones internas

¿Qué te pareció el artículo?

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

  * He leído y acepto la política de privacidad

¿Qué hacemos con tus datos?

Creatividad Codificada como responsable tratará tus datos con la finalidad de gestionar tu participación en nuestro blog informativo. Puedes acceder, rectificar y suprimir tus datos, así como ejercer otros derechos consultando la información adicional y detallada sobre protección de datos en nuestra Política de Privacidad