Asignatura:

Diseño y Control

Control por PC

-puzzle.wmf (4054 bytes)

 

     WB01372.gif (406 bytes)

 

 

 

 

 

 

 

 

 

 

 

 

 

l

CONTROLADORA PARA MOTOR DE CORRIENTE CONTINUA

Introducción
Esquema controladora
Entradas y salidas
Conectores controladora
Puertos del PC utilizados
Dispositivos controlados
Ejemplo de aplicación
Detalles de la controladora

Interfaz de control de un motor de corriente continua (controladora).

INTRODUCCIÓN

 

BLOQUES.jpg (6291 bytes)

La controladora para motor cc consiste en dos circuitos opto-acoplados. Uno controlado a través del puerto paralelo del ordenador y otro que activa directamente el motor en ambos sentidos y con función de paro automático.

El circuito de control dispone de dos pulsadores marcha y paro, dos interruptores de fin de carrera y dos led indicadores. El circuito de potencia activa un motor de corriente continua alimentado con una fuente externa de 12 voltios. La conexión entre ambos circuitos se realiza a través de dos opto-acopladores que generan una señal lógica de dos bits, cuyos cuatro estados gobiernan el motor cc.

ESQUEMA CONTROLADORA

Estos esquemas muestran los circuitos de entrada de los pulsadores e interruptores marcha-paro: un circuito anti-rebotes utilizando un disparador 7414 y un flip-flop con un par de puertas nand 7400.

Las salidas de estos circuitos se leen mediante los bits D3,D4,D5 y D7 del puerto de estado.

 

p1yp2.jpg (3278 bytes)

{bml S1YS2.bmp}

s1ys2.bmp (5566 bytes)

