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

PIC 18F45XX

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

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

1. El módulo C.C.P

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 PWMo 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)

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 periodo Tpwm . 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.

a una carga (lámpara) podemos controlar la potencia entregada y, por lo tanto, el nivel de

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

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.

la potencia entregada y, por lo tanto, su velocidad. Nota: Reducir la potencia entregada a un

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

4. Funcionamiento del módulo CCPx en modo PWM
4. Funcionamiento del módulo CCPx en modo PWM (*) En modo PWM, el pin CCPx puede

(*) 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)

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)

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)

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)

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)

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

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

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

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)

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 (l)

Solución en C18 (II)

Solución en C18 (II)

Captura Osciloscopio en Proteus

Captura Osciloscopio en Proteus Observar que la base de tiempos es de 100us y que el

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

Simulación en Proteus