17
PIC 18F45XX El módulo CCP de Comparación, Captura y PWM (Pulse Wide Modulation)

PIC 18F45XX - IES LUIS DE LUCENA€¦ · 2. Características del módulo en modo PWM (I) El módulo en modo PWM utiliza el Timer2 para generar un tren de pulsos de amplitud y ciclo

  • Upload
    vandung

  • View
    214

  • Download
    0

Embed Size (px)

Citation preview

PIC 18F45XX

El módulo CCP de Comparación, Captura y PWM

(Pulse Wide Modulation)

1. El módulo C.C.P

➔ La mayoría de microcontroladores actuales disponen de un periférico denominado“ , ” .Módulo de Captura Comparación y PWM o CCP

➔ Este módulo consta de un registro de 16bits CCPx que puede operar como registro , de captura de datos comparación de datos o como registro para fijar el ciclo de

.trabajo de una señal PWM

➔ El pic 18F4550 dispone de dos módulos denominados CCP1 y CCP2 asociados a los ( ) / ( )*. registros CCPR1 y CCPR2 pines RC2 CCP1 y RC1 RB3 CCP2

➔ En modo captura el módulo es capaz de almacenar el valor del TIMER1 o TIMER3 ( / , / cuando se produce un evento flanco de subida bajada cada 4 16 flancos de/ , ) / . subida bajada etc en los pines CCP1 CCP2

➔ En modo comparación el valor del registro CCPRx está siendo constantemente . comparado con el valor del TIMER1 o TIMER3 Cuando los valores coinciden el pin

: / , .CCPx puede ponerse a nivel alto bajo cambiar de estado o permanecer en su valor

(*) # :La directiva pragma se utiliza para fijar el pin asociado al modulo CCP2# = // pragma config CCP2MX ON CCP2 en RC1# = // pragma config CCP2MX OFF CCP2 en RB3

2. Características del módulo en modo PWM (I)

➔ El módulo en modo PWM utiliza el Timer2 para generar un tren de ( ).pulsos de amplitud y ciclo de trabajo variable señal PWM

➔ Para una frecuencia determinada Fpwm ( - ) 1 10Khz obtenemos un periodoTpwm. ( ) Fijando el ciclo de trabajo duty_cicle podemos variar la potencia

/ - .entregada en el pin de salida asociado RC2 RC1 RB3

➔ Para un periodo Tpwm fijo, se puede modificar el tiempo que permanece en alto la seña o “duty_cicle”. Si aplicamos esta señal a una carga (lámpara) podemos controlar la potencia entregada y, por lo tanto, el nivel de iluminación según la figura.

3. Características del módulo en modo PWM (II)

➔ Podemos utilizar la señal PWM para regular la alimentación de un motor DC, y controlar la potencia entregada y, por lo tanto, su velocidad.

Nota: Reducir la potencia entregada a un motor reduce su velocidad, pero también se reduce el par en su eje.

4. Funcionamiento del módulo CCPx en modo PWM

(*) En modo PWM, el pin CCPx puede generar una señal de salida PWM de 10bits de resolución. Los pines CCPx deben estar configurados como salidas para funcionar en modo PWM.

5. Funciones de control en C18 del módulo PWM (I)

Para configurar y controlar el módulo PWM, C18 proporciona las siguientes funciones:

➔ OpenPWM1(valor); Esta función configura el módulo CCP1 en modo PWM y fija el periodo de la señal de salida en el pin RC2 según la expresión

Tpwm = (valor + 1)* 4 * Tosc * TMR2 prescaler

Donde: Tpwm: Valor del periodo de la señal PWM en us Tosc: Periodo de la señal de reloj del sistema en us TMR2 prescaler: Valor del preescaler del Timer2

➔ OpenPWM2(valor); Configura el módulo CCP2 en modo PWM igual que en caso anterior utilizando como pin de salida RC1 o RB3 en función del estado de la directiva:# = // pragma config CCP2MX ON Señal PWM en RC1# = // pragma config CCP2MX OFF Señal PWM en RB3

Nota: Se pueden usar los dos módulo CCP1 y CCP2, pero ambos deben compartir el mismo valor del periodo de señal PWM.

6. Funciones de control en C18 del módulo PWM (II)

➔ SetDCPWM1(duty); Esta función configura el tiempo en alto de la señal PWM según la expresión:

duty = (Ton * Fosc) / (100*Fpwm*TMR2 preescaler)

Donde: Ton: Valor del tiempo en alto (duty cicle) de la señal PWM en %. Fosc: Frecuencia del reloj del sistema en Hz.(*) Fpwm: Frecuencia del la señal PWM en Hz. TMR2 preescaler: Valor del preescaler del Timer2

➔ SetDCPWM2(duty); Realiza la misma función sobre el módulo CCP2 y los pines RC1/RB3. El valor del ciclo de trabajo de CCP2 puede ser diferente al del CCP1.

--oOo--

Nota1: (*) El valor de la Fosc puede ser distinta del valor del Xtal. Nota2: Se pueden usar los dos módulo CCP1 y CCP2, pero ambos deben compartir el mismo valor del periodo de señal PWM.Nota3: El duty debe ser un valor entero, como máximo de 10bits (0-1023)

