PWM timer2 AVR fase correcta


Compartir: Share on Facebook2Tweet about this on TwitterShare on Google+0Share on Tumblr0Share on LinkedIn0

Anterior PWM AVR modulación por ancho de pulso

PWM timer2 AVR fase correcta, 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 fase correcta; 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.

PWM timer0 AVR

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 generar señales PWM con el módulo PWM modo fase correcta timer2 AVR.

PWM timer2 AVR fase correcta

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 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 fase correcta el registro TCNT2 irá de 0 a 255 y luego de 255 a 0, y nuevamente de 255 a 0, y así continuará en el modo fase correcta; a este ir de 0 a 255 y de 25 a 0 le tomará un tiempo que dependerá del prescaler utilizado para el timer2, ese tiempo que le tome al registro TCNT2 para ir de 0 a 255 y de 255 a 0 es el periodo de la señal PWM timer2 AVR fase correcta, al registro TCNT2 se lo puede imaginar como si estuviese generando una onda triangular en el transcurso del  tiempo.

Una cosa a tener en cuenta es que al pasar el registro TCNT2 de 0 a 255 y luego de 255 a 0  en este caso se disparará la bandera de interrupción por desborde cuando el temporizador que va de 255 a 0 llega a 0, por lo que se puede habilitar el uso de la interrupción por desborde del  timer2.

pwm timer2 avr fase correcta tcnt2

Normalmente  si no se usan prescaler, en el PWM timer2 AVR fase correcta 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 en un primer momento 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, en un segundo momento el registro TCNT2 disminuirá sus valores desde el máximo de 255 hasta el mínimo de 0, en ese ir de 255 hasta 0 habrán trascurrido otros 255us mas, por lo que en ese ir de 0 a 255 y luego volver de 255 a 0 han pasado 510us, que vendría a ser el periodo de la señal PWM timer2 AVR fase correcta Tpwmpc 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 TCNT0 aumente su valor desde 0 a 255 y luego vuelva de 255 a 0.

El tiempo que trascurre para que el registro TCNT2 aumente su valor desde 0 a 255 y luego vuelva de 255 a 0 se puede modificar también mediante el uso de los prescaler, la siguiente es la tabla para la elección de los prescaler para el timer2 mediante las combinaciones de los bits 2, 1, y 0 del registro TCCR2B.

pwm timer2 avr fase correcta prescaler

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 luego vuelve de 255 a 0 para completar un periodo de la señal PWM timer2 AVR fase correcta Tpwmpc, habrá realizado el contero de 510 unidades, por lo que habrán transcurrido (510*8)/FCPU microsegundos.

Para cualquier otro prescaler que se utilice el periodo de la señal PWM timer2 AVR fase correcta tendrá la siguiente forma:

Tpwmpc=(510*prescaler)/FCPU

Si en lugar del periodo se quiere utilizar la frecuencia de la señal PWM timer2 AVR fase correcta, solo hay que invertir la ecuación anterior y se obtendrá:

Fpwmpc=FCPU/(prescaler*510)

PWM timer2 AVR fase correcta obtención de la señal PWM

La señal PWM timer2 AVR fase correcta se genera cuando el valor del  registro TCNT2 se iguala al valor almacenado en el registro OCR2A o en el registro OCR2B, tanto cuando el registro se incrementa de 0 a 255 como cuando se decrementa de 255 a 0, 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 255 o decrementandose hasta su valor mínimo de 0, la señal PWM timer2 AVR fase correcta 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á OC2x para los pines y OCR2x 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  timer0.

La señal PWM timer2 AVR fase correcta 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 este aumentando de 0 a 255 y 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 cuando el registro TCNT2, al disminuir de 255 a 0 se haga igual nuevamente al valor almacenado en registro OCR2x, momento en el cual el estado del pin OC2x cambiará nuevamente a un alto, el registro TCNT2 seguirá disminuyendo hacia 0, luego volverá a incrementase hacia 255 y cuando nuevamente se haga igual al valor almacenado en el registro OCR2x nuevamente por el pin OC2x se obtendrá un bajo y el ciclo se repetirá.
  • Para la forma invertida por el pin OC2x se obtendrá un bajo mientras el valor del registro TCNT2 este aumentando de 0 a 255 y 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 cuando el registro TCNT2, al disminuir de 255 a 0 se haga igual nuevamente al valor almacenado en registro OCR2x, momento en el cual el estado del pin OC2x cambiará nuevamente a un bajo, el registro TCNT2 seguirá disminuyendo hacia 0, luego volverá a incrementase hacia 255 y cuando nuevamente se haga igual al valor almacenado en el registro OCR2x nuevamente por el pin OC2x se obtendrá un alto y el ciclo se repetirá.

pwm timer2 avr fase correcta generación

