0% encontró este documento útil (0 votos)
256 vistas17 páginas

PWM Rápido con Timer2 en AVR

El documento explica cómo generar señales PWM en modo rápido usando el timer2 del microcontrolador AVR. Brevemente, el timer2 cuenta de 0 a 255 y se reinicia, generando una onda cuadrada. El ancho de pulso se controla variando el valor en el registro OCR2x, mientras que la frecuencia depende del prescaler y la frecuencia del CPU. Modificando OCR2x se puede cambiar el ancho de pulso sin afectar el periodo.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
256 vistas17 páginas

PWM Rápido con Timer2 en AVR

El documento explica cómo generar señales PWM en modo rápido usando el timer2 del microcontrolador AVR. Brevemente, el timer2 cuenta de 0 a 255 y se reinicia, generando una onda cuadrada. El ancho de pulso se controla variando el valor en el registro OCR2x, mientras que la frecuencia depende del prescaler y la frecuencia del CPU. Modificando OCR2x se puede cambiar el ancho de pulso sin afectar el periodo.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

PWM timer2 AVR modo rápido

PWM timer2 AVR, Con el timer2 del microcontrolador AVR se pueden generar
2 tipos de señales PWM, PWM en modo rápido y PWM en modo fase correcta,
en este caso se comentará como obtener la señal PWM modo rápido timer2
AVR; es muy importante entender el timer2 AVR tema que ya se ha tratado aquí ,
de no ser así se recomienda antes de continuar visitar el enlace indicado. Será
necesario tener la hoja de datos del microcontrolador AVR utilizado, en este caso
se utilizará como modelo el ATmega88 del cual se puede ver y descargar su hoja
de datos desde aquí .
Una señal PWM es una onda rectangular de periodo fijo y como la frecuencia es
la inversa del periodo entonces también será de frecuencia fija, lo que si se
cambiará o modificará normalmente en una señal PWM es el tiempo en alto que
estará su valor máximo Vmáx, a este tiempo en alto se le llama ancho de pulso,
por lo que en una señal PWM se modificará su ancho pulso.

Si el ancho de pulso de la señal PWM se representa en forma de porcentaje se le


suele llamar ciclo de trabajo, el ciclo de trabajo se obtienen mediante la siguiente
relación:
Ciclo de trabajo=(Talto/T)*100%
El ciclo de trabajo puede ser desde un 0% cuando el Talto=0, hasta un 100%
cuando el Talto es igual al periodo de la señal PWM Talto=T, si el tiempo en
alto es igual a la mitad del periodo entonces el ciclo de trabajo será del 50%.
Al proceso de cambiar o modificar el tiempo en alto de la señal PWM es lo que
se llama modificación por ancho de pulso, y por sus siglas del inglés se le llama
PWM, ahora se verá como lograr señales PWM con el módulo PWM modo rápido
timer2 AVR.

PWM timer2 AVR en modo rápido


El temporizador timer2 es de 8 bits, el registro TCNT2 es el que en si es el
temporizador, es el que irá aumentando sus valores de 0 a 255 en el proceso de

1
temporización, el aumento de sus valores en una unidad puede ser con cada ciclo
de trabajo del microcontrolador AVR, o si se utilizan los prescaler del timer2 el
aumento en una unidad de sus valores tardará mas, dependiendo del prescaler
utilizado.
En el PWM timer2 AVR modo rápido el registro TCNT2 irá de 0 a 255, luego se
reiniciará a 0 para volver hasta 255 y luego otra vez de 0 a 255 y así continuará
en el modo rápido; a este ir de 0 a 255 le tomará un tiempo que dependerá del
prescaler utilizado para el timer2, y es e tiempo que le tome al registro TCNT2
para ir de 0 a 255 será el periodo de la señal PWM timer2 AVR modo rápido, al
registro TCNT2 se lo puede imaginar como si estuviese generando una onda
diente de sierra en el transcurso del tiempo.
Una cosa a tener en cuenta es que al pasar el registro TCNT2 de 255 a 0 se
desborda, por lo cual se puede habilitar el uso de la interrupción por desborde
del timer2.

Normalmente el registro TCNT2 irá aumentando su conteo con cada ciclo de