7. Funciones de control en C18 del módulo PWM (III)

➔ SetOutputPWM1(config,modo); Esta función configura el modo en que se generará la señal PWM según el valor de los parámetros siguientes:

config: SINGLE_OUT: Single output.(*) FULL_OUT_FWD: Full-bridge output forward HALF_OUT: Half-bridge output FULL_OUT_REV: Full-bridge output reverse PWM_OP_MODE_MASK: Mask PWM Output Configuration bits

modo: PWM_MODE_1: PxA,PxC active high, PxB,PxD active high (*) PWM_MODE_2: PxA,PxC active high, PxB,PxD active low PWM_MODE_3: PxA,PxC active low, PxB,PxD active high PWM_MODE_4: PxA,PxC active low, PxB,PxD active low PWM_MODE_MASK: Mask PWM Output Configuration bits

➔ ClosePWM1(); / Close PWM2(); Desactiva la módulo PWM y la señal de salida.

(*) Nota: El modo normal de operación del PWM es SINGLE_OUT y MODE_1. Con esta configuración el pulso PWM se mantiene en el tiempo y el ciclo de trabajo expresa el tiempo en alto de la señal de salida.

8. Configuración del módulo CCP1 (PWM1)

Para configurar el pin RC2 (CCP1) como salida PWM1 debemos seguir los siguientes pasos:

➔ Incluir en nuestro programa las funciones de control pwm #include <pwm.h>

➔ Configurar el pin RC2 como salida. TRISCbits.RC2=0;

➔ Configurar el TIMER2 como temporizador, sin interrupciones y con el prescaler (PR2) adecuado. El postescaler es ignorado. OpenTimer2 (TIMER_INT_OFF&T2_PS_1_X); // Donde X=1,4 o 16

➔ Configurar el módulo CCP en modo PWM y fijar el periodo. OpenPWM1(valor);

➔ Fijar el ciclo de trabajo SetDCPWM1(duty);

➔ Poner en marcha el módulo. SetOutputPWM1(SINGLE_OUT, PWM_MODE1);

9. Configuración del módulo CCP2 (PWM2)

Para configurar el pin RC1/RB3 (CCP2) como salida PWM2 debemos seguir los siguientes pasos:

➔ Incluir en nuestro programa las funciones de control pwm #include <pwm.h>

➔ Configurar el pin RC1/RB3 como salida. TRISCbits.RC1=0; → Para (# = )pragma config CCP2MX ON TRISBbits.RB3=0; → Para (# = )pragma config CCP2MX OFF

➔ Configurar el TIMER2 como temporizador, sin interrupciones y con el prescaler (PR2) adecuado. El postescaler es ignorado. OpenTimer2 (TIMER_INT_OFF&T2_PS_1_X); // Donde X=1,4 o 16

➔ Configurar el módulo CCP2 en modo PWM y fijar el periodo. OpenPWM2(valor);

➔ Fijar el ciclo de trabajo del PWM2 SetDCPWM2(duty);

➔ Poner en marcha el módulo. SetOutputPWM1(SINGLE_OUT, PWM_MODE_1);

10. Documentación de Microchip sobre el módulo CCPx

11. Ejempo de configuración del módulo PWM1 (I)

Supongamos que queremos generar una señal PWM de 2Khz en el pin RC2 con un ciclo de trabajo del 50%. Para ello suponemos que nuestro oscilador trabaja a 20Mhz.

Parámetro iniciales:Fosc: 20Mhz, Tosc: 0,05us Fpwm: 2Khz, Tpwm: 500us

1º) Calculo del periodo: Tpwm = (valor + 1)* 4 * Tosc * TMR2 prescaler

Despejando: valor=[Tpwm / (4*Tosc * TMR2 prescaler)]-1

Sustituyendo para un preescaler de TMR2=16: Valor= [500/4*0,05*16]-1 => [500/3,2]-1 = 155,25 = 155 (*)

(*) Elegimos el valor entero más próximo. Este es el valor que tenemos que pasar a la función OpenPWM1() para conseguir un periodo de la señal PWM de 500us. OpenPWM1(155);

12. Ejempo de configuración del módulo PWM1 (II)

2º) Una vez fijado el periodo tenemos que calcular valor de duty que tenemos que pasar a la función SetDCPWM1(duty) para conseguir un ciclo de trabajo del 50%. Para ello utilizamos la expresión: duty = (Ton * Fosc) / (100*Fpwm*TMR2 preescaler)

Sustituyendo: Duty = (50 * 20.000.000) / (100*2000*16) = 312,5 => 312

(*) Elegimos el valor entero más próximo. Este es el valor que tenemos que pasar a la función SetDCPWM1() para conseguir un ciclo de trabajo de 250us. SetDCPWM1(312);

3º) Poner en marcha el módulo: SetOutputPWM1(SINGLE_OUT, PWM_MODE_1);

Solución en C18 (l)

Solución en C18 (II)

Captura Osciloscopio en Proteus

Observar que la base de tiempos es de 100us y que el periodo de la señal generada tiene 5 cuadros, es decir 500us (Tpwm) y el ciclo de trabajo es de dos cuadros y medio, es decir 250us (duty del 50%) como pretendíamos.

Simulación en Proteus