Para modificar el ancho de pulso de la señal PWM timer2 AVR fase correcta solo hay que modificar el valor almacenado 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 AVR fase correcta 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 llegue a su máximo valor no antes, esto es si TCNT2 se ha estado incrementando o decrementando y en ese 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 que es 255.

pwm timer2 avr fase correcta generación 2

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 fase correcta y se hace un cambio en el ancho del pulso, el centro del ancho de pulso no se moverá, no cambiará de lugar, se dice que la fase del ancho de pulso no se modifica, o que la fase es correcta, esto se puede ver en la siguiente imagen.

pwm timer2 avr fase correcta cambio ancho de pulso

PWM timer2 AVR fase correcta Programación

Para programar el módulo PWM timer2 AVR fase correcta en el ATmega88, se utilizan 2 registros los que son  el registro TCCR2A y el registro TCCR2B.

El registro TCCR2A

timer2 avr tccr2a

Los bits 7 y 6 son para elegir que la obtención de la señal PWM timer2 AVR fase correcta 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.

pwm timer2 avr fase correcta OC2A

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 timer2 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.

pwm timer2 avr fase correcta OC2B

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.

pwm timer2 avr fase correcta selección PWM

La combinación de estos bits que se utilizara para la generación de la señal PWM timer2 AVR fase correcta será opción 1, la que está resaltada, esto es el bit 3 del registro TCCR2B se pondrá a 0 y del registro TCCR2A  su bit1 se pondrá a 0 y su bit0 se pondrá a 1.

El registro TCCR2B

temporizador contador timer2

Los bits 7, 6, 5, y 4 no se utilizarán en la obtención de la señal PWM timer2 AVR fase correcta 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 fase correcta, las combinaciones de estos bits para los diversos prescaler del timer2 son los que se indican en la siguiente tabla:

temporizador timer2

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.

El ancho de pulso en una señal PWM timer2 AVR fase correcta no invertido se inicia cuando el registro TCNT2 que esta incrementándose desde 0 a 255 se iguala al valor almacenado en el registro OCR2x, y terminará cuando el al decrementarse el registro TCNT2 de 255 a 0 se vuelva a igualar al valor almacenado en el registro OCR2x, por lo que el ancho de pulso  será igual a 2 veces el valor almacenado en el registro OCR2x, el periodo de la señal PWM timer2 AVR fase correcta es 2 veces el valor máximo que puede tener el registro TCNT2 esto es 510, ya que va de 0 a 255 y luego vuelve de 255 a 0.

Se puede utilizar la siguiente forma para el ciclo de trabajo de la señal PWM timer2 AVR fase correcta.

Ciclo de trabajo=((2*OCR2x)/510)*100%

Ciclo de trabajo=((OCR2x)/255)*100%

Cuando el valor almacenado en el registro OCR2x sea 0 el ciclo de trabajo será 0 o del 0%, cuando sea 255 el ciclo de trabajo será del 100% de la señal PWM timer2 AVR fase correcta, y entre 0 y 255 se obtienen los diferentes ciclos de trabajo de la señal PWM timer2 AVR fase correcta.

Por ejemplo si se quiere un ciclo de trabajo del 15%, se puede proceder así

15%=((OCR2x)/255)x100%

De donde al despejar OCR2x se tendrá:

OCR2x=38

Esto indica que si se quiere un ciclo de trabajo del 15% de la señal PWM timer2 AVR fase correcta en el registro OCR2x se tendrá que cargar el valor de 38 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

Ejemplo 1 En este primer ejemplo se generará una señal PWM timer2 AVR fase correcta con 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 8Mhz.

Se puede escoger la frecuencia de la señal PWM Fpwmpc, con la ecuación que se vio en la que la Fpwmpc 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.

Fpwmpc=FCPU/(prescaler*510)

Si por ejemplo se elige el prescaler de 8, entonces se tendrá

