introduccionpwm
TRANSCRIPT
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• 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 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.
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
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%
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
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
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)
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
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
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
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