Cómo controlar la rotación hacia adelante y hacia atrás de motores paso a paso
Una aplicación práctica para controlar la rotación hacia adelante y hacia atrás de un motor paso a paso
/*Esta es una aplicación práctica para controlar la rotación hacia adelante y hacia atrás de un motor paso a paso*/ p>
/*Se selecciona un controlador de motor paso a paso trifásico y la línea del puerto p14 se usa para el control de pulso del motor paso a paso*/
/*La línea del puerto p13 se usa para el Control de dirección del motor paso a paso. p15, p16, p17 son entradas de interruptor optoacoplador*/
/* terminales de señal, p20, p21, p22, p23 están conectados a la memoria de vigilancia X25045.html">X25045*/
/*Las teclas k7 y k8 son las teclas de suma y resta para configurar los parámetros de velocidad de rotación del motor paso a paso*/
/*k9 es la tecla de inicio de funcionamiento. Presione k9 y el motor paso a paso comenzará a funcionar hasta. La línea del puerto p17 se detendrá solo cuando haya una entrada de señal*/
/*k10 es la tecla de parada. Al presionar k10 en cualquier momento se detendrá la operación actual del motor paso a paso*/
./*k11 Es la tecla de operación paso a paso. Presiónela una vez y el motor paso a paso se moverá. */
/*La tecla k12 es la tecla de operación inversa. Presiónela una vez y el motor paso a paso se moverá. comience a funcionar en dirección inversa hasta que haya una señal en la línea del puerto p15. Simplemente deténgase*/
/*Si hay entrada de señal desde la línea del puerto p16, solo funcionará la tecla k12. otras teclas no responderán.
*/
INICIO:hacer;
$INCLUDE(REG51.DCL)
DECLARAR (addrl,n,I,j,ok,ds) byte; /*Definir variables*/
declarar l(5) byte;
declarar (dat,data) byte a las (30h);
declarar palabra de retardo;
DECLARAR ACO(11) BYTE CONSTANTE (05h,9fh,23h,0bh,99h,49h,/*Definir tabla de códigos de segmentos LED*/
41h,1fh,01h,09h ,00h);
declarar si literalmente ''p21'',sck literalmente ''p20'' /*X25045 definición de línea de puerto*/
declarar así literalmente ''p22'; ',cs literalmente ''p23'';
dog:procedure; /* Inicializar vigilancia X25045.html">X25045 */
cs=1;
tiempo de llamada(1);
cs=0;
tiempo de llamada(1);
cs=1;
fin dog;
ejecutar:procedimiento; /*motor paso a paso ejecutando programa de salida de pulsos*/
si está bien=1 entonces
llame a dog;
p >hacer;
p14=0;
tiempo de llamada(1);
p14=1;
tiempo de llamada (1);
fin;
finalizar ejecución;
DISPLAY:PROCEDURE(L0,L10); /*mostrar subrutina*/
DECLARAR (L0,L10) BYTE; /*definir visualización de dos dígitos*/
n=L10;
n=aco(n); codificar en código de segmento*/
sbuf=n; /*Se envían diez dígitos al 164 para su visualización*/
hacer mientras ti=0; */
llamar al perro; /*Reinicio del temporizador de vigilancia*/
fin;
n=L0
n=aco( n);
sbuf=n; /*Un solo dígito mostrará 164*/
hacer mientras ti=0
llamar al perro;
end;
end DISPLAY;
outbyt: procedimiento(da); /*Escribe un byte en la memoria de vigilancia*/
declarar (i) ,da) byte;
j=da; /*Asignar el byte a escribir en la variable temporal J */
hacer i=0 a 7 / *Desplazar 8 bits a la izquierda; y enviar a la línea de puerto si */
sck=0;
j=scl(j,1);
si=cy ;
sck=1; /*Cada bit de datos se desplaza, seguido de una señal de reloj*/
end;
end outbyt
inbyt; : procedimiento; /* Leer un byte de la memoria de vigilancia*/
declarar (i,di) byte;
j=0;
hacer i= 0 a 7;
sck=1;
sck=0;
cy=so;
j=scl(j
,1); /*Leer un byte de la memoria de vigilancia y enviarlo a la variable temporal j*/
end;
dat=j;
end inbyt;
wrenable: procedimiento /* Establecer habilitación de escritura de vigilancia*/
sck=0
cs=0;
; /* comando de habilitación de escritura */
call outbyt(06h); /* X25045.html">X25045 comando de habilitación de escritura 06h */
cs=1 ;
sck=0;
end wrenable;
wrdisable: procedimiento /* Establecer deshabilitación de escritura de vigilancia*/
sck=0; p>
cs=0;
; /* comando de desactivación de escritura */
llamada outbyt(04h);
sck=0; p>
cs=1;
end wrdisable;
wrregister: procedimiento; /* escribir registro de estado*/
sck=0; p>
cs=0;
dat=01h; /* escribir comando de registro */
llamar a outbyt(dat);
; 00h——1.4S, 20h——200MS, 10h——600MS, 30h——desactivar Wdog */
call outbyt(00h); /* Establecer tiempo de sincronización de vigilancia*/
sck=0;
cs=1;
call time(200); /* espera para completar el ciclo de escritura */
end wrregister; p>
rdregister:procedure; /* Leer el registro de estado del guardián*/
sck=0;
cs=0
; leer comando */
llamar outbyt(05h);
llamar inbyt /* registro de estado leer en
sck=0;
cs=1;
end rdregister;
wbyte:procedure; /* byte de memoria de vigilancia Escribir subrutina*/
declarar byte de comunicación ;
sck=0;
cs=0;
comm=02h; /* Escribir comando 02h */
llamar outbyt (comm);
call outbyt(addrl);
call outbyt(dat) /* envía datos de un byte a X25043 */
cs=1 ;
sck=0;
tiempo de llamada(150);
finalizar wbyte ;
rbyte:procedimiento /*Memoria de vigilancia; subrutina de lectura de bytes*/
declarar byte de comunicación;
sck=0;
sck=0;
p>
cs=0;
comm=03h; /* leer comando */
llamar a outbyt(comm);
llamar
byt(addrl);
llamar a inbyt; /* leer un byte en
sck=0;
cs=1; p>
end rbyte;
incdata: procedimiento; /* Modificación de parámetros——Subrutina de procesamiento de clave "Agregar"*/
si p10=0 entonces /* si K7 presiona key*/
hacer;
hacer mientras p10=0; /* Esperar a que se suelte la tecla*/
llamar al perro /* aquí El perro guardián se debe llamar a la subrutina de reinicio ("alimentar al perro"); de lo contrario, el perro guardián reiniciará el programa*/
end;
data=data 1 /* Valor de configuración 1; */
if data>99 then data=1 /* Especifica el límite superior del valor de configuración*/
L(1)=data MOD 10; Elimine el dígito de las decenas del valor fijo y envíelo a la variable de visualización de dígitos de las decenas L(1) */
L(2)=data/10; elimine el dígito único del valor establecido y enviarlo Dar variable de visualización de un solo dígito L(2) */
call DISPLAY(L(1),L(2) /* Enviar el valor de configuración modificado a 164 para visualización */ p); >
tiempo de llamada(200); /* retraso*/
llamar al perro;
tiempo de llamada(200);
llamar al perro
p>call wrenable; /* Establecer habilitación de escritura en memoria*/
addrl=00h /* Establecer dirección de memoria*/
dat=l(1) ; p>
llamar wbyte; /* Escribe el valor de la variable L(1) en la ubicación de memoria 00h*/
llamar a wrenable;
addrl=01h;
dat=l(2);
llamar a wbyte /* Escribe el valor de la variable L(2) en la ubicación de memoria 01h*/
end;
end incdata;
decdata: PROCEDIMIENTO; /* Modificación de parámetros——-Subrutina de procesamiento de claves "Deducción"- */
IF p11=0 THEN / * procesamiento de claves k8 subrutina*/
hacer;
hacer mientras p11=0;
llamar al perro;
fin;
DATOS=DATOS-1; /* Valor de configuración-1 */
si datos=0 entonces datos=99;
L(1)=datos MOD 10; >
L(2)=datos/10;
llamar DISPLAY(l(1),l(2));
llamar perro
tiempo de llamada(200);
llamar al perro;
tiempo de llamada(200);
llamar al perro;
llamar a la hora;
addrl=00h;
dat=l(1);
llamar a wbyte;
llamar a wrenable ;
addrl=01h;
dat=l(2);
llamar a wbyte;
end;
END decdata; /p>
starton: PROCEDIMIENTO; /* inicio */
declarar sd byte;
si p12=0 ENTONCES /* subrutina de procesamiento de clave K9*/
hacer;
hacer mientras p12=0;
llamar al perro;
end;
si p17=0 entonces ok=0; /* Si hay una entrada de señal en la línea del puerto p17, el indicador de ejecución se establece en 0 (detener la ejecución)*/
p13=1; /* Configura el motor paso a paso para que funcione hacia adelante*/
tiempo de llamada(200);
llamar al perro;
hacer while ok=1 ; /* Cuando el indicador de funcionamiento es 1, realice la operación de retardo de velocidad*/
haga sd= 0 a los datos /* Determine la velocidad de funcionamiento del motor paso a paso en función del retardo numérico del; establecer datos de valor Velocidad dada del pulso*/
llamar al perro
end;
end;
END starton;
paso: PROCEDIMIENTO; /* paso */
declarar sd byte;
p13=1; /* Configurar el motor paso a paso para que funcione en dirección de avance*/ p>
tiempo de llamada(200);
llamar al perro;
SI p33=0 ENTONCES /* subrutina de procesamiento de clave k11*/
hacer;
if p17=0 entonces ok=0; /* Si hay entrada de señal en p17, deja de ejecutar*/
hazlo mientras p33=0;
do sd= 0 to data; /* Retardo de llamada para ajustar la velocidad de funcionamiento del motor paso a paso*/
llamar al perro;
tiempo de llamada(2);
fin;
llamar ejecutar;
llamar perro;
fin;
fin;
ok =0;
FIN del paso;
BACK: PROCEDIMIENTO; /* Subrutina de procesamiento de ejecución inversa*/
declarar sd byte; SI p34 =0 ENTONCES
hacer;
hacer mientras p34=0;
llamar al perro;
finalizar;
si p15=0 entonces ok=0; /* Cuando se ejecuta en dirección inversa, si hay una entrada de señal en p15, el motor paso a paso dejará de funcionar*/
p13=0; * Configure el motor paso a paso para que funcione en dirección inversa*/
tiempo de llamada(200);
llamar al perro;
hacer mientras está bien=1;
hacer sd=0 a datos; /*Ajustar la velocidad de funcionamiento del motor paso a paso de acuerdo con el valor establecido*/
llamar al perro;
tiempo de llamada(2) ;
end;
llamada en ejecución;
si (p15=0 o p32=0 ) entonces ok=0 /* Si el puerto p15 o p32; la línea tiene entrada de señal, deja de ejecutarse */
end;
end;
END BACK
MAIN$PROGRAM: /* Inicializar programa principal*/ p>
ea=0; /* Desactivar interrupciones*/
SCON=00h /*Establecer el modo de puerto serie 0, modo de salida de datos serie*/ p>
PCON=00h ;
tmod=11h;
et0=1;
enable /* Habilitar interrupción (ea=1) * /
SCK=0;cs=
1; /* Definir el estado inicial de la línea del puerto de memoria*/
call wrenable;
call wrregister /* Inicializar la memoria de vigilancia*/
call wrenable ;
llamar a perro;
p2=0ffh /* Inicializa el estado de cada línea de puerto*/
p1=0ffh;ok=0;
p14=1;p32=1;p33=1;p34=1;
p13=1;
ADDRL=00h /* De la memoria después reinicio de encendido Leer el valor de velocidad establecido*/
CALL rbyte
l(1)=dat;
addrl=01h;
llamar a rbyte;
l(2)=dat;
DATA=L(1) L(2)*10 /* Combina los valores leídos en decimal, almacenar en datos variables*/
/* El siguiente es el programa de bucle principal*/
BUCLE:
IF p10=0 THEN CALL incdata; /* Detección de si cada botón está presionado*/
SI p11=0 ENTONCES LLAME a decdata
si p12=0 entonces
do;
ok=1;
llamar a starton;
end;
si p34=0 entonces
hacer;
ok=1;
llamar DEVOLVER;
fin;
si p33=0 entonces
hacer; p>
ok=1;
llamar paso;
fin;
llamar perro;
LLAMADA DISPLAY(L( 1) ,L(2)); /* Enviar el valor establecido a 164 para mostrar*/
llamar al perro;
TIEMPO DE LLAMADA(100); >llamar al perro ;
IR A BUCLE;
FIN DE INICIO;