Pwm Con Arduino

18
Sistemas de Tiempo Real Laboratorio 2: Introducci´ on a Pulse-Width Modulation (PWM) en Arduino Grado en Ingenier´ ıa Inform´ atica. Curso 2011/2012 1 Objetivos del laboratorio El objetivo del laboratorio es que el alumno aprenda los conceptos b´ asicos de la modulaci´ on en anchura del pulso (Pulse-Width modulation, PWM) y c´ omo puede ser implementado sobre la plataforma Arduino. Este laboratorio persigue: 1. Presentar al alumno las distintos modos de PWM. 2. Dise˜ nar un circuito electr´ onico y desarrollar el programa (sketch) que permita controlar un LED mediante PWM (parte 1 del laboratorio) y posteriormente reproducir una melod´ ıa usando tambi´ en PWM mediante un zumbador (parte 2 del laboratorio). 2 Materiales Para la elaboraci´ on de este laboratorio necesita utilizar los siguientes componentes: Microcontrolador Arduino UNO. 1 Placa de prototipado. 1 LED (Light-Emitting Diode). 2 resistencias de 220 ohmios. 1 LDR (fotorresistencia). Cable r´ ıgido para interconexi´ on de los componentes. Cable USB de conexi´ on del PC al microcontrolador. Para ahorrar tiempo durante el laboratorio, se recomienda traer un conjunto de cables precorta- dos y listos para su uso de las siguientes medidas: 2cm, 5cm, 10cm. En el Ap´ endice A se muestra una descripci ´ on de cada uno de los componentes anteriores. 3 Introducci´ on a PWM La modulaci ´ on de anchura de pulso o Pulse-Width Modulation (PWM) consiste en generar se˜ nales digitales como ondas cuadradas donde la frecuencia es constante pero la fracci ´ on de tiempo en que la se ˜ nal est´ a activada (denominado ciclo de actividad) puede variar entre 0% y 100%. La Figura 1 muestra diferentes ondas cuadr´ aticas generadas con distintos ciclos de actividad: 0%, 10%, 25%, 50%, 80% y 100%. De esta manera, el tiempo en que se mantiene el pulso (anchura del pulso) en estado de activaci´ on (on) en un per´ ıodo (tiempo total que dura la onda), puede ser expresado como un tanto por ciento de la longitud del per´ ıodo. Como puede observarse la frecuencia se mantiene 1

Transcript of Pwm Con Arduino

Page 1: Pwm Con Arduino

Sistemas de Tiempo RealLaboratorio 2: Introduccion a Pulse-Width Modulation (PWM) en Arduino

Grado en Ingenierıa Informatica. Curso 2011/2012

1 Objetivos del laboratorio

El objetivo del laboratorio es que el alumno aprenda los conceptos basicos de la modulacion enanchura del pulso (Pulse-Width modulation, PWM) y como puede ser implementado sobre laplataforma Arduino. Este laboratorio persigue:

1. Presentar al alumno las distintos modos de PWM.

2. Disenar un circuito electronico y desarrollar el programa (sketch) que permita controlarun LED mediante PWM (parte 1 del laboratorio) y posteriormente reproducir una melodıausando tambien PWM mediante un zumbador (parte 2 del laboratorio).

2 Materiales

Para la elaboracion de este laboratorio necesita utilizar los siguientes componentes:

• Microcontrolador Arduino UNO.

• 1 Placa de prototipado.

• 1 LED (Light-Emitting Diode).

• 2 resistencias de 220 ohmios.

• 1 LDR (fotorresistencia).

• Cable rıgido para interconexion de los componentes.

• Cable USB de conexion del PC al microcontrolador.

Para ahorrar tiempo durante el laboratorio, se recomienda traer un conjunto de cables precorta-dos y listos para su uso de las siguientes medidas: 2cm, 5cm, 10cm. En el Apendice A se muestrauna descripcion de cada uno de los componentes anteriores.

3 Introduccion a PWM

