Вы находитесь на странице: 1из 9

ISTP - SENATI

LABORATORIO DE CIRCUITOS ELECTRONICOS IV LABORATORIO N 09

P1) a) Visualizar el archivo de video Videotutorial 8 LCD_ADC_Programacion en C de PIC, en la carpeta ADC, a partir del minuto 19:00 (antes est el uso del LCD. A partir de 18:05-19:00 se muestra como descargar los archivos de los videos); el Videotutorial 9 Timer0 y WatchDog Timer_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: registros de configuracin, otros registros, bits de los registros anteriores, bits de inicio y fin de conversin anlogo-digital, habilitacin de la interrupcin del mdulo ADC, registro de resultados de 8 y 10 bits, ejemplos de configuracin, etc. P2) Lectura de un solo canal, adaptando cdigo de un compilador de versin mas antigua 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 el archivo 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 bits de los registros de configuracin, para el compilador actual. Se sugiere adaptar el cdigo para el lcd_6 hilos, previa su configuracin. #include <htc.h> #include <stdio.h> #include "lcd_cd4094" __CONFIG(INTIO & WDTDIS & MCLRDIS & LVPDIS) char mensaje[16]; // alt+91 y alt+93 unsigned char adc=0; void main(void) { ANSEL=0b00001000; // poner los pines como I/O digitales ADCON0=0b00011001; // ADCS1 | ADCS0 | CHS2 | CHS1 | CHS0 | GO/ | X | ADON ADCON1=0b00000000; // ADFM | X | X | X | PCFG3 | PCFG2 | PCFG1 | PCFG0 OSCCON=0b01101100; // para establecer la frecuencia del procesador lcd_init(); lcd_gotoxy(0,0); lcd_puts("HOLA MUNDO!!"); while(1) { ADCON0|=0x04; // ALT+124 LA BARRA VERTICAL; inicia la conversion while((ADCON0&0x04)==0); //interroga por el BIT2 de ADCON0 adc=ADRESH; lcd_gotoxy(0,1); sprintf(mensaje,"Valor adc = %3u",adc); lcd_puts(mensaje); delay_ms(250); } } b) Simlelo en MPLAB SIM c) 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?

d) Use un potencimetro conectado a una fuente de 5 Vdc y varelo, para ver las variaciones en 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 | ADON ADCON0=0b11011001; // ADCS1 |ADCS0 | CHS2 | CHS1 | CHS0 | GO/ | X | ADON //ADCON0|=0b00000100; // ALT+124 LA BARRA VERTICAL; inicia la conversion GODONE=1; // while((ADCON0&0x04)==0); while((GODONE==1); adc=ADRESH<<8 | ADRESL; y complelo. Son equivalentes? Por qu? b) Simlelo en MPLAB SIM c) Simlelo en ISIS, con el potencimetro variando los valores. Nota alguna diferencia? Si su respuesta es afirmativa, Por qu? d) De cuntos bits es el registro del ADC en este cdigo? Cmo se hace para manejar dos registros de 8 bits separados, en uno solo de 16 bits? e) En ISIS, cambie el potencimetro por el integrado LM35 como entrada al canal analgico, para la medicin de temperatura son iguales los valores del integrado con lo mostrado en el LCD? Por qu? Qu cambios se necesita realizar? Recuerde el video 8, tiempo 48:36. P4) Lectura de dos canales a) Agregue sentencias al cdigo de P2 que permita manejar dos canales ADC, uno alimentado por una fuente de tensin continua y la otra por el integrado LM35. b) Simlelo en MPLAB SIM c) Simlelo en ISIS. Nota alguna diferencia? Si su respuesta es afirmativa, Por qu? P5) Lectura de dos canales adaptando un cdigo de otro compilador (CCS) a) En el siguiente ejercicio, se medirn dos canales analgicos (RA0 y RA1), el primero ser el valor de una variable que se desea medir y el segundo ser el set point. Si la variable est por encima del set point se activa un led rojo. En caso contrario se activa un led verde. Adaptar el siguiente cdigo para el compilador Hi-Tech #include<16f877.h> #device ADC=10 #fuses XT,NOWDT,NOPROTECT,NOLVP #use delay(clock=4000000) #use fast JO(C) #include <lcd.c> intl6 valor=0; long setpoint=0; float p; float psp; void main(){ set_tris_c(0); setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(ALL_ANALOG); lcd_init(); output_C(0); while (TRUE){

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); } }

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 continua. Para ello se usara el mdulo ADC que nos entregara el valor digital de la seal continua de la entrada 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 <16F883.h> #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 de todas formas lo subir para completar la nota.

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, lo que podemos ver es que la lectura del ADC (alimentado por el potencimetro) se guarda en tOFF, luego tON ser el mximo del ADC como lo seteamos en 8 bit ser de 0 a 255, por ende el valor del ADC ser restado del 255 y nos dar el tON, luego utilizaremos el tON como variable del delay_us() y de la misma forma el tOFF, esto quiere decir que primero tOFF tendr el tiempo de apagado del Led output_low(PIN_C0) y luego tON tendr el tiempo de encendido output_high(PIN_C0). Un ejemplo de este clculo seria: si por ejemplo situamos el potencimetro en el centro el ADC estara leyendo -2,5V que traducidos al ADC sera el valor 127, ese valor estara en la variable tOFF, luego aparece el clculo 255 - tOFF = tON, entonces seria 255-127 = 128, tON valdra 128, podramos decir que el ciclo es 50%, ahora si variamos el potencimetro por ejemplo 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 nuestra rutina, la cual se podra expandir para cada salida prolijamente dentro de una funcin o bien dentro de una interrupcin. DutyCycle 95% DutyCycle 50%

