Anda di halaman 1dari 22

__________________________________________________________________________ITSP

Timer1 del AVR

7.1 INTRODUCCIÓN
Timer/Contador 1 de 16 bits.

Registros

El registro del Timer/Contador 1 (TNCT1), y los Registros de Comparación de Salida


(OCR1A/B) y de Captura de Entrada (ICR1) todos son de 16 bits. Se usan
procedimientos especiales cuando se accesan los registros de 16 bits. Los registros de
Control del Timer/Contador 1 (TCCR1A/B) son registros de 8 bits y no existen
restricciones de acceso. Las señales de petición de interrupciones (Interruption
Request) son visibles en el Registro de Banderas de Interrupciones (TIMSK). Los
registros TIFR y TIMSK no se muestran en las figuras ya que estos registros son
compartidos por otras unidades.

Documento traducido de la hoja de datos del ATmega32 1


__________________________________________________________________________ITSP

El Timer/Contador 1 puede ser sincronizado internamente vía el preescalador o por una


fuente externa de reloj en el pin T1. El bloque lógico de selección de reloj controla cual
fuente de reloj, y si se incrementa (o decrementa) su valor. El Timer/Contador 1 esta
inactivo cuando ninguna fuente se selecciona. La salida de la selección lógica del reloj
se refiere al reloj del timer (clkT1). Los registros de comparación de salida de doble
buffer (OCR1A/B) son comparados con el valor del Timer/Contador 1 en todo momento.
El resultado de la comparación se puede usar por el generador de forma de onda y
generar PWM o variables de frecuencia de salida en el pin de salida de comparación
(OC1A/B). Un evento de igualdad en la comparación también activará la bandera de
comparación igualada (OCF1A/B) la cual se usa para generar solicitudes de
interrupciones en la comparación de salida.

El registro de captura de entrada puede capturar el valor del Timer/Contador 1 en un


evento externo dado (disparo de transición) o ya sea por el pin de Captura de entrada
(ICP1) o por los pines del Comparador Analógico. La unidad de captura de entrada
incluye una unidad de filtrado (cancelador de ruido) para la reducción de picos de ruido.
El valor TOP, o valor máximo del Timer/Contador 1, en algunos modos de operación
pueden ser definidos por el registro OCR1A, el registro ICR1 o por un conjunto de
valores fijos. Cuando se usa OCR1A como valor TOP en el modo PWM, el registro
OCR1 no puede ser utilizado para generar una salida PWM. Sin embargo, el valor TOP
será de doble buffer permitiendo al valor TOP sea cambiado mientras este corriendo el
contador. Si un valor fijo TOP se requiere, el registro ICR1 puede usarse como una
alternativa, liberando OCR1A/B a ser usado como salida PWM.

Definiciones

BOTTOM. El contador alcanza el BOTTOM cuando llegar a ser 0x0000.


MAX. El contador alcanza su máximo valor cuando llega a ser 0xFFFF (65535).
TOP. El contador alcanza su TOP cuando llega a ser igual al valor más alto en la
secuencia de conteo. El valor TOP puede ser asignado a uno de los valores fijos:
0x00FF, 0x1FF, 0x03FF o a los valores almacenados en los registros OCR1A o ICR1.
La asignación depende del modo de operación.

Accesando a los Registros de 16 bits

Los registros TCNT1, OCR1A/B e ICR1 son registros de 16 bits que pueden ser
accesados por el CPU del AVR vía el bus de datos de 8 bits. El registro de 16 bits debe
ser accesado usando 2 operaciones de lectura o escritura. Cada timer de 16 bits tiene
un solo registro temporal de 8 bits para almacenamiento temporal del byte alto de 16
bits. El mismo registro temporal se comparte entre los registros de 16 bits dentro de
cada timer de 16 bits. Accesando al byte bajo del registro de 16 bits ya sea escribiendo
o leyendo en él se dispara esta operación. Cuado el byte bajo del registro de 16 bits se
escribe por el CPU, el byte alto se almacena en el registro temporal, y escrito ambos,
estos son copiados al registro de 16 bits en el mismo ciclo de reloj. Cuando el byte bajo
del registro de 16 bits es leído por el CPU, el byte alto del registro de 16 bits se copia
dentro del registro temporal en el mismo ciclo de reloj tal como el byte bajo es leído.

Documento traducido de la hoja de datos del ATmega32 2


__________________________________________________________________________ITSP

No todos los accesos a 16 bits utilizan el registro temporal para el byte alto. Leyendo los
registros de 16 bits OCR1A/B no involucran registros temporales.

Para realizar una escritura a 16 bits, el byte alto debe ser escrito antes que el byte bajo.
Para una lectura a 16 bits, el byte bajo debe ser leído antes del byte alto.

El siguiente cogido ejemplo muestra como accesar a los registros del Timer de 16 bits
asumiendo que ninguna interrupción se actualiza el registro temporal.

El código ensamblador del ejemplo retorna el valor de TCNT1 en el par de registros


r17:r16. Es importante notar que el acceso a registros de 16 bits son operaciones
atómicas. Si una interrupción ocurre entre las dos instrucciones de acceso a los
registros de 16 bits, y el código de interrupción actualiza el registro temporal accesando
al mismo o a otros registros de timers a 16 bits, entonces el resultado del acceso a
estos registros será corrompido. Por consiguiente, cuando el código principal y el código
de interrupción actualicen los registros temporales, el código principal deberá
deshabilitar las interrupciones durante el acceso a 16 bits.

El siguiente código ejemplo muestra como hacer una lectura atómica al contenido del
registro TCNT1. Leyendo cualquier cualquiera de los registros OCR1A/B o ICP1 puede
ser hecho usando el mismo principio.

Documento traducido de la hoja de datos del ATmega32 3


__________________________________________________________________________ITSP

El código ejemplo ensamblador retorna el valor de TCNT1 en el par de registros r17:r16.

