• Viernes 29 de Marzo de 2024, 15:10

Autor Tema:  Control de Motor paso a paso a través de un PIC  (Leído 16071 veces)

Quicksilver

  • Miembro activo
  • **
  • Mensajes: 93
  • Nacionalidad: co
    • Ver Perfil
Control de Motor paso a paso a través de un PIC
« en: Miércoles 30 de Julio de 2008, 03:44 »
0
Compañeros, Picmanianos, mis estimados ratones de programación... vengo por aca con mis dudas, sugerencias y flores para todos los usuarios del foro.

Actualmente me encuentro desarrollando un programita para lo que posiblemente puede ser en el futuro un brazo robotico, esperemos que si, pondré aca el código que he implementado y explicaré mis dudas, espero que os entiendan.

Pienso controlar mi brazo robótico a través de motores paso a paso, en este momento, he hecho el control de un solo motor, a través de 2 pulsadores, que cuando lo mantengo pulsado, el motor gira para un lado y cuando lo suelto, se queda en el paso en el cual se encuentra en ese instante, y si pulso el otro pulsador, pasa exacatamente lo mismo, salvo que gira en el otro sentido; sin embargo, he tenido problema con el manejo del retardo, pues, en mucha parte influye esto, pues, o no alcanza a energizar bien la bobina, o salta a otro paso, espero que me puedan ayudar a mejorar mi programa, para ver como puedo implementarlo de una mejor forma.

Para la salida del pic al motor, tengo un arreglo de transistores DARLINGTON, en un encapsulado, el ULN2803, por ahora no tengo ningún montaje hecho, solo lo he simulado en proteus., y mi código lo estoy haciendo en CCS C.

También he visto que lo puedo hacer a través de Servo motores, o motores paso a paso pero controlados por PWM, sin embargo, considero un poco mas complicado esta parte.

Así mis estimados, os dejo mi código aca abajo, y el circuto hecho en PROTEUS. Acepto sugerencias y reclamos, ah y muchisimas gracias a todos y muchos Exitos con sus proyectos y circuitos.



Código: Text
  1. #include <16F877.h>
  2. #use delay(clock=1000000)
  3. #fuses NOWDT,NOPROTECT,NOLVP,NODEBUG,PUT
  4. int retardo;
  5. void main()
  6. { retardo=300; //CON ESTE VALOR SE CAMBIA LA VELOCIDAD DE GIRO DEL MOTOR
  7. WHILE(input(PIN_C0))  // INICIALIZO LOS PINES EN VALOR BAJO, PARA QUE EL MOTOR NO SE MUEVA
  8.  {
  9.    OUTPUT_LOW(PIN_B0);
  10.    OUTPUT_LOW(PIN_B1);
  11.    OUTPUT_LOW(PIN_B2);
  12.    OUTPUT_LOW(PIN_B3);
  13.  
  14.  }
  15. do{
  16. if(!input(pin_C0)&&(input(pin_c1)))     // GIRO EN UN SENTIDO (GIRO 1)
  17. {
  18.    OUTPUT_LOW(PIN_B0);
  19.    OUTPUT_HIGH(PIN_B1);
  20.    OUTPUT_LOW(PIN_B2);
  21.    OUTPUT_LOW(PIN_B3);
  22.    delay_ms(retardo); }if(!input(pin_C0)&&(input(pin_c1)))  // GIRO EN UN SENTIDO (GIRO 1)
  23. {
  24.    OUTPUT_LOW(PIN_B0);
  25.    OUTPUT_LOW(PIN_B1);
  26.    OUTPUT_HIGH(PIN_B2);
  27.    OUTPUT_LOW(PIN_B3);
  28.    delay_ms(retardo); }if(!input(pin_C0)&&(input(pin_c1)))   // GIRO EN UN SENTIDO (GIRO 1)
  29. {
  30.    OUTPUT_LOW(PIN_B0);
  31.    OUTPUT_LOW(PIN_B1);
  32.    OUTPUT_LOW(PIN_B2);
  33.    OUTPUT_HIGH(PIN_B3);
  34.    delay_ms(retardo); }if(!input(pin_C0)&&(input(pin_c1))) // GIRO EN UN SENTIDO (GIRO 1)
  35. {
  36.    OUTPUT_HIGH(PIN_B0);
  37.    OUTPUT_LOW(PIN_B1);
  38.    OUTPUT_LOW(PIN_B2);
  39.    OUTPUT_LOW(PIN_B3);
  40.    delay_ms(retardo); }if(input(pin_C0)&&(!input(pin_c1)))// GIRO EN UN SENTIDO (GIRO 2)
  41. {
  42.    OUTPUT_HIGH(PIN_B0);
  43.    OUTPUT_LOW(PIN_B1);
  44.    OUTPUT_LOW(PIN_B2);
  45.    OUTPUT_LOW(PIN_B3);
  46.    delay_ms(retardo); }if(input(pin_C0)&&(!input(pin_c1)))  // GIRO EN UN SENTIDO (GIRO 2)
  47. {
  48.    OUTPUT_LOW(PIN_B0);
  49.    OUTPUT_LOW(PIN_B1);
  50.    OUTPUT_LOW(PIN_B2);
  51.    OUTPUT_HIGH(PIN_B3);
  52.    delay_ms(retardo); }if(input(pin_C0)&&(!input(pin_c1)))   // GIRO EN UN SENTIDO (GIRO 2)
  53. {
  54.    OUTPUT_LOW(PIN_B0);
  55.    OUTPUT_LOW(PIN_B1);
  56.    OUTPUT_HIGH(PIN_B2);
  57.    OUTPUT_LOW(PIN_B3);
  58.    delay_ms(retardo); }if(input(pin_C0)&&(!input(pin_c1))) // GIRO EN UN SENTIDO (GIRO 2)
  59. {
  60.    OUTPUT_LOW(PIN_B0);
  61.    OUTPUT_HIGH(PIN_B1);
  62.    OUTPUT_LOW(PIN_B2);
  63.    OUTPUT_LOW(PIN_B3);
  64.    delay_ms(retardo); }}while(true);
  65. }
  66.  
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.
Everything that has a beginning has an end

patitofeo

  • Miembro MUY activo
  • ***
  • Mensajes: 145
    • Ver Perfil
Re: Control de Motor paso a paso a través de un PIC
« Respuesta #1 en: Viernes 22 de Agosto de 2008, 16:04 »
0
Para necesitar menos energia prueba a escitar en la siguiente secuencia:
Código: Text
  1. output_B(0x03);  //0011
  2. output_B(0x06);  //0110
  3. output_B(0x0C);  //1100
  4. output_B(0x09);  //1001
  5.  

Escitando de esta manera evitaras probablemente que se salten pasos.

Yo utilizaria ademas esta forma para dar valores a los puertos (output_B). En cuanto a la velocidad (retardo) depende del motor y del driver. Si lo haces muy lento quizá de trompicones y vibre mucho una vez ensamblada la parte mecánica.

Te aconsejo que te olvides ya del proteus y comiences a simular la realidad, por que el motor nunca llegará a moverse desde proteus.

Un saludo y espero haberte ayudado. :hola: