Red de conocimiento informático - Conocimiento de la instalación - Cómo controlar la rotación hacia adelante y hacia atrás de motores paso a paso

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*/

/*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;

cs=0;

; /* comando de desactivación de escritura */

llamada outbyt(04h);

sck=0;

cs=1;

end wrdisable;

wrregister: procedimiento; /* escribir registro de estado*/

sck=0;

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;

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;

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 */

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)

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*/

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*/

ea=0; /* Desactivar interrupciones*/

SCON=00h /*Establecer el modo de puerto serie 0, modo de salida de datos serie*/

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;

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;