El siguiente código ejemplo muestra como hacer una escritura atómica al contenido de
los registros TCNT1. Escribiendo a cualquiera de los registros OCR1A/B o ICP1 puede
ser hecho usando el mismo principio.

Documento traducido de la hoja de datos del ATmega32 4


__________________________________________________________________________ITSP

Fuentes de reloj del Timer/Contador 1

El Timer/Contador 1 puede ser sincronizado por una fuente de reloj interna o externa, la
fuente de reloj se selecciona por la unidad lógica de selección de reloj la cual se
controla por los bits de selección (CS12:0) localizados en el registro de control B del
Timer/Contador 1 (TCCR1B).

Unidad de conteo.

La parte principal para el Timer/Contador 1 de 16 bits es la programación de la unidad


de conteo bidireccional.

Documento traducido de la hoja de datos del ATmega32 5


__________________________________________________________________________ITSP

Descripción de señales (señales internas):

Count Se incrementa o decrementa TCNT1 en 1.


Direction Se selecciona entre incremento o decremento.
Clear Limpia el TCNT1.
clkT1 Reloj del Timer/Contador 1.
TOP Señaliza que TCNT1 ha alcanzado el valor máximo.
BOTTOM Señaliza que TCNT1 ha alcanzado su valor mínimo.

El contador a 16 bits se mapea dentro de las localidades de memoria de 8 bits de I/O:


Parta alta del contador (TCNT1H) que contiene los 8 bits más altos del contador, y la
parte baja del contador (TCNT1L) que contiene los 8 bits más bajos del contador. El
registro TCNT1H puede solamente accesar indirectamente por el CPU. Cuando el CPU
realiza un acceso a la localidad TCNT1H I/O, el CPU accesa a la parte alta del registro
temporal (TEMP). El registro temporal se actualiza con el valor de TCNT1H cuando el
TCNT1L se lee, TCNT1H se actualiza con el valor del registro temporal cuando TCNT1L
se escribe. Esto permite al CPU leer o escribir al valor entero del contador de 16 bits
dentro de un ciclo de reloj vía el bus de datos de 8 bits. Es importante notar que existen
casos especiales cuando se escribe al registro TCNT1 mientras esta contando que
darán resultados impredecibles. Los casos especiales se describen en las secciones
donde son de importancia.

Dependiendo del modo de operación usado, el contador se limpia, se incrementa o


decrementa en cada ciclo de reloj (clkT1). El clkT1 puede ser generado de una fuente
de reloj externo o interno, seleccionando los bits de Selección de Reloj (CS12:0).
Cuando ninguna fuente de reloj se selecciona (CS12:0 = 0) el timer se detiene. Sin
embargo, el valor de TCNT1 puede ser accesado por el CPU, independientemente de si
clkT1 esta presente o no. Una escritura del CPU tiene prioridad sobre todos las
operaciones del contador o de limpieza del contador.

La secuencia de conteo se determina por los bits de configuración del Modo de


Generación de Forma de Onda (WGM13:0) localizados en los Registros de Control del
Timer/Contador 1 A y B (TCCR1A y TCCR1B) existen conexiones entre como el
contador cuenta y como se generan las formas de onda en la salida de la Comparación
de salida OC1x. La Bandera de Sobreflujo del Timer/Contador 1 (TOV1) es colocada de
acuerdo al modo de operación seleccionado por los bits WGM13:0. TOV1 puede ser
usado para generar la interrupción del CPU.

Documento traducido de la hoja de datos del ATmega32 6


__________________________________________________________________________ITSP

Unidad de Captura de Entrada

El Timer/Contador 1 incorpora una Unidad de Entrada de Captura que puede capturar


eventos externos y darles una indicación de ocurrencia en el tiempo estampado. La
señal externa indican que un evento o múltiples eventos pueden ser aplicados vía el pin
ICP1 o alternadamente, vía la unidad del Comparador Analógico. El tiempo estampado
puede ser usado para calcular la frecuencia, la razón del ciclo, y otras características de
la señal aplicada. Alternativamente el tiempo estampado puede ser usado para crear un
registro de los eventos.

A continuación se ilustra el diagrama a bloques de la unidad de captura de entrada.

Cuando ocurre un cambio en nivel lógico (un evento) en el pin de Captura de Entrada
(ICP1), o alternativamente en la Salida del Comparador Analógico (ACO) y este cambio
se confirma por los ajustes del detector de transición, una captura será disparada.
Cuando se dispara una captura, el valor de 16 bits del contador (TCNT1) se escribe en
el Registro de Captura de Entrada (ICR1). La bandera de Captura de Entrada (ICF1) se
pone a uno en el mismo ciclo de reloj así como el valor de TCNT1 se copia dentro del
registro ICR1. Si esta habilitado (TICIE1 = 1), la bandera de captura de entrada genera
una interrupción de captura de entrada. La bandera ICF1 es automáticamente limpiada
cuando la interrupción se ejecuta. Alternadamente la bandera ICF1 puede ser limpiada
por software escribiendo un uno lógico en la localidad del bit de I/O.

Documento traducido de la hoja de datos del ATmega32 7


__________________________________________________________________________ITSP

Leyendo el valor de 16 bits en el Registro de Captura de Entrada (ICR1) se realiza


primeramente leyendo el byte bajo (ICR1L) y entonces el byte alto (ICR1H). Cuando el
byte bajo es leído el byte alto se copia dentro del registro temporal del byte alto (TEMP).
Cuando el CPU lee la localidad ICR1H I/O accesará al registro TEMP.

El registro ICR1 puede ser escrito solamente cuando se usa el modo de generación de
forma de onda que utiliza al registro ICR1 para definir el valor TOP del contador. En
estos casos los bits del modo de generación de forma de onda (WGM13:0) deben ser
puestos a su valor TOP antes de escribirse al registro ICR1. Cuando se escribe al
registro ICR1 el byte alto debe ser escrito en la localidad ICR1H I/O antes que el byte
bajo es escrito en ICR1L.

Fuente de Captura de Entrada del Pin

La principal fuente de disparo para la unidad de captura de entrada es el pin de captura


