l
CONTROLADORA PARA MOTOR
DE CORRIENTE CONTINUA
Interfaz de control de un
motor de corriente continua (controladora).
INTRODUCCIÓN
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.
{bml S1YS2.bmp}
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.
CONEXIONES
Este esquema muestra los conectores de alimentación de 12 y 5
voltios, al PC (25 pines) y al dispositivo controlado (15 pines):
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.
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.
DISPOSITIVOS
CONTROLADOS
Algunos dispositivos que pueden conectarse a la controladoras son:
una barrera, una puerta
automática, un ascensor, etc.
BARRERA ELECTRÓNICA
ASCENSOR ESCALERA
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:
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.
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
|