0% encontró este documento útil (0 votos)
66 vistas5 páginas

Interrupciones Con Timer Arduino

Los temporizadores en Arduino permiten ejecutar tareas en segundo plano mientras se realizan otras operaciones. Funcionan mediante interrupciones configuradas para dispararse cuando un contador alcance un valor de comparación. Existen diferentes temporizadores en Arduino que pueden configurarse en modos como PWM o CTC para disparar interrupciones a diferentes frecuencias controladas por un prescaler.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
66 vistas5 páginas

Interrupciones Con Timer Arduino

Los temporizadores en Arduino permiten ejecutar tareas en segundo plano mientras se realizan otras operaciones. Funcionan mediante interrupciones configuradas para dispararse cuando un contador alcance un valor de comparación. Existen diferentes temporizadores en Arduino que pueden configurarse en modos como PWM o CTC para disparar interrupciones a diferentes frecuencias controladas por un prescaler.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 5

Temporizadores en Arduino

Los temporizadores en Arduino están fuertemente relacionados con las interrupciones


externas vistas, esto se debe a que los temporizadores serán ejecutados por una
interrupción para atender alguna tarea definida. Existen algunas funciones en Arduino
utilizan los temporizadores en segundo plano, por ejemplo la función delay(), que permite
definir una espera de tiempo en la que el Arduino detiene la ejecución del programa
principal. Este es precisamente el problema de esta función, que bloquea el programa
principal y se debe esperar hasta que la espera termine para continuar.
En lo anterior radican las ventajas del uso de temporizadores en Arduino, ya que permiten
temporizar cuando simultáneamente se está realizando otra tarea con la placa.

Modos de los Timers:


1. Señal PWM: Modulación por ancho de pulsos.

2. CTC (Clear timer on compare match): En este modo de funcionamiento el sistema


contabiliza un tiempo dentro de un contador, y al alcanzar el registro de los timers,
se ejecuta una interrupción asociada.
En la siguiente imagen se muestran los modos que pueden ser configurados en los registros
del microcontrolador para configurar los timers de Arduino.
Dado que el temporizador es un recurso del microcontrolador de la placa Arduino, se puede
realizar el conteo del tiempo sin la necesidad de utilizar algún hardware externo. Cada placa
de Arduino posee un cristal de cuarzo (oscilador), para el caso de la placa Arduino Pro MINI,
UNO y MGEA, se tiene un oscilador de 16 MHz. Este oscilador es el encargado de darle los
tiempos de ejecución (ticks) al programa interno del Arduino.
Según la frecuencia del oscilador, teóricamente se podría ejecutar una interrupción cada
1/16.000.000 segundos (1 tick). Cada instrucción consume “x” ciclos de reloj, entonces se
tiene que dividir la frecuencia del reloj. La mayoría de las instrucciones consumen un ciclo.
Para ejecutar las instrucciones propias del Arduino, muchas veces se requiere más de un
tick. Los timers disponibles en Arduino poseen un registro el cual indica cuántos ticks son
necesarios para disparar el timer. Dependiendo de la placa de Arduino, se tienen los
siguientes timers:
Timer 0 Arduino
Es un timer de 8 bits. Se utiliza para las funciones delay(), millis(), micros(). Es conveniente
no modificar este timer para evitar alterar estas funciones que son muy utilizadas.

Timer 1 Arduino
Es un timer de 16 bits. Es utilizado por la librería Servo en el Arduino UNO. Se utiliza para el
control de servomotores. Así que, si se van a manipular servomotores no se debe modificar
este timer.

Timer 2 Arduino
Al igual que el 0, es un timer de 8 bits. Es utilizado en la función tone(). Si no se va a utilizar
esta función, se puede utilizar este timer libremente.

Timer 3,4 y 5
Solo disponibles para los Arduino MEGA, estos timers son de 16 bits y se utilizan
principalmente para el control de servomotores.

Prescales y Registros de comparación


Como ya se mencionó anteriormente, debido a la frecuencia del oscilador (16 MHz), los
temporizadores pueden incrementar sus contadores cada 1/16.000.000 de segundos, es
decir, más o menos cada 63 ns, por ejemplo, contará se incrementará 10 veces en 625 ns,
un valor muy pequeño.
Los timer 0 y 2, que son de 8 bits, pueden almacenar máximo un valor de contador de 255;
y el timer 1, que es de 16 bits, puede almacenar un valor máximo de contador de 65535.
Una vez que el contador alcanza su valor máximo se produce un desbordamiento, es decir,
que vuelve a cero.
Esto significa que, a una frecuencia de 16 MHz, incluso al configurar el registro de
comparación con el valor máximo del contador, se producirían interrupciones cada
256/16.000.000 segundos (aproximadamente 16 us) para los contadores de 8 bits, y cada
65535/16.000.000 segundos (aproximadamente 4 ms) para el contador de 16 bits.
Claramente, estos siguen siendo valores muy pequeños, y producir interrupciones con tanta
frecuencia no tiene mucho sentido.
Para controlar la velocidad de incremento del temporizador se utiliza un prescaler que
establece la velocidad de temporización con la siguiente ecuación:

𝐹𝑟𝑒𝑐𝑢𝑒𝑛𝑐𝑖𝑎 𝑑𝑒𝑙 𝑜𝑠𝑐𝑖𝑙𝑎𝑑𝑜𝑟 (𝐻𝑧)


𝐹𝑟𝑒𝑐𝑢𝑒𝑛𝑐𝑖𝑎 𝑑𝑒 𝑡𝑒𝑚𝑝𝑜𝑟𝑖𝑧𝑎𝑐𝑖ó𝑛(𝐻𝑧) =
𝑝𝑟𝑒𝑠𝑐𝑎𝑙𝑒𝑟