La modulacion de anchura de pulso o Pulse-Width Modulation (PWM) consiste en generar senalesdigitales como ondas cuadradas donde la frecuencia es constante pero la fraccion de tiempo en quela senal esta activada (denominado ciclo de actividad) puede variar entre 0% y 100%. La Figura 1muestra diferentes ondas cuadraticas generadas con distintos ciclos de actividad: 0%, 10%, 25%,50%, 80% y 100%. De esta manera, el tiempo en que se mantiene el pulso (anchura del pulso) enestado de activacion (on) en un perıodo (tiempo total que dura la onda), puede ser expresado comoun tanto por ciento de la longitud del perıodo. Como puede observarse la frecuencia se mantiene

1

Page 2: Pwm Con Arduino

Figure 1: Ondas cuadradas generadas con distintos ciclos de actividad (extraıdo de arduino.cc)

constante. La frecuencia puede definirse como la cantidad de pulsos (estado on/off) por segundoy su expresion matematica es la inversa del periodo es decir frecuencia= 1

periodo .El microcontrolador Arduino dispone de una serie de pines que implementan PWM. Estos

pines son algunos de los pines digitales, especıficamente: 3,5,6,9,10 y 11. Cuando se configuraapropiadamente PWM en uno de estos pines, y se conecta un dispositivo de salida, por ejemploun LED, el resultado es que se generara una onda cuadrada cuya anchura de pulso se representacomo estado ON del dispositivo y el resto del tiempo del perıodo en estado OFF del dispositivo.La funcion analogWrite proporciona una interfaz mas simple al hardware PWM: aunque permitemodular la anchura del pulso no proporciona ningun control sobre la frecuencia.

Los modos PWM se describen en el Apendice B de este enunciado.

4 Descripcion del laboratorio

El laboratorio se divide en dos partes:

4.1 PWM y analogWrite

Modifique el codigo correspondiente a la parte 2 del Laboratorio 1 para usar PWM en lugar deanalogWrite. En ese laboratorio, el LED estaba conectado a la salida analogica 9. Para configurarPWM en el pin 9, usaremos el Timer 1, y la salida A. Para ello debera simplemente configurarPWM con los siguientes valores (ver Apendice C):

1. Seleccionar Modo Fast PWM escribiendo 0101 en WGM.

2. Valor de pre-escalado de 64 (011).

3. No invertir la salida.

Para ello, en la seccion setup() escriba el siguiente codigo que configura PWM con los valoresanteriores:pinMode(9, OUTPUT);pinMode(10, OUTPUT);TCCR1A = BV(COM1A1) | BV(COM1B1) | BV(WGM10);

2

Page 3: Pwm Con Arduino

TCCR1B = BV(WGM12) | BV(CS11) | BV(CS10);

En la seccion loop() del sketch, el unico cambio consiste en asignar el valor del sensor LDRal registro OCR1A, de la siguiente manera:

valor=analogRead(LDR);

OCR1A=valor;

delay(10);

Una vez programado la funcion anterior, verifique y compile el sketch. Conecte el cable USBy cargue el codigo sin errores en la plataforma Arduino. Compruebe que el programa ejecutacorrectamente. ¿Cual es el resultado de este programa?

4.2 Control de un LED mediante el modo Fast PWM

El alumno debera disenar un circuito que permita conectar un LED al pin PWM correspondientede salida. De esta manera, cuando haya pulso en la onda generada el LED permanecera encendido(ON) y en caso contrario se apagara (OFF). En esta parte del laboratorio, el alumno debera mod-ificar los valores de comparacion para modificar la salida. Para ello, el alumno debera seguir lossiguientes pasos:

• Seleccionar el Timer que desea usar. Puede usar Timer0, Timer 1 y Timer2. En funciondel Timer seleccionado, identifique los dos pines PWM de salida correspondientes al timerseleccionado (ver Tabla B1). Por ejemplo, si usa el Timer 2, la salida A se corresponde conel pin PWM 11; si usa la salida B el pin PWM es el 3.

• Conecte a uno de esos pines de salida el anodo del LED. La Figura 2 muestra la placa de deprototipado (en la parte izquierda) y el esquema de conexion (en la parte derecha) para larealizacion de esta parte del laboratorio.