de entrada (ICP1). El Timer/Contador 1 puede alternarse usando la salida del
comparador análogo como fuente de disparo ajustando el bit de Captura de Entrada del
Comparador Análogo (ACIC) en el Registro de Estado de Control del Comparador
Análogo (ACSR). Ten cuidado que cambiando la fuente de disparo puede activar una
captura. La bandera de captura de entrada debe limpiarse después del cambio.

Ambas entradas el pin de captura de entrada (ICP1) y la salida del comparador análogo
(ACO) son muestreadas usando algunas técnicas para el pin T1. El detector de flanco
es también idéntico. Sin embargo, cuando el cancelador de ruido de activa, lógica
adicional se inserta antes que el detector de flanco, el cual incrementa el retardo por 4
ciclos de reloj. Note que la entrada del cancelador de ruido y el detector de flanco esta
siempre habilitado a menos que el Timer/Contador 1 es puesto en modo generación de
forma de onda que utiliza ICR1 para definir el TOP.

Una captura de entrada puede ser disparada por software controlando el puerto del pin
ICP1.

Cancelador de Ruido

El cancelador de ruido mejora la inmunidad de ruido usando un esquema de filtrado


digital simple. La entrada del cancelador de ruido se monitorea sobre cuatro muestras, y
las cuatro deben ser iguales para cambiar la salida que esta en turno por el detector de
flanco.

El cancelador de ruido se habilita ajustando el bit de cancelador de ruido de entrada


(ICNC1) en el registro B de control del Timer/Contador 1 (TCCR1B). Cuando se habilita
el cancelador de ruido se introducen cuatro ciclos de reloj más de retardo para un
cambio aplicado a la entrada, hasta la actualización del registro ICR1. El cancelador de
ruido utiliza el sistema de reloj y por consiguiente no se afecta por el preescalador.

Usando la Unidad de Captura de Entrada

El principal desafío cuando se usa la unidad de captura de entrada es asignar bastante


capacidad en el procesador para el manejo de eventos de entrada. El tiempo entre dos

Documento traducido de la hoja de datos del ATmega32 8


__________________________________________________________________________ITSP

eventos es crítico. Si el procesador no ha leído el valor de captura en el registro ICR1


antes que el próximo evento ocurra, el ICR1 será sobrescrito con un nuevo valor. En
este caso el resultado de la captura será incorrecto.

Cuando se usa la interrupción de captura de entrada, el registro ICR1 deberá ser leído
tan pronto como el manejador de rutina de interrupción sea posible. Aún cuando la
interrupción de captura de entrada tenga relativamente una alta prioridad, el tiempo de
respuesta de interrupción máxima es dependiente en el número máximo de ciclos de
reloj manejando cualquiera de las solicitudes de interrupción.

Usando la unidad de captura de entrada en cualquier modo de operación cuando el


valor TOP (resolución) es cambiado durante la operación activa, no es recomendable.
La medida de un ciclo de una señal externa requiere que el flanco de disparo sea
cambiado después de cada captura. Cambiando el flanco de sensado debe ser hecho
tan pronto como sea posible después del registro ICR1 sea leído. Después de un
cambio en el flanco, la bandera de captura de entrada (ICF1) debe ser limpiada por
software (escribiendo un uno lógico al bit de la localidad de I/O). Para medir solamente
la frecuencia, limpiando la bandera ICF1 no es requerida (si se usa un manejador de
interrupción).

Unidades de Comparación de Salida

El comparador a 16 bits continuamente compara a TCNT1 con el registro de


Comparación de Salida (OCR1x). Si TCNT iguala a OCR1x el comparador señalizara
una igualdad. Una igualdad pondrá a uno la bandera de comparación de salida (OCF1)
en el próximo ciclo del timer. La bandera OCF1x automáticamente se limpia cuando la
interrupción se ejecuta. Alternadamente la bandera OCF1x puede ser limpiada por
software escribiendo un uno lógico a su localidad de I/O. El generador de forma de onda
usa esta señal de igualdad para generar una salida acorde al modo de operación
seleccionado por los bits (WGM13:0) y los bits del modo de comparación de salida
(COM1x1:0). Las señales de TOP y BOTTOM son usadas por el generador de forma de
onda para el manejo de casos especiales de valores extremos en algunos modos de
operación.

Una característica especial de la unidad de comparación de salida A es que permite


definir el valor TOP del Timer/Contador 1 (por ejemplo, la resolución del contador). En
resumen la resolución de contador, el valor TOP define el periodo de tiempo para
generar las formas de ondas por el generador.

La figura siguiente muestra un diagrama a bloques de la unidad de comparación de


salida. La letra “n” indica el número del timer 1, y “x” indica la unidad de comparación de
salida (A/B).

Documento traducido de la hoja de datos del ATmega32 9


__________________________________________________________________________ITSP

El registro OCR1x es de doble buffer cuando se usa para cualquiera de los 12 modos
de PWM. Para los modos de operación normal y limpieza del timer por comparación
(CTC), el doble buffer se deshabilita. El doble buffer sincroniza la actualización del
registro de comparación OCR1x ya sea en TOP o en BOTTOM de la secuencia de
conteo. La sincronización previene la ocurrencia de longitudes impares, pulsos no
simétricos PWM, y la creación de la salida libre de fallas. El acceso al registro OCR1x
puede ser complicado, pero este no es el caso. Cuando el doble buffer se habilita el
CPU tienen acceso al registro del buffer OCR1x, y si el doble buffer se deshabilita, el
CPU accesará al OCR1x directamente. El contenido de OCR1x (Buffer de comparación)
solamente se cambia por una operación de escritura (el Timer/Contador 1 no actualiza
este registro automáticamente como el TCNT1 y el registro ICR1). Por consiguiente
OCR1x no es leído vía el registro temporal alto (TEMP). Sin embargo, es una buena
práctica leer primero el byte bajo cuando se accesa a registros de 16 bits. Escribiendo a
los registros OCR1x debe ser hecho vía el registro TEMP ya que la comparación de
todos os 16 bits se hacen automáticamente. El byte alto (OCR1xH) tiene que estar
escrito primero. Cuando el byte alto de la localidad de I/O es escrito por el CPU, el
registro TEMP será actualizado por el valor escrito. Entonces cuando el byte bajo
(OCR1xL) se escriben a los ochos bits bajos, el byte alto será copiado dentro de los 8
bits altos del buffer OCR1x o el registro de comparación OCR1x en el mismo ciclo del
sistema de reloj.

