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

Prctica 3 Microcontroladores M.S.C. Miguel Montiel Mtz ITST: Ing. Mecatrnica.

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, adems considera el siguiente funcionamiento Inicialmente el motor debe estar detenido. start = stop = 1; I_nD = X. El motor se mueve si se presiona el botn start = 0 y el botn I_nD = 1 a la izquierda. El motor se mueve si se presiona el botn start = 0 y el botn 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 botn de stop es presionado y se mantiene as an despus de soltarlo. O si el botn de stop se mantiene presionado, no importan los estados de start o de I_nD, el motor permanece detenido. Los pines se asignarn a las siguientes terminales:
Id start stop I_nD a b En Descripcin Botn de inicio Botn de paro Botn de sentido Salida hacia L293 Salida hacia L293 Salida de hablitacin de L293 Puerto PINC1 PINC2 PINB0 PD0 PD1 PD2 Tipo Entrada Entrada Entrada Salida Salida Salida

Resolucin: Primero se debe plantear el diagrama de estados en funcin de la descripcin 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 definirn como valores binarios.
Formato para entradas start 1 stop 1 I_nD 1 a 0 Formato para salidas b 0 En 0

Ilustracin 1: Diagrama de estados propuesto

Los nmeros que estn sobre las flechas indican las seales de entrada que provienen de start,stop e I_nD, y los nmeros que estn 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 sealado con doble anillo. El software permite generar entre otros cdigos HDL , el de AHDL, que por su sintxis es muy similar al lenguaje C. En el cuadro que a continuacin se presenta, se indica el cdigo fuente generado.
% This file was generated by % Qfsm Version 0.52 % (C) Stefan Duffner, Rainer Strobel SUBDESIGN Motor (clock, reset start,stop,I_nD :OUTPUT; a,b,En :OUTPUT;) VARIABLE fsm : :INPUT; :INPUT; % % %

MACHINE OF BITS(s0, s1) WITH STATES ( Detenido = B"00", Derecha = B"01", Izquierda = B"10"); reset_async : NODE; _asynca, _asyncb, _asyncEn : NODE; reset_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 IS WHEN Detenido => IF (start,stop,I_nD) == B"101" THEN END IF; IF (start,stop,I_nD) == B"100" THEN END IF; IF (start,stop,I_nD) == B"110" THEN END IF; IF (start,stop,I_nD) == B"111" THEN END IF; IF (start,stop,I_nD) == B"010" THEN fsm = Derecha; (_asynca, _asyncb, _asyncEn) END IF; IF (start,stop,I_nD) == B"011" THEN fsm = Izquierda; (_asynca, _asyncb, _asyncEn) END IF; WHEN Derecha => IF (start,stop,I_nD) == B"100" THEN fsm = Detenido; (_asynca, _asyncb, _asyncEn) END IF; IF (start,stop,I_nD) == B"111" THEN fsm = Izquierda; (_asynca, _asyncb, _asyncEn) END IF; IF (start,stop,I_nD) == B"011" THEN fsm = Izquierda; (_asynca, _asyncb, _asyncEn) END IF; IF (start,stop,I_nD) == B"010" THEN END IF; IF (start,stop,I_nD) == B"110" THEN END IF; WHEN Izquierda => IF (start,stop,I_nD) == B"101" THEN fsm = Detenido; (_asynca, _asyncb, _asyncEn)

BEGIN

= B"101";

= B"011";

= B"000";

= B"011";

= B"011";

= B"000";

END CASE; END;

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" THEN END IF; IF (start,stop,I_nD) == B"011" THEN END IF;

Del cdigo, solo se tomarn los if dentro de cada case, en donde exista una indicacin de cambio de estado para traducirlo al lenguaje C, por ejemplo
IF (start,stop,I_nD) == B"011" THEN fsm = Izquierda; (_asynca, _asyncb, _asyncEn) = B"011"; END IF; IF (start,stop,I_nD) == B"111" THEN END IF;

Estas lneas se traducen a C Estas lneas se ignoran

Para pasar al lenguaje C, son declarados como #define los estados y se les asigna un valor, y se agrega adems 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 cdigo C traducido a partir del cdigo AHDL generado por el software Qfsm.
#include <avr/io.h> #define F_CPU 1000000UL #include <util/delay.h> /*Definicin 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 #define #define #define #define #define #define a Pa b Pb En pEn PD0 PORTD PD1 PORTD PD2 PORTD

/*Defincion para configuracin 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 #define #define #define #define #define ca cPa cb cPb cEn cpEn DDD0 DDRD DDD1 DDRD DDD2

DDRD

/*Definicion de estados*/ #define DETENIDO 0 #define DERECHA #define IZQUIERDA 2

int main(void) { /*Creacin 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); } bit_is_set(pI_nD,I_nD)) if(bit_is_clear(pstart,start) && bit_is_set(pstop,stop) && { ESTADO = IZQUIERDA; clearbit(Pa,a); setbit(Pb,b); setbit(pEn,En);

} case { bit_is_clear(pI_nD,I_nD))

} break;

DERECHA: if(bit_is_set(pstart,start) && bit_is_clear(pstop,stop) && { ESTADO = DETENIDO; clearbit(Pa,a); clearbit(Pb,b); clearbit(pEn,En);

} bit_is_set(pI_nD,I_nD))

if(bit_is_set(pstart,start) && bit_is_set(pstop,stop) && { ESTADO = IZQUIERDA; clearbit(Pa,a); setbit(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 { bit_is_set(pI_nD,I_nD))

IZQUIERDA: if(bit_is_set(pstart,start) && bit_is_clear(pstop,stop) && { ESTADO = DETENIDO; clearbit(Pa,a); clearbit(Pb,b); clearbit(pEn,En); } if(bit_is_set(pstart,start) && bit_is_set(pstop,stop) && { ESTADO = DERECHA; setbit(Pa,a); clearbit(Pb,b); setbit(pEn,En);

bit_is_clear(pI_nD,I_nD))

} bit_is_clear(pI_nD,I_nD))

if(bit_is_clear(pstart,start) && bit_is_set(pstop,stop) && { 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

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