Figure 2: Placa de prototipado (izquierda) y esquema de conexion (derecha) del laboratorio (parte2))

3

Page 4: Pwm Con Arduino

• Abra el IDE de Arduino y programe un nuevo sketch que realize las siguientes operaciones:

1. En el apartado setup() debe inicializar los pines PWM como salida mediante la funcionpinMode. Debe configurar ademas el modo PWM usando las siguientes opciones:

(a) Asignar 011 a los bits WGM correspondientes al timer usado (selecciona FastPWM).

(b) Asignar el valor de pre-escalado de 64 escribiendo 100 en los bits C2 (divide lafrecuencia del reloj del sistema entre 64).

(c) Asignar el valor 10 en los bits COM2A y COM2B de manera que no se inviertala salida generada en A y en B.

El codigo de configuracion si usa el Timer 2 es similar al explicado como ejemplocuando se describio Fast PWM en este enunciado.

2. En el apartado loop() debe alternativamente modificar los valores de comparacion uti-lizados por el timer. Estos registros se denominan OCRXA y OCRXB, donde X=0,1,2dependiendo del timer utilizado. En este codigo fuente usamos valores aleatorios paralos registros de comparacion:valor=0;

if (valor == LOW){OCR2A=180;

OCR2B=250;

}else{OCR2A=100;

OCR2B=5;

}valor = 1 - valor;

• Una vez programado la funcion anterior, verifique y compile el sketch.

• Conecte el cable USB y cargue el codigo sin errores en la plataforma Arduino.

• Compruebe que el programa ejecuta correctamente. ¿Cual es el resultado de este programa?Pruebe a modificar los valores de comparacion. ¿Cual es la diferencia con respecto a laejecucion anterior?

4.3 Evaluacion del laboratorio

El profesor debe comprobar visualmente el correcto funcionamiento de cada parte del laboratorio.Para ello, cuando el grupo de practicas haya terminado, debe llamar al profesor para que puedarealizar esta verificacion.

Antes de abandonar el aula, cada alumno debera entregar y responder el cuestionario queproponga el profesor.

4

Page 5: Pwm Con Arduino

5 Material de consulta

El alumno podra consultar la siguiente bibliografıa para la realizacion de este laboratorio:

