Practica Motor l 293
-
Upload
maximiliano-cruz-garcia -
Category
Documents
-
view
8 -
download
0
Transcript of Practica Motor l 293
7/16/2019 Practica Motor l 293
http://slidepdf.com/reader/full/practica-motor-l-293 1/5
Práctica 3 Microcontroladores M.S.C. Miguel Montiel MtzITST: Ing. Mecatrónica.Elaborar un circuito que permita controlar un motor de corriente directa de 12V usando una interface depotencia L293D, programando un microcontrolador ATmega48 el cual contiene tres entradas y tres salidas,además considera el siguiente funcionamiento
• Inicialmente el motor debe estar detenido. start = stop = 1; I_nD = X.
• El motor se mueve si se presiona el botón start = 0 y el botón I_nD = 1 a la izquierda.• El motor se mueve si se presiona el botón start = 0 y el botón I_nD = 0 a la derecha.
• Para los casos anteriores al dejar de pulsar start el motor se mantiene girando en el sentido indicadopor I_nD.
• El motor se detiene si el botón de stop es presionado y se mantiene así aún después de soltarlo. O siel botón de stop se mantiene presionado, no importan los estados de start o de I_nD, el motorpermanece detenido.
Los pines se asignarán a las siguientes terminales:Id Descripción Puerto Tipo
start Botón de inicio PINC1 Entrada
stop Botón de paro PINC2 EntradaI_nD Botón de sentido PINB0 Entrada
a Salida hacia L293 PD0 Salida
b Salida hacia L293 PD1 Salida
En Salida de hablitación de L293 PD2 Salida
Resolución: Primero se debe plantear el diagrama de estados en función de la descripción del problema. Eneste caso, utilizaremos el software Qfsm (http://qfsm.sourceforge.net). Sin embargo es necesario dar formatosde entradas y salidas, ya que en este software las entradas se definirán como valores binarios.
Formato para entradas Formato para salidas
start stop I_nD a b En
1 1 1 0 0 0
Ilustración 1: Diagrama de estados propuesto
7/16/2019 Practica Motor l 293
http://slidepdf.com/reader/full/practica-motor-l-293 2/5
Los números que están sobre las flechas indican las señales de entrada que provienen de start,stop e I_nD, ylos números que están dentro de los estados, corresponden a las salidas a,b,En.
Agregar que el estado final indicado es el estado Detenido, es por esa causa que en el diagrama de estaos,se encuentra señalado con doble anillo.
El software permite generar entre otros códigos HDL , el de AHDL, que por su sintáxis es muy similar allenguaje C. En el cuadro que a continuación se presenta, se indica el código fuente generado.% This file was generated by %% Qfsm Version 0.52 %% (C) Stefan Duffner, Rainer Strobel %
SUBDESIGN Motor(clock, reset :INPUT;start,stop,I_nD :INPUT;
:OUTPUT;a,b,En :OUTPUT;)
VARIABLEfsm : MACHINE OF BITS(s0, s1)
WITH STATES (Detenido = B"00",Derecha = B"01",Izquierda = B"10");
reset_async : NODE;_asynca, _asyncb, _asyncEn : NODE;
BEGINreset_sync = DFF(reset,clock,VCC,VCC);fsm.reset = reset_sync;
fsm.clk = clock;a = DFF(a_async,clock,VCC,VCC);b = DFF(b_async,clock,VCC,VCC);En = DFF(En_async,clock,VCC,VCC);
CASE fsm ISWHEN Detenido =>
IF (start,stop,I_nD) == B"101" THENEND IF;IF (start,stop,I_nD) == B"100" THENEND IF;IF (start,stop,I_nD) == B"110" THENEND IF;IF (start,stop,I_nD) == B"111" THENEND IF;IF (start,stop,I_nD) == B"010" THEN
fsm = Derecha;(_asynca, _asyncb, _asyncEn) = B"101";
END IF;IF (start,stop,I_nD) == B"011" THEN
fsm = Izquierda;(_asynca, _asyncb, _asyncEn) = B"011";
END IF;
WHEN Derecha =>IF (start,stop,I_nD) == B"100" THENfsm = Detenido;(_asynca, _asyncb, _asyncEn) = B"000";
END IF;IF (start,stop,I_nD) == B"111" THEN
fsm = Izquierda;(_asynca, _asyncb, _asyncEn) = B"011";
END IF;IF (start,stop,I_nD) == B"011" THEN
fsm = Izquierda;(_asynca, _asyncb, _asyncEn) = B"011";
END IF;IF (start,stop,I_nD) == B"010" THENEND IF;IF (start,stop,I_nD) == B"110" THENEND IF;
WHEN Izquierda =>IF (start,stop,I_nD) == B"101" THEN
fsm = Detenido;(_asynca, _asyncb, _asyncEn) = B"000";
7/16/2019 Practica Motor l 293
http://slidepdf.com/reader/full/practica-motor-l-293 3/5
END IF;IF (start,stop,I_nD) == B"110" THEN
fsm = Derecha;(_asynca, _asyncb, _asyncEn) = B"101";
END IF;IF (start,stop,I_nD) == B"010" THEN
fsm = Derecha;(_asynca, _asyncb, _asyncEn) = B"101";
END IF;
IF (start,stop,I_nD) == B"111" THENEND IF;IF (start,stop,I_nD) == B"011" THENEND IF;
END CASE;END;
Del código, solo se tomarán los if dentro de cada case, en donde exista una indicación de cambio de estadopara traducirlo al lenguaje C, por ejemplo
IF (start,stop,I_nD) == B"011" THENfsm = Izquierda;(_asynca, _asyncb, _asyncEn) = B"011";
END IF;
Estas líneas setraducen a C
IF (start,stop,I_nD) == B"111" THENEND IF;
Estas líneas seignoran
Para pasar al lenguaje C, son declarados como #define los estados y se les asigna un valor, y se agregaademás una variable denominada ESTADO, la cual almacenará de forma temporal el estado actual.
En el cuadro siguiente, se muestra el cuadro donde se expone el código C traducido a partir del código AHDLgenerado por el software Qfsm.#include <avr/io.h>#define F_CPU 1000000UL#include <util/delay.h>
/*Definición de macros para set y reset de bits*/#define setbit(sfr,bit) (_SFR_BYTE(sfr)|=(_BV(bit)))#define clearbit(sfr,bit) (_SFR_BYTE(sfr)&=~(_BV(bit)))
/*Definicion de entradas y salidas*/#define start PINC1#define pstart PINC#define rpstart PORTC#define stop PINC2#define pstop PINC#define rpstop PORTC#define I_nD PINB0#define pI_nD PINB#define rpI_nD PORTB
#definea PD0#define Pa PORTD
#define b PD1#define Pb PORTD#define En PD2#define pEn PORTD
/*Defincion para configuraciòn de entradas y salidas*/#define cstart DDC1#define cpstart DDRC#define cstop DDC2#define cpstop DDRC#define cI_nD DDB0#define cpI_nD DDRB
#define ca DDD0#define cPa DDRD
#define cb DDD1#define cPb DDRD#define cEn DDD2#define cpEn DDRD
7/16/2019 Practica Motor l 293
http://slidepdf.com/reader/full/practica-motor-l-293 4/5
/*Definicion de estados*/#define DETENIDO 0#define DERECHA 1#define IZQUIERDA 2
int main(void ){
/*Creación del estado inicial*/
unsigned char ESTADO=DETENIDO;
/*configurar entradas*/clearbit(cpstart,cstart);clearbit(cpstop,cstop);clearbit(cpI_nD,cI_nD);
/*configurar resistencia pull-up*/setbit(rpstart,start);setbit(rpstop,stop);setbit(rpI_nD,I_nD);
/*configurar salidas*/setbit(cPa,ca);setbit(cPb,cb);setbit(cpEn,cEn);
/*Condiciones iniciales*/clearbit(Pa,a);clearbit(Pb,b);clearbit(pEn,En);
while(1){
switch(ESTADO){
case DETENIDO:{
if(bit_is_clear(pstart,start) && bit_is_set(pstop,stop) &&bit_is_clear(pI_nD,I_nD))
{
ESTADO = DERECHA;setbit(Pa,a);clearbit(Pb,b);setbit(pEn,En);
}
if(bit_is_clear(pstart,start) && bit_is_set(pstop,stop) &&bit_is_set(pI_nD,I_nD))
{ESTADO = IZQUIERDA;clearbit(Pa,a);setbit(Pb,b);setbit(pEn,En);
} break;
}case DERECHA:{
if(bit_is_set(pstart,start) && bit_is_clear(pstop,stop) &&bit_is_clear(pI_nD,I_nD))
{ESTADO = DETENIDO;clearbit(Pa,a);clearbit(Pb,b);clearbit(pEn,En);
}
if(bit_is_set(pstart,start) && bit_is_set(pstop,stop) &&bit_is_set(pI_nD,I_nD))
{ESTADO = IZQUIERDA;clearbit(Pa,a);setbit(Pb,b);
setbit(pEn,En);}
if(bit_is_clear(pstart,start) && bit_is_set(pstop,stop) &&
7/16/2019 Practica Motor l 293
http://slidepdf.com/reader/full/practica-motor-l-293 5/5
bit_is_set(pI_nD,I_nD)){
ESTADO = IZQUIERDA;clearbit(Pa,a);setbit(Pb,b);setbit(pEn,En);
} break;
}
case IZQUIERDA:{if(bit_is_set(pstart,start) && bit_is_clear(pstop,stop) &&
bit_is_set(pI_nD,I_nD)){
ESTADO = DETENIDO;clearbit(Pa,a);clearbit(Pb,b);clearbit(pEn,En);
}
if(bit_is_set(pstart,start) && bit_is_set(pstop,stop) &&bit_is_clear(pI_nD,I_nD))
{ESTADO = DERECHA;setbit(Pa,a);clearbit(Pb,b);
setbit(pEn,En);}
if(bit_is_clear(pstart,start) && bit_is_set(pstop,stop) &&bit_is_clear(pI_nD,I_nD))
{ESTADO = DERECHA;setbit(Pa,a);clearbit(Pb,b);setbit(pEn,En);
} break;
}default: break;
}}
}
Finalmente se presenta el esquema que muestra las conexiones del circuito