reloj del microcontrolador, si se usa por ejemplo una frecuencia de trabajo (lo
que se conoce como FCPU) de 1Mhz entonces el registro TCNT2 aumentará en
una unidad cada microsegundo, y como este registro es de 8 bits este aumentará
desde un mínimo de 0 que es su valor BOTTOM, hasta un máximo de 255 que es
su valor TOP, al ir desde 0 hasta 255 habrán transcurrido 255us luego volverá a
0, pero en esa vuelta a 0 transcurre 1us mas, por lo que en ir de 0 a 255 y volver
a 0 han pasado 256us, que vendría a ser el periodo de la señal PWM timer2
AVR Tpwm cuando la FCPU es de 1Mhz; no siempre se utiliza una FCPU de
1Mhz esto puede variar, y como consecuencia variará el tiempo que pasa para
que el registro TCNT2 aumente su valor desde 0 a 255.
El tiempo que trascurre para que el registro TCNT2 aumente su valor desde 0 a
255 se puede modificar también mediante el uso de los prescaler, la siguiente es

2
la tabla para la elección de los prescaler para el timer2 me diante las
combinaciones de los bits 2, 1, y 0 del registro TCCR2B.

Si por ejemplo se elige un prescaler de 8 y la FCPU=1Mhz, entonces el registro


TCNT2 aumentará en una unidad cada 8/FCPU lo que es cada 8 microsegundos,
y si el registro TCNT2 va de 0 a 255 y vuelve a 0 para completar un periodo
de la señal PWM timer2 AVR Tpwm , habrá realizado el contero de 256
unidades, por lo que habrán transcurrido (256*8)/FCPU microsegundos.
Para cualquier otro prescaler que se utilice el periodo de la señal PWM timer 2
AVR en modo rápido tendrá la siguiente forma:
Tpwm=(256*prescaler)/FCPU
Si en lugar del periodo se quiere utilizar la frecuencia de la señal PWM timer2
AVR en modo rápido, solo hay que invertir la ecuación anterior y se obtendrá:
Fpwm=FCPU/(prescaler*256)

PWM timer2 AVR modo rápido obtención de la señal PWM


La señal PWM timer2 AVR se genera cuando el valor del registro TCNT2 el que
se encuentra incrementándose de unidad en unidad se iguala al valor almacenado
en el registro OCR2A o en el registro OCR2B, cuando se utilizó el timer2 en
modo comparación al ocurrir esta igualdad el registro TCNT2 se reiniciaba a 0,
en el modo PWM el registro TCNT2 no se reiniciará tras ocurrir la igualdad sino
que seguirá incrementado sus valores hasta llegar a su máximo de 2 55, momento
en el que recién se reiniciará, la señal PWM timer2 AVR generada se obtendrá
en cualesquiera de los pines OC2A o OC2B del ATmega88, dependiendo si
para la comparación se utiliza el registro OCR2A o el registro OCR2B, en
adelante se utilizará OC0x para los pines y OCR0x para los registros de
comparación donde x puede ser A o B.
Una cosa a tener en cuenta es que al ocurrir la igualdad entre el registro TCNT2
y el registro OCR2A, se puede habilitar el uso de la interrupción por
comparación del timer2.

3
La señal PWM timer2 AVR obtenida en el pin OC2x puede ser en forma no
invertida o en forma invertida, estos pines deben ser declarados como salidas
digitales mediante sus registros DDRnx respectivos.
 Para la forma no invertida por el pin OC2x se obtendrá un alto mientras
el valor del registro TCNT2 sea menor al valor almacenado en el registro
OCR2x, al ocurrir la igualdad entre los registros TCNT2 y OCR2x el
estado del pin OC2x cambiará a un bajo y se mantendrá así hasta que el
registro TCNT2 llegue a su máximo que es 255 y vuelva 0, momento en el
cual el estado del pin OC2x cambiará nuevamente a un alto y el ciclo se
repetirá.
 Para la forma invertida por el pin OC2x se obtendrá un bajo mientras el
valor del registro TCNT2 sea menor al valor almacenado en el registro
OCR2x, al ocurrir la igualdad entre los registros TCNT2 y OCR2x el
estado del pin OC2x cambiará a un alto y se mantendrá así hasta que el
registro TCNT2 llegue a su máximo que es 255 y vuelva 0, momento en el
cual el estado del pin OC2x cambiará nuevamente a un bajo y el ciclo se
repetirá.