• El microcontrolador Arduino (http://arduino.cc).

• Fritzing (http://fritzing.org).

• Electronica Basica(http://www.sc.ehu.es/sbweb/electronica/elec_basica/default.htm).

• Componentes electronicos(http://es.wikipedia.org/wiki/Componente_electronico).

• Secrets of Arduino PWM(http://www.arcfn.com/2009/07/secrets-of-arduino-pwm.html).

• Codigo de ejemplo PlayMelody:http://www.arduino.cc/en/Tutorial/PlayMelody

• Datasheet de Atmega328http://www.atmel.com/Images/doc8271.pdf

• Material y transparencias de clase.

5

Page 6: Pwm Con Arduino

Appendix

A Apendice A. Descripcion de los componentes electronicos

A1 LED

Un LED es un diodo semiconductor que emite luz. Muchos dispositivos usan LEDs de distintoscolores como indicadores. Los hay de varios colores, siendo los mas usuales rojos, verdes yamarillos. Las ”patas” de los LEDs tienen distintos tamanos: la mas corta es el catodo (quedebe conectarse al polo negativo de la fuente de alimentacion) y la mas larga el anodo (que debeconectarse al polo positivo de la fuente de alimentacion). La siguiente figura muestra el aspectode los LEDs.

Figure A1: Leds de distintos colores

A2 Fotorresistencia

Una fotorresistencia es un componente electronico cuya resistencia disminuye con el aumento deintensidad de luz incidente (puede descender hasta 50 ohmios) y aumenta cuando esta a oscuras(varios megaohmios). Figure A2 muestra un LDR.

Figure A2: Ligth Diode Resistor (LDR)

A3 Placa de prototipado

Una placa de prototipado es un dispostivo de plastico que contiene filas y columnas de agujerosque dejan pasar la electricidad. Esos agujeros estan situados a una distancia estandar de 2.54 mmy los componentes electronicos mantienen esa separacion entre sus pines. Al poner un pin de uncomponente en uno de los agujeros, se establecera una conexion electrica con todos los agujeros enla misma columna vertical. En la parte inferior y superior de la placa, existen dos filas especialesmarcadas como ’+’ (5v) y ’-’ (0v), que permiten conectar horizontalmente con los otros agujeros

6

Page 7: Pwm Con Arduino

en esa fila. De esta manera, se pueden poner jumpers o cables para conectar a tierra o al voltajeespecificado los distintos componentes insertados en la placa.

Figure A3: Una placa de prototipado

A4 Resistencias

Una resistencia es un componente electronico con un cuerpo cilındrico con dos ”patas”. Se tratade un componente imprescindible en cualquier circuito electronico: en un circuito el voltaje, laintensidad, y la resistencia estan relacionados; en particular, la resistencia de un circuito determinala intensidad de corriente que circula, dado un cierto voltaje (conocida como la Ley de Ohm):

R(resistencia) = V (voltaje)/I(intensidad)

Los ingenieros han disenado un codigo de colores, para determinar la capacidad de una resistencia(en ohmios). Por lo general, en el cuerpo de una resistencia hay cuatro anillos de colores, unade ellas en color dorado o plata, donde cada color representa lo siguiente (leıdo de izquierda aderecha, dejando a la derecha el anillo de color dorado/plata):

1. El color del primer anillo representa las decenas.

2. El color del segundo anillo representa las unidades.

3. El color del tercer anillo representa el valor k (en formato 10k) que multiplica el valor de laresistencia.

4. Por ultimo, el color del cuarto anillo representa el valor de tolerancia.

7

Page 8: Pwm Con Arduino

Negro 0 Azul 6Marron 1 Purpura 7Rojo 2 Gris 8Naranja 3 Blanco 9Amarillo 4 Plata 10 %Verde 5 Dorado 5 %

Table A1: Codigo de colores de las resistencias

La Tabla A1 muestra el codigo de colores usados para calcular el valor de la resistencia. Por ejem-plo, considera una resistencia con codigo de colores: marron, azul, naranja y dorado. Entonces suvalor es 16 ∗ 103 ± 5%.

Figura A4 muestra varias resistencias electricas.

Figure A4: Resistencias electricas

A5 Boton

Un boton es un dispositivo compuesto de dos pines de metal y una cubierta de plastico. Cuandolos pines de metal no estan conectados, es decir el boton no esta presionado, no existe circulacionde corriente. Por otro lado, cuando el boton se presiona los pines entran en contacto y entre elloscircula corriente. El boton es, pues, una forma basica de interruptor de la corriente electrica. LaFigura A5 muestra el aspecto de un pulsador electrico o boton.

Figure A5: Pulsador o boton electrico

8

Page 9: Pwm Con Arduino

A6 Zumbador

Un zumbador es un transductor electroacustico que produce un sonido o zumbido del mismo tonoque puede ser continuo o intermitente. Se utiliza como mecanismo de senalizacion o aviso enmultiples sistemas como en automoviles o en electrodomesticos. Para lograr distintos tonos puedeser conectado a distintos tipos de circuitos.

El zumbador consta de dos elementos basicos: un electroiman y una lamina metalica de acero.Cuando la corriente pasa por la bobina del electroiman, se produce un campo magnetico variableque hace vibrar la lamina de acero, lo cual produce un tono.

Figure A6: Zumbador (buzzer)

9

Page 10: Pwm Con Arduino

B Modos de PWM

Para controlar la frecuencia en que se generan las ondas se utilizan los timer (o relojes de software)incorporados en el microcontrolador de Arduino. El chip ATmega168P/328P usa tres timer paraPWM (ver datasheet) denominados Timer 0, Timer 1 y Timer 2. Cada uno de estos timer controlanla funcion PWM modificando los valores de dos registros de control, denominados TCCRnA yTCCRnB. Los registros permiten codificar las opciones de PWM que queramos usar en cada caso.

1. Los bits Waveform Generation Mode (WGM) permiten seleccionar el modo de PWM. Esosbits se almacenan discontinuamente en los registros TCCRnA and TCCRnB.

2. Los bits Clock Select (CS) permiten controlar el pre-escalado del reloj, es decir, dividen lafrecuencia del reloj del sistema por un factor de pre-escalado entre 1 y 1024. Los valores deCS identifican uno de esos factores.

Cada timer tiene dos registros de comparacion denominados OCRnA y OCRnB, correspondientesa las salidas A y B respectivamente. Cuando el valor del timer llega al valor del registro decomparacion, la salida se modificara de acuerdo al modo PWM especificado. Existen dos bitsmas, denominados Compare Match Output A Mode (COMnA) y Compare Match Output B Mode(COMnB) que permiten habilitar, deshabilitar o invertir la salida de los registros A y B.

NOTA: los bits de los registros de control difieren en cada timer (ver datasheet para detalles).Por ejemplo, el Timer 2 usa las salidas PWM 3 (asociada al registro de salida OC2B) y 11 (asociadaal registro de salida OC2A). El Timer 1 esta implementado como un contador de 16 bits y el Timer0 y Timer 2 de 8 bits.

Existen distintos modos de PWM. En este enunciado se describe el modo Fast PWM, Phase-Correct PWM y modificacion del lımite superior del timer mediante el registro OCRA.

B1 Fast PWM

Fast PWM es el modo mas simple de PWM, donde el timer cuenta repetidamente desde 0 hasta255. La salida generada toma el valor 1 (ON) cuando el timer es igual a 0 y toma el valor 0 (OFF)cuando el valor del timer alcanza el valor del registro de comparacion. En este caso, cuanto masalto es el valor en el registro de comparacion, mayor es la anchura del pulso. El siguiente diagramamuestra las salidas para dos valores concretos de los registros de comparacion: OCRnA es 180 yOCRnB es 50.

Para configurar Arduino con cualquier modo PWM se ha de usar los pines PWM correpondi-entes al timer que queremos usar. La tabla siguiente muestra la asignacion de timers a pines PWMde Arduino.

El siguiente codigo configura Fast PWM, un pre-escalado de 64 (division de la frecuencia delreloj del sistema), salida no-invertida para A y B y los valores de los registros de comparacionOCRnA igual a 180 y OCRnB igual a 50.pinMode(3, OUTPUT);pinMode(11, OUTPUT);TCCR2A = BV(COM2A1) | BV(COM2B1) | BV(WGM21) | BV(WGM20);TCCR2B = BV(CS22);

10

Page 11: Pwm Con Arduino

Figure B1: Fast PWM(http://www.arcfn.com/2009/07/secrets-of-arduino-pwm.html)

Timer Registro de salida del Timer Pin PWM de ArduinoTimer 0 OC0A 6Timer 0 OC0B 5Timer 1 OC1A 9Timer 1 OC1B 10Timer 2 OC2A 11Timer 2 OC2B 3

Table B1: Relacion entre timers, registros de salida y pines PWM de Arduino

OCR2A = 180;OCR2B = 50;

La macro BV permite activar (poner a 1) el bit que recibe como argumento. El apendice Cmuestra los registros de control y los bits que los componen. La modificacion de esos bits permiteconfigurar distintos modos de PWM. Asumiendo que estamos usando el timer 2, para configurar elmodo Fast PWM debemos escribir el valor 011 en los bits WGM; para configurar un pre-escaladode 64 escribimos el valor 100 en los bits CS; finalmente, para indicar que la salida no se invierta,se escribe el valor 10 en los bits COM2A y COM2B.

Podemos calcular la frecuencia y el ciclo de actividad conociendo la frecuencia del reloj delsistema, en el caso del chip Atmega328 de 16Mhz. En este caso la frecuencia del reloj del sistemase ha dividido entre 64 (valor de pre-escalado), dividido entre 256 ciclos que toma el timer parainiciar de nuevo la onda. Nota que la frecuencia en las salidas A y B es la misma. Por tanto:

freq(FastPWM) =Frecuencia reloj sistema

Pre− escalado× 256(B1)

El ciclo de actividad de las ondas generadas en las salidas A y B depende del valor del registrode comparacion correspondiente. En este caso:

duty cycle(FastPWM) =OCRN2X + 1

256(B2)

donde X es igual a A o B, segun el registro de comparacion. El incremento en 1 se debe a que elvalor de salida cambia un ciclo despues de que el valor del timer alcance el valor del registro decomparacion.

11

Page 12: Pwm Con Arduino

B2 Phase Correct PWM

En este modo PWM, el timer cuenta de 0 a 255 y de aquı cuenta hacia atras hasta llegar a 0. Lasalida se desactiva (pone a 0) cuando el valor del timer alcanza el registro de comparacion durantela cuenta hacia adelante; por el contrario la salida se activa (pone a 1) cuando el valor del timeralcanza el registro de comparacion durante la cuenta hacia atras. Este modo PWM genera unaonda mas simetrica, tal y como muestra la siguiente figura:

Figure B2: Phase-correct PWM(http://www.arcfn.com/2009/07/secrets-of-arduino-pwm.html)

En este caso, la frecuencia de salida sera aproximadamente la mitad que en el modo FastPWM, dado que la salida cambia dos veces, cuando el timer cuenta hacia atras y hacia adelante:

freq(Phase− correctPWM) =Frecuencia reloj sistema

Pre− escalado× 255× 2(B3)

El ciclo de actividad de las ondas generadas en las salidas A y B depende del valor del registrode comparacion correspondiente. En este caso:

duty cycle(Phase− correctPWM) =OCRN2X

256(B4)

donde X es igual a A o B, segun el registro de comparacion. Nota que en este caso no existe elincremento en 1.

El siguiente fragmento de codigo usa el Timer 2 y los pines 3 y 11 para configurar Phase Cor-rect PWM. En este caso, escribimos en los bits WGM el valor 001 (correspondiente a este modode PWM). Dado que las opciones de pre-escalado y no invertir la salida se mantienen, el resto debits permanecen igual que en el ejemplo Fast PWM.

pinMode(3, OUTPUT);pinMode(11, OUTPUT);TCCR2A = BV(COM2A1) | BV(COM2B1) | BV(WGM20);TCCR2B = BV(CS22);OCR2A = 180;OCR2B = 50;

12

Page 13: Pwm Con Arduino

B3 Modificacion del lımite superior del timer con OCRA

El ultimo de los modos PWM consiste en modificar el valor del lımite superior del timer y puedeusarse tanto con Fast PWM como con Phase-Correct PWM. En este modo, el timer cuenta de0 hasta OCRA (el registro de comparacion de la salida A) en lugar de contar hasta 255 (comolo hacıa en los modos anteriores). Esto proporciona mas control en la frecuencia de salida quelos modos anteriores. Dado que el registro OCRA contiene el valor superior del timer, cuandousamos este modo solo la salida B puede ser usada para PWM. El modo especial, denominado”Toggle OCnA on Compare Match” modifica la salida A al final de cada ciclo, generando unaonda cuadrada y un ciclo de actividad del 50% y la mitad de la frecuencia. La Figura B3 muestracomo el timer resetea cuando alcanza el valor de OCRnA, produciendo una frecuencia mas rapidapara la salida B que en los casos anteriores.

Figure B3: Fast PWM con OCRA(http://www.arcfn.com/2009/07/secrets-of-arduino-pwm.html)

En este modo, los valores de frecuencia y ciclo de actividad se calculan de distinta manerapara las salidas A y B. Para la salida A:

frequencyA(Fast PWM OCRA) =Frecuencia reloj sistema

Pre− escalado× (OCR2A+ 1)× 2(B5)

duty cycleA(Fast PWM OCRA) = 50% (B6)

Para la salida B:

frequencyB(Fast PWM OCRA) =Frecuencia reloj sistema

Pre− escalado× (OCR2A+ 1)(B7)

duty cycleB(Fast PWM OCRA) =OCR2B + 1

OCR2A+ 1(B8)

En este ejemplo, el Timer 2 cuenta de 0 a 180 (OCRA), y tarda 181 ciclos de reloj, por tanto,la frecuencia de salida se divide entre 181. La salida A tiene la mitad de la frecuencia que la salidaB, debido a que el modo ”Toggle on Compare Match” cambia la salida A toda vez que se completael ciclo del timer. Para controlar el valor de OCRA usando Fast PWM, se debe escribir 111 en losbits WGM. El modo ”Toggle on Compare Match” se consigue escribiendo 01 en los bits COM2A.

13

Page 14: Pwm Con Arduino

pinMode(3, OUTPUT);pinMode(11, OUTPUT);TCCR2A = BV(COM2A0) | BV(COM2B1) | BV(WGM21) | BV(WGM20);TCCR2B = BV(WGM22) | BV(CS22);OCR2A = 180;OCR2B = 50;

De igual modo, es posible configurar Phast-Correct PWM con OCRA para modificar el valormaximo del timer. La Figura B4 muestra la salida en este modo:

Figure B4: Phase-correct PWM con OCRA(http://www.arcfn.com/2009/07/secrets-of-arduino-pwm.html)

Para configurarlo, escribimos el valor 101 en los bits WGM (selecciona phase-correct PWMcon OCRA). Como en el caso anterior, para seleccionar ”Toggle on Compare Match” escribimos01 en los bits COM2A.

pinMode(3, OUTPUT);pinMode(11, OUTPUT);TCCR2A = BV(COM2A0) | BV(COM2B1) | BV(WGM20);TCCR2B = BV(WGM22) | BV(CS22);OCR2A = 180;OCR2B = 50;Calculamos la frecuencia y ciclo de actividad para las salidas A y B usando este modo. Para lasalida A:

frequencyA(PhaseCorrect PWM OCRA) =Frecuencia reloj sistema

Pre− escalado×OCR2A× 2× 2(B9)

duty cycleA(PhaseCorrect PWM OCRA) = 50% (B10)

Para la salida B:

frequencyB(PhaseCorrect PWM OCRA) =Frecuencia reloj sistema

Pre− escalado×OCR2A× 2(B11)

duty cycleB(PhaseCorrect PWM OCRA) =OCR2B

OCR2A(B12)

En el ejemplo, el Timer 2 cuenta hacia adelante de 0 a 180 y despues hacia atras hasta llegar a0, lo cual tomo 360 ciclos de reloj.

14

Page 15: Pwm Con Arduino

C Apendice B. Configuracion de los timer para implementacion dePWM

NOTA: Para consultar los detalles de implementacion, vea el datasheet del chip Atmega328.

C1 Timer 0

• Configurar el modo PWM.

Timer 0 - 8 bitsMode TCCR0B TCCR0A TCCR0A Valor

WGM02 WGM01 WGM00 TOPDeshabilitar canales 0 0 0 25516-bit Phase + Frecuency correct8 bit Phase-correct 0 0 1 2559 bit Phase-correct10 bit Phase-correct16 bit Phase-correct8 bit Fast PWM 0 1 1 2559 bit Fast PWM10 bit Fast PWM16 bit Fast PWM

Table C1: Opciones PWM en Timer 0

• Pre-escalado.

Timer 0 - 8 bitsMode TCCR0B TCCR0B TCCR0B

CS02 CS01 CS00Deshabilitar canales 0 0 0Divisor reloj por 1 0 0 1Divisor reloj por 8 0 1 0Divisor reloj por 32Divisor reloj por 64 0 1 1Divisor reloj por 128Divisor reloj por 256 1 0 0Divisor reloj por 1024 1 0 1

Table C2: Opciones de pre-escalado para el Timer 0

• Registros de comparacion de salida.

• Los registros que almacenan el valor de comparacion son OCR0A (8 bits) y OCR0B (8 bits)y la salida OC0A y OC0B (de 8 bits cada uno).

15

Page 16: Pwm Con Arduino

Mode Channel A Channel BTCCR0A TCCR0A TCCR0A TCCR0ACOM0A1 COM0A0 COM0B1 COM0B0

Deshabilitar el canal 0 0 0 0No invertir la salida 1 0 1 0Invertir la salida 1 1 1 1

Table C3: Modos de registros de comparacion de salida en Timer 0

C2 Timer 1

• Configurar el modo PWM.

Timer 1 - 16 bitsMode TCCR1B TCCR1B TCCR1A TCCR1A Valor

WGM13 WGM12 WGM11 WGM10 TOPDeshabilitar canales 0 0 0 0 6553516-bit Phase + Frecuency correct 1 0 0 0 ICR18 bit Phase-correct 0 0 0 1 2559 bit Phase-correct 0 0 1 0 51110 bit Phase-correct 0 0 1 1 102316 bit Phase-correct 1 0 1 0 ICR18 bit Fast PWM 0 1 0 1 2559 bit Fast PWM 0 1 1 0 51110 bit Fast PWM 0 1 1 1 102316 bit Fast PWM 1 1 1 0 ICR1

Table C4: Opciones PWM en Timer 1

• Pre-escalado

• Registros de comparacion de salida.

• Los registros que almacenan el valor de comparacion son OCR1A (16 bits) y OCR1B (16bits) y la salida OC1A y OC1B (de 16 bits cada uno).

C3 Timer 2

• Configurar el modo PWM.

• Pre-escalado.

• Registros de comparacion de salida.

• Los registros que almacenan el valor de comparacion son OCR2A (8 bits) y OCR2B (8 bits)y la salida OC2A y OC2B (de 8 bits cada uno).

16

Page 17: Pwm Con Arduino

Timer 1 - 16 bitsMode TCCR1B TCCR1B TCCR1B

CS12 CS11 CS10Deshabilitar canales 0 0 0Divisor reloj por 1 0 0 1Divisor reloj por 8 0 1 0Divisor reloj por 32Divisor reloj por 64 0 1 1Divisor reloj por 128Divisor reloj por 256 1 0 0Divisor reloj por 1024 1 0 1

Table C5: Opciones de pre-escalado para el Timer 1

Mode Channel A Channel BTCCR1A TCCR1A TCCR1A TCCR1ACOM1A1 COM1A0 COM1B1 COM1B0

Deshabilitar el canal 0 0 0 0No invertir la salida 1 0 1 0Invertir la salida 1 1 1 1

Table C6: Modos de registros de comparacion de salida en Timer 1

Timer 2 - 8 bitsMode TCCR2B TCCR2A TCCR2A Valor

WGM22 WGM21 WGM20 TOPDeshabilitar canales 0 0 0 25516-bit Phase + Frecuency correct8 bit Phase-correct 0 0 1 2559 bit Phase-correct10 bit Phase-correct16 bit Phase-correct8 bit Fast PWM 0 1 1 2559 bit Fast PWM10 bit Fast PWM16 bit Fast PWM

Table C7: Opciones PWM en Timer 2

17

Page 18: Pwm Con Arduino

Timer 2 - 8 bitsMode TCCR2B TCCR2B TCCR2B

CS22 CS21 CS20Deshabilitar canales 0 0 0Divisor reloj por 1 0 0 1Divisor reloj por 8 0 1 0Divisor reloj por 32 0 1 1Divisor reloj por 64 1 0 0Divisor reloj por 128 1 0 1Divisor reloj por 256 1 1 0Divisor reloj por 1024 1 1 1

Table C8: Opciones de pre-escalado para el Timer 2

Mode Channel A Channel BTCCR2A TCCR2A TCCR2A TCCR2ACOM2A1 COM2A0 COM2B1 COM2B0

Deshabilitar el canal 0 0 0 0No invertir la salida 1 0 1 0Invertir la salida 1 1 1 1

Table C9: Modos de registros de comparacion de salida en Timer 2

18