Comparación de Salida Forzada

En los modos de generación de forma de onda no PWM, la salida igualada del


comparador puede ser forzada escribiendo a uno el bit de Comparación de Salida

Documento traducido de la hoja de datos del ATmega32 10


__________________________________________________________________________ITSP

Forzada (FOC1x). Forzando una comparación igualada no será puesta a uno la


bandera OCF1x o recarga/limpia del timer, pero el pin OC1x será actualizado como si
una comparación igualada real haya ocurrido (el ajuste de los bits COM1x1:0 definen si
el pin OC1x es puesto a uno, limpiado o invertido).

Bloqueo de una Comparación Igualada por una escritura en TCNT1

Todas las escrituras del CPU al registro TCNT1 bloquearan cualquier comparación
igualada que ocurra en el próximo ciclo de reloj del timer, aún cuando el timer sea
detenido. Esta característica permite a OCR1x sea inicializado al mismo valor como
TCNT1 sin disparar una interrupción cuando el Timer/Contador 1 del reloj sea
habilitado.

Usando la Unidad de Comparación de Salida

Ya que al escribir al TCNT1 en cualquier modo de operación bloqueara todas las


igualdades de comparación por un ciclo de reloj del timer, existe un riesgo involucrado
cuando cambiamos a TCNT1 al usar cualquier unidad de comparación de salida,
independientemente si el Timer/Contador 1 esta corriendo o no. Si el valor escrito a
TCNT1 iguala al valor OCR1x, la comparación igualada se perderá, resultando una
incorrecta generación de forma de onda. No escriba el TCNT1 igual a TOP en los
modos PWM con valores TOP variables. La comparación igualada para el TOP será
ignorada y el contador continuara hasta 0xFFFF. Similarmente, no escriba a TCNT1 a
BOTTOM cuando el contador este decrementándose.

El ajuste de OC1x deberá realizarse antes del establecimiento del registro de dirección
de datos para el pin del puerto como salida. La manera más fácil de ajustar el valor de
OC1x es usar los bits en la comparación de salida forzada (FOC1x) en el modo normal.
El registro OC1x mantiene su valor aún cuando cambie entre los modos de generación
de forma de onda.

Tenga cuidado de que los bits COM1x1:0 no son de doble buffer junto con el valor de
comparación. Cambiando los bits COM1x1:0 tomara efecto inmediatamente.

Unidad de Comparación Igualada de Salida

Los bits del modo de comparación de salida (COM1x1:0) tienen dos funciones. El
generador de forma de onda usa los bits COM1x1:0 para definir el estado de la
comparación de salida (OC1x) en la próxima comparación igualada. En segundo lugar
los bits COM1x1:0 controlan la fuente de salida del pin OC1x. La figura siguiente
muestra un diagrama esquemático del ajuste de los bits COM1x1:0. Los registros de
I/O, los bits de I/O, y los pines de I/O en la figura se muestran en negritas. Solamente
las partes de los registros de control del puerto de I/O (DDR y PORT) que son afectadas
por los bits COM1x1 se muestran. Cuando nos referimos al estado OC1, la referencia
es para el registro interno OC1x, no el pin OC1. Si un reset en el sistema ocurre, el
registro OC1x se refiere como un “0”.

Documento traducido de la hoja de datos del ATmega32 11


__________________________________________________________________________ITSP

La función general del puerto de I/O es sobre escrita por el comparador de salida
(OC1x) del generador de forma de onda si los bits del COM1x1:0 son puestos. Sin
embargo, la dirección del pin OC1x (entrada o salida) es aún controlada por el registro
de dirección de datos (DDR) para el pin del puerto. El bit del registro de dirección de
datos para el pin OC1x (DDR_OC1x) debe de estar colocada como salida antes que el
valor de OC1x sea visible en el pin. La función de sobre escritura del puerto es
generalmente independiente del modo de generación de la forma de onda, pero existen
algunas excepciones. El diseño del pin lógico de la comparación de salida permite la
inicialización del estado de OC1x antes que la salida sea habilitada. Note que ciertos
bits de COM1x1:0 se reservan para ciertos modos de operación. Los bits COM1x1:0 no
tienen efecto en la unidad de captura de entrada.

Modo de Salida de Comparación y Forma de Onda

El generador de forma de onda usa los bits COM1x1:0 para el modo normal, CTC, y
PWM. Para todos los modos, el ajuste de COM1x1:0 le dice al generador de forma de
onda que ninguna acción en el registro OC1x sea ejecutada en la próxima comparación
igualada. Verifique las siguientes tablas para el ajuste de los bits en los modos en
particular.

Modos de Operación

El modo de operación, por ejemplo, la conducta del Timer/Contador 1 y la salida de los


pines de la comparación de salida se definen por la combinación de los bits del modo
de Generación de la Forma de Onda (WGM13:0) y los bits del Modo de Comparación
de Salida (COM1x1:0). Los bits del modo de Comparación de Salida no afectan la
secuencia de conteo, mientras que los bits del modo de generación de forma de onda

Documento traducido de la hoja de datos del ATmega32 12


__________________________________________________________________________ITSP

si. Los bits COM1x1:0 controlan si la salida del PWM deberá ser invertida o no (PWM
invertido o no invertido). Para modo no PWM los bits COM1x1:0 controlan si la salida
deberá ser puesta a uno, limpiada o invertida cuando se iguala la comparación.

Modo Normal

