Introducción a PWM
Sistemas de Tiempo Real
http://www.arcos.inf.uc3m.es/~infostr

Grupo de Arquitectura y Tecnología de Computadores
(ARCOS)
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
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).
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 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.
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)
– 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
– Ejemplo con n=8

cuenta de 0..2^n-1

255
Timer (+1)

tick1

0

tick255

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

(16*10^6/8)*255
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
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%
Timer (+1)

255
127
Reg. comparación

0
Salida generada
DC es 50%
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
Reg. comparación

0
Salida generada
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)

255
Reg.
comparación

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 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
• 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

R

R/W

R/W

• TCCR0B – Timer/Counter Control Register B
F0C0A

F0C0B

--

--

WGM02

CS02

CS01

CS00

W

W

R

R

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

R

R/W

R/W

• TCCR1B – Timer/Counter Control Register B
ICNC1

IC3S1

--

WGM13

WGM12

CS12

CS11

CS10

W

W

R

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

R

R/W

R/W

• TCCR2B – Timer/Counter Control Register B
F0C2A

F0C2B

--

--

WGM22

CS22

CS21

CS20

W

W

R

R

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
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
_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

Introduccionpwm

  • 1.
    Introducción a PWM Sistemasde Tiempo Real http://www.arcos.inf.uc3m.es/~infostr Grupo de Arquitectura y Tecnología de Computadores (ARCOS)
  • 2.
    PWM: frecuencia yduty 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 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).
  • 3.
    Duty cycle • Ejemplosde 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 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.
  • 4.
    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) – 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 – Ejemplo con n=8 cuenta de 0..2^n-1 255 Timer (+1) tick1 0 tick255 Frecuencia=1tick por c/factor pre-escalado Si usamos pre-escalado=8, en un período hay (16*10^6/8)*255
  • 5.
    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 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% Timer (+1) 255 127 Reg. comparación 0 Salida generada DC es 50%
  • 6.
    Modos básicos dePWM: 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 Reg. comparación 0 Salida generada
  • 7.
    Modos básicos dePWM: 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) 255 Reg. comparación 0 Salida generada
  • 8.
    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 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 • Timer 1 • Timer 2 salidas 6 (A) y 5 (B) salidas 9 (A) y 10 (B) salidas 11 (A) y 3 (B)
  • 9.
    Timer 0 (8bits) • TCCR0A – Timer/Counter Control Register A 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 F0C0A F0C0B -- -- WGM02 CS02 CS01 CS00 W W R R 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
  • 10.
    Timer 1 (16bits) • TCCR1A – Timer/Counter Control Register A 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 ICNC1 IC3S1 -- WGM13 WGM12 CS12 CS11 CS10 W W R 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
  • 11.
    Timer 2 (8bits) • TCCR2A – Timer/Counter Control Register A 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 F0C2A F0C2B -- -- WGM22 CS22 CS21 CS20 W W R R 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
  • 12.
    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 _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