El Timer0 y el Timer2 en Modo PWM Inicialmente era el Timer1 el que fue plenamente equipado para generar ondas PWM. Si bien los otros Timers también ofrecen esa funcionalidad, aún tienen muchas limitaciones. El Timer0 de los AVR AV R actuales puede producir hasta dos canales PWM, por los pines OC0A y OC0B. El Timer2 hace lo propio por los pines OC2A y OC2B. Estos pines deberán estar configurados como salida para dar salida a las señales PWM. Esta es una característica que distingue a los módulos PWM de los demás periféricos del megaAVR donde la configuración y control de los pines involucrados quedan a cargo del módulo respectivo. Dada la paridad entre los dos Timers y entre los dos canales PWM, volvemos a aclarar que la siguiente exposición está relacionada solo al canal A del Timer0, dando por sentado que es también aplicable al canal B, tanto del Timer0 como del Timer2. Tabla WGM02 WGM02 WGM01 WGM00 Modo de Operación del Timer0 Inicio del Conteo Tope del Conteo 0
0
1
PWM de Fase Correcta
0x00
0xFF
0
1
1
Fast PWM
0x00
0xFF
1
0
1
PWM de Fase Correcta
0x00
OCR0A
1
1
1
Fast PWM
0x00
OCR0A
La tabla de arriba nos muestra que el Timer0 puede generar dos tipos de ondas PWM, Fast PWM y PWM de Fase Correcta, según la forma como avanza el registro TCNT0. registro TCNT0. Cada Cada uno de estos modos tiene a su vez una variante (aparecen sombreados en la tabla), donde el tope del conteo es el valor del registro OCR0A. registro OCR0A. Estos Estos modos son especiales que suelen entorpecer la comprensión del modo PWM de los Timers. Así que los ignoraremos por el momento y en adelante asumiremos que el valor tope del Timer0 es siempre de 255. Con eso en mente podemos seguir. Timer0 en modo Fast PWM El modo Fast PWM se conoce también como PWM de pendiente única porque el registro TCNT0 registro TCNT0 avanza siempre hacia arriba, es decir, cuenta desde 0 hasta un valor TOPE que es 255, después de lo cual se resetea y vuelve a empezar desde 0. Si graficamos este progreso, la curva resulta siendo efectivamente una escalera de pendiente única, como se ve abajo.
Como se indica en la figura, la onda Fast PWM es generada por la conmutación del pin OC0A cada vez que el registro TCNT0 llega al tope y cada vez que TCNT0 coincide con el registro OCR0A. En la gráfica las coincidencias se señalan con pequeñas líneas rojas horizontales sobre la escalera. Según la configuración de los bits COM0A1 y COM0A0 (del registro TCCR0A), la onda PWM puede ser invertida o no invertida.
Si los bits COM0A1:0 valen 0b10 se establece una onda no-invertida, esto es, el pin OC0A se setea cuando TCNT0 llega al tope y se limpia cuando TCNT0 coincide con el registro OCR0A. Si los bits COM0A1:0 valen 0b11 se establece una onda invertida, esto es, el pin OC0A se limpia cuando TCNT0 llega al tope y se setea cuando TCNT0 coincide con el registro OCR0A.
Puesto que el Timer0 siempre cuenta en todo su rango de 0 a 255, se deduce que el periodo, y por ende la frecuencia, de la onda PWM también serán constantes. Esa es la limitación del modo PWM de los Timers de 8 bits. Por otro lado, sí es posible modificar el valor del registro OCR0A, lo cual nos permitirá controlar el duty cycle de la onda PWM. En la siguiente imagen se indican las fórmulas para calcular el periodo y el duty cycle de una onda Fast PWM no-invertida. Como siempre, F_CPU es la frecuencia del procesador y N es el factor del
prescaler. Recuerda que N tiene más posibles valores en el Timer 2 que en el Timer0. Para más detalles puedes revisar la sección relojes del Timer0 y del Timer2.
Periodo y Duty cycle de una onda Fast PWM no-invertida. La frecuencia de la onda Fast PWM se obtiene invirtiendo la fórmula del periodo:
Y la fórmula que nos da el duty cycle expresado en porcentaje la obtenemos dividiendo las fórmulas del duty cycle y del periodo:
En esta fórmula podemos observar que si el registro OCR0A toma su valor máximo de 255, entonces el duty cycle será del 100%, lo cual significa que el estado del pin OC0A será de 1 lógico constante. En cambio, no hay ningún para el registro OCR0A que nos dé un duty cycle del 0%. Si el registro OCR0A vale 0 la salida será de unos pequeños picos que representan un duty cycle cercano al 0.4%. Ésa es la característica que diferencia al modo Fast PWM de los demás modos PWM. Timer0 en modo PWM de Fase Correcta El modo PWM de Fase Correcta se conoce también como PWM de doble pendiente porque el registro TCNT0 cuenta en sube y baja, es decir, primero avanza desde 0 hasta un valor TOPE (255) y después regresa de 255 hasta 0. Este proceso se repite cíclicamente y si lo graficamos, la curva resulta siendo efectivamente una escalera de doble pendiente, como se ve abajo.
Como se indica en la figura, la onda PWM de Fase Correcta es generada por la conmutación del pin OC0A cada vez que el registro TCNT0 coincide con el registro OCR0A. En la gráfica las coincidencias se señalan con pequeñas líneas rojas horizontales sobre la escalera. Según la configuración de los bits COM0A1 y COM0A0 (del registro TCCR0A), la onda PWM puede ser invertida o no invertida.
Si los bits COM0A1:0 valen 0b10 se establece una onda no-invertida, esto es, el pin OC0A se setea cuando TCNT0 coincide con el registro OCR0A en su conteo descendente, y se limpia cuando TCNT0 coincide con el registro OCR0A en su conteo ascendente. Si los bits COM0A1:0 valen 0b11 se establece una onda invertida, esto es, el pin OC0A se setea cuando TCNT0 coincide con el registro OCR0A en su conteo ascendente, y se limpia cuando TCNT0 coincide con el registro OCR0A en su conteo descendente.
Puesto que el Timer0 siempre cuenta en todo su rango de 0 a 255, se deduce que el periodo, y por ende la frecuencia, de la onda PWM también serán constantes. Esa es la limitación del modo PWM de los Timers de 8 bits. Por otro lado, sí es posible modificar el valor del registro OCR0A, lo cual nos permitirá controlar el duty cycle de la onda PWM. En la siguiente imagen se indican las fórmulas para calcular el periodo y el duty cycle de una onda PWM de Fase Correcta no-invertida. Como siempre, F_CPU es la frecuencia del procesador y N es el factor del prescaler. Recuerda que N tiene más posibles valores en el Timer 2 que en el Timer0. Para más detalles puedes revisar la sección relojes del Timer0 y del Timer2.
Periodo y Duty cycle de una onda PWM de Fase Correcta no-invertida. La frecuencia de la onda PWM de Fase Correcta se obtiene invirtiendo la fórmula del periodo. Observa que la doble pendiente de este modo hace que la máxima frecuencia obtenida sea la mitad de la frecuencia máxima que brinda el modo Fast PWM.
Y la fórmula que nos da el duty cycle expresado en porcentaje la obtenemos dividiendo las fórmulas del duty cycle y del periodo:
A diferencia del modo Fast PWM en esta fórmula podemos observar que el duty cycle puede abarcar todo su rango desde 0% (con OCR0A = 0) hasta el 100% (con OCR0A = 255). El 0% significa que la salida será un constante 0 lógico y un 100%, que la salida será un estado alto constante. Ésa es la razón por la que se denomina de fase correcta.
Modos de Operación del Timer0 y Timer2 En general existen 3 modos en que pueden trabajar los Timers:
Modo Normal Modo CTC Modo PWM
Cada modo tendrá sus variantes dependiendo del Timer. Por ejemplo, en el Timer1 existen hasta 12 modos PWM, pero bueno, de eso nos ocuparemos en su momento.
Diagrama de bloques del Timer0. La figura nos resalta que esta vez vamos a trabajar con los bits WGM. Su nombre viene de Waveform Generation Mode porque estos bits pre-establecen el tipo de onda que podrá generar el Timer0 por los pines OC0A y OC0B. En la práctica es raro utilizar otras formas de onda que no sean de tipo PWM, así que el nombre no parece muy apropiado. En la figura también se aprecia que los GENERADORES DE ONDA también dependen de los bits COM (de Compare Output Mode). Estos bits establecen el mod o en que finalmente saldrán las ondas por los pines OC0A y OC0B, es decir, pueden salir normales, invertidas, o pueden simplemente no salir y dejar los pines OC0x libres para otras tareas. A lo q ue quiero llegar es que al menos en cursomicros los bits COM solo se usan en modo PWM. En los modos Normal y CTC nos olvidamos de ellos.
Tabla Modos de Operación de Timer0 WGM02 WGM01 WGM00 Modo de Operación de Timer0 Inicio del Conteo Tope del Conteo
0
0
0
Normal
0x00
0xFF
Tabla Modos de Operación de Timer0 WGM02 WGM01 WGM00 Modo de Operación de Timer0 Inicio del Conteo Tope del Conteo
0
0
1
PWM de Fase Correcta
0x00
0xFF
0
1
0
CTC
0x00
OCR0A
0
1
1
Fast PWM
0x00
0xFF
1
0
0
Reservado
0x00
---
1
0
1
PWM de Fase Correcta
0x00
OCR0A
1
1
0
Reservado
0x00
---
1
1
1
Fast PWM
0x00
OCR0A
Los bits WGM están distribuidos en los dos registros de control del Timer0, TCCR0A y TCCR0B. El hecho de que el bit WFG02 esté en TCCR0B y no junto con sus pares en TCCR0A habiendo espacios vacíos allí se debe a cuestiones de compatibilidad con otros AVR.
Registro TCCR0A TCCR0A COM0A1 COM0A0 COM0B1 COM0B0 --- --- WGM01 WGM00 Registro TCCR0B TCCR0B FOC0A FOC0B --- --- WGM02 CS02 CS01 CS00