Es importante mencionar que un prescaler solo puede tener los valores 1, 8, 64, 256 y 1024.
Por lo tanto, un prescaler de 8 incrementará la frecuencia a 2MHz, uno de 64 la incrementará
a 250 kHz, etc.

La frecuencia de interrupción está dada por la siguiente ecuación:


𝐹𝑟𝑒𝑐𝑢𝑒𝑛𝑐𝑖𝑎 𝑑𝑒 𝑜𝑠𝑐𝑖𝑙𝑎𝑑𝑜𝑟 𝑑𝑒 𝐴𝑟𝑑𝑢𝑖𝑛𝑜 (𝐻𝑧)
𝐹𝑟. 𝑑𝑒 𝐼𝑛𝑡𝑒𝑟𝑟𝑢𝑝𝑐𝑖ó𝑛 =
𝑝𝑟𝑒𝑠𝑐𝑎𝑙𝑒𝑟 ∗ (𝑟𝑒𝑔𝑖𝑠𝑡𝑟𝑜 𝑑𝑒 𝑐𝑜𝑚𝑝𝑎𝑟𝑎𝑐𝑖ó𝑛 + 1 )
El +1 se debe a que el registro de comparación está indexado a cero.
Ya que lo que interesa es el registro de comparación, que da la frecuencia de interrupción
deseada, se puede despejar y resulta:
𝐹𝑟𝑒𝑐𝑢𝑒𝑛𝑐𝑖𝑎 𝑑𝑒 𝑜𝑠𝑐𝑖𝑙𝑎𝑑𝑜𝑟 𝑑𝑒 𝐴𝑟𝑑𝑢𝑖𝑛𝑜 (𝐻𝑧)
𝑅𝑒𝑔𝑖𝑠𝑡𝑟𝑜 𝑑𝑒 𝑐𝑜𝑚𝑝𝑎𝑟𝑎𝑐𝑖ó𝑛 = −1
𝑝𝑟𝑒𝑠𝑐𝑎𝑙𝑒𝑟 ∗ 𝐹𝑟𝑒𝑐𝑢𝑒𝑛𝑐𝑖𝑎 𝑑𝑒 𝑖𝑛𝑡𝑒𝑟𝑟𝑢𝑝𝑐𝑖ó𝑛 𝑑𝑒𝑠𝑒𝑎𝑑𝑎

Es importante resaltar que al utilizar los temporizadores 0 y 2, este número debe ser menor
que 256 y menor que 65536 para el temporizador 1.

Ejemplo:
Se desea establecer una interrupción con una frecuencia de 1Hz, es decir, cada segundo,
con un prescaler de 1024.
16000 𝑀𝐻𝑧
𝑅𝑒𝑔𝑖𝑠𝑡𝑟𝑜 𝑑𝑒 𝑐𝑜𝑚𝑝𝑎𝑟𝑎𝑐𝑖ó𝑛 = − 1 = 15624
1024 ∗ 1𝐻𝑧

Ya que el registro de comparación tiene un valor mayor que 256, se debe utilizar el
temporizador 1.

Registros del Temporizador


Internamente, el microcontrolador del Arduino es manejado por diferentes registros. La
gran ventaja de Arduino es que muchas no es necesario entrar en detalle de como configurar
estos registros internos, ya que la propia interfaz de Arduino hace toda la configuración. Sin
embargo, en aplicaciones como el Timer, si no se emplean librerías, se debe optar por
modificar estos registros manualmente. Los registros de temporizador más importantes son:

• TCCRnA/B: Registros de control para poder configurar el timer en modo CTC y el pre-
escalador.
o Para los timers 0 y 2:
▪ TCCRnA debe estar todo en 0 excepto por el bit WGM01 que debe
estar en 1 para configurar el modo CTC.
▪ TCCRnB debe estar todo en 0 excepto los bits que se van a usar en 1
para el pre-escalador (si se va a utilizar).
o Para el timer 1:
▪ TCCRnA debe estar todo en 0 para su uso.
▪ TCCRnB debe estar todo en 0 excepto por el bit WGMn2 que debe
estar en 1 para configurar el modo CTC y los bits del pre-escalador
que se requieran en uno.

• TCNTn : Es el registro del contador, por lo general se inicializa en 0.


• OCRnA: Registro comparador de salida. Después de definir un pre-escalador, este
registro se utiliza como un valor específico para que las interrupciones ocurran
cuando el valor del contador (TCNTn) coincida con este.
• TIMSkn: Es el registro de configuración de interrupción. En este caso, se utiliza con
todos los bits en 0, excepto el bit OCIEnA, ya que debe estar en 1 para indicarle al
timer que el registro OCRnA se va a utilizar a modo de comparación.

Configuración de Timers en Arduino


Para iniciar, se debe establecer el modo CTC para activar las interrupciones cada vez que
ocurre un desbordamiento del TIMER, lo cual sucede cuando el registro contador (TCNTn)
coincide con el valor del registro de comparación de salida (OCRnA/B). Los registros
correspondientes deben ser consultados en la hoja de datos del microcontrolador que se
esté utilizando con precaución. La ventaja que ofrece Arduino IDE es que ya se definen los
registros correspondientes a la placa utilizada. La configuración de los timers de Arduino se
realiza dentro de la función setup() del Sketch, siempre desactivando las interrupciones
antes de comenzar a configurar el/los timer/s y reactivándolas al final.
La configuración del código de la interrupción se predefine con la función:
ISR(interrupcion)
{
// código aquí
}
y la interrupción se configura haciendo uso de las constantes pre-configuradas para cada
placa. En caso de la placa Arduino se utiliza la instrucción TIMERn_COMPA_vect

También podría gustarte