Autor Tema: Control de un motor a pasos  (Leído 2249 veces)

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

Desconectado Jabeeb2K8

  • PIC10
  • *
  • Mensajes: 10
Control de un motor a pasos
« en: 26 de Marzo de 2008, 17:41:44 »
:)
« Última modificación: 09 de Abril de 2008, 04:28:44 por Jabeeb2K8 »

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
Re: Control de Stepper con PIC18F458
« Respuesta #1 en: 26 de Marzo de 2008, 18:39:04 »
Regla de oro: En la interrupciones, lo menos tiempo posible.

Bien, mi solucion (habra otras 1000 mejores o peores):

**define una variable: 
Código: [Seleccionar]
volatile unsigned char MOTOR_ESTADO=0;

**Dentro del vector interrupcion:
Código: [Seleccionar]
   if(INTCONbits.INT0IF) {MOTOR_ESTADO=0; INTCONbits.INT0IF=0;}
   if(INTCON3bits.INT1IF)  {MOTOR_ESTADO=1;INTCON3bits.INT1IF=0;}
   if(INTCON3bits.INT2IF)   {MOTOR_ESTADO=2;INTCON3bits.INT2IF=0;}
**y nada mas.

Y en el programa principal:
Código: [Seleccionar]
switch(MOTOR_ESTADO)
{
     case 0: motor_stop();
                 break;
     case 1: motor_backward();
                 break;
     case 2: motor_forward();
                 break;
}


Con eso deberia de valer.

« Última modificación: 26 de Marzo de 2008, 18:43:22 por manex_1987 »

Desconectado Jabeeb2K8

  • PIC10
  • *
  • Mensajes: 10
Re: Control de Stepper con PIC18F458
« Respuesta #2 en: 26 de Marzo de 2008, 19:18:23 »
me funcionó perfectamente manex_1987, muchas gracias!  :idea:

Ahora entiendo porque no me funcionaba, solo una funcion estaba dentro del ciclo principal, y con la solucion que me proporcionas, ahora las 3 funciones estan dentro del mismo ciclo.

De nuevo, muchas gracias!

Por cierto, tambien se me ocurrio controlar la velocidad del motor. Ahorita de momento se me ocurre poner una variable "x" dentro del delay y controlarlo, pero se puede hacer tambien mediante una interrupcion? Veo que los pins RB4~RB7 tambien fungen como interrupciones, pero de manera diferente, como cambio de estado. No pueden funcionar de la misma manera, del cambio 0 a 1 o viceversa? Sin embargo, un amigo me sugirio un diseño que vio en internet, para controlar la velocidad, usando un potenciometro y la carga de un capacitor. (Agrego como archivo adjunto el archivo de proteus, la parte del circuito que les menciono la acabo de agregar a lo que ya tenia).

Segun me explico, basicamente la velocidad del motor disminuye al aumentar el potenciometro. El transistor se enciende cuando el pin RB7 se pone en "1" logico. Estando asi, la carga del capacitor fluye a traves del transistor y el voltaje de ambas terminales del capacitor se ponen casi en 0V. Cuando el pin RB76 se ponen en "0", el transistor se apaga, la carga fluye del potenciometro y la resistencia en serie hacia el capacitor y este se empieza a cargar. Y a diferencia de la anterior condicion, el voltaje de ambas terminales del capacitor va aumentando hasta que se termina de cargar, el voltaje del cap lo detecta RB5. Ahi es donde el programa supuestamente causa una interrupcion checando el pin RB5 despues de que RB7 se pone en "0" y RB7 se pone en "1".  Y de ahi, al tener un valor pequeño en el potenciometro, el tiempo de carga del capacitor es pequeño y el motor gira rapidamente, y viceversa.

Acabo de poner el diseño, y sin hacer nada en el codigo, trato de mover el potenciometro y no observo ningun cambio, ni en el pin RB7 ni en RB5.

Creen que sea posible o es mejor (si es que es posible tambien) usar botones para seleccionar velocidades fijas, usando la misma tecnica de interrupciones usadas para los pins RB0~RB3?

Saludos!