DutyCycle 5%

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 funcione 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 puede 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 este modo trabajar en modo contador de impulsos externos, donde la seal que se le aplica es proporcionada por el generador de la Micro PIC IO. Los pulsos que deber contar vienen determinados 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 configurado como contador de eventos externos. El tratamiento se realizar con interrupciones y un LED bascular cada vez que el TMRO se desborde. Jugando con los valores de los predivisores de frecuencia y de la constante n se pueden obtener diferentes temporizaciones. Esquema elctrico Con este ejercicio se pueden obtener granFigura 6.8 Esquema des temporizaciones, ya que se est enlazanelctrico el ejercicio do el funcionamiento de dos temporizadores. propuesto. Para ello, la seal de salida del mdulo CCP1 (RC2/CCP1) deber unirse fsicamente con la seal de entrada de impulsos del TMRO (RA4/T0CKI). (Figura 6.8.) La entrada de impulsos del TMR1, por su parte, vendr dada por la unin de la patita RC0/T1CKI con el generador. El LED se corresponder con la lnea RBO, por lo que se puede utilizar uno de los diodos de la barra de LEDs. Organigrama En el cuerpo principal del programa slo se realizar la configuracin e inicializacin de los

registros que se van a utilizar, tal y como se muestra en la Figura 6.9. Luego el programa deber quedarse en un bucle infinito a la espera de que se produzca una interrupcin. A la vuelta de la interrupcin se seguir en dicho bucle. Cuando se trabaja con interrupciones se necesita utilizar, al menos, dos organigramas: uno para el tratamiento de la interrupcin y otro para el programa principal. Si el programa principal 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 la rutina. La salida, asimismo, tambin debe ser nica. Siempre que se habilite ms de una interrupcin, el primer paso ser discriminar de entre los tipos posibles aquel que la ha producido. En nuestro caso, tenemos la interrupcin del TMRO al desbordarse, lo cual har cambiar de estado al LED conectado en RB0, y la interrupcin provocada cuando el comparador del mdulo CCP1 detecta la igualdad del TMR1 con el valor programado. En ambos casos se debe poner a 0 el sealizador de interrupcin antes de volver.

Figura 6.9. Organigrama del cuerpo principal del ejercicio propuesto.

Figura 6.10. Organigrama de la rutina de tratamiento 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 este ejercicio vamos a hacer trabajar al mdulo CCP2 en modulacin de anchura de pulsos para el gobierno de un motor, y al mdulo CCP1 en comparacin para controlar el desplazamiento de dicho motor. El TMR1 actuar en modo contador de eventos externos, donde los impulsos sern 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.

4. Girar en sentido anti horario tantos pasos como indique la constante "ANTIHORARIO" a la velocidad 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 ejercicio se deben hacer las conexiones mostradas en la Figura 6.12 y que se enuncian 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 entrada de activacin del motor. 3. Las salidas RB1:RB0 se conectan con las lneas IN2:IN1 del motor para controlar el sentido del giro.

Figura 6.12 Esquema de conexionado del PIC con el motor y el encoder

Organigrama Los pasos a realizar tras configurar los registros adecuadamente se pueden ver como una secuencia de acciones. En este caso, cada recuadro se corresponder con un bloque de instrucciones. Se trata de comenzar con una velocidad nula en el motor e ir incrementndola en uno de los sentidos de giro. Esto se har mediante PWM, aumentando la anchura del pulso en un bucle hasta llegar al mximo. En esa velocidad, el motor girar un nmero dado de pasos. Dichos pasos sern pulsos que el encoder acoplado al motor introduce en la patita RC07TICKI del TMR1. P10) Funcionamiento del mdulo PWM del PIC16F877A a) Visualizar el archivo de video Videotutorial 12 CCP1, CCP2 y PWM1_Programacion de C en PIC, y adaptar el cdigo para el compilador Hi-tech V9.83 o posteriores. b) Simularlo en MPLAB SIM c) Simularlo en ISIS.

Figura 6.13. Organigrama del segundo ejercicio propuesto.

Se parar el motor de golpe y permanecer as durante un segundo. A velocidad marcada por unos interruptores el motor volver a girar, esta vez en sentido contrario al anterior y, por ltimo, por la misma PWM se ir decrementando la velocidad del motor hasta pararlo durante otro 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 produzca un fallo en el sistema.

Вам также может понравиться