Es el modo más simple de operar (WGM13:0 = 0). En este modo la dirección del conteo
es siempre ascendente y no se ejecuta ninguna limpieza al contador. El contador
simplemente sigue contando cuando pasa de su máximo valor de 16 bits (MAX =
0xFFFF) y entonces se reinita a su valor BOTTOM (0x0000). En operación normal la
bandera de Sobreflujo del Timer/Contador 1 (TOV1) será puesta en uno en el mismo
ciclo de reloj como TCNT1 llega ser cero. La bandera TOV1 en este caso llega a ser
como el 17vo bit, excepto que solamente puesto a uno, no limpiado. Sin embargo,
combinado con la interrupción del sobreflujo del timer que automáticamente limpia la
bandera TOV1, la resolución del timer puede ser incrementada por software. No existen
casos especiales para considerar en el modo normal, un valor nuevo de contador
puede ser escrito en cualquier tiempo.

La Unidad de Captura de Entrada es fácil de usar en el modo normal. Sin embargo,


observe que el máximo intervalo entre los eventos externos no debe exceder la
resolución del contador. Si el intervalo entre los eventos es muy largo, la interrupción
del sobreflujo del timer o el preescalador deben ser utilizados para extender la
resolución de la unidad de captura.

La unidad de comparación de salida puede ser usada para generar interrupciones en


algún tiempo dado. Usando la comparación de salida para generar formas de onda en
el modo normal no es recomendado, ya que esto ocuparía demasiado tiempo de
consumo del CPU.

Modo de Limpieza del Timer por Comparación Igualada (CTC)

En el modo de limpieza del timer por comparación o CTC (WGM13:0 = 4 o 12), los
Registros OCR1A o ICR1 son usados para manipular la resolución del contador. En el
modo CTC el contador se limpia a cero cuando el valor del contador (TCNT1) se iguala
ya sea a OCR1A (WGM13:0 = 4) o a ICR1 (WGM13:0 = 12). El OCR1A o ICR1 definen
el valor TOP del contador, y también su resolución. Esto modo permite mayor control de
la frecuencia de comparación de salida igualada. También se simplifica la operación de
conteo de eventos externos.

El diagrama de tiempos para el modo CTC se muestra a continuación. El valor del


contador (TCNT1) se incrementa hasta que ocurre una igualdad en la comparación con
ya sea OCR1A o ICR1, y entonces el contador (TCNT1) se reinicia.

Documento traducido de la hoja de datos del ATmega32 13


__________________________________________________________________________ITSP

Una interrupción puede ser generada cada vez que el contador alcanza el valor TOP ya
sea por la bandera OCF1A o ICF1 acorde al registro usado para definir el valor TOP. Si
la interrupción es habilitada, el manejador de rutina de interrupción puede ser usado
para actualizar el valor TOP. Sin embargo, cambiando el TOP a un valor cercano a
BOTTOM cuando el contador esta corriendo con ningún o un preescalador muy bajo
debe tenerse cuidado, ya que el modo CTC no posee la característica de doble buffer.
Si el nuevo valor escrito a OCR1A o a ICR1 es más bajo que el valor actual del TCNT1,
el contador perderá la igualdad en la comparación. El contador tendrá que contar a su
máximo valor (0xFFFF) y empezar en el inicio 0x0000 antes que la comparación
igualada pueda ocurrir. En muchos casos esta característica no es deseable. Una
alternativa será usar el modo PWM rápido usando OCR1A para definir el TOP
(WGM13:0 = 15) ya que el OCR1A será de doble buffer. Para generar una forma de
onda de salida en el modo CTC, la salida OC1A puede ser invertida en su nivel lógico
en cada igualdad de comparación ajustando los bits del modo de comparación de salida
en modo toggle (COM1A1:0 = 1). El valor OC1A no será visible en el pin del puerto a
menos que la dirección de datos para el pin este colocado como salida (DDR_OCR1A =
1). La forma de onda generada tendrá su máxima frecuencia de fOC1A = fclk_I/O /2 cuando
OCR1A sea colocado a cero (0x0000). La frecuencia de forma de onda se define por la
siguiente ecuación:

La variable N representa el valor del preescalador divisor (1, 8, 64, 256, o 1024).

Para el modo normal de operación, la bandera TOV1 se pone a uno en el mismo ciclo
de reloj cuando el contador pasa de MAX a 0x0000.

Modo PWM Rápido

La Modulación por Ancho de Pulso Rápida (WGM13:0 = 5, 6, 7, 14 o15) provee una alta
frecuencia de PWM en la opción de generación. El modo PWM rápido difiere de las
otras opciones de PWM por la operación de una sola pendiente. El contador cuenta

Documento traducido de la hoja de datos del ATmega32 14


__________________________________________________________________________ITSP

desde BOTTOM (0x0000) hasta TOP y entonces de reinicia a BOTTOM. En el modo de


comparación de salida no invertida, la salida de comparación (OC1x) se limpia cuando
se iguala la comparación entre TCNT1 y OCR1x y se pone en BOTTOM. En el modo de
comparación de salida invertida la salida se pone a uno cuando existe una comparación
igualada y se limpia en BOTTOM. Debido a la operación de una sola pendiente, la
frecuencia de operación en el modo PWM rápido puede ser dos veces tan alto como los
modos PWM de fase correcta y fase y frecuencia correcta que usan la operación de
doble pendiente, máxima más baja comparada con la operación de una sola pendiente.
Esta alta frecuencia hace que el modo PWM rápido se ocupe en aplicaciones de
regulación de potencia, rectificación y aplicaciones para DACs. La alta frecuencia
permite que componentes externos de tamaño pequeño (inductancias, capacitores)
reduzcan el costo del sistema total.

La resolución PWM para el modo PWM rápido puede fijarse a 8, 9 o 10 bits, o definirse
ya sea por ICR1 u OCR1A. La mínima resolución permitida es de 2 bits (ICR1 o ICR1A
se colocan a 0x0003) y la máxima resolución es a 16 bits (ICR1 o ICR1A se colocan a
MAX). La resolución PWM en bits puede ser calculada usando la siguiente ecuación:

En el modo PWM rápido el contador se incrementa hasta que el valor del contador
iguala ya sea uno de los valores fijos 0x00FF, 0x01FF, o 0x03FF (WGM13:0 = 5, 6 o 7),
o al valor en ICR1 (WGM13:0 = 14) o al valor de OCR1A (WGM13:0 = 15). El contador
entonces se limpia en el siguiente ciclo de reloj. El diagrama de tiempos para este modo
de muestra en la siguiente figura. La figura muestra el modo PWM rápido cuando
OCR1A o ICR1 se usan para definir el TOP. El valor TCNT1 se muestra en el diagrama
de tiempos como un histograma para ilustrar la operación de una sola pendiente. El
diagrama incluye las salidas para los modos PWM invertida y no invertida. La marca
horizontal en la pendiente de TCNT1 representa el momento cuando se iguala a OCR1x
y TCNT1. La bandera de interrupción OC1x será colocada a uno cuando una
comparación igualada ocurra.

Documento traducido de la hoja de datos del ATmega32 15


__________________________________________________________________________ITSP

La bandera de sobreflujo del Timer/Contador 1 (TOV1) se coloca a uno cada vez que el
timer alcanza el valor TOP. En resumen las banderas OC1A o ICF1 se ponen a uno en
el mismo ciclo de reloj del timer como TOV1 es puesto a uno cuando ya sea OCR1A o
ICR1 se utilizan para definir el valor TOP. Si una de las interrupciones esta habilitada, el
manejador de rutinas de interrupción puede ser utilizado para actualizar los valores de
comparación de TOP.

Cuando se cambia el valor TOP en el programa, debe asegurase que el nuevo valor
TOP sea mayor o igual al valor de todos los registros de comparación. Si el valor TOP
esta más abajo que en cualquiera de los registros de comparación, una igualdad en la
comparación nunca ocurrirá entre TCNT1 y el OCR1x. Note que cuando se usan
valores fijos TOP, los bits sin usarse son enmascarados a cero cuando cualquiera de
los registros OCR1x sea escrito.

El procedimiento para actualizar ICR1 difiere de la actualización de OCR1A cuando se


usa para definir el valor TOP. El registro ICR1 no es de doble buffer. Esto significa que
si ICR1 se cambia a una valor más pequeño cuando el contador esta corriendo con
ninguno o algún valor bajo de preescalación, existe un riesgo que el nuevo valor de
ICR1 escrito es más bajo que el valor actual de TCNT1. El resultado entonces resultara
que el contador pierda la igualdad en la comparación del valor TOP. El contador tendrá
que contra hasta MAX (0xFFFF) y comenzar en 0x0000 antes que la comparación
igualada pueda ocurrir. El registro OCR1A sin embargo, es de doble buffer. Esta
característica permite escribir en la localidad de OCR1A I/O sea escrita en cualquier
tiempo. Cuando se escribe en la localidad OCR1A I/O el valor escrito será puesto
dentro del registro del buffer OCR1A. el registro de comparación OCR1A será
actualizado con el valor del registro de buffer en el próximo ciclo de reloj cuanto TCNT1
iguale a TOP. La actualización se hace en el mismo ciclo de reloj del timer como el
TCNT1 es limpiado y la bandera TOV1 es puesta a uno.

Documento traducido de la hoja de datos del ATmega32 16


__________________________________________________________________________ITSP

Usando el registro ICR1 para definir a TOP trabaja bien cuando se usan valores fijos de
TOP. Usando el ICR1, el registro OCR1A esta libre para usarse para generar la salida
PWM en OC1A. Sin embargo, si la frecuencia base PWM se activa cambiando el valor
TOP, se usa el OCR1A como TOP, es mejor elección debido a la característica de
doble buffer.

En el modo PWM rápido, la unidad de comparación permite la generación de PWM en


los pines OC1x. Ajustando los bits COM1x1:0 a 2 producirán un PWM no invertido y una
salida PWM invertida puede generarse ajustando los bits COM1x1:0 a 3. El valor actual
de OC1x solamente será visible en el pin del puerto si la dirección de datos de ese pin
se ajusta como salida (DDR_OC1x). La forma de onda PWM se genera poniendo a uno
(o limpiando) el registro OCR1x cuando se iguala la comparación entre OCR1x y
TCNT1, y se limpia (o se pone a uno) el registro OC1x en el mismo ciclo de reloj del
timer, el contador se reinicia (cambia de TOP a BOTTOM).

La frecuencia PWM para la salida puede ser calculada por la siguiente ecuación:

La variable N representa el valor del preescalador divisor (1, 8, 64, 256, o 1024).

Los valores extremos para el registro OCR1x representan casos especiales cuando se
genera una forma de onda de salida en el modo PWM rápido. Si el OCR1x es puesto
igual a BOTTOM (0x0000), la salida será un pequeño pico por cada ciclo de reloj del
timer TOP+1. Ajustando el OCR1x igual a TOP resultara en una salida constante alta o
baja (dependiendo de la polaridad de la salida ajustando los bits COM1x1:0).

Una forma de onda de frecuencia (al 50% de la razón del ciclo) de salida en el modo
PWM rápido puede ser alcanzada ajustando OC1A a toggle su nivel lógico en cada
comparación igualada (COM1A1:0 = 1). Esto aplica solamente si OCR1A se usa para
definir el valor TOP (WGM13:0 = 15). La forma de onda generada tendrá una frecuencia
máxima de fOC1A = fclk_I/O /2 cuando OCR1A es colocado a cero (0x0000). Esta
característica es similar al toggle de OC1A en el modo CTC, excepto por la
característica de doble buffer en la unidad de comparación de salida se habilita en el
modo PWM rápido.

Modo PWM de Fase Correcta

La Modulación de Ancho de Pulso de Fase Correcta (WGM13:0 1, 2, 3, 10 u 11) provee


