Practica Motor l 293

5
Práctica 3 Microcontroladores M.S.C. Miguel Montiel Mtz ITST : Ing. Mecatrónica. Elaborar un circuito que permita controlar un motor de corriente directa de 12V usando una interface de potencia 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 indicado por 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 si el botón de stop se mantiene presionado, no importan los estados de start o de I_nD, el motor permanece 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 Entrada I 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 l a descripción del problema. En este caso, utilizaremos el software Qfsm (http://qfsm.sourceforge.net). Sin embargo es necesario dar formatos de 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 estado s propuesto

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