Laboratorio 9 Modulo ADC y PWM con el PIC 16F877A

Embed Size (px)

Citation preview

  • 8/13/2019 Laboratorio 9 Modulo ADC y PWM con el PIC 16F877A

    1/9

    ISTP - SENATI LABORATORIO DE CIRCUITOS ELECTRONICOS IVLABORATORIO N 09

    P1)a) Visualizar el archivo de videoVideotutorial 8 LCD_ADC_Programacion en C de PIC,en lacarpeta ADC, a partir del minuto 19:00 (antes est el uso del LCD. A partir de 18:05-19:00 semuestra como descargar los archivos de los videos); el Videotutorial 9 Timer0 y WatchDogTimer_Programacion en C de PIC,solo hasta el tiempo de 8:55.

    b) En un archivo de Word responder las preguntas del profesor sobre el mdulo ADC: registrosde configuracin, otros registros, bits de los registros anteriores, bits de inicio y fin de conver-sin anlogo-digital, habilitacin de la interrupcin del mdulo ADC, registro de resultados de 8y 10 bits, ejemplos de configuracin, etc.

    P2)Lectura de un solo canal, adaptando cdigo de un compilador de versin mas an-

    tigua

    a) Adaptar el cdigo del manejo del mdulo ADC del PIC16F84, del video, para el PIC16F877A.Ambos compiladores son de Hi Tech, pero de versiones diferentes. Para mayor detalle, abrir elarchivo en la carpeta y buscar el mdulo ADC y sus registros de

    configuracin; en ellos encontraran los nombres de los pines del pic y los nombres de los bitsde los registros de configuracin, para el compilador actual. Se sugiere adaptar el cdigo parael lcd_6 hilos, previa su configuracin.

    #include #include #include "lcd_cd4094"

    __CONFIG(INTIO & WDTDIS & MCLRDIS & LVPDIS)

    char mensaje[16]; // alt+91 y alt+93unsigned char adc=0;

    void main(void){ANSEL=0b00001000; // poner los pines como I/O digitalesADCON0=0b00011001; // ADCS1 | ADCS0 | CHS2 | CHS1 | CHS0 |GO/ | X | ADONADCON1=0b00000000; //ADFM | X | X | X |PCFG3 | PCFG2 | PCFG1 | PCFG0OSCCON=0b01101100; // para establecer la frecuencia del procesadorlcd_init();lcd_gotoxy(0,0);lcd_puts("HOLA MUNDO!!");

    while(1){ADCON0|=0x04; // ALT+124 LA BARRA VERTICAL; inicia la conversionwhile((ADCON0&0x04)==0); //interroga por el BIT2 de ADCON0adc=ADRESH;lcd_gotoxy(0,1);sprintf(mensaje,"Valor adc = %3u",adc);lcd_puts(mensaje);delay_ms(250);

    }

    }b) Simlelo en MPLAB SIMc) Simlelo en ISIS, con una fuente de 1.5 Vdc y luego de 2.5 Vdc por el canal analgico.d) De cuntos bits es el registro del ADC en este cdigo? Qu ocurrira si se omite ADCON1?

    http://vimeo.com/22340053http://vimeo.com/22340053http://vimeo.com/22340053http://vimeo.com/22340053http://vimeo.com/22340053http://vimeo.com/22340053http://vimeo.com/22340053http://vimeo.com/22340053http://vimeo.com/22340053
  • 8/13/2019 Laboratorio 9 Modulo ADC y PWM con el PIC 16F877A

    2/9

    d) Use un potencimetro conectado a una fuente de 5 Vdc y varelo, para ver las variacionesen el LCD. Corresponde los valores del LCD con la salida del potencimetro? Por qu?

    P3)a) Realice los siguientes cambios en el cdigo anterior//unsigned char adc=0;unsigned int adc=0;

    //ADCON0=0b00011001; //ADCS1 |ADCS0 | CHS2 |CHS1 | CHS0 |GO/ | X | ADONADCON0=0b11011001; // ADCS1 |ADCS0 | CHS2 | CHS1 |CHS0 |GO/ | X | ADON

    //ADCON0|=0b00000100; // ALT+124 LA BARRA VERTICAL; inicia la conversionGODONE=1;

    // while((ADCON0&0x04)==0);while((GODONE==1);adc=ADRESH

  • 8/13/2019 Laboratorio 9 Modulo ADC y PWM con el PIC 16F877A

    3/9

    set_adc_channel(0);

    delay_ms(10);

    valor=read_adc();

    p=0.004883*valor;

    printf(lcd_putc/"\fSENSOR=%g\n",p);

    set_adc_channel(l);

    delay_ms(10);setpoint=read_adc();

    psp=0.004883*setpoint;

    printf(lcd_putc,"SPOINT=%g\n",psp);

    if(p>=psp){

    output_high(PIN_CO);

    output_low(PIN_Cl);}

    else{

    output_low(PIN_CO);

    output_high(PIN_Cl);

    }

    delay_ms(50);}

    }

  • 8/13/2019 Laboratorio 9 Modulo ADC y PWM con el PIC 16F877A

    4/9

    P6)PWM sin CCP

    Esta publicacin fue realizada con el fin de conseguir una segunda opcin para los MCU que no poseen

    mdulos PWM o bien para aquellos desarrollos que requieren ms de los que posee el MCU. Si bien ya

    sabemos que los MCU ms baratos no poseen estos mdulos PWM pero con esta simple rutina es posible

    modular una salida cualquiera para lograr el PWM.

    La idea de esta rutina es manipular tantas salidas como tenga el MCU si se quisiera, de manera conti-

    nua. Para ello se usara el mdulo ADC que nos entregara el valor digital de la seal continua de la entra-da que controla el ancho de pulso (simulada por un potencimetro conectado a una fuente de 5 Vdc).

    La idea en el programa es el siguiente:

    #include

    #device adc=8

    #FUSES NOWDT

    #FUSES INTRC_IO

    #FUSES NOPUT

    #FUSES NOMCLR

    #FUSES NOPROTECT

    #FUSES NOCPD

    #FUSES NOBROWNOUT

    #FUSES IESO

    #FUSES FCMEN

    #FUSES NOLVP

    #FUSES NODEBUG

    #FUSES NOWRT

    #FUSES BORV40

    #use delay(int=8000000)

    void main()

    {

    setup_adc_ports(sAN0|VSS_VDD); ///Escoge 1 canal:AN0 y Vref+=VDD, Vref-=Vss

    setup_adc(ADC_CLOCK_DIV_2); // tiempo de conversion por 2 (fosc/2).

    int8 tOFF, tON; // dos variables de 8 bits, tiempo en bajo y

    // tiempo en alto; manteniendo la frecuencial (periodo) fija

    while(1){

    set_adc_channel(0); // active el modulo, empieza la conversion y termina la conversion.

    tOFF = read_adc(); // lee el valor del registro de resultados, como tiempo en bajo.

    tON = 255 - tOFF; // calcula el valor del tiempo en alto.

    output_low(PIN_C0);

    delay_us(tOFF);

    output_high(PIN_C0);delay_us(tON);

    }

    }

    El circuito es muy simple solamente se utiliza un pin de entrada y uno de salida, pero detodas formas lo subir para completar la nota.

    http://electgpl.blogspot.com/2012/05/pwm-sin-ccp.htmlhttp://electgpl.blogspot.com/2012/05/pwm-sin-ccp.htmlhttp://electgpl.blogspot.com/2012/05/pwm-sin-ccp.htmlhttp://electgpl.blogspot.com/2012/05/pwm-sin-ccp.html
  • 8/13/2019 Laboratorio 9 Modulo ADC y PWM con el PIC 16F877A

    5/9

    La primera parte del cdigo (include del micro a utilizar, rango del ADC, configuracin del

    MCU "FUSES", delay) es genrica, lo que nos interesa es el cdigo marcado en color rojo, loque podemos ver es que la lectura del ADC (alimentado por el potencimetro) se guarda entOFF, luego tON ser el mximo del ADC como lo seteamos en 8 bit ser de 0 a 255, por endeel valor del ADC ser restado del 255 y nos dar el tON, luego utilizaremos el tON como varia-ble del delay_us() y de la misma forma el tOFF, esto quiere decir que primero tOFF tendr eltiempo de apagado del Led output_low(PIN_C0) y luego tON tendr el tiempo de encendidooutput_high(PIN_C0).

    Un ejemplo de este clculo seria: si por ejemplo situamos el potencimetro en el centro elADC estara leyendo -2,5V que traducidos al ADC sera el valor 127, ese valor estara en lavariable tOFF, luego aparece el clculo 255 - tOFF = tON, entonces seria 255-127 = 128, tONvaldra 128, podramos decir que el ciclo es 50%, ahora si variamos el potencimetro porejemplo a 1,25V sera el valor 64 del ADC, tOFF sera igual a 64 y tON seria 255 - 64 = 191,entonces podemos decir que el ciclo de trabajo seria del 75%, de esa forma trabaja nuestrarutina, la cual se podra expandir para cada salida prolijamente dentro de una funcin o biendentro de una interrupcin.

    DutyCycle 95% DutyCycle 50%

    DutyCycle 5%

    http://2.bp.blogspot.com/-2rYW1el0o9g/T685AiTTmaI/AAAAAAAAA58/OVuAJ8Mqs_I/s1600/pwm.PNGhttp://4.bp.blogspot.com/-T5mCUwJo6vI/T684ftPOwiI/AAAAAAAAA5o/ISBjXhD0CwU/s1600/DS0002.PNGhttp://3.bp.blogspot.com/-kGOsHC58kwg/T684fK7LHpI/AAAAAAAAA5k/twFTme-fwek/s1600/DS0001.PNGhttp://2.bp.blogspot.com/-2rYW1el0o9g/T685AiTTmaI/AAAAAAAAA58/OVuAJ8Mqs_I/s1600/pwm.PNGhttp://4.bp.blogspot.com/-T5mCUwJo6vI/T684ftPOwiI/AAAAAAAAA5o/ISBjXhD0CwU/s1600/DS0002.PNGhttp://3.bp.blogspot.com/-kGOsHC58kwg/T684fK7LHpI/AAAAAAAAA5k/twFTme-fwek/s1600/DS0001.PNGhttp://2.bp.blogspot.com/-2rYW1el0o9g/T685AiTTmaI/AAAAAAAAA58/OVuAJ8Mqs_I/s1600/pwm.PNGhttp://4.bp.blogspot.com/-T5mCUwJo6vI/T684ftPOwiI/AAAAAAAAA5o/ISBjXhD0CwU/s1600/DS0002.PNGhttp://3.bp.blogspot.com/-kGOsHC58kwg/T684fK7LHpI/AAAAAAAAA5k/twFTme-fwek/s1600/DS0001.PNG
  • 8/13/2019 Laboratorio 9 Modulo ADC y PWM con el PIC 16F877A

    6/9

    P7)Generador de seal PWM con Timer2

    a) Vea el archivo de video e indique que recursos mnimos del PIC y que registros se requieren configurar para que fun-cione como generador de seales PWM.b) Implemente el cdigo del archivo de video, complelo y simlelo en MPLAB SIM.c) Simlelo en ISIS de Proteus.d) Hasta qu valor de ciclo de trabajo genera el cdigo implementado?, qu cambio se pue-de realizar para mejorarlo?, se puede generar seales PWM sin el modulo comparador?

    P8)Funcionamiento del mdulo CCP1 en modo de comparacin.

    Se quiere hacer trabajar al mdulo CCP1 en modo comparacin. El TMR1 asociado a estemodo trabajar en modo contador de impulsos externos, donde la seal que se le aplica esproporcionada por el generador de la Micro PIC IO. Los pulsos que deber contar vienen de-

    terminados por una constante n.A su vez, la seal de salida generada por el mdulo CCP1 cuando el TMR1 llegue a su valor,es aplicada a la patita RA4/T0CKI, de modo que incremente el valor del TMRO, que estar con-figurado como contador de eventos externos. El tratamiento se realizar con interrupciones yun LED bascular cada vez que el TMRO se desborde. Jugando con los valores de los pre-divisores de frecuencia y de la constante n se pueden obtener diferentes temporizaciones.Esquema elctrico

    Con este ejercicio se pueden obtener gran-des temporizaciones, ya que se est enlazan-do el funcionamiento de dos temporizadores.Para ello, la seal de salida del mdulo CCP1(RC2/CCP1) deber unirse fsicamente con laseal de entrada de impulsos del TMRO(RA4/T0CKI). (Figura 6.8.)

    La entrada de impulsos del TMR1, por suparte, vendr dada por la unin de la patitaRC0/T1CKI con el generador. El LED se co-rresponder con la lnea RBO, por lo que sepuede utilizar uno de los diodos de la barra deLEDs.Organigrama

    En el cuerpo principal del programa slo serealizar la configuracin e inicializacin de los

    Figura 6.8 Esquema

    elctrico el ejercicio

    propuesto.

    http://3.bp.blogspot.com/-CvacZI9me1M/T684f37DYrI/AAAAAAAAA5w/OeVEhAdFtDI/s1600/DS0003.PNGhttp://3.bp.blogspot.com/-CvacZI9me1M/T684f37DYrI/AAAAAAAAA5w/OeVEhAdFtDI/s1600/DS0003.PNG
  • 8/13/2019 Laboratorio 9 Modulo ADC y PWM con el PIC 16F877A

    7/9

    registros que se van a utilizar, tal y como se muestra en la Figura 6.9. Luego el programa de-ber quedarse en un bucle infinito a la espera de que se produzca una interrupcin. A la vueltade la interrupcin se seguir en dicho bucle.

    Cuando se trabaja con interrupciones se necesita utilizar, al menos, dos organigramas: unopara el tratamiento de la interrupcin y otro para el programa principal. Si el programa princi-pal o la interrupcin son complejos, sus organigramas mostrarn los llamamientos a subrutinas

    y stas debern especificarse en otros organigramas.La Figura 6.10 muestra el organigrama de tratamiento de interrupcin.

    El primer recuadro INTER no se traduce en ninguna instruccin; representa la entrada a larutina. La salida, asimismo, tambin debe ser nica.

    Siempre que se habilite ms de una interrupcin, el primer paso ser discriminar de entrelos tipos posibles aquel que la ha producido. En nuestro caso, tenemos la interrupcin delTMRO al desbordarse, lo cual har cambiar de estado al LED conectado en RB0, y la interrup-cin provocada cuando el comparador del mdulo CCP1 detecta la igualdad del TMR1 con elvalor programado. En ambos casos se debe poner a 0 el sealizador de interrupcin antes devolver.

    Figura 6.9.Organigrama del cuerpo prin-cipal del ejercicio propuesto.

    Figura 6.10. Organigrama de la rutina detratamiento de interrupcin.

    P9)Funcionamiento de CCP1 en modo de comparacin y CCP2 en PWM

    Los mdulos CCP1 y CCP2 pueden trabajar simultneamente en diferentes modos. En esteejercicio vamos a hacer trabajar al mdulo CCP2 en modulacin de anchura de pulsos para elgobierno de un motor, y al mdulo CCP1 en comparacin para controlar el desplazamiento dedicho motor. El TMR1 actuar en modo contador de eventos externos, donde los impulsos se-rn generados por el encoder asociado al motor.La secuencia que se pretende realizar con este programa es:

    1.Arrancar el motor suavemente en el sentido horario hasta llegar a la velocidad mxima.2.Girar en sentido horario tantos pasos como determine la constante "HORARIO".3.Parar un segundo.

  • 8/13/2019 Laboratorio 9 Modulo ADC y PWM con el PIC 16F877A

    8/9

    4.Girar en sentido anti horario tantos pasos como indique la constante "ANTIHORARIO" a lavelocidad que determinen los interruptores (RA4-RA0)*8.

    5.Decrecer la velocidad hasta llegar a detener el motor.6.Parar un segundo.7.Vuelta al paso 1.

    Esquema elctrico

    Para la realizacin de este ejerci-cio se deben hacer las conexionesmostradas en la Figura 6.12 y que seenuncian a continuacin:1.La salida del encoder debe unirse

    con la entrada de pulsos del TMR1l(RC0/T1CKI).

    2.La salida del mdulo CCP2(RC1/CCP2) se conecta a la entra-da de activacin del motor.

    3.Las salidas RB1:RB0 se conectancon las lneas IN2:IN1 del motorpara controlar el sentido del giro.

    OrganigramaLos pasos a realizar tras configu-

    rar los registros adecuadamente sepueden ver como una secuencia deacciones. En este caso, cada recua-dro se corresponder con un bloquede instrucciones.

    Se trata de comenzar con unavelocidad nula en el motor e ir incrementndola en uno de los sentidos de giro. Esto se harmediante PWM, aumentando la anchura del pulso en un bucle hasta llegar al mximo. En esavelocidad, el motor girar un nmero dado de pasos. Dichos pasos sern pulsos que el encoderacoplado al motor introduce en la patita RC07TICKI del TMR1.

    P10)Funcionamiento del mdulo PWM del PIC16F877A

    a) Visualizar el archivo de videoVideotutorial 12 CCP1, CCP2 y PWM1_Programacion de C en PIC,y adaptar el cdigo para elcompilador Hi-tech V9.83 o posteriores.b) Simularlo en MPLAB SIMc) Simularlo en ISIS.

    Figura 6.12 Esquema de

    conexionado del PIC con

    el motor y el encoder

    http://vimeo.com/23714823http://vimeo.com/23714823http://vimeo.com/23714823
  • 8/13/2019 Laboratorio 9 Modulo ADC y PWM con el PIC 16F877A

    9/9

    Figura 6.13. Organigrama del segundoejercicio propuesto.

    Se parar el motor de golpe y permanecer as durante un segundo. A velocidad marcadapor unos interruptores el motor volver a girar, esta vez en sentido contrario al anterior y, porltimo, por la misma PWM se ir decrementando la velocidad del motor hasta pararlo duranteotro segundo. Durante el programa, adems, se va a controlar el estado del perro guardin,introduciendo instrucciones de borrado para que resetee el PIC en el caso de que se produzcaun fallo en el sistema.