You are on page 1of 12

Introduccin a PWM

Sistemas de Tiempo Real http://www.arcos.inf.uc3m.es/~infostr

Grupo de Arquitectura y Tecnologa de Computadores (ARCOS)

PWM: frecuencia y duty cycle


La tcnica PWM (Pulse-Width Modulation) o modulacin por anchura del pulso permite generar ondas cuadradas con una frecuencia y ciclo de actividad determinada:
En Arduino UNO la frecuencia del reloj del sistema es 16Mhz
16*10^6 ciclos (ticks) por segundo tiempo de ciclo es 1/ 16*10^6 = 62.5ns Es posible modificar la frecuencia para que el nmero de ciclos por segundo sea 1 por cada 8,16,32,64, etc. ciclos de reloj del sistema. Este valor se llama factor de pre-escalado.

El ciclo de actividad (o duty cycle, DC) representa la anchura del pulso: cunto tiempo de cada onda cuadrada hay pulso (5V) y cundo no lo hay (0V).

Duty cycle
Ejemplos de duty cycle:

Otro ejemplo:
analogWrite(pin,DC): es una funcin de Arduino que escribe en pin (salida) un determinado DC o duty cycle
Est funcin se implementa como un PWM con una frecuencia fija (mediante un factor de preescalado de 64). Problema: aunque permite modificar el duty cycle, no es posible modificar la frecuencia, ya que el valor de pre-escalado est fijo.

Introduccin a PWM
PWM permite generar ondas con diferentes frecuencias y duty cycles usando timers:
Un timer es un contador software que cuenta ciclos de reloj: el timer usa el reloj de la CPU (o reloj del sistema). El timer se puede configurar para que solo se incremente cada X ciclos en lugar de cada ciclo. (siendo X el factor de preescalado) Un timer cuenta desde 0 hasta MAX,
MAX es el mximo que puede almacenar, y depende del nmero de bits del timer:
Si el timer usa n bits Ejemplo con n=8 cuenta de 0..2^n-1

255
Timer (+1)

tick1

tick255

0
(16*10^6/8)*255

Frecuencia=1tick por c/factor pre-escalado Si usamos pre-escalado=8, en un perodo hay

Introduccin a PWM
PWM permite generar ondas con diferentes frecuencias y duty cycles usando timers:
El duty cycle se modifica haciendo uso de un registro de comparacin:
Un registro de comparacin almacena un valor comprendido entre 0 y MAX Cada registro de comparacin esta asociado a una salida digital (PWM). Por ejemplo, en Fast PWM, si el valor del contador del timer es menor que el registro de comparacin, la salida emite 5 v (valor 1). En caso contrario emite 0 v (valor 0). Ejemplo: un timer de n=8 bits y valor de comparacin 2^n/2-1 genera un DC=50% Timer (+1)

255
127
Reg. comparacin

0
Salida generada DC es 50%

Modos bsicos de PWM: Fast PWM


Fast PWM:
El timer cuenta de 0 a MAX y vuelve a 0. La salida generada toma el valor 1 (ON) cuando el timer es igual a 0 La salida generada toma el valor 0 (OFF) cuando el valor del timer alcanza el valor del registro de comparacin

255
Reg. comparacin

0
Salida generada

Modos bsicos de PWM: Fase correcta


Phase-Correct PWM:
El timer cuenta de 0 a MAX y decrece hasta 0. La salida generada toma el valor 0 (OFF) cuando el timer alcanza el valor del registro de comparacin durante la cuenta hacia adelante (0..MAX) La salida generada toma el valor 1 (ON) cuando el timer alcanza el valor del registro de comparacin durante la cuenta hacia atrs (MAX..0)

255
Reg. comparacin

0
Salida generada

Timers de Arduino
Arduino tiene 3 Timers (Timer0, Timer1, Timer2),
Cada timer tiene 2 registros de HW que permiten configurar las opciones de PWM
TCCRXA y TCCRXB (X=0,1,2) dependiendo del timer usado

Cada timer tiene otros 2 registros de HW que actan como registros de comparacin,
OCRXA y OCRXB (X=0,1,2) dependiendo del timer usado

Cada timer tiene 2 salidas que pueden conectarse a dos salidas PWM de Arduino:
Timer 0 Timer 1 Timer 2 salidas 6 (A) y 5 (B) salidas 9 (A) y 10 (B) salidas 11 (A) y 3 (B)

Timer 0 (8 bits)
TCCR0A Timer/Counter Control Register A
COM0A1 COM0A0 COM0B1 COM0B0 --WGM01 WGM02

R/W

R/W

R/W

R/W

R/W

R/W

TCCR0B Timer/Counter Control Register B


F0C0A F0C0B --WGM02 CS02 CS01 CS00

R/W

R/W

R/W

R/W

Leyenda:
WGM (Waveform Generation Mode) permite seleccionar modo PWM CS (Clock Select) permite especificar el factor de pre-escalado Los bits COM0 permite habilitar, deshabilitar o invertir las salidas A y B

Timer 1 (16 bits)


TCCR1A Timer/Counter Control Register A
COM1A1 COM1A0 COM1B1 COM1B0 --WGM11 WGM10

R/W

R/W

R/W

R/W

R/W

R/W

TCCR1B Timer/Counter Control Register B


ICNC1 IC3S1 -WGM13 WGM12 CS12 CS11 CS10

R/W

R/W

R/W

R/W

R/W

Leyenda:
WGM (Waveform Generation Mode) permite seleccionar modo PWM CS (Clock Select) permite especificar el factor de pre-escalado Los bits COM1 permite habilitar, deshabilitar o invertir las salidas A y B

Timer 2 (8 bits)
TCCR2A Timer/Counter Control Register A
COM2A1 COM2A0 COM2B1 COM2B0 --WGM21 WGM20

R/W

R/W

R/W

R/W

R/W

R/W

TCCR2B Timer/Counter Control Register B


F0C2A F0C2B --WGM22 CS22 CS21 CS20

R/W

R/W

R/W

R/W

Leyenda:
WGM (Waveform Generation Mode) permite seleccionar modo PWM CS (Clock Select) permite especificar el factor de pre-escalado Los bits COM2 permite habilitar, deshabilitar o invertir las salidas A y B

Configuracin de opciones
Un registro de HW se modifica como una variable de SW
TCCR2A=5 Opciones PWM se configuran escribiendo sobre los registros de HW

Para activar/desactivar bits de los registros se usa la macro _BV(pin) donde pin es el nombre del bit que queremos activar.
Se utilizan operadores de bits (& y |) para hacer operaciones AND y OR con el resto de bits de los registros
TCCR2A=BV(COM2A1) activa (pone a 1) el bit COM2A1 del registro TCCR2A TCCR2A=TCCR2A|BV(COM2A1) activa (pone a 1) el bit COM2A1 del registro TCCR2A y mantiene el valor del resto de bits del registro

You might also like