Fpwmpc=(8Mhz/(8*510)

de donde Fpwmpc=1,96KHz o el periodo Tpwmpc=510us, en este ejemplo lo que se busca es que el ancho de pulso de la señal PWM timer2 AVR fase correcta sea del 75% de momento da igual la frecuencia Fpwmpc, se puede elegir otra si así se desea.

Se quiere una señal PWM por el pin OC2B con un ciclo de trabajo 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 fase correcta por el pin OC2B su bit5 se pondrá a 1 y su bit4 se pondrá a 0, su bit1 se pondrá a 0 y su bit0 se pondrá a 1 ya que se utilizará el modo PWM fase correcta, sus demás bits se pondrán a 0 ya que no se usarán.

TCCR2A=0b00100001;// PWM por el pin OC2B, PWM timer2 AVR fase correcta

Configuración del registro TCCR2B para el ejemplo 1

Su bit3 se pondrá a 0 para utilizar el modo PWM timer2 AVR fase correcta, 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  timer2 AVR fase correcta, prescaler de 8

El circuito utilizado es el siguiente:

pwm timer2 avr ejemplo1 circuito

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

La siguiente es una imagen de la señal PWM timer2 AVR fase correcta del ejemplo 1 vista en el osciloscopio.

pwm timer2 avr fase correcta imagen ejemplo 1

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 1,98KHz..

Ejemplo 2 En este segundo ejemplo se generará una señal PWM timer2 AVR fase correcta con un ancho de pulso variable desde el 0% hasta el 100% por el pin OC2A en forma no invertida, y una señal PWM timer2 AVR fase correcta con un ancho de pulso del 50% por el pin OC2B en forma no invertida.  Se utilizará el ATmega88 el cual estará trabajando a una frecuencia de 8Mhz.

El prescaler elegido para el registro TCNT2 será de 1, se puede elegir otro si así se desea.

Fpwmpc=FCPU/(prescaler*510)

Entonces se tendrá

Fpwmpc=(8Mhz/(1*510)

de donde Fpwmpc=15,7Khz que es lo mismo que un periodo de Tpwmpc=64us, 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 100ms.

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 100ms y así continuará, en este ejemplo lo que interesa es ver como se logra la variación del ancho de pulso de una señal PWM timer2 AVR fase correcta.

Para la señal PWM timer2 AVR fase correcta con un ancho de pulso del 50% por el pin OC2B, el registro OCR2A se cargará con 128.

OCR2B=128;//ciclo de trabajo constante del 50%

Configuración del registro TCCR2A para el ejemplo 2

Se obtendrá una señal PWM timer2 AVR fase correcta no invertida por el pin OC2A su bit7 se pondrá a 1 y su bit6 se pondrá a 0, además se obtendrá una señal PWM timer2 fase correcta no invertida por el pin OC2B se pondrá su bit5 a 1 y su bit4 a 0, su bit1 se pondrá a 0 y su bit0 se pondrán a 1 ya que se utilizará el modo PWM fase correcta, sus demás bits se pondrán a 0 ya que no se usarán.

TCCR2A=0b10100001;// PWM por el pin OC2A y por el pin OC2B , PWM timer2 AVR fase correcta

Configuración del registro TCCR2B para el ejemplo 1

Su bit3 se pondrá a 0 para utilizar el modo PWM timer2 AVR fase correcta, 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 timer2 AVR fase correcta, prescaler de 1

El circuito utilizado es el siguiente:

pwm timer2 avr fase correcta ejemplo circuito

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

La siguiente es una imagen de la señal PWM timer2 AVR fase correcta del ejemplo 2 vista en el osciloscopio.

pwm timer2 avr fase correcta imagenejemplo 2

El ancho de pulso en color azul de la señal PWM timer2 AVR fase correcta obtenida por el pin OC2A está incremtandose, el ancho de pulso en color rojo de la señal PWM timer2 AVR fase correcta obtenida por el pin OC2B se mantine constante al 50%, se puede ver que los centros de los anchos de pulso no se desplazan, esta es la característica de la señal PWM en fase correcta.

Ejemplo 3 En este tercer ejemplo se generará una señal PWM timer2 AVR modo rápido con un ancho de pulso variable desde el 0% hasta el 100% por el pin OC2A en forma no invertida, 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 8Mhz.

El prescaler elegido para el registro TCNT2 será de 1, se puede elegir otro si así se desea.

Fpwm=FCPU/(prescaler*510)

Entonces se tendrá

Fpwm=(8Mhz/(1*510)

de donde Fpwmpc=15,7Khz que es lo mismo que un periodo de Tpwmpc=64us, 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; del pin PB0 se aprovechara su resistencia pull up interna, se controlará el ancho de pulso de la señal PWM timer2 AVR fase correcta mediante incrementos en el  valor del registro OCR2A dentro del ciclo del programa.

OCR2A=0;//Ancho de pulso inicial de 0

Configuración del registro TCCR2A para el ejemplo 3

Como se obtendrá la señal PWM timer2 AVR fase correcta por el pin OC2A su bit7 se pondrá a 1 y su bit6 se pondrá a 0, sus bit1 se pondrá a 0 y su bit0 se pondrá 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=0b10000001;// PWM por el pin OC2A, PWM timer0 AVR fase correcta

Configuración del registro TCCR2B para el ejemplo 3

Su bit3 se pondrá a 0 para utilizar el modo PWM fase correcta, 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 timer2 AVR fase correcta, prescaler de 1

El circuito utilizado es el siguiente:

pwm timer2 avr ejemplo3 circuito

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

Si he logrado ayudarte en cuanto a la utilización del módulo PWM timer2 AVR fase correcta con el microcontrolador AVR, comparte este enlace para poder ayudar a muchas personas mas. Muchas Gracias.

Atte: MrElberni.

Compartir: Share on Facebook2Tweet about this on TwitterShare on Google+0Share on Tumblr0Share on LinkedIn0