Uso del PWM en el PIC18F4550

En este tutorial explicare el funcionamiento en el PIC18F4550 del módulo de PWM con el compilador XC8 y el IDE MPLABX. Para el caso del microcontrolador mencionado este cuenta con dos salidas de PWM. También el caso de los pines utilizados son el CCP1 y CCP2. El CCP1 se conecta en el pin RC2. Por el contrario el pin CCP2 está multiplexado y puede ser configurado en el pin RC1 y RB3. La modulación por ancho de pulso (PWM) requiere de uno de los timers del microcontrolador. Una imagen que representa el funcionamiento del PWM se muestra en la Figura 1.

Figura 1. La modulación por ancho de pulso PWM en el PIC18F4550 ocurre cuando se «cambia» el ciclo de trabajo de una señal periódica. En la imágen se muestra un ejemplo donde se varía el ciclo de trabajo del 25% al 50%. Como podrán observar la frecuencia de salida en el ciclo PWM no cambia, lo que cambia es su ciclo de trabajo.

Registros del PIC18F4550 para el PWM

A continuación explicaremos el funcionamiento del PWM-1. Este módulo utiliza el Timer 2.

  • CCPxCON. Donde la X representa el número 1 o 2, dependiendo de cuál módulo se quiera usar, en este caso usaremos el CCP1CON. Este registro se encarga de configurar el modo de funcionamiento y además cuenta con los 2 bits menos significativos de un registro de 10 bits que permite controlar el ciclo de trabajo del PWM.
  • TMR2. Es un registro de 8 bits que permite el funcionamiento del Timer 2.
  • PR2. También es una memoria de 8 bits, se utiliza para calcular la frecuencia de operación del PWM.
  • CCPRxL. Es un registro de 8 bits que funciona en conjunto con 2 bits del registro CCPxCON para funcionar como una memoria de 10 bits. La x se sustituye por 1 o 2 dependiendo del módulo o pin que se quiera usar. En este caso usaremos el CCPR1L.
  • T2CON. Memoria de 8 bits que se requiere para controlar el funcionamiento del Timer 2.
  • TRISC. Es un registro que permite configurar los pines del puerto C. En este caso se utilizará para configurar como salida a los pines RC2 y RC1. Estos son los pines utilizados para el PWM en el PIC18F4550.

Fórmulas para la configuración del PWM en XC8

Para controlar el módulo PWM se requiere primero conocer la frecuencia de operación del Timer 2. Esto para el caso del uso del Timer 1 en el PIC18F4550. La Frecuencia de operación se puede calcular conociendo la Frecuencia de Oscilación, que llamaremos FOSC.

Ejemplo 1, calcular la frecuencia de oscilación del Timer 2.

Si FOSC = 8 000 000 Hz y usamos una pre-escala de 16, la frecuencia de operación del Timer 2 será:

Frecuencia Timer 2 = 8 Mhz / 4 / 256 / 16 = 488.28125 Hz

Es decir, el periodo de funcionamiento del Timer 2 será:

Periodo = 1/F = 1/488 = 0.00204918 segundos.

Calcular la frecuencia de operación del PWM en el PIC18F4550 con el XC8

La frecuencia de oscilación en el PWM está directamente relacionada con el periodo del Timer 2 y con el valor en el registro PR2. Si configuramos el registro PR2 con el máximo valor (255), esto permitirá configurar la mínima frecuencia en el PWM. Si por el contrario configuramos el mínimo valor (0) esto dará pie a configurar la máxima frecuencia en el PWM.

Periodo PWM = (PR2+1)*4*TOSC*(Valor de la pre-escala)

  • TOSC = Periodo de oscilación, por ejemplo si FOSC = 8Mhz, entonces TOSC = 125nS (1/8Mhz).
  • Pre-escala. Es el valor configurado

Ejemplo 2: Calcular el valor del periodo mínimo y máximo con FOSC = 8MHZ, Pre-escala = 16.

Para el valor maximo de frecuencia en el PWM, PR2 = 0, con preescala de 16 Por lo tanto:

Periodo PWM máximo = (0+1)*4*125ns*16 = 0.000008s = 8us, frecuencia Máxima = 125khz.

Periodo PWM mínimo = (255+1)*4*125ns*16 = 0.002048s = 2.048ms, frecuencia mínima = 488Hz.

Ciclo de trabajo en el PWM

El ciclo de trabajo en el PWM se refiere a la relación del tiempo entre la señal en estado lógico bajo y en estado lógico alto. Por ejemplo, cuando la señal digital pasa el mismo tiempo en estado bajo que en estado alto, se trata de un ciclo de trabajo (CT) del 50%.

Para calcular el ciclo de trabajo del PWM en el PIC18F4550 se utiliza la siguiente fórmula:

PWM Duty Cycle = (CCPR X L:CCP X CON<5:4>) •
T OSC • (TMR2 Prescale Value)

CT PWM = [CPR1L|(BIT1 | BIT0)]*TOSC*(pre-escala)

Donde el BIT1 y el BIT0, son los últimos dos bits de los 10 bits que se cuentan para controlar el ciclo de trabajo. Estos 10 bits se logran al unir el registro CCPR1L y dos bits del registro CCP1CON (los bits DC1B1 y DC1B0 ).

Ejemplo 3. Calcular el ciclo de trabajo del 50% para un FOSC de 8Mhz, una pre-escala de 16 y una frecuencia del timer 2 de 488Hz.

Para este ejemplo necesitamos despejar el registro de 10 bits de la fórmula anterior. Esto es:

[CPR1L|(BIT1 | BIT0)] = (CT PWM)/[TOSC*(pre-escala)]

El ciclo de trabajo lo tomaremos en unidades de tiempo. Por ejemplo. Si el periodo para una señal de 488Hz es de 2.04ms y queremos un CT del 50%, este deberá de ser de 1.02ms. Este es el valor que sustituiremos en la fórmula.

[CPR1L|(BIT1 | BIT0)] = (1.02ms)/[125ns*(16)] =512.295 o aproximadamente 512. En hexadecimal y binario 512 corresponde al: 0x0200 o 0b10 0000 0000. Si esto lo trasladamos a un registro de 8 bits y 2 bits. Tendriámos que colocar la siguiente información:

CCPR1L = 0b1000 0000 //0x80

DC1B1 = 0

DC1B0 = 0

Entonces si queremos variar el ciclo de trabajo del PWM tendriámos que variar el valor de estos 10 bits en nuestro programa.

Código para el PIC18F4550 con el compilador XC8 para controlar el PWM 1

Autor: Dr. Rubén Estrada Marmolejo

Fecha publicación: 3 de Diciembre 2020

Fecha última actualización: 3 de Diciembre 2020

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *