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á .....