MPLABX C18 Control de PWM

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

description

tutorial de control de PWM para mplab en C18

Transcript of MPLABX C18 Control de PWM

  • 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