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

Aprendiendo a programar Microcontroladores PIC en Lenguaje C con CCS

Por Andrs Ral Bruno Saravia

Entrega N 9.

Hagamos un driver para un motor de DC


Aprovechando ya los primeros conocimientos, los pondremos en prctica sobre una aplicacin real, disearemos el control de un motor de corriente continua de 12V hasta 1 Amp, del tipo usado en muchas aplicaciones pequeas. El sistema de control nos permitir activar el arranque y la parada del motor as como cambiar su direccin. Para el circuito usaremos el PIC16F1939 que estamos estudiando, adems 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 sealizacin. El circuito lo implementaremos sobre una placa del tipo pertinax multiperforada paso 2.54mm, muy comunes actualmente, y generalmente usadas para la implementacin de circuitos experimentales. El circuito podemos verlo a continuacin:

La secuencia de nuestro programa ser muy simple; leer los pulsadores y en funcin del pulsador que accionemos, cambiaremos la funcin del dispositivo. Las funciones de la aplicacin estarn controladas por 2 Flags (banderas) internos, los cuales se implementan mediante la creacin de 2 variables de 1 bit, y a las que llamaremos FLAG_RUN y FLAG_FWRW. La aplicacin estar constituida por 2 rutinas o funciones del tipo void-void, que leern 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 tambin 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 configuracin #fuses INTRC_IO //oscilador Interno con Puertos IO #fuses NOPROTECT//sin proteccin de cdigo #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 proteccin contra escritura #fuses NOVCAP//regulador para el MTOUCH desactivado #fuses NOSTVREN//reset por desborde del stack desactivado #fuses NOLVP//programacin 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 analgicos como digitales setup_adc_ports(NO_ANALOGS); // Bucle principal while(true){ ScanKey(); //llamada a la funcin de lectura de los pulsadores MotorControl();//llamada a la funcin 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 funcin 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 funcin 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 funcin realiza una tarea determinada y cooperan entre s para generar como resultado final la aplicacin requerida. Continuar .....

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