4
Para modificar el ancho de pulso de la señal PWM timer2 AVR modo rápido solo
hay que modificar el valor almacen ado en el registro OCR2x, con esto se logra
que los cambios de estado del pin OC2x sean en diferentes tiempos, por
ejemplo si se toma como referencia la imagen anterior para el nivel del registro
OCR2x, cambiando su nivel se obtendrá la señal PWM timer2 A VR con un ancho
de pulso modificado pero manteniendo constante su periodo, esto se puede ver
en la siguiente imagen.
Es importante señalar que el cambio en el valor almacenado en el registro
OCR2x, el microcontrolador AVR lo hará cuando el registro TCNT2 l legue a su
máximo valor no antes, esto es si TCNT2 se ha estado incrementando y en ese

5
momento se modifica el valor a cargar en OCR2x, este no se modificará
inmediatamente, sino que la modificación se realizará cuando TCNT2 llegue a
su máximo.

Una observación a tener muy en cuenta y es lo que diferencia al modo PWM


rápido con el modo fase correcta, es que si se toma el centro de los anchos de
pulso de la señal PWM timer2 AVR modo rápido y se hace un cambio en el ancho
del pulso, el centro del ancho de pulso se moverá, cambiará de lugar, se dice que
se modifica la fase del ancho de pulso, o que la fase no es correcta, esto se puede
ver en la siguiente imagen.

6
PWM timer2 AVR modo rápido Programación
Para programar el módulo PWM timer2 AVR en el ATmega88, se utilizan 2
registros los que son el registro TCCR2A y el registro TCCR2B.
El registro TCCR2A

7
Los bits 7 y 6 son para elegir que la obtención de la señal PWM timer2 AVR
será por el pin OC2A y si será en forma no invertida o en forma invertida,
mediante las combinaciones de estos bits según se indica en la siguiente tabla.

Si las combinaciones de estos bits son 10 la señal PWM obtenida por el pin
OC2A será no invetida, si las combinaciones de estos bits son 11 la señal PWM
obtenida por el pin OC2A será invetida
Los bits 5 y 4 son para elegir que la obtención de la señal PWM time r2 AVR
será por el pin OC2B y si será en forma no invertida o en forma invertida,
mediante las combinaciones de estos bits según se indica en la siguiente tabla.

Si las combinaciones de estos bits son 10 la señal PWM obtenida por el pin OC2B
será no invetida, si las combinaciones de estos bits son 11 la señal PWM obtenida
por el pin OC2B será invetida
Los bits 3 y 2 no se utilizan por lo que se les pone a 0.
Los bits 1 y 0 junto con el bit3 del registro TCCR2B son con los cuales se
elige el modo de obtener las señales PWM timer2 AVR, mediante las
combinaciones de estos bits según se indica en la siguiente tabla.

8
La combinación de estos bits que se utilizara para la generación de la señal PWM
timer2 AVR modo rápido será la tercera, la que está resaltada, esto es el bit 3
del registro TCCR2B se pondrá a 0 y los bits 1 y 0 del registro TCCR2A se
pondrán a 1.
El registro TCCR2B

Los bits 7, 6, 5, y 4 no se utilizarán en la obtención de la señal PWM timer2


AVR modo rápido por lo que se les pondrá a 0.
El bit3 trabaja junto con los bits 1 y 0 del registro TCCR2A tal como se comentó.
Los bits 2, 1 y 0 son para elegir el prescaler a utilizar para obtener la
frecuencia de la señal PWM timer2 AVR, las combinaciones de estos bits para
los diversos prescaler del timer2 son los que se indican en la siguiente tabla:

