mplabx c18 control de pwm
DESCRIPTION
tutorial de control de PWM para mplab en C18TRANSCRIPT
-
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