Autor Tema: Motores paso a paso, intetar hacer ir adelante y atras  (Leído 2282 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Motores paso a paso, intetar hacer ir adelante y atras
« en: 10 de Junio de 2015, 15:50:45 »
Estimados,

Nuevamente recurro a su ingenio, estoy tratando de hacer girar un motor paso a paso lo cual he logrado, tanto en dirección horario como anti horario, hasta ahí el asunto fue sencillo, ya que no requiere mucha ciencia entender el como funciona. Sin embargo el problema que tengo es poder lograr que al presionar el botón 1 gire en sentido horario manteniendo el giro, y al presionar el botón 2 el motor gire en sentido anti horario. Para que entiendan les dejo dos programaciones que efectuado para el pic 18f4550, Saludos.

A continuación les dejo unas lineas de codigo que hacen que el motor gire en sentido horario y anti horario, pero no que se mantenga el giro


Código: [Seleccionar]
int retardo;

    void derecha() //giro a la derecha
    {
       output_a(0x01);
       delay_ms(retardo);
       output_a(0x03);
       delay_ms(retardo);
       output_a(0x02);
       delay_ms(retardo);
       output_a(0x06);
       delay_ms(retardo);
       output_a(0x04);
       delay_ms(retardo);
       output_a(0x0c);
       delay_ms(retardo);
       output_a(0x08);
       delay_ms(retardo);
       output_a(0x09);
       delay_ms(retardo);
               }     
     void izquierda()//giro sentido a la izquierda
     {
       
     
       output_a(0x01);
       delay_ms(retardo);
       output_a(0x09);
       delay_ms(retardo);
       output_a(0x08);
       delay_ms(retardo);
       output_a(0x0c);
       delay_ms(retardo);
       output_a(0x04);
       delay_ms(retardo);
       output_a(0x06);
       delay_ms(retardo);
       output_a(0x02);
       delay_ms(retardo);
       output_a(0x03);
       delay_ms(retardo);
      }
     
     
      void main()
      {
         retardo=100;
         while(true)
          {
            if(input(sw1)==0)// si el pulsador es activado el motor comienza a girar a la derecha
            derecha();
            else
            {
                if(input(sw2)==0)//si el pulsador es activado comienza a  girar a la izquierda
                izquierda();
            }
          }
      }
     

Esta otra linea de código, hace que el motor gire en sentido horario u/o Horario manteniéndose en cualquiera de ambos sentidos, pero al querer cambiar el sentido este no lo hace.

Código: [Seleccionar]
int retardo;

    void derecha() //giro a la derecha
    {
    do{
       output_a(0x01);
       delay_ms(retardo);
       output_a(0x03);
       delay_ms(retardo);
       output_a(0x02);
       delay_ms(retardo);
       output_a(0x06);
       delay_ms(retardo);
       output_a(0x04);
       delay_ms(retardo);
       output_a(0x0c);
       delay_ms(retardo);
       output_a(0x08);
       delay_ms(retardo);
       output_a(0x09);
       delay_ms(retardo);
               }     
       while(1);
    }
     void izquierda()//giro sentido a la izquierda
     {
        do{
     
       output_a(0x01);
       delay_ms(retardo);
       output_a(0x09);
       delay_ms(retardo);
       output_a(0x08);
       delay_ms(retardo);
       output_a(0x0c);
       delay_ms(retardo);
       output_a(0x04);
       delay_ms(retardo);
       output_a(0x06);
       delay_ms(retardo);
       output_a(0x02);
       delay_ms(retardo);
       output_a(0x03);
       delay_ms(retardo);
      }
      while(1);
     }
     
     
      void main()
      {
         retardo=100;
         while(true)
          {
            if(input(sw1)==0)// si el pulsador es activado el motor comienza a girar a la derecha
            derecha();
            else
            {
                if(input(sw2)==0)//si el pulsador es activado comienza a  girar a la izquierda
                izquierda();
            }
          }
      }


Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2980
Re: Motores paso a paso, intetar hacer ir adelante y atras
« Respuesta #1 en: 10 de Junio de 2015, 15:58:13 »
hola evonkc

cuando entras en una de las dos funciones de girar, tu programa nunca mas vuelve a salir a consecuencia del do while(1), tu programa se quedara siempre girando en un sentido y no volvera a detectar los pulsadores ni nada

para arreglarlo debes de quitar el do while1
y en el bucle principal poner

Código: [Seleccionar]
void main()
      {
         retardo=100;
         while(true)
          {
            if(input(sw1)==0  && input(sw2)!=0)// si el pulsador es activado el motor comienza a girar a la derecha
            {
                    derecha();
            }
            
            if(input(sw2)==0) && input(sw1)!=0)//si el pulsador es activado comienza a  girar a la izquierda
           {
                    izquierda();
            }                
          }
      }