9
Los registros OCR2A y OCR2B
Se usará OCR2x para referirse a cualesquiera de ellos, x será A o B, en este
registro se cargará el valor mediante el cual se controlará el ancho de pulso de
la señal PWM que se obtendrá por el pin OC2x, este valor va de 0 a 255, cuando
sea 0 el ancho de pulso será 0 o del 0%, cuando sea 255 el ancho de pulso será
igual al periodo o del 100% de la señal PWM timer2 AVR, y entre ese intervalo
se obtienen los diferentes anchos de pulso de la señal PWM.
Se puede utilizar la siguiente forma para el ciclo de trabajo de la señal PWM
timer2 AVR modo rápido.
Ciclo de trabajo=((OCR2x)/255)*100%
Por ejemplo si se quiere un ciclo de trabajo del 75%, se puede proceder así
75%=((OCR2x)/255)x100%
De donde al despejar OCR2x se tendrá:
OCR2x=191
Esto indica que si se quiere un ciclo de trabajo del 75% de la señal PWM en el
registro OCR2x se tendrá que cargar el valor de 191 y esto será lo que se haga
en el primer ejemplo.
Normalmente lo que se quiere es controlar todo el ancho de pulso de la señal
PWM, por lo que de alguna forma se hace variar el valor de OCR2x, se verán
algunos ejemplo de como realizar esto.
Si se utilizan ambos pines OC2A y OC2B, la frecuencia de las señales PWM
obtenidas en ambos pines serán las mismas, ya que ambas utilizan el mismo
registro TCNT2, que es con el que decide la frecuencia o su inversa que es
periodo de la señal PWM.

PWM timer2 AVR modo rápido Ejemplos

