introduccionpwm

12
Introducción a PWM Sistemas de Tiempo Real http://www.arcos.inf.uc3m.es/~infostr Grupo de Arquitectura y Tecnología de Computadores (ARCOS)

Upload: luis-sanchez

Post on 17-Jul-2015

82 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Introduccionpwm

Introducción a PWM

Sistemas de Tiempo Real

http://www.arcos.inf.uc3m.es/~infostr

Grupo de Arquitectura y Tecnología de Computadores

(ARCOS)

Page 2: Introduccionpwm

PWM: frecuencia y duty cycle

• La técnica PWM (Pulse-Width Modulation) o modulación 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 número de ciclos por segundo sea 1 por cada• Es posible modificar la frecuencia para que el número 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: cuánto tiempo de cada onda cuadrada hay pulso (5V) y cuándo

no lo hay (0V).

Page 3: Introduccionpwm

Duty cycle

• Ejemplos de duty cycle:

• Otro ejemplo:

– analogWrite(pin,DC): es una función de Arduino que escribe en pin (salida) un

determinado DC o duty cycle

• Está función se implementa como un PWM con una frecuencia fija (mediante un factor de pre-

escalado de 64).

• Problema: aunque permite modificar el duty cycle, no es posible modificar la frecuencia, ya que

el valor de pre-escalado está fijo.

Page 4: Introduccionpwm

Introducción 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)lugar de cada ciclo. (siendo X el factor de preescalado)

– Un timer cuenta desde 0 hasta MAX,

• MAX es el máximo que puede almacenar, y depende del número de bits del timer:

– Si el timer usa n bits � cuenta de 0..2^n-1

– Ejemplo con n=8

0

255

Timer (+1)

tick1 tick255

Frecuencia=1tick por c/factor pre-escalado

Si usamos pre-escalado=8, en un período hay � (16*10^6/8)*255

Page 5: Introduccionpwm

Introducción 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 comparación:

• Un registro de comparación almacena un valor comprendido entre 0 y MAX

• Cada registro de comparación 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 • Por ejemplo, en Fast PWM, si el valor del contador del timer es menor que el registro de

comparación, 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 comparación 2^n/2-1 genera un DC=50%

0

255

Timer (+1)

127

Reg. comparación

Salida generada

DC es 50%

Page 6: Introduccionpwm

Modos básicos 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 comparación

255

0

255

Reg. comparación

Salida generada

Page 7: Introduccionpwm

Modos básicos 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

comparación durante la cuenta hacia adelante (0..MAX)

– La salida generada toma el valor 1 (ON) cuando el timer alcanza el valor del registro de

comparación durante la cuenta hacia atrás (MAX..0)

0

255

Reg.

comparación

Salida generada

Page 8: Introduccionpwm

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 actúan como registros – Cada timer tiene otros 2 registros de HW que actúan como registros

de comparación,

• 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 ���� salidas 6 (A) y 5 (B)

• Timer 1 ���� salidas 9 (A) y 10 (B)

• Timer 2 ���� salidas 11 (A) y 3 (B)

Page 9: Introduccionpwm

Timer 0 (8 bits)

• TCCR0A – Timer/Counter Control Register A

• TCCR0B – Timer/Counter Control Register B

COM0A1 COM0A0 COM0B1 COM0B0 -- -- WGM01 WGM02

R/W R/W R/W R/W R R R/W R/W

• TCCR0B – Timer/Counter Control Register B

• 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

F0C0A F0C0B -- -- WGM02 CS02 CS01 CS00

W W R R R/W R/W R/W R/W

Page 10: Introduccionpwm

Timer 1 (16 bits)

• TCCR1A – Timer/Counter Control Register A

• TCCR1B – Timer/Counter Control Register B

COM1A1 COM1A0 COM1B1 COM1B0 -- -- WGM11 WGM10

R/W R/W R/W R/W R R R/W R/W

• TCCR1B – Timer/Counter Control Register B

• 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

ICNC1 IC3S1 -- WGM13 WGM12 CS12 CS11 CS10

W W R R/W R/W R/W R/W R/W

Page 11: Introduccionpwm

Timer 2 (8 bits)

• TCCR2A – Timer/Counter Control Register A

• TCCR2B – Timer/Counter Control Register B

COM2A1 COM2A0 COM2B1 COM2B0 -- -- WGM21 WGM20

R/W R/W R/W R/W R R R/W R/W

• TCCR2B – Timer/Counter Control Register B

• 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

F0C2A F0C2B -- -- WGM22 CS22 CS21 CS20

W W R R R/W R/W R/W R/W

Page 12: Introduccionpwm

Configuración 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 • 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