de todas formas te aconsejo que remodeles tu codigo y te olvides de los delay, es mucho mejor trabajar con los timer, ya que mientras tu micro este ejecutando el delay durante ese tiempo tampoco detectaras pulsaciones ni nada de nada.

un saludo
« Última modificación: 10 de Junio de 2015, 16:00:26 por juaperser1 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Motores paso a paso, intetar hacer ir adelante y atras
« Respuesta #2 en: 10 de Junio de 2015, 16:08:32 »
Como dice juaperser, el while esta mal puesto. Lo que tal ves vos queres es que siga girando sin tener que tener presionado el boton. Lo cual lo de juaperser no te va a funcionar.

De todas formas si queres hacerlo con el while entonces seria algo como esto:

Esta solucion que voy a dar yo es mala, es mala por como esta diseñada la funcion ya que si o si te tenes que comer todos esos retardos de 100ms, lo cual si queres cambiar de sentido lo vas a tener que tener presionado al otro boton hasta que llegue al if, tal ves estamos hablando de 1/2 segundos

Código: C
  1. void derecha() //giro a la derecha
  2.     {
  3.      while(1)
  4.       {
  5.        output_a(0x01);
  6.        delay_ms(retardo);
  7.        output_a(0x03);
  8.        delay_ms(retardo);
  9.        output_a(0x02);
  10.        delay_ms(retardo);
  11.        output_a(0x06);
  12.        delay_ms(retardo);
  13.        output_a(0x04);
  14.        delay_ms(retardo);
  15.        output_a(0x0c);
  16.        delay_ms(retardo);
  17.        output_a(0x08);
  18.        delay_ms(retardo);
  19.        output_a(0x09);
  20.        delay_ms(retardo);
  21.        if (!input(sw2)) {break;}
  22.        }
  23.  }
  24.  
  25.      void izquierda()//giro sentido a la izquierda
  26.      {
  27.        while(1)
  28.        {
  29.        output_a(0x01);
  30.        delay_ms(retardo);
  31.        output_a(0x09);
  32.        delay_ms(retardo);
  33.        output_a(0x08);
  34.        delay_ms(retardo);
  35.        output_a(0x0c);
  36.        delay_ms(retardo);
  37.        output_a(0x04);
  38.        delay_ms(retardo);
  39.        output_a(0x06);
  40.        delay_ms(retardo);
  41.        output_a(0x02);
  42.        delay_ms(retardo);
  43.        output_a(0x03);
  44.        delay_ms(retardo);
  45.        if (!input(sw1)) {break;}
  46.        }
  47.  }

Lo mejor creo que es implementar un array con los valores del puerto

Código: C
  1. puerto[8] = {0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}

Para ir para un lado solo deberias incrementar el indice, para el otro decrementar y cuando llegas a tope simplemente le asignas el valor al indice del ultimo o primer valor, segun cual necesites

Código: C
  1. int i=0;
  2. if(input(sw1)==0){  // Si es igual a 0 entra aca y no sale hasta que se presione el otro boton
  3. while(1)
  4. {
  5. output_a(puerto[i++]);         // i++ para la derecha e i-- para la izquierda.
  6. if (i == 8) {i=0;} // suponiendo que sean 8 valores, para el otro lado seria if(i==0) {i=7;}
  7. delay_ms(retardo);
  8. if(input(sw2)==0) break;
  9. }
  10. }

Eso simplificaria bastante tu programa y ademas permite que arranque con los valores que dejo cuando iba girando al lado contrario, tambien podes cambiar de giro en cualquier momento y no solo cuando termine toda la vuelta.
otra cosa solo tenes un retardo como limitante.
« Última modificación: 10 de Junio de 2015, 16:23:35 por KILLERJC »

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Re: Motores paso a paso, intetar hacer ir adelante y atras
« Respuesta #3 en: 12 de Junio de 2015, 13:25:11 »
Primero que todo agradecerle a los dos, ambos casos me han dilucidado un método para poder salir de una rutina mediante una interrupción externa y es algo que se aprende de a poco y a medida que se avanza en este mundo de la programación.

KillerJC, tu método me ha ido de maravillas hace lo que deseaba, ahora puedo avanzar mas con este tema y lograr hacer algo mas elaborado.

Juaperser, voy a elaborar a seguir tu recomendación de hacer retardo por medio del Timer y veré como lo puedo integrar.


Saludos a ambos, y repito gracias por sus comentarios.


 

anything