10
Ejemplo 1 En este primer ejemplo se generará una señal PWM co n un ancho de
pulso del 75% por el pin OC2B en forma no invertida. Se utilizará el ATmega88
el cual estará trabajando a una frecuencia de 1Mhz.
Se puede escoger la frecuencia de la señal PWM Fpwm, con la ecuación que se
vio en la que la Fpwm depende de la FCPU y del prescaler a utilizar para el
registro TCNT2, se puede elegir entre 1, 8, 32, 64, 128, 256 y 1024, según la
tabla vista para el registro TCCR2B.
Fpwm=FCPU/(prescaler*256)
Si por ejemplo se elige el prescaler de 8, entonces se tendrá
Fpwm=(1Mhz/(8*256)
de donde Fpwm=488,3Hz, en este ejemplo lo que se busca es que el ancho de
pulso de la señal PWM sea del 75% de momento da igual la frecuencia Fpwm,
se puede elegir otra si así se desea.
Se quiere una señal PWM por el pin OC2B con un ciclo de trabaj o del
75%, entonces habrá que cargar el registro OCR2B con lo que se obtenga de la
ecuación del ciclo de trabajo.
75%=((OCR2B)/255)x100%
De donde al despejar OCR2B se obtiene el valor a cargar en el registro OCR2B
OCR0B=191 ;//valor a cargar en el registro OCR2B

Configuración del registro TCCR2A para el ejemplo 1

Como se obtendrá la señal PWM timer2 AVR por el pin OC2B su bit5 se pondrá
a 1 y su bit4 se pondrá a 0, sus bits 1 y 0 se pondrán a 1 ya que se utilizará el
modo PWM rápido, sus demás bits se pondrán a 0 ya que no se usarán.
TCCR2A=0b00100011;//PWM por el pin OC2B, PWM modo rápido
Configuración del registro TCCR2B para el ejemplo 1
Su bit3 se pondrá a 0 para utilizar el modo PWM rápido, y como se usará un
prescaler de 8 la combinación de sus bits 2, 1 y 0 será 010, todos sus demás bits
se pondrán a 0 ya que no se usarán.
TCCR2B=0b00000010;//PWM modo rápido, prescaler de 8
El circuito utilizado es el siguiente

11
El código para el ejemplo 1 del uso del módulo PWM timer2 AVR, hecho en el
ATMEL STUDIO es el siguiente:

La siguiente es una imagen de la señal PWM timer2 AVR modo rápido, con un
ancho de pulso o ciclo de trabajo del 75% vista en el osciloscopio.

12
Se comprueba que el ancho de pulso o el ciclo de trabajo es de un 75%, y la
frecuencia de la señal es de 491Hz.
Ejemplo 2 En este segundo ejemplo se generará una señal PWM timer0 AVR
con un ancho de pulso variable desde el 0% hasta el 100% por el pin OC2A en
forma no invertida. Se utilizará el ATmega88 el cual estará trabajando a una
frecuencia de 1Mhz.
El prescaler elegido para el registro TCNT2 será de 1, se puede elegir otro si así
se desea.
Fpwm=FCPU/(prescaler*256)
Entonces se tendrá
Fpwm=(1Mhz/(1*256)
de donde Fpwm=3,9Khz que es lo mismo que un periodo de Tpwm=256us, se
iniciará el ancho de pulso a un 0% por lo que el registro OCR2A se cargará en
un inicio con 0, luego dentro del ciclo del programa se hará que se incremente
en 1 unidad en cada 50ms.
OCR2A=0;//Ancho de pulso inicial de 0
El registro OCR2A irá entonces desde 0 para el 0% hasta 255 para el 100% del
ancho de pulso, momento en que el ancho de pulso se iguala al periodo de la
señal PWM; cuando el registro OCR2A llega 255 se reinicia automáticamente a
0, volviendo nuevamente a incrementarse en 1 unidad dentro del ciclo del
programa cada 50ms y así continuará, en este ejemplo lo que interesa es ver como

13
se logra la variación del ancho de pulso de una señal PWM timer2 AVR modo
rápido.
Configuración del registro TCCR2A para el ejemplo 2
Como se obtendrá la señal PWM timer2 AVR por el pin OC2A su bit7 se pondrá
a 1 y su bit6 se pondrá a 0, sus bits 1 y 0 se pondrán a 1 ya que se utiliz ará el
modo PWM rápido, sus demás bits se pondrán a 0 ya que no se usarán.
TCCR2A=0b10000011;//PWM por el pin OC2A, no invertido, PWM modo rápido
Configuración del registro TCCR2B para el ejemplo 2
Su bit3 se pondrá a 0 para utilizar el modo PWM rápido, y como se usará un
prescaler de 1 la combinación de sus bits 2, 1 y 0 será 001, todos sus demás bits
se pondrán a 0 ya que no se usarán.
TCCR2B=0b00000001;//PWM modo rápido, prescaler de 1
El circuito utilizado es el siguiente:

El código para el ejemplo 2 del uso del módulo PWM timer2 AVR, hecho en el
ATMEL STUDIO es el siguiente:

14
Ejemplo 3 En este tercer ejemplo se generará una señal PWM timer2 AVR con
un ancho de pulso variable desde el 0% hasta el 100% por el pin OC2A en forma
no invertida, es el mismo ejemplo que el caso anterior pero esta vez se utilizará
un pulsador conectado al pin PB0 para controlar el ancho de pulso. Se utilizará
el ATmega88 el cual estará trabajando a una frecuencia de 1Mhz.
El prescaler elegido para el registro TCNT2 será de 1, se puede elegir otro si así
se desea.
Fpwm=FCPU/(prescaler*256)
Entonces se tendrá
Fpwm=(1Mhz/(1*256)
de donde Fpwm=3,9Khz que es lo mismo que un periodo de Tpwm=256us, se
iniciará el ancho de pulso a un 0% por lo que el registro OCR2A se cargará en
un inicio con 0, luego mediante el pulsador conectado al pin PB0 cada vez que
este sea pulsado se incrementarán los valores del registro OCR2A en 5 unidades,
se a elegido 5 para que se aprecien pronto los cambios en el ancho del pulso,
puede ser cualquier otro incremento, por precaución se limitará que el valor del
registro OCR2A no sea mayor a 255, aunque este se reinicia a 0 cuando sobrepasa
los 255; del pin PB0 se aprovechara su resistencia pull up interna, se controlará
el ancho de pulso de la señal PWM timer2 AVR mediante incrementos en el valor
del registro OCR2A dentro del ciclo del programa.
OCR2A=0;//Ancho de pulso inicial de 0

15
Configuración del registro TCCR2A para el ejemplo 3
Como se obtendrá la señal PWM timer2 AVR por el pin OC2A su bit7 se pondrá
a 1 y su bit6 se pondrá a 0, sus bits 1 y 0 se pondrán a 1 ya que se utilizará el
modo PWM rápido, sus demás bits se pondrán a 0 ya que no se usarán.
TCCR2A=0b10000011;//PWM por el pin OC2A, no invertido, PWM modo rápido
Configuración del registro TCCR2B para el ejemplo 3
Su bit3 se pondrá a 0 para utilizar el modo PWM rápido, y como se usará un
prescaler de 1 la combinación de sus bits 2, 1 y 0 será 001, todos sus demás bits
se pondrán a 0 ya que no se usarán.
TCCR2B=0b00000001;//PWM modo rápido, prescale r de 1
El circuito utilizado es el siguiente:

El código para el ejemplo 3 del uso del módulo PWM timer2 AVR, hecho en el
ATMEL STUDIO es el siguiente:

16
17

También podría gustarte