Desconectado gu1llermo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 217
Re: Control de Stepper con PIC18F458
« Respuesta #3 en: 26 de Marzo de 2008, 21:38:37 »
Para que controles la velocidad te recomendaría que declarases dos variables globales más, estas son: aux (2 bytes) y cont (1 byte), ambas la incializas en 0 la primera vez y una constante llamada velocidad le puedes dar el valor de 1000 para empezar, luego aumentas o disminuyes según quieras, porque si el motor está muy lento tu escuchas que da como golpes, es decir, va tac tac tac... es muy notorio eso, y si vá muy rápido, simplemente no se mueve  :lol: así que puedes jugar con ese valor de velocidad hasta que tengas el que consideres adecuado.

Luego
**Dentro del vector interrupcion:
   if(INTCONbits.INT0IF) {MOTOR_ESTADO=0; INTCONbits.INT0IF=0;}
   if(INTCON3bits.INT1IF)  {MOTOR_ESTADO=1;INTCON3bits.INT1IF=0;cont=0;}
   if(INTCON3bits.INT2IF)   {MOTOR_ESTADO=2;INTCON3bits.INT2IF=0;cont=0;}
...

Y en la rutina motor_backward()
Código: [Seleccionar]
cont++;
if (cont>=velocidad){// velocidad puedes colocar = 1000 para empezar, esto significa que cada
// 1000 veces que pase por aqui le mandamos un pulso al motor de paso
   cont=0;
   switch (aux){
      case 1:
         aux=8;
         PORTC=8;
      break;
                 
      case 8:
         aux=4;
         PORTC=4;
      break;
                 
      case 4:
         aux=2;
         PORTC=2;
      break;
                 
      case 2:
         aux=1;
         PORTC=1;
      break;
   }
}

Y en la rutina motor_forward()
Código: [Seleccionar]
cont++;
if (cont>=velocidad){// velocidad puedes colocar = 1000 para empezar, esto significa que cada
// 1000 veces que pase por aqui le mandamos un pulso al motor de paso
   cont=0;
   switch (aux){
      case 1:
         aux=2;
         PORTC=2;
      break;
                 
      case 2:
         aux=4;
         PORTC=4;
      break;
                 
      case 4:
         aux=8;
         PORTC=8;
      break;
                 
      case 8:
         aux=1;
         PORTC=1;
      break;
   }
}

Saludos.

Desconectado Jabeeb2K8

  • PIC10
  • *
  • Mensajes: 10
Re: Control de Stepper con PIC18F458
« Respuesta #4 en: 28 de Marzo de 2008, 08:23:11 »
gracias gu1llermo, pero oye, tengo una pregunta, de esa forma tu estas controlando la velocidad en el programa, cierto? por que lo que yo busco es controlarlo externamente, ya sea con un boton o con un potenciometro. Quiero usar las otras interrupciones que quedan (RB4 a RB7) pero apenas estoy haciendo pruebas e investigando sobre este puerto, y no se si se pueda utilizar igual que las interrupciones de RB0 a RB3.

De hecho se me ocurrio con un boton en RB4, donde al presionarlo cambie la velocidad. Es decir, presiono el boton, ocurre la interrupcion y se aumenta un contador (inicializado en 0). Este contador va en un switch donde se selecciona el valor de una variable que iria en la funcion del delay. Y por supuesto, en caso de que esta variable contador llega a 4, por ejemplo, la cual seria la maxima velocidad, se regresaria a 0, para regresar el motor a su velocidad original. Estoy haciendo pruebas pero aun no me sale.

Se pueden usar estas interrupciones tal como las de cambio de flanco en RB0, RB1 y RB2?

Saludos

Desconectado gu1llermo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 217
Re: Control de Stepper con PIC18F458
« Respuesta #5 en: 28 de Marzo de 2008, 09:20:19 »
Claro, yo también controlo cuántos pasos tengo qe mandar a mover al motor.

Si quieres controlar la velocidad con dos interrupciones más, en una aumenta y en otra disminuyes, entonces declara a velocidad como una variable de 2 bytes y en las interrupciones la aumentas o la disminuyes y éste código te sirve perfectamente, es el que uso para controlar la velocidad de mi motor paso a paso, pero mi velocidad es constante, no necesito variarla, la fije y ya.

Saludos.
« Última modificación: 28 de Marzo de 2008, 09:23:39 por gu1llermo »

Desconectado Jabeeb2K8

  • PIC10
  • *
  • Mensajes: 10
Re: Control de Stepper con PIC18F458
« Respuesta #6 en: 28 de Marzo de 2008, 09:35:21 »
gracias gu1llermo, lo intentaré.


Entonces no hay problema en utilizar las interrupciones del puerto RB4 a RB7 tal como se utilizan los de RB0 a RB3?