El presente sitio presenta diseños y proyectos realizados con Solidworks y otros programas 3d , además de laminas y modelos 3d para practicar en casa, con el único objetivo de poder aprender y explorar la capacidad de Solidworks, no existiendo en ningún caso fines de lucro.

Friday, March 1, 2013

uso del pwm usart y adc C18

Posted by Juan Francisco | Friday, March 1, 2013 | Category: |


//                USO DEL PWM CON ADC Y USART         
#include
#include    //tiempos 
#include    //USAREMOS INTERRUPCION POR TIMERS
#include        //PWM LIBRARY
#include        //Trabajamos con ADC
#include    //Incluimos usart 
#include    //uso de conversiones printf

//Fuses para trabajar con 8Mhz/////////
#pragma config FOSC   = INTOSCIO_EC        //usamos 8Mhz internos
#pragma config PLLDIV = 5                //PLL DIV 20Mhz/5=4Mhz
#pragma config CPUDIV = OSC1_PLL2         //CPUDIV1 96Mhz/2=48Mhz
#pragma config USBDIV = 1                //tRABAJAMOS CON USB CLOCK divido en 1
#pragma config VREGEN = OFF  //Trabajamos sin regulador interno 3.3v para usb
#pragma config FCMEN  = OFF, IESO    = OFF 
#pragma config PWRT   = ON, BOR     = OFF,BORV   = 0
#pragma config WDT    = OFF,WDTPS   = 32768 
#pragma config MCLRE  = ON, LPT1OSC = OFF,PBADEN = OFF,CCP2MX = ON 
#pragma config STVREN = OFF,LVP     = OFF,XINST  = OFF,DEBUG  = OFF 
#pragma config CP0    = OFF,CP1     = OFF,CP2    = OFF
#pragma config CPB    = ON, CPD     = ON 
#pragma config WRT0   = OFF,WRT1    = OFF,WRT2   = OFF 
#pragma config WRTB   = OFF,WRTC    = OFF,WRTD   = OFF
#pragma config EBTR0  = OFF,EBTR1   = OFF,EBTR2  = OFF 
#pragma config EBTRB  = OFF


/////Declaracion de variables    ///////
/*------------------------------------------*/
unsigned int adc;
unsigned char cont;
unsigned int percent;
unsigned char flag=0;

/*------------------------------------------*/

//Prototipos de funciones        ///////
/*------------------------------------------*/
void ISRTimer0(void);            //Funcion de Interrupcion
void config(void);                //Funcion de Configuraciones de puertos, Timer,pwm,usart,adc

/*------------------------------------------*/
//Inicio de la interrupcion por timer 0//////
//                                       //////
//0x08 es la posicion de alta prioridad//////
//0x18 es posicion de baja prioridad   //////
#pragma code Interrupcion = 0X0008
void VectorInterrupcion(void){
    _asm goto ISRTimer0 _endasm
}
#pragma code
//Funcion de Interrupcion/////////////
#pragma interrupt ISRTimer0
void ISRTimer0(void){
    cont++;
    if(INTCONbits.TMR0IF==1 && cont==2){
        flag=1;
        INTCONbits.TMR0IF=0;
        cont=0;
    }
    WriteTimer0(61629);
}
//Fin de la interrupcion            //////////
/*------------------------------------------*/
//Incio de la funcion de configuracion///////
void config(void){
    TRISA=0x01;
    TRISC=0X80;
    //Configuramos UART
    OpenUSART(    USART_TX_INT_OFF    &    //Disable Interrupts
                USART_RX_INT_OFF    &    //----------------
                USART_ASYNCH_MODE    &    //Modo asincronico
                USART_EIGHT_BIT        &    //8 bit
                USART_CONT_RX        &    //resepcion continua
                USART_BRGH_HIGH        ,
                25);                //FOSC / (16 * (spbrg + 1))
                                    //spbrg=((FOSC/BAUD)/16)-1
                                    //25=((8Mhz/19200)/16)-1

    //Configuramos TIMER0
    OpenTimer0(TIMER_INT_ON &     //Interrupciones por timer0 activado
               T0_16BIT     &    //16-bit
               T0_SOURCE_INT&     //Contar los ciclos internos 48Mhz/4
               T0_EDGE_FALL &     //~~_
               T0_PS_1_256);    //Preescalar =256
                //Interrupcion timpo=(1/(FOSC/4))*preescalar*(65536-timer0)
                //               .500s=tiempo maximo
                //               timer0=+65536-{tiempo/[(1/(FOSC/4))*preescalar]}
    WriteTimer0(61629);                //Cargamos el timer0=0
    //Configuramos ADC
    OpenADC(ADC_FOSC_RC     &    //Clock Interno
            ADC_RIGHT_JUST    &    //10bit
            ADC_20_TAD        ,    //20TAD
            ADC_CH0            &    //CANAL0
            ADC_INT_OFF        &    //INTERRUPCIONES OFF
            ADC_REF_VDD_VSS ,    //+5,GND
            ADC_1ANA);            //canal 0 analogo, resto digital
    //Configuramos PWM        
    OpenTimer2(TIMER_INT_OFF     &//Interrupcion timer2 OFF
               T2_PS_1_16        &//preescalar = 16
               T2_POST_1_1);     //POst escalar=1
                                //
    OpenPWM1(124);
                    //PWM period =   [(period  ) + 1] x 4 x Tosc x TMR2 prescaler
                    //PWM period =   [(255)+1]x(4/8Mhz)x16
                    // [.001s/((4/8Mhz)*16)]-1=period 
                    // [1/(f*(4/Tosc)*preescalar)]-1=period
    OpenPWM2(124);
    SetDCPWM1(127);
    SetDCPWM2(127);
    //Habilitamos interrupciones
    RCONbits.IPEN=0;            //Deshabilitamos prioridades
    INTCONbits.PEIE=1;            //Activamos Interrupciones por Timer0
    INTCONbits.GIE=1;            //Interrupciones global Activadas
    
}

void main(void){
    OSCCON=0x70;                //Oscilador a 8Mhz
                                //Se tiene que poner antes de todas las funciones
    config();                    //Funcion de configuracion

    while(1){//bucle infinito
        if(flag==1){            //Ha desbordado?        
            INTCONbits.PEIE=0;    //Desactivamos TIMER0
            flag=0;                //TOGGLE timer0
            Delay1KTCYx(1);        //500uS
            SetChanADC(0);        //canal 0 empieza la conversion
            ConvertADC();        //start convert
            while(BusyADC());    //Ha terminado?
            adc=ReadADC();        //lee dato
            printf("ADC = %i\r\n",adc);    //IMPRIME ADC
            SetDCPWM1(adc);        //CAMBIA VALORES DEL duty
            SetDCPWM2(adc);        //------------------------
            INTCONbits.PEIE=1;    //Activamos adc
        }
    }
}

Currently have 0 comentarios:


Leave a Reply

Te doy la bienvenida al blog , puedes escribir tu comentario en la casilla mostrada abajo ,gracias.
You are welcome in this blog , you can write your comment in the box shown below, thanks.