Este otro esquema muestra el diagrama lógico del circuito que controla el motor cc (como la alimentación es de 12 V se utilizan puertas cmos 4011 (nand) y una 4030 (xor).

El control se realiza mediante los bits D0 y D1 del puerto de datos del ordenador.

 

CONTROLA.jpg (19904 bytes)

 

CONEXIONES

Este esquema muestra los conectores de alimentación de 12 y 5 voltios, al PC (25 pines) y al dispositivo controlado (15 pines):

esquema.bmp (26998 bytes)

 

 

CONECTORES DEL DISPOSITIVO CONTROLADO

El esquema muestra la conexión a la controladora del dispositivo (escalera, puerta, barrera, etc) a través de un conector Sub-D de 15 pines.

conecto1.bmp (94646 bytes)

PUERTOS DEL PC UTILIZADOS

Para leer la información del dispositivo conectado al PC, se utiliza el puerto de estado (dirección 379 hexadecimal) leyéndose los bits d7, d5,d4 y d3.

En la imagen puede verse cómo se aplica una máscara al byte de estado (10111000) para obtener la información de estos bits únicamente.

Las salidas del programa se envían a la controladora utilizando los bits de menor peso (d0 y d1) del puerto de datos (dirección 378h) para controlar la dirección del motor, y los bits d2 y d3 para activar dos leds o indicadores.

conexlpt.jpg (32751 bytes)

DISPOSITIVOS CONTROLADOS

Algunos dispositivos que pueden conectarse a la controladoras son:

una barrera, una puerta automática, un ascensor, etc.

barrera2.gif (113057 bytes)

BARRERA ELECTRÓNICA

escalera.gif (355895 bytes)

ASCENSOR ESCALERA

puerta.gif (166519 bytes)

PUERTA AUTOMATICA

EJEMPLO DE APLICACION

El programa  PRJESCAL.EXE está realizado en DELPHI 2.0 y permite controlar cualquier dispositivo conectado a la controladora a través del puerto paralelo del PC.

Aquí puedes ver su aspecto:

Pantalla1.gif (41352 bytes)

La pantalla de simulación muestra tres animaciones de diferentes dispositivos que pueden activarse pulsando sobre los botones P1 y P2. Los dos grupos de leds muestran el estado del puerto de salida y del puerto de entrada de la impresora, a donde está conectada la controladora.

Pantalla2.gif (53098 bytes)

La otra pantalla muestra el estado  real de los interruptores y pulsadores del dispositivo controlado.

A continuación se proponen ejemplos de utilización de la controladora desde TurboPascal y QBasic:

 

En TurboPascal:

program ESCALERA;

uses crt,dos,TEXTLIB;

var x,n,s:integer;

B,A,BB:BYTE;

C:CHAR;

P1,P2,S1,S2:boolean;

PUERTOiN,PUERTOouT:word;

 

function d7(b:byte):byte;assembler;

asm

XOR AX,AX

MOV AL,B

AND AL,$80

end;

function d6(b:byte):byte;assembler;

asm

XOR AX,AX

MOV AL,B

AND AL,$40

end;

function d5(b:byte):byte;assembler;

asm

XOR AX,AX

MOV AL,B

AND AL,$20

end;

function d4(b:byte):byte;assembler;

asm

XOR AX,AX

MOV AL,B

AND AL,$10

end;

function d3(b:byte):byte;assembler;

asm

XOR AX,AX

MOV AL,B

AND AL,$08

end;

function d2(b:byte):byte;assembler;

asm

XOR AX,AX

MOV AL,B

AND AL,$04

end;

function d1(b:byte):byte;assembler;

asm

XOR AX,AX

MOV AL,B

AND AL,$02

end;

function d0(b:byte):byte;assembler;

asm

XOR AX,AX

MOV AL,B

AND AL,$01

end;

 

BEGIN

{repeat

b:=LEEHIGHNIBBLE(b);

GOTOXY(10,10); WRITE(B);

until KEYPRESSED; HALT;}

CLRSCR;

WRITELN;

WRITELN;

WRITELN(' CONTROLADORA MOTOR C.C. ');

gotoxy(20,12);

writeln('1: Puerto LPT1 2: Puerto LPT2');

REPEAT UNTIL KEYPRESSED; c:=readkey;

if c='1' then begin PUERTOout:=$378;PUERTOin:=$379;end;

if c='2' then begin PUERTOout:=$278;PUERTOin:=$279;end;

GOTOXY(40,8);WRITELN('Puerto: ',PUERTOout);

CSROFF;clrscr;

B:=0;

P1:=false;

P2:=false;

GOTOXY(8,1); WRITE(' CONTROLADORA MOTOR (ESCALERA,PUERTA AUTOMATICA..)');

GOTOXY(8,2); WRITE(' __________________________________________________');

GOTOXY(8,3); WRITE(' P2 pulsado y s1 activado : $90 1001 0000');

GOTOXY(8,4); WRITE(' P2 pulsado y s1 desactivado : $01 0001 0000');

GOTOXY(8,5); WRITE(' P1 pulsado y s2 activado : $28 0010 1000');

GOTOXY(8,6); WRITE(' P1 pulsado y s2 desactivado : $20 0010 0000');

GOTOXY(8,23); WRITE(' 1: Port LPT1 2: Port LPT2 S: subir B: bajar ESC: Salir');

{c:=#32;}

WHILE NOT (c=#27) DO

BEGIN

c:=#32;

bb:=0; {para que el OR 0000 0000 no afecte al byte b}

IF KEYPRESSED THEN

begin

c:=readkey;

if c='1' then begin PUERTOout:=$378;PUERTOin:=$379;end;

if c='2' then begin PUERTOout:=$278;PUERTOin:=$279;end;

if (c='s') or (c='S') then bb:=$20;

if (c='b') or (c='B') then bb:=$10;

 

end;

b:=port[PUERTOin]; { $379];}

b:=b AND $B8; {a cero ACK y bits no usados D0 D1 y D2 = 1011 1000}

b:=b OR bb; {activar bits D5 o D4 P1 o P2 !}

if (b=8) and not(p1) then

begin

port[PUERTOout]:=15; { $378]:=15;}

P1:=false; P2:=false;

end;

if (b=128) and not(P2) then

begin

port[PUERTOout]:=15;

P1:=false; P2:=false;

end;

S1:=(b and $80)=$80; S2:=(b and $08)=$08;

if b=$90 then P2:=true; {si s1 activado y se pulsa bajar p2 1001 0000}

if b=16 then begin P2:=true; P1:=false; end;

if b=$28 then P1:=true; {si s2 activado y se pulsa subir p1 0010 1000}

if b=32 then begin P1:=true; P2:=false; end;

if b=$30 then port[PUERTOout]:=15;

if P2 then port[PUERTOout]:=5;

if P1 then port[PUERTOout]:=10;

a:= port[PUERTOout];

GOTOXY(13,9); WRITE(B,' ',A,' ');

gotoxy(13,10); write('status data S1 S2');

gotoxy(10,11);WRITE('D7 ',D7(b),' ',D7(a),' ',S1,' ',S2,' ');

gotoxy(10,12);WRITE('D6 ',D6(b),' ',D6(a),' ');

gotoxy(10,13);WRITE('D5 ',D5(b),' ',D5(a),' ');

gotoxy(10,14);WRITE('D4 ',D4(b),' ',D4(a),' ');

gotoxy(10,15);WRITE('D3 ',D3(b),' ',D3(a),' ');

gotoxy(10,16);WRITE('D2 ',D2(b),' ',D2(a),' ');

gotoxy(10,17);WRITE('D1 ',D1(b),' ',D1(a),' ');

gotoxy(10,18);WRITE('D0 ',D0(b),' ',D0(a),' ');

writeln;

writeln('--------');

if not(P1) and not(p2) then begin gotoxy(10,20);write('Û.............-- DETENIDA --...........Û');END;

if P1 then begin gotoxy(10,20);write('ÛÛÛ.....ÚÙ..<-- SUBIENDO ...............');END;

if P2 then begin gotoxy(10,20);write('............... BAJANDO -->.....ÚÙ...ÛÛÛ');END;

END;

C:=READKEY;

CSRON;

END.

En QBasic:

false = 0

true = -1

CLS

PRINT

PRINT

PRINT " CONTROLADORA MOTOR C.C. ');"

LOCATE 12, 20

PRINT "1: Puerto LPT1 2: Puerto LPT2);"

c$ = ""

WHILE c$ = "": c$ = INKEY$: WEND

'C$ = INKEY$

IF c$ = "1" THEN PUERTOout = 888: PUERTOin = 889

IF c$ = "2" THEN PUERTOout = 632: PUERTOin = 633

LOCATE 8, 40: PRINT "Puerto: "; PUERTOout

CLS

b = 0

P1 = false

P2 = false

LOCATE 1, 8: PRINT "' CONTROLADORA MOTOR (ESCALERA,PUERTA AUTOMATICA..)');"

LOCATE 2, 8: PRINT "' __________________________________________________');"

LOCATE 3, 8: PRINT "' P2 pulsado y s1 activado : $90 1001 0000');"

LOCATE 4, 8: PRINT "' P2 pulsado y s1 desactivado : $01 0001 0000');"

LOCATE 5, 8: PRINT "' P1 pulsado y s2 activado : $28 0010 1000');"

LOCATE 6, 8: PRINT "' P1 pulsado y s2 desactivado : $20 0010 0000');"

LOCATE 23, 8: PRINT "' 1: Port LPT1 2: Port LPT2 S: subir B: bajar ESC: Salir');"

'{c:=#32;}

WHILE c$ <> CHR$(27)

c$ = CHR$(32)

BB = 0'{para que el OR 0000 0000 no afecte al byte b}

c$ = INKEY$

IF c$ = "1" THEN PUERTOout = 888: PUERTOin = 889

IF c$ = "2" THEN PUERTOout = 632: PUERTOin = 633

IF (c$ = "s") OR (c$ = "S") THEN BB = 32

IF (c$ = "b") OR (c$ = "B") THEN BB = 16

b = INP(PUERTOin)' { $379];}

b = b AND &HB8' {a cero ACK y bits no usados D0 D1 y D2 = 1011 1000}

b = b OR BB'{activar bits D5 o D4 P1 o P2 !}

IF (b = 8) AND NOT (P1) THEN : OUT PUERTOout, 15: P1 = false: P2 = false

IF (b = 128) AND NOT (P2) THEN OUT PUERTOout, 15: P1 = false: P2 = false

s1 = (b AND &H80) = &H80: s2 = (b AND &H8) = &H8

IF b = &H90 THEN P2 = true'{si s1 activado y se pulsa bajar p2 1001 0000}

IF b = 16 THEN P2 = true: P1 = false

IF b = &H28 THEN P1 = true'{si s2 activado y se pulsa subir p1 0010 1000}

IF b = 32 THEN P1 = true: P2 = false

IF b = &H30 THEN OUT PUERTOout, 15

IF P2 THEN OUT PUERTOout, 5

IF P1 THEN OUT PUERTOout, 10

A = INP(PUERTOout)

LOCATE 9, 13: PRINT b; " "; A; " ";

LOCATE 10, 13: PRINT "status data S1 S2";

LOCATE 11, 10: PRINT "D7 "; b AND 128; " "; A AND 128; " "; s1; " "; s2; " ";

LOCATE 12, 10: PRINT "D6 "; b AND 64; " "; A AND 64; " ";

LOCATE 13, 10: PRINT "D5 "; b AND 32; " "; A AND 32; " ";

LOCATE 14, 10: PRINT "D4 "; b AND 16; " "; A AND 16; " ";

LOCATE 15, 10: PRINT "D3 "; b AND 8; " "; A AND 8; " ";

LOCATE 16, 10: PRINT "D2 "; b AND 4; " "; A AND 4; ' ';

LOCATE 17, 10: PRINT "D1 "; b AND 2; " "; A AND 2; " ";

LOCATE 18, 10: PRINT "D0 "; b AND 1; " "; A AND 1; " ";

PRINT

PRINT "--------"

LOCATE 1, 70: PRINT P1; " "; P2

IF NOT (P1) AND NOT (P2) THEN LOCATE 20, 10: PRINT "Û.............-- DETENIDA --...........Û"

IF P1 THEN LOCATE 20, 10: PRINT "'ÛÛÛ.....ÚÙ..<-- SUBIENDO ..............."

IF P2 THEN LOCATE 20, 10: PRINT "............... BAJANDO -->.....ÚÙ...ÛÛÛ"

WEND

c$ = ""

WHILE c$ = "": c$ = INKEY$: WEND