una alta resolución en la opción de generación de forma de onda PWM de fase
correcta. El modo PWM de fase correcta se parece al modo PWM de fase y frecuencia
correcta basado en la operación de la doble pendiente. El contador cuenta
repetidamente desde BOTTOM (0x0000) hasta TOP y desde TOP hasta BOTTOM. En
el modo de comparación de salida no invertida, la salida de comparación (OC1x) se
limpia cuando se iguala la comparación entre TCNT1 y OCR1x mientras sigue su
conteo ascendente, y se pone a uno cuando se iguala la comparación mientras sigue su
conteo descendente. En el modo de comparación de salida invertido, esta operación se

Documento traducido de la hoja de datos del ATmega32 17


__________________________________________________________________________ITSP

invierte. La operación de doble pendiente ofrece una frecuencia de operación máxima


más baja comparada con la operación de una sola pendiente. Sin embargo, debido a la
característica simétrica del modo PWM de doble pendiente, estos modos se prefieren
para aplicaciones de control de motores.

La resolución PWM para el modo PWM de fase correcta puede fijarse a 8, 9 o 10 bits, o
definirse ya sea por ICR1 u OCR1A. La mínima resolución permitida es de 2 bits (ICR1
o ICR1A se colocan a 0x0003) y la máxima resolución es a 16 bits (ICR1 o ICR1A se
colocan a MAX). La resolución PWM en bits puede ser calculada usando la siguiente
ecuación:

En el modo PWM de fase correcta el contador se incrementa hasta que el valor del
contador iguala ya sea uno de los valores fijos 0x00FF, 0x01FF, o 0x03FF (WGM13:0 =
1, 2, o 3), o al valor en ICR1 (WGM13:0 = 10) o al valor de OCR1A (WGM13:0 = 11). El
contador entonces tiene que alcanzar el valor TOP y cambiar la dirección de la cuenta.
El valor TCNT1 será igual a TOP por un solo ciclo de reloj. El diagrama de tiempos para
este modo de muestra en la siguiente figura. La figura muestra el modo PWM de fase
correcta cuando OCR1A o ICR1 se usan para definir el TOP. El valor TCNT1 se
muestra en el diagrama de tiempos como un histograma para ilustrar la operación de
doble pendiente. El diagrama incluye las salidas para los modos PWM invertida y no
invertida. La marca horizontal en la pendiente de TCNT1 representa el momento
cuando se iguala a OCR1x y TCNT1. La bandera de interrupción OC1x será colocada a
uno cuando una comparación igualada ocurra.

Documento traducido de la hoja de datos del ATmega32 18


__________________________________________________________________________ITSP

La bandera de sobreflujo del Timer/Contador 1 (TOV1) se coloca a uno cada vez que el
timer alcanza el valor BOTTOM. Cuando ya sea OCR1A o ICR1 se utilizan para definir
el valor TOP, la bandera OC1A o ICF1 se ponen a uno de acuerdo en el mismo ciclo de
reloj como posregistros OCR1x son actualizados con el valor de doble buffer (en TOP).
Las banderas de interrupción pueden se usadas para generar interrupciones cada vez
que el contador alcanza el valor TOP o BOTTOM.

Cuando se cambia el valor TOP en el programa, debe asegurase que el nuevo valor
TOP sea mayor o igual al valor de todos los registros de comparación. Si el valor TOP
esta más pequeño que en cualquiera de los registros de comparación, una igualdad en
la comparación nunca ocurrirá entre TCNT1 y el OCR1x. Note que cuando se usan
valores fijos TOP, los bits sin usarse son enmascarados a cero cuando cualquiera de
los registros OCR1x se escriben. Como se muestra en la figura siguiente el tercer
periodo, se cambia el valor TOP activo mientras el Timer/Contador 1 esta corriendo en
el modo de fase correcta puede resultar en una salida no simétrica. La razón de esto
puede ser por el tiempo de actualización del registro OCR1x. Ya que la actualización de
OCR1x ocurre en TOP, el periodo PWM inicia al final del TOP, mientras que la longitud
de la pendiente de subida se determina por el nuevo valor TOP. Cuando estos dos
valores difieren, las dos pendientes del periodo diferirán en longitud. La diferencia en
longitud nos da un resultado de salida asimétrico.

Es recomendable usar el modo de fase y frecuencia correcta en lugar del modo de fase
correcta cuando se cambia el valor TOP mientras el Timer/Contador 1 esta corriendo.
Cuando se usa un valor TOP estático no existe diferencia entre los dos modos de
operación.

En el modo PWM de fase correcta, la unidad de comparación permite la generación de


PWM en los pines OC1x. Ajustando los bits COM1x1:0 a 2 producirán un PWM no
invertido y una salida PWM invertida puede generarse ajustando los bits COM1x1:0 a 3.
El valor actual de OC1x solamente será visible en el pin del puerto si la dirección de
datos de ese pin se ajusta como salida (DDR_OC1x). La forma de onda PWM se
genera poniendo a uno (o limpiando) el registro OCR1x cuando se iguala la
comparación entre OCR1x y TCNT1 cuando el contador se incrementa, y se limpia (o
se pone a uno) el registro OC1x cuando se iguala la comparación entre OCR1x y
TCNT1 cuando el contador se decrementa. La frecuencia PWM para la salida cuando
se usa PWM de fase correcta puede ser calculada por la siguiente ecuación:

La variable N representa el valor del preescalador divisor (1, 8, 64, 256, o 1024).

Los valores extremos para el registro OCR1x representan casos especiales cuando se
genera una forma de onda de salida en el modo PWM de fase correcta. Si el OCR1x es
puesto igual a BOTTOM, la salida será continuamente baja y si es puesta al valor TOP
la salida será continuamente alta para el modo PWM no invertido. Para el PWM
invertido la salida tendrá valores lógicos opuestos. Si se usa OCR1A para definir el

Documento traducido de la hoja de datos del ATmega32 19


__________________________________________________________________________ITSP

valor TOP (WGM13:0 = 11) y COM1A1:0 =1, la salida OCR1A será invertida con una
razón de ciclo al 50%.

