Download Curso Programación MCUs PIC en lenguaje C
Document related concepts
no text concepts found
Transcript
Aprendiendo a programar Microcontroladores PIC en Lenguaje C con CCS Por Andrés Raúl Bruno Saravia Entrega Nº 9. Hagamos un driver para un motor de DC… Aprovechando ya los primeros conocimientos, los pondremos en práctica sobre una aplicación real, diseñaremos el control de un motor de corriente continua de 12V hasta 1 Amp, del tipo usado en muchas aplicaciones pequeñas. El sistema de control nos permitirá activar el arranque y la parada del motor así como cambiar su dirección. Para el circuito usaremos el PIC16F1939 que estamos estudiando, además necesitaremos un L293D, el cual es un driver para motores de corriente continua de hasta 1 Amper, unos pulsadores y unos LEDs para hacer la señalización. El circuito lo implementaremos sobre una placa del tipo pertinax multiperforada paso 2.54mm, muy comunes actualmente, y generalmente usadas para la implementación de circuitos experimentales. El circuito podemos verlo a continuación: La secuencia de nuestro programa será muy simple; leer los pulsadores y en función del pulsador que accionemos, cambiaremos la función del dispositivo. Las funciones de la aplicación estarán controladas por 2 Flags (banderas) internos, los cuales se implementan mediante la creación de 2 variables de 1 bit, y a las que llamaremos FLAG_RUN y FLAG_FWRW. La aplicación estará constituida por 2 rutinas o funciones del tipo void-void, que leerán el estado de los pulsadores (ScanKey) y controlaran el funcionamiento del motor (MotorControl). Para implementar el programa usaremos las funciones embebidas estudiadas anteriormente y los recursos del lenguaje C también estudiados en los apartados anteriores. El listado del programa con su respectivo comentario lo presentamos aquí: //archivo de cabecera del procesador #include <16f1939.H> //seteamos la frecuencia del delay #use delay(internal, clock=4000000) //fusibles de configuración #fuses INTRC_IO //oscilador Interno con Puertos IO #fuses NOPROTECT//sin protección de código #fuses PUT//Power Up Timer activado #fuses NOBROWNOUT//Sin Brown Out #fuses NOWDT//sin WDT #fuses MCLR//master clear #fuses NOCLKOUT//no sale la frecuencia del clock #fuses NOIESO//cambio de clock desactivado #fuses NOFCMEN//sin monitor de falla de clock #fuses NOWRT//sin protección contra escritura #fuses NOVCAP//regulador para el MTOUCH desactivado #fuses NOSTVREN//reset por desborde del stack desactivado #fuses NOLVP//programación en bajo voltaje desactivado //definiciones de etiquetas #define BTN1 PIN_A0 #define BTN2 PIN_A1 #define RUN PIN_B0 #define FW PIN_B1 #define RW PIN_B2 //funciones prototipo void ScanKey(void); void MotorControl(void); //variables globales short FlagRUN=0; short FlagFWRW=0; //programa principal void main(void) { // Configuramos el oscilador interno setup_oscillator(OSC_4MHZ|OSC_PLL_OFF|OSC_INTRC); // Configuramos los puertos analógicos como digitales setup_adc_ports(NO_ANALOGS); // Bucle principal while(true){ ScanKey(); //llamada a la función de lectura de los pulsadores MotorControl();//llamada a la función de control del motor } } //Rutinas auxiliares: void ScanKey(void) { if(input(BTN1)) //lee el estado del pulsador { //si el mismo está accionado FlagRUN=!FlagRUN;//cambia el estado de FlagRUN MotorControl();//llamada a la función que controla el motor delay_ms(2);//espera para evitar leer el rebote al oprimir while(input(BTN1));//re-lectura espera que se suelte delay_ms(2);//espera para evitar leer el rebote al soltar } } if(input(BTN2)) //lee el estado del pulsador { //si el mismo está accionado FlagFWRW=!FlagFWRW;//cambia el estado de FlagFWRW MotorControl();//llamada a la función que controla el motor delay_ms(2);//espera para evitar leer el rebote al oprimer while(input(BTN2));//re-lectura espera que se suelte delay_ms(2);//espera para evitar leer el rebote al soltar } void MotorControl(void) { if(FlagRun==1)// FlagRUN=1 ? output_high(RUN);//habilita el motor else { output_low(RUN);//sino desactiva el L293 output_low(FW);//apagamos FW y RW output_low(RW); } } if(FlagRun==1)// FlagRUN=1 ? { if(FlagFWRW==1)// FlagFWRW=1? { output_low(RW); //apaga RW delay_ms(50); //espera output_high(FW);//enciende } else // Sino { output_low(FW);//apaga FW delay_ms(50); //espera un output_high(RW);//enciende } } un tiempo FW tiempo RW El programa está realizado usando un algoritmo denominado “multitarea cooperativa”, ya que el main esta constituido por llamadas a funciones sucesivas, donde cada función realiza una “tarea” determinada y “cooperan” entre sí para generar como resultado final la aplicación requerida. Continuará .....