Upload
khriz69
View
50
Download
5
Embed Size (px)
DESCRIPTION
tutorial de control de PWM para mplab en C18
Citation preview
PIC 18F45XX
El mdulo CCP de Comparacin, Captura y PWM
(Pulse Wide Modulation)
1. El mdulo C.C.P
La mayora de microcontroladores actuales disponen de un perifrico denominado , .Mdulo de Captura Comparacin y PWM o CCP
Este mdulo consta de un registro de 16bits CCPx que puede operar como registro , de captura de datos comparacin de datos o como registro para fijar el ciclo de
.trabajo de una seal PWM
El pic 18F4550 dispone de dos mdulos denominados CCP1 y CCP2 asociados a los ( ) / ( )*. registros CCPR1 y CCPR2 pines RC2 CCP1 y RC1 RB3 CCP2
En modo captura el mdulo 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 comparacin 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. Caractersticas del mdulo en modo PWM (I)
El mdulo en modo PWM utiliza el Timer2 para generar un tren de ( ).pulsos de amplitud y ciclo de trabajo variable seal 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 sea o duty_cicle. Si aplicamos esta seal a una carga (lmpara) podemos controlar la potencia entregada y, por lo tanto, el nivel de iluminacin segn la figura.
3. Caractersticas del mdulo en modo PWM (II)
Podemos utilizar la seal PWM para regular la alimentacin 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 tambin se reduce el par en su eje.
4. Funcionamiento del mdulo CCPx en modo PWM
(*) En modo PWM, el pin CCPx puede generar una seal de salida PWM de 10bits de resolucin. Los pines CCPx deben estar configurados como salidas para funcionar en modo PWM.
5. Funciones de control en C18 del mdulo PWM (I)
Para configurar y controlar el mdulo PWM, C18 proporciona las siguientes funciones:
OpenPWM1(valor); Esta funcin configura el mdulo CCP1 en modo PWM y fija el periodo de la seal de salida en el pin RC2 segn la expresin
Tpwm = (valor + 1)* 4 * Tosc * TMR2 prescaler
Donde: Tpwm: Valor del periodo de la seal PWM en us Tosc: Periodo de la seal de reloj del sistema en us TMR2 prescaler: Valor del preescaler del Timer2
OpenPWM2(valor); Configura el mdulo CCP2 en modo PWM igual que en caso anterior utilizando como pin de salida RC1 o RB3 en funcin del estado de la directiva:# = // pragma config CCP2MX ON Seal PWM en RC1# = // pragma config CCP2MX OFF Seal PWM en RB3
Nota: Se pueden usar los dos mdulo CCP1 y CCP2, pero ambos deben compartir el mismo valor del periodo de seal PWM.
6. Funciones de control en C18 del mdulo PWM (II)
SetDCPWM1(duty); Esta funcin configura el tiempo en alto de la seal PWM segn la expresin:
duty = (Ton * Fosc) / (100*Fpwm*TMR2 preescaler)
Donde: Ton: Valor del tiempo en alto (duty cicle) de la seal PWM en %. Fosc: Frecuencia del reloj del sistema en Hz.(*) Fpwm: Frecuencia del la seal PWM en Hz. TMR2 preescaler: Valor del preescaler del Timer2
SetDCPWM2(duty); Realiza la misma funcin sobre el mdulo 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 mdulo CCP1 y CCP2, pero ambos deben compartir el mismo valor del periodo de seal PWM.Nota3: El duty debe ser un valor entero, como mximo de 10bits (0-1023)
7. Funciones de control en C18 del mdulo PWM (III)
SetOutputPWM1(config,modo); Esta funcin configura el modo en que se generar la seal PWM segn el valor de los parmetros 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 mdulo PWM y la seal de salida.
(*) Nota: El modo normal de operacin del PWM es SINGLE_OUT y MODE_1. Con esta configuracin el pulso PWM se mantiene en el tiempo y el ciclo de trabajo expresa el tiempo en alto de la seal de salida.
8. Configuracin del mdulo 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
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 mdulo CCP en modo PWM y fijar el periodo. OpenPWM1(valor);
Fijar el ciclo de trabajo SetDCPWM1(duty);
Poner en marcha el mdulo. SetOutputPWM1(SINGLE_OUT, PWM_MODE1);
9. Configuracin del mdulo 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
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 mdulo CCP2 en modo PWM y fijar el periodo. OpenPWM2(valor);
Fijar el ciclo de trabajo del PWM2 SetDCPWM2(duty);
Poner en marcha el mdulo. SetOutputPWM1(SINGLE_OUT, PWM_MODE_1);
10. Documentacin de Microchip sobre el mdulo CCPx
11. Ejempo de configuracin del mdulo PWM1 (I)
Supongamos que queremos generar una seal PWM de 2Khz en el pin RC2 con un ciclo de trabajo del 50%. Para ello suponemos que nuestro oscilador trabaja a 20Mhz.
Parmetro 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 ms prximo. Este es el valor que tenemos que pasar a la funcin OpenPWM1() para conseguir un periodo de la seal PWM de 500us. OpenPWM1(155);
12. Ejempo de configuracin del mdulo PWM1 (II)
2) Una vez fijado el periodo tenemos que calcular valor de duty que tenemos que pasar a la funcin SetDCPWM1(duty) para conseguir un ciclo de trabajo del 50%. Para ello utilizamos la expresin: duty = (Ton * Fosc) / (100*Fpwm*TMR2 preescaler)
Sustituyendo: Duty = (50 * 20.000.000) / (100*2000*16) = 312,5 => 312
(*) Elegimos el valor entero ms prximo. Este es el valor que tenemos que pasar a la funcin SetDCPWM1() para conseguir un ciclo de trabajo de 250us. SetDCPWM1(312);
3) Poner en marcha el mdulo: SetOutputPWM1(SINGLE_OUT, PWM_MODE_1);
Solucin en C18 (l)
Solucin en C18 (II)
Captura Osciloscopio en Proteus
Observar que la base de tiempos es de 100us y que el periodo de la seal 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 pretendamos.
Simulacin en Proteus
Pgina 1Pgina 2Pgina 3Pgina 4Pgina 5Pgina 6Pgina 7Pgina 8Pgina 9Pgina 10Pgina 11Pgina 12Pgina 13Pgina 14Pgina 15Pgina 16Pgina 17