Modo PWM de Fase y Frecuencia Correcta

La Modulación por Amplitud de Pulso de Fase y Frecuencia Correcta, (WGM13:0 = 8 o


9) provee una alta resolución en la generación de forma de onda PWM de fase y
frecuencia correcta. El modo PWM de fase y frecuencia correcta es parecido al modo
PWM de fase correcta basado en la operación de doble pendiente. El contador cuenta
repetidamente desde BOTTOM (0x0000) hasta TOP y desde TOP hasta BOTTOM. En
el modo de comparación de salida no invertida, la salida de comparación (OC1x) se
limpia cuando se iguala la comparación entre TCNT1 y OCR1x mientras sigue su
conteo ascendente, y se pone a uno cuando se iguala la comparación mientras sigue su
conteo descendente. En el modo de comparación de salida invertido, esta operación se
invierte. La operación de doble pendiente ofrece una frecuencia de operación máxima
más baja comparada con la operación de una sola pendiente. sin embargo, debido a la
característica simétrica del modo PWM de doble pendiente, estos modos se prefieren
para aplicaciones de control de motores.

La principal diferencia entre la fase correcta y el modo de fase y frecuencia correcta


PWM es el tiempo de actualización del registro OCR1x por el registro del buffer OCR1x.

La resolución PWM para el modo PWM de fase y frecuencia correcta puede ser definido
por ICR1 o ICR1A. La mínima resolución permitida es de 2 bits (ICR1 o ICR1A se
colocan a 0x0003) y la máxima resolución es a 16 bits (ICR1 o ICR1A se colocan a
MAX). La resolución PWM en bits puede ser calculada usando la siguiente ecuación:

En el modo PWM de fase y frecuencia correcta el contador se incrementa hasta que el


valor del contador iguala ya sea al valor en ICR1 (WGM13:0 = 8) o al valor de OCR1A
(WGM13:0 = 9). El contador entonces tiene que alcanzar el valor TOP y cambiar la
dirección de la cuenta. El valor TCNT1 será igual a TOP por un solo ciclo de reloj. El
diagrama de tiempos para este modo de muestra en la siguiente figura. La figura
muestra el modo PWM de fase y frecuencia correcta cuando OCR1A o ICR1 se usan
para definir el TOP. El valor TCNT1 se muestra en el diagrama de tiempos como un
histograma para ilustrar la operación de doble pendiente. El diagrama incluye las
salidas para los modos PWM invertida y no invertida. La marca horizontal en la
pendiente de TCNT1 representa el momento cuando se iguala a OCR1x y TCNT1. La
bandera de interrupción OC1x será colocada a uno cuando una comparación igualada
ocurra.

Documento traducido de la hoja de datos del ATmega32 20


__________________________________________________________________________ITSP

La bandera de sobreflujo del Timer/Contador 1 (TOV1) se coloca a uno en el mismo


ciclo de reloj del timer como los registros OCR1x son actualizados con el valor de doble
buffer (en BOTTOM). Cuando ya sea OCR1A o ICR1 se utilizan para determinar el valor
TOP, la bandera se pone a uno OC1A o ICF1 cuando TCNT1 ha alcanzado el TOP. Las
banderas de interrupción pueden se usadas para generar interrupciones cada vez que
el contador alcanza el valor TOP o BOTTOM.

Cuando se cambia el valor TOP en el programa, debe asegurase que el nuevo valor
TOP sea mayor o igual al valor de todos los registro de comparación. Si el valor TOP
esta más abajo de cualquier registro de comparación, una igualdad en la comparación
nunca ocurrirá entre TCNT1 y el OCR1x. Como se muestra en la figura siguiente. Ya
que los registros OCR1x son actualizados a BOTTOM, la longitud de las pendientes de
subida y bajada siempre serán iguales. Esto resulta en pulsos simétricos de salida y por
consiguiente la frecuencia correcta.

Usando el registro ICR1 para definir que TOP trabaja bien cuando se usan valores fijos
de TOP. Usando ICR1A, el registro OCR1A queda libre para usarse en la generación de
salida PWM en OC1A. Sin embargo, si la frecuencia base PWM se activa cambiando el
valor TOP, se usa el OCR1A como valor TOP, es una mejor decisión debido a su
característica de doble pendiente.

En el modo PWM de fase y frecuencia correcta, la unidad de comparación permite la


generación de PWM en los pines OC1x. Ajustando los bits COM1x1:0 a 2 producirán un
PWM no invertido y una salida PWM invertida puede generarse ajustando los bits
COM1x1:0 a 3. El valor actual de OC1x solamente será visible en el pin del puerto si la
dirección de datos de ese pin se ajusta como salida (DDR_OC1x). La forma de onda
PWM se genera poniendo a uno (o limpiando) el registro OCR1x cuando se iguala la
comparación entre OCR1x y TCNT1 cuando el contador se incrementa, y se limpia (o
se pone a uno) el registro OC1x cuando se iguala la comparación entre OCR1x y

Documento traducido de la hoja de datos del ATmega32 21


__________________________________________________________________________ITSP

TCNT1 cuando el contador se decrementa. La frecuencia PWM para la salida cuando


se usa PWM de fase y frecuencia correcta puede ser calculada por la siguiente
ecuación:

La variable N representa el valor del preescalador divisor (1, 8, 64, 256, o 1024).

Los valores extremos para el registro OCR1x representan casos especiales cuando se
genera una forma de onda de salida PWM en el modo de fase y frecuencia correcta. Si
el OCR1x es puesto igual a BOTTOM, la salida será continuamente baja y si es puesta
al valor TOP la salida será puesta en alta para el modo PWM no invertido. Para el PWM
invertido la salida tendrá valores lógicos opuestos. Si se usa OCR1A para definir el
valor TOP (WGM13:0 = 9) y COM1A1:0 =1, la salida OCR1A será invertida con una
razón de ciclo al 50%.

Documento traducido de la hoja de datos del ATmega32 22

Anda mungkin juga menyukai