Control de motor de paso

Industriales. Materiales. Motores. Bobinas. Turbopascal

  • Enviado por: César Yagui
  • Idioma: castellano
  • País: Argentina Argentina
  • 23 páginas
publicidad
publicidad

CONTROL DE MOTOR DE PASO

  • OBJETIVOS

  • El objetivo del presente laboratorio es que el estudiante aplique sus conocimientos de maquinas eléctricas, control de procesos industriales y lenguajes de programación para controlar un motor de paso relacionándolo como dispositivo final o actuador.

  • MATERIALES E INSTRUMENTOS

    • Programa de control.

    • Transistores 2N3904.

    • Resistencias de 470ðð

    • Motor de paso.

    • Microcomputador.

  • FUNDAMENTO TEORICO

  • MOTORES PASO A PASO

    EL motor paso a paso está constituido esencialmente por dos partes: a) Una fija llamada "estator", construida a base de cavidades en las que van depositadas las bobinas que excitadas convenientemente formarán los polos norte-sur de forma que se cree un campo magnético giratorio. b) Una móvil, llamada "rotor" construida mediante un imán permanente, con el mismo número de pares de polos, que el contenido en una sección de la bobina del estator; este conjunto va montado sobre un eje soportado por dos cojinetes que le permiten girar libremente.

    Si por el medio que sea, conseguimos excitar el estator creando los polos N-S, y hacemos variar dicha excitación de modo que el campo magnético formado efectúe un movimiento giratorio, la respuesta del rotor será seguir el movimiento de dicho campo, produciéndose de este modo el giro del motor.

    Puede decirse por tanto que un motor paso a paso es un elemento que transforma impulsos eléctricos en movimientos de giro controlados, ya que podremos hacer girar al motor en el sentido que deseemos y el número de vueltas y grados que necesitemos.

    Según la construcción de las bobinas del estator, podemos diferenciar entre motores "bipolares" y motores "unipolares". Los primeros tiene las bobinas con un arrollamiento único, mientras que los segundos tienen las bobinas compuestas por dos arrollamientos cada una. En la FIG.1 podemos ver esta diferencia de forma gráfica. A igual número de espiras, el unipolar, deberá tener menor sección en el hilo de las bobinas, aumentando por tanto su resistencia y disminuyendo su par a bajas velocidades.

    Al número de grados que gira el rotor, cuando se efectúa un cambio de polaridad en las bobinas del estator, se le denomina "ángulo de paso" y puede ser muy variado en función de la aplicación y por tanto de la construcción del mismo. Además, existe la posibilidad (con el control electrónico apropiado) de conseguir una rotación de medio paso. En los motores que tratamos a continuación el paso completo es de 7'5º (medio paso 3'75º) y el número de pasos por vuelta completa es de 48. En cada paso puede producirse un error cifrado de 0'5º en adelanto o en retraso, sin embargo, este error no es acumulativo, quedando anulado en el transcurso de los 360 grados eléctricos. Deberemos considerar que cuando se efectúe medio giro, el motor desarrollará un par menor y ejecutará el giro con menor precisión. Los motores son fabricados para trabajar en un rango de frecuencias determinado por el fabricante y rebasado dicho rango, estaremos provocando una velocidad de giro del campo magnético creado por el estator muy elevada, no siendo el rotor capaz de alcanzar esa velocidad, provocando una pérdida de sincronización y quedando frenado en estado de vibración. Para estos motores, la máxima frecuencia admisible está alrededor de los 625 Hz.

    SECUENCIA DE EXCITACION DE LAS BOBINAS: Puesto que estamos hablando de dos tipos de motores paso a paso, el bipolar y el unipolar, tendremos también dos modos de excitación de sus devanados:

    1.- Devanado bipolar. Tenemos dos bobinas de arrollamiento único y su excitación, es decir, el orden en que se les aplica la tensión, hace circular una determinada intensidad en un sentido u otro, creando así los polos Norte-Sur y produciendo el giro del motor. La secuencia se expresa en la tabla siguiente. Si seguimos el orden 1, 2, 3, 4, estaremos efectuando un giro hacia la derecha. Para invertir el giro no tendremos más que seguir la secuencia inversa, es decir, 4, 3, 2, 1.

    2.- Devanado bipolar. Tenemos dos bobinas con doble arrollamiento y la excitación precisa en las bobinas se representa también en la misma tabla. Los valores 1 y 0 representan niveles lógicos. Con la secuencia 1, 2, 3, 4 se realiza un giro a la derecha y para cambiar el sentido de giro se efectúa la secuencia contraria.

    CIRCUITOS DE MANDO: El manejo operativo de un motor paso a paso, puede llevarse a cabo de dos modos básicos, bien mediante un control por tensión constante o bien mediante un control por corriente constante.

    Vamos a mostrar el control por tensión constante de un motor bipolar, mediante un circuito integrado diseñado específicamente para esta labor. se trata del SAA 1042 (fabricado por Motorola) cuya distribución de patillas se muestra en la FIG.2. Seguidamente describiremos la función de cada una de ellas:

    Patilla 1: Salida de control de una bobina del motor en unión con la patilla 3.

    Patilla 2: Sirve para proteger las salidas 1, 3, 14, y 16, amortiguando los transitorias que introducen las bobinas del motor en los cambios de nivel de los pulsos de control. Es necesario conectar un diodo zener entre la patilla 2 y la 15 (zener de 3V3).

    Patilla 3: Salida de control de una bobina del motor en unión con la patilla 1.

    Patilla 6: Terminal con dos funciones básicas, a través de una resistencia adapta la corriente del motor y con un pulso a través de la resistencia se efectúa un set de las salidas de control. Si no se utiliza la función set, debe colocarse a masa a través de la resistencia.

    Patilla 7: Entrada de reloj, activa en el flanco positivo del pulso. Por cada pulso que llegue, el motor gira 7'5º (o bien 3'75º según este conectado el terminal 8).

    Patilla 8: (Full/Half step) Determina el ángulo de rotación del motor por cada pulso que llegue de reloj. En estado bajo, el motor gira un paso completo (7'5º).

    Patilla 9: Masa.

    Patilla 10: (CW/CCW) Determina el sentido de giro. Cuando esta a nivel bajo, gira en sentido de las agujas del reloj. A nivel alto, el giro es contrario al de las agujas del reloj.

    Patilla 11: Alimentación de la parte lógica del SAA 1042. Puede variar de los +5V hasta los +20V. Puede ser la misma tensión que la alimentación del motor (patilla 15) o bien puede alimentarse a +5V para ser acoplado a señales de nivel TTL.

    Patilla 14: Salida de control de una bobina del motor en unión con la patilla 16.

    Patilla 15: Tensión a la que vamos a alimentar al motor.

    Patilla 16: Salida de control de una bobina del motor en unión con la patilla 14.

    El integrado SAA 1042 puede controlar motores con tensiones desde 6V hasta 12V y el SAA 1042A controla motores de 24V. Soportan una corriente de salida de 600 mA y poseen internamente diodos supresores de parásitos. sus entradas son compatibles con familias lógicas como MOS, DTL y TTL.

    Como puede observarse en la FIG.2, posee dos aletas refrigeradoras, que posibilitan mayor disipación de calor interno. No obstante es conveniente añadir un pequeño refrigerador que aumente la capacidad de disipación total.

    En la FIG.3 puede verse la conexión de las bobinas del motor al SAA 1042. Si conectamos una señal pulsante de reloj en la entrada de Clock, haremos girar el motor en el sentido que deseemos, según conectemos la entrada CW/CCW a +5V o a masa; por cada pulso recibido el motor girará 7'5º ó 3'75º según sea el estado de la entrada F/H.

    Control de Motores Paso-Paso


    De todos es conocido, que uno de los más importantes motores utilizados en robótica son los motores de tipo paso-paso.

    La ventaja de estos motores consiste en que de forma muy sencilla podemos controlar la posición en cada momento del eje del motor, con lo que nos permite dar solución a sistemas en los que se requiera un alto grado de precisión en los movimientos a realizar.

    Aunque la precisión final de este tipo de motores, depende de las características del mismo, a continuación ofrecemos un pequeño diseño para poder controlar un motor paso-paso de forma sencilla.

    Para la realización del mismo se ha contado con un motor paso-paso de la Casa PHILIPS modelo PAP 9904 112 35314 y de un integrado especial para su control el SAA1027, ambos componentes se pueden encontrar en el mercado fácilmente.

    Descripción de las patillas de control:

    patilla T:

    A esta patilla se le introducen pulsos generados externamente, como consecuencia de estos pulsos el motor comenzará a girar, hay que tener en cuenta que la frecuencia de los pulsos nos determinará la velocidad del motor, y que el número de pulsos entrados es igual al número de pasos o posiciones que avanzará el motor.

    Patilla R:

    La misión de esta patilla es controlar el sentido del giro del motor paso-paso así obtendremos que:

    para R= "1 lógico" , el motor gira en sentido antihorario.

    para R= "0 lógico", el motor gira en sentido horario.

    Patilla S:

    Esta patilla nos permite habilitar el integrado, esto quiere decir que si introducimos un 1 lógico por S el integrado responderá a las patillas de entrada, mientras que si mantenemos un 0 lógico es S el integrado no responderá a ninguna señal de control.

    Como comentario, me gustara destacar que si en el mercado no podéis encontrar el modelo de motor paso-paso indicado en el esquema, no os preocupéis, podéis utilizar cualquier motor pero respetando las siguientes condiciones:

    - Que su tensión de alimentación sea de 12V

    - Que sea un motor de 4 bobinas.

    Por último incluyo en el informe las características técnicas del motor PAP 9904 112 32001;

    - Consumo: 2 W

    - Ángulo de paso: 7º 30´

    - Tolerancia por paso: +- 40´

    - Pasos por revolución: 48

    En todas aquellas aplicaciones industriales en donde se requiera un posicionado de una pieza, embolo, válvula, en forma rápida y precisa; el motor de paso constituye un elemento idóneo por su elevada ergonomía. Los motores de paso también conocidos como stepper motor pueden girar un ángulo preciso llamado paso como resultado de la aplicación de pulsos en sus entradas.

    La rotación angular puede ser horaria o antihoraria dependiendo del orden de la secuencia de pulsos aplicados a sus bobinas. Su principio de funcionamiento esta basado en leyes de atracción y repulsión magnética.

    Existen motores de 400 pasos la cual corresponde un ángulo de paso de 0.9 grados; también de 1.8, 7.5grados, etc.

    Aplicaciones


    • Taxímetros.

    • Disk-drive.

    • Impresoras.

    • Plotters.

    • Brazo y Robots completos.

    • Patrón mecánico de velocidad angular.

    • Registradores XY.

    • Relojes Eléctricos.

    • Casetes Digitales.

    • Control Remoto.

    • Maquinas de escribir electrónicas.

    • Manipuladores.

    • Posicionamiento de válvulas en controles industriales.

    • Posicionamientro de piezas en general.

    • Bombas impelentes en aplicaciones de electromedicina.


    Tipos

    Existen diferentes tipos de motor de paso:

    • Imán Permanente.

    • Reluctancia variable.

    • Híbridos.

    Características

    Larga vida.

    Velocidad de respuesta elevada (<1ms).

    Posicionamiento dinámico preciso.

    Reinicialización a una posición preestablecida.

    Frecuencia de trabajo variable.

    Funcionamiento sincrónico bidireccional.

    Sincronismo unidireccional en régimen de sobrevelocidad.

    Carencia de escobillas.

    Insencibilidad al choque en régimen dinámico, a la regulación de la fuente de alimentación.

  • PROCEDIMIENTO

  • Programa

    El programa de control será editado en C++ o Turbo Pascal, que contiene un menú de opciones por ejecutar.

    Circuito de Interfase

    El circuito de Interfase o etapa de potencia tiene dos opciones: circuitos con transistores y circuito con configuración Darligton. Puede escogerse el mas adecuado para su motor.

    En esta práctica se usará el circuito con transistores, para dicho efecto arme el circuito de la figura.

    Efectúe las conexiones necesarias al sistema de control, mediante el puerto paralelo, para lo cual debe identificarse los respectivos pines conectores.

    Programa de control en el Microcomputador

    Cargue y corra el programa de control que deberá estar editado en C++ o Turbo Pascal y que debe contener un menú de opciones mínimas: NUMERO DE PASOS DEL MOTOR, SECUENCIAS DE FASES, PASOS A LA IZQUIERDA, PASOS A LA DERECHA, TERMINAR, así como una presentación personalizada por el estudiante.

  • DESARROLLO DE LAS PREGUNTAS

  • A. Presente el programa fuente de control del motor de paso, impreso y en diskett.

    //Programa de control de motor de paso en C++//

    #include <process.h>

    #include <dos.h>

    #include <stdio.h>

    #include <conio.h>

    #include <iostream.h>

    #include <graphics.h>

    #include <stdlib.h>

    int pasos,n,m,tiempo=1000;

    char sentido;

    void presentacion()

    {

    do{

    int i;

    for (i=0;i<50;i++)

    {

    setcolor(i);

    ellipse(70,100,0,360,i,50-i);

    setcolor(50-i);

    ellipse(70,100,0,360,50-i,i);

    circle(70,100,i);

    setcolor(0);

    circle(70,100,50-i);

    delay(10);

    }

    setcolor(3);

    rectangle(130,50,610,180);

    rectangle(131,51,611,181);

    settextstyle(0, 0, 0);

    setcolor(15);

    outtextxy(230,80,"UNIVERSIDAD NACIONAL DEL CALLAO");

    outtextxy(180,100,"FACULTAD DEINGENIERIA ELECTRICA Y ELECTRONICA");

    outtextxy(190,120,"ESCUELA PROFESIONAL DE INGENIERIA ELECTRICA");

    outtextxy(140,140,"LABORATORIO DE CONTROL DE PROCESOS Y ELECTRONICA APLICADA");

    outtextxy(240,160,"*CONTROL DE MOTOR PASO A PASO*");

    settextstyle(0, 0, 1);

    setcolor(9);

    rectangle(160,200,560,320);

    rectangle(161,201,561,321);

    setcolor(15);

    outtextxy(180,220,"1.APONTE VALVERDE LINCOLN 952541-J ");

    outtextxy(180,240,"2.CONDE QUISPE FRANK 952563-C ");

    outtextxy(180,260,"3.SANDOVAL VALVERDE PERCY 952547-H ");

    outtextxy(180,280,"4.VALER SEHUIN ORLANDO 952540-F ");

    } while(~kbhit());

    }

    void menu()

    {

    int y=270;

    int x=60;

    setcolor(12);circle(90,200,49);circle(90,200,48);

    setcolor(14);circle(90,200,50);

    setcolor(12);circle(90,200,51);circle(90,200,52);

    outtextxy(60,200,"MOTOR PP");

    rectangle(50,260,130,280);rectangle(51,259,131,281);

    setcolor(10);

    circle(x,y,5);

    circle(x+20,y,5);

    circle(x+40,y,5);

    circle(x+60,y,5);

    dibujo:

    int d;

    for (d=290;d<350;d++)

    {setcolor(5);

    rectangle(200,290,390,d);

    }

    menu:

    for(d=200;d<=390;d++)

    {setcolor(5);

    rectangle(200,270,d,290);

    }

    setcolor(15);

    rectangle(200,100,600,265);

    outtextxy(350,120,"* MENU *");

    outtextxy(220,150,".1. NUMERO DE PASOS DEL MOTOR");

    outtextxy(220,170,".2. SECUENCIA DE FASE");

    outtextxy(220,190,".3. PASOS A LA DERECHA");

    outtextxy(220,210,".4. PASOS A LA IZQUIERDA");

    outtextxy(220,250,".5. TERMINAR");

    rectangle(200,270,400,360);

    outtextxy(220,276,"opcion : ");

    char opcion;

    textcolor(5);

    gotoxy(38,18);cin>>opcion;

    setcolor(5);

    circle(500,150,5);

    circle(500,170,5);

    circle(500,190,5);

    circle(500,210,5);

    circle(500,230,5);

    switch(opcion){

    case '1':{//numero de pasos

    setcolor(12);

    circle(500,150,5);

    setcolor(15);

    outtextxy(210,292,"numero de pasos : ");

    gotoxy(45,19);cin>>pasos;

    variable:

    outtextxy(210,320,"sentido <D><I>");

    outtextxy(210,340,"sentido: ");

    gotoxy(38,22);cin>>sentido;

    switch(sentido){

    case 'D': {do{

    n++;

    pasos--;

    if (n==5) n=1;

    if (n==1) {

    setcolor(10);

    circle(x+20,y,5);

    circle(x+40,y,5);

    circle(x+60,y,5);

    outportb(0X378,1);

    setcolor(14);

    circle(x,y,5);}

    if (n==2) {

    setcolor(10);

    circle(x,y,5);

    circle(x+40,y,5);

    circle(x+60,y,5);

    outportb(0X378,2);

    setcolor(14);

    circle(x+20,y,5);}

    if (n==3) {

    setcolor(10);

    circle(x+20,y,5);

    circle(x,y,5);

    circle(x+60,y,5);

    outportb(0X378,4);

    setcolor(14);

    circle(x+40,y,5);}

    if (n==4) {

    setcolor(10);

    circle(x+20,y,5);

    circle(x+40,y,5);

    circle(x,y,5);

    outportb(0X378,8);

    setcolor(14);

    circle(x+60,y,5);}

    delay(tiempo);

    gotoxy(45,19);cout<<pasos;

    }while(pasos!=0);

    }break;

    case 'd': {do{

    n++;

    pasos--;

    if (n==5) n=1;

    if (n==1) {

    setcolor(10);

    circle(x+20,y,5);

    circle(x+40,y,5);

    circle(x+60,y,5);

    outportb(0X378,1);

    setcolor(14);

    circle(x,y,5);}

    if (n==2) {

    setcolor(10);

    circle(x,y,5);

    circle(x+40,y,5);

    circle(x+60,y,5);

    outportb(0X378,2);

    setcolor(14);

    circle(x+20,y,5);}

    if (n==3) {

    setcolor(10);

    circle(x+20,y,5);

    circle(x,y,5);

    circle(x+60,y,5);

    outportb(0X378,4);

    setcolor(14);

    circle(x+40,y,5);}

    if (n==4) {

    setcolor(10);

    circle(x+20,y,5);

    circle(x+40,y,5);

    circle(x,y,5);

    outportb(0X378,8);

    setcolor(14);

    circle(x+60,y,5);}

    delay(tiempo);

    gotoxy(45,19);cout<<pasos;

    }while(pasos!=0);

    }break;

    case 'I': {do{

    n--;

    pasos--;

    if (n==0) n=4;

    if (n==-1) n=4;

    if (n==1) {

    setcolor(10);

    circle(x+20,y,5);

    circle(x+40,y,5);

    circle(x+60,y,5);

    outportb(0X378,1);

    setcolor(14);

    circle(x,y,5);}

    if (n==2) {

    setcolor(10);

    circle(x,y,5);

    circle(x+40,y,5);

    circle(x+60,y,5);

    outportb(0X378,2);

    setcolor(14);

    circle(x+20,y,5);}

    if (n==3) {

    setcolor(10);

    circle(x+20,y,5);

    circle(x,y,5);

    circle(x+60,y,5);

    outportb(0X378,4);

    setcolor(14);

    circle(x+40,y,5);}

    if (n==4) {

    setcolor(10);

    circle(x+20,y,5);

    circle(x+40,y,5);

    circle(x,y,5);

    outportb(0X378,8);

    setcolor(14);

    circle(x+60,y,5);}

    delay(tiempo);

    gotoxy(45,19);cout<<pasos;

    }while(pasos!=0);

    }break;

    case 'i': {do{

    n--;

    pasos--;

    if (n==0) n=4;

    if (n==-1) n=4;

    if (n==1) {

    setcolor(10);

    circle(x+20,y,5);

    circle(x+40,y,5);

    circle(x+60,y,5);

    outportb(0X378,1);

    setcolor(14);

    circle(x,y,5);}

    if (n==2) {

    setcolor(10);

    circle(x,y,5);

    circle(x+40,y,5);

    circle(x+60,y,5);

    outportb(0X378,2);

    setcolor(14);

    circle(x+20,y,5);}

    if (n==3) {

    setcolor(10);

    circle(x+20,y,5);

    circle(x,y,5);

    circle(x+60,y,5);

    outportb(0X378,4);

    setcolor(14);

    circle(x+40,y,5);}

    if (n==4) {

    setcolor(10);

    circle(x+20,y,5);

    circle(x+40,y,5);

    circle(x,y,5);

    outportb(0X378,8);

    setcolor(14);

    circle(x+60,y,5);}

    delay(tiempo);

    gotoxy(45,19);cout<<pasos;

    }while(pasos!=0);

    }break;

    default :goto variable;

    }

    };goto dibujo;

    case '2':{ //fases

    setcolor(12);

    circle(500,170,5);

    n=0;

    do{

    n++;

    if (n==1) {

    setcolor(10);

    circle(x+20,y,5);

    circle(x+40,y,5);

    circle(x+60,y,5);

    outportb(0X378,1);

    setcolor(14);

    circle(x,y,5);}

    if (n==2) {

    setcolor(10);

    circle(x,y,5);

    circle(x+40,y,5);

    circle(x+60,y,5);

    outportb(0X378,2);

    setcolor(14);

    circle(x+20,y,5);}

    if (n==3) {

    setcolor(10);

    circle(x+20,y,5);

    circle(x,y,5);

    circle(x+60,y,5);

    outportb(0X378,4);

    setcolor(14);

    circle(x+40,y,5);}

    if (n==4) {

    setcolor(10);

    circle(x+20,y,5);

    circle(x+40,y,5);

    circle(x,y,5);

    outportb(0X378,8);

    setcolor(14);

    circle(x+60,y,5);}

    delay(tiempo);

    }while(n!=5);

    n=4;

    };goto menu;

    case '3':{ //pasos a la derecha

    setcolor(12);

    circle(500,190,5);

    setcolor(15);

    do{

    n++;

    if (n==5) n=1;

    if (n==1) {

    setcolor(10);

    circle(x+20,y,5);

    circle(x+40,y,5);

    circle(x+60,y,5);

    outportb(0X378,1);

    setcolor(14);

    circle(x,y,5);}

    if (n==2) {

    setcolor(10);

    circle(x,y,5);

    circle(x+40,y,5);

    circle(x+60,y,5);

    outportb(0X378,2);

    setcolor(14);

    circle(x+20,y,5);}

    if (n==3) {

    setcolor(10);

    circle(x+20,y,5);

    circle(x,y,5);

    circle(x+60,y,5);

    outportb(0X378,4);

    setcolor(14);

    circle(x+40,y,5);}

    if (n==4) {

    setcolor(10);

    circle(x+20,y,5);

    circle(x+40,y,5);

    circle(x,y,5);

    outportb(0X378,8);

    setcolor(14);

    circle(x+60,y,5);}

    delay(tiempo);

    }while(!kbhit());

    };goto menu;

    case '4':{ //pasos a la izquierda

    setcolor(12);

    circle(500,210,5);

    setcolor(15);

    do{

    n--;

    if (n==-1) n=4;

    if (n==0) n=4;

    if (n==1) {

    setcolor(10);

    circle(x+20,y,5);

    circle(x+40,y,5);

    circle(x+60,y,5);

    outportb(0X378,1);

    setcolor(14);

    circle(x,y,5);}

    if (n==2) {

    setcolor(10);

    circle(x,y,5);

    circle(x+40,y,5);

    circle(x+60,y,5);

    outportb(0X378,2);

    setcolor(14);

    circle(x+20,y,5);}

    if (n==3) {

    setcolor(10);

    circle(x+20,y,5);

    circle(x,y,5);

    circle(x+60,y,5);

    outportb(0X378,4);

    setcolor(14);

    circle(x+40,y,5);}

    if (n==4) {

    setcolor(10);

    circle(x+20,y,5);

    circle(x+40,y,5);

    circle(x,y,5);

    outportb(0X378,8);

    setcolor(14);

    circle(x+60,y,5);}

    delay(tiempo);

    }while(!kbhit());

    };goto menu;

    case '5': {

    outportb(0x378,0);

    exit(0);

    }

    default: goto menu;

    }

    }

    void main()

    {

    clrscr();

    outportb(0x378,0);

    int gdriver = DETECT, gmode, errorcode;

    int midx, midy;

    initgraph(&gdriver, &gmode," c:\borlandc\bgi\egavga.bgi");

    errorcode = graphresult();

    directvideo=0;

    if (errorcode != grOk)

    {

    printf("Graphics error: %s\n", grapherrormsg(errorcode));

    printf("Press any key to halt:");

    getch();

    exit(1);

    }

    setbkcolor(5);

    presentacion();

    for (int j=1;j<=getmaxx();j++)

    {

    setcolor(5);

    rectangle(j,1,getmaxx(),getmaxy());

    }

    n=0;

    menu();closegraph();

    }

    B. Presente otro programa editado en C++ o Turbo Pascal donde se use otras técnicas de control para el motor de paso. Considere una mejora en la presentación grafica y en el menú de opciones.

    program MOTORPASO A PASO; {EN TURBO PASCAL}

    USES CRT;

    VAR

    OPC:CHAR;

    retardo,pasos,a,b,c,d,i:integer;

    const

    puerto=$378;

    BEGIN

    CLRSCR;

    TEXTBACKGROUND(blue);

    TEXTCOLOR(green);

    gotoxy( 16,2);writeln('UNIVERSIDAD NACIONAL DEL CALLAO');

    gotoxy( 12,3);writeln('FACULTAD DE INGENIERIA ELECTRICA Y ELECTRONICA');

    gotoxy( 13,5);writeln('ESCUELA PROFESIONAL DE INGENIERIA ELECTRICA ');

    gotoxy( 7,8);writeln('LABORATORIO DE CONTROL DE PROCESOS Y ELECTRONICA INDUSTRIAL');

    gotoxy( 17,10);writeln('CONTROL DE MOTOR DE PASOS MEDIANTE PC');

    gotoxy( 17,12);write('APONTE VALVERDE LINCOLN 952541-J');

    gotoxy( 17,14);write('CONDE QUISPE FRANK 952563-C');

    gotoxy( 17,16);write('SANDOVAL VALVERDE PERCY 952547-H');

    gotoxy( 17,18);write('VALER SEHUIN ORLANDO 952540-F');

    READKEY;

    REPEAT

    CLRSCR;

    TEXTBACKGROUND(blue);

    TEXTCOLOR(green);

    GOTOXY(19,2);WRITELN(' MOTOR DE PASOS');

    GOTOXY(19,3);WRITELN('---------------------------------');

    GOTOXY(19,4);WRITELN('DERECHA ......................D');

    GOTOXY(19,5);WRITELN('IZQUIERDA.....................I');

    GOTOXY(19,6);WRITELN('PARADA........................P');

    GOTOXY(19,7);WRITELN('SALIR.........................S');

    GOTOXY(19,8);WRITELN('--------------------------------');

    GOTOXY(19,10);WRITE('ESCOJA UNA OPCION');READKEY;

    OPC:=UPCASE(READKEY);

    CASE OPC OF

    'D' : BEGIN

    repeat

    CLRSCR;

    GOTOXY(8,10);write('GIRO A LA DERECHA');

    GOTOXY(8,12);write('Ingrese el numero de pasos = ');readln(pasos);

    GOTOXY(8,14);write('Ingrese el retardo = ');readln(retardo);

    GOTOXY(8,16);write('Ingrese el primer numero = ');readln(a);

    GOTOXY(8,18);write('Ingrese el segundo numero = ');readln(b);

    GOTOXY(8,20);write('Ingrese el tercer numero = ');readln(c);

    GOTOXY(8,22);write('Ingrese el cuarto numero = ');readln(d);

    i:=0;

    repeat

    GOTOXY(8,10);write('GIRO A LA DERECHA');

    Port[puerto]:=a;

    DELAY(retardo);

    Port[puerto]:=b;

    DELAY(retardo);

    Port[puerto]:=c;

    DELAY(retardo);

    Port[puerto]:=d;

    DELAY(retardo);

    i:=i+1;

    UNTIL i>pasos;

    clrscr;

    gotoxy(8,12);write('Para continuar presione una tecla, para salir presione esc');readkey;

    until readkey=#27;

    END;

    'I': BEGIN

    repeat

    CLRSCR;

    GOTOXY(8,10);write('GIRO A LA IZQUIERDA');

    GOTOXY(8,12);write('Ingrese el numero de pasos = ');readln(pasos);

    GOTOXY(8,14);write('Ingrese el retardo = ');readln(retardo);

    GOTOXY(8,16);write('Ingrese el primer numero = ');readln(a);

    GOTOXY(8,18);write('Ingrese el segundo numero = ');readln(b);

    GOTOXY(8,20);write('Ingrese el tercer numero = ');readln(c);

    GOTOXY(8,22);write('Ingrese el cuarto numero = ');readln(d);

    i:=0;

    repeat

    GOTOXY(8,10);write('GIRO A LA IZQUIERDA');

    Port[puerto]:=a;

    DELAY(retardo);

    Port[puerto]:=b;

    DELAY(retardo);

    Port[puerto]:=c;

    DELAY(retardo);

    Port[puerto]:=d;

    DELAY(retardo);

    i:=i+1;

    UNTIL i>pasos;

    clrscr;

    gotoxy(8,12);write('Para continuar presione una tecla, para salir presione esc');readkey;

    until readkey=#27;

    END;

    'P' :BEGIN

    REPEAT

    CLRSCR;

    GOTOXY(10,20);writeln('PARAR');

    GOTOXY(10,23);writeln('PRESIONE UNA TECLA PARA CONTINUAR...');

    Port[puerto]:=0;

    DELAY(1000);

    UNTIL KEYPRESSED;

    END;

    'S' : EXIT;

    END;

    UNTIL (READKEY= 'S') OR (READKEY= 's') ;

    end.

    Control de motor de paso

    Control de motor de paso

    Control de motor de paso

    Control de motor de paso

    Control de motor de paso