sábado, 13 de septiembre de 2014

Creación de un driver alternativo al A4988 con PIC12f675.

Definición de A4988.

Definition of A4988.



El A4988 es un Controlador Stepper Motor que trabaja con reguladores de voltaje. El producto posee dos reguladores de voltaje(5v y 3.3v), separando la parte lógica de aquella relacionada con el motor. Este módulo con un limitador de corriente ajustable, sobrecorriente y protección de sobrecalentamiento, y posee 5 resoluciones diferentes (Down to1/16-step). Opera de 8 a 35V y puede suministrar aproximadamente 1 amperio por fase sin un disipador de calor o flujo de aire forzado ( Se debe agregar disipador para corrientes mayores de 700 mA).




conexiones de potencia
El controlador necesita una tensión de alimentación de la lógica (3 - 5,5 Vpara ser conectado entre los pines VDD y GND y una tensión de alimentación de motor (8 - 35 Vpara ser conectado a través VMOT y GNDEl voltaje lógico puede ser suministrado desde una fuente externa, tal como la alimentación de la lógica del resto del sistemao por puenteando la salida de la V 5 V o 3,3 salidas del regulador de tensión a VDDTambién hay montados en la superficie almohadillas que permiten la selección VDD a hacerse haciendo un puente de soldadura a través de las almohadillas adecuadasTenga en cuenta que los reguladores del conductor también se puede utilizar para otros electrónica de potencia en el sistema.
La fuente de alimentación del motor debe ser capaz de suministrar las corrientes previstos para los motores paso a paso se utiliza (picos de hasta 4 A).

Cuatro, seis y ocho hilos de motores paso a paso puede ser impulsado por la A4988, pueden funciona sin ningún problema, excepto los de 5 cables que esta unido por un cable común.


Paso (micropasotamaño
Motores paso a paso suelen tener una especificación de tamaño de paso (por ejemplo, 1,8 ° o 200 pasos por revolución), que se aplica a los pasos completos. Un controlador de micropasos tales como la A4988 permite resoluciones más altas, permitiendo posiciones intermedias de paso, que se consiguen por la activación de las bobinas intermedias con los niveles actuales. Por ejemplola conducción de un motor en el modo de un cuarto de paso dará el 200-paso por revolución del motor 800 micropasos por revolución mediante el uso de cuatro nivelesdiferentes de corriente.
La resolución (tamaño de paso) del selector de entradas (MS1, MS2, MS3) permitir la selección de las cinco resoluciones paso de acuerdo con la siguiente tabla. MS1 y MS3 tener 100kΩ internas pull-down y MS2 tiene un interior 50kΩ resistor pull-downasí que dejar estos tresalfileres Microstep selección de resultados desconectados en pleno modo paso a pasoPara los modos de micropaso para funcionar correctamenteel límite de corriente debe estar configurado lo suficientemente bajo (ver más abajo) de manera que la limitación de corriente se dedicanDe lo contrario, los actuales niveles intermedios no se mantiene correctamentey el motor efectivamente funcionar en un modo full-paso.


MS1MS2MS3Microstep Resolution
LowLowLowFull step
HighLowLowHalf step
LowHighLowQuarter step
HighHighLowEighth step
HighHighHighSixteenth step

Fuente consultada: http://www.rambal.com

Para que funcionara con cualquier Arduino expongo los código de funcionamiento para su estudio:

To make it work with any Arduino I set out the operation code for study:

int velocidad = 9;
int direccion = 8;
int reset = 9;
int pasos = 3500;

// the setup routine runs once when you press reset:
void setup() {            
  // initialize the digital pin as an output.
  pinMode(velocidad, OUTPUT);
  pinMode(direccion, OUTPUT);
  pinMode(reset, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(reset, LOW); //Mientras reset este en LOW el motor permanecerá apagado y no sufrirá. El chip apagará todos los puertos y no leerá comandos.
  delay(100);
  digitalWrite(reset, HIGH);   //Cuando reset se encuentre en HIGH el motor arrancará y leerá los comandos enviados.
  digitalWrite(direccion, HIGH);
    

  for (int i = 0; i<pasos; i++)   //Equivale al numero de vueltas (200 es 360º grados) o micropasos
  {
digitalWrite(velocidad, HIGH);  // This LOW to HIGH change is what creates the
digitalWrite(velocidad, LOW);   // al A4988 de avanzar una vez por cada pulso de energia.  
delayMicroseconds(1700); // Regula la velocidad, cuanto mas bajo mas velocidad.

  }

  digitalWrite(reset, LOW);   //Mientras reset este en LOW el motor permanecerá apagado y no sufrirá. El chip apagará todos los puertos y no leerá comandos.
  delay(100);
  digitalWrite(reset, HIGH);   //Cuando reset se encuentre en HIGH el motor arrancará y leerá los comandos enviados.
  digitalWrite(direccion, LOW);

  for (int i = 0; i<pasos; i++)   //Equivale al numero de vueltas (200 es 360º grados) o micropasos
  {
   
digitalWrite(velocidad, HIGH);   // LOW to HIGH hace que el motor avance ya que da la orden
digitalWrite(velocidad, LOW); // al A4988 de avanzar una vez por cada pulso de energia.
delayMicroseconds(1700);     // Regula la velocidad, cuanto mas bajo mas velocidad.
  }
}

Y su circuito:

And its circuit:






Ya sabiendo como se comporta el driver de Motor PAP bipolar ahora intentaremos hacernos un driver con un PIC12 f675 programado en PICC , aquí pondré un poco de información obtenido en la web lo que vamos a trabajar con ella:

En esquemático:

Already knowing how PAP Motor driver us a try now bipolar driver with PIC12 F675 scheduled PICC behaves, here I will put some information obtained from the web that we're going to work with it: 


In schematic:





Y su código ejemplo que había conseguido de  un sitio web para saber como actúa el microcontrolador cuando llegue el impulso STEP y DIR, el motor avanza un paso cada vez que llegue el impulso a la patilla STEP, mientras la patilla DIR controla el sentido del motor, si es ALTO girará un sentido y si es bajo girará por el otro sentido:

And his example code that had gotten a website to find out how the microcontroller works as the STEP and DIR pulse arrives, the motor advances one step each time you get the impulse to STEP pin, while the DIR pin controls the direction of the motor if HIGH rotate one way and if low will rotate the other direction:

#include <12F675.h>
/*#device ADC=10*/
#fuses INTRC_IO,NOWDT,NOPUT,NOPROTECT,NOCPD,NOMCLR
#use delay(clock=4000000)
#use standard_io(a)
#byte TRISIO      =  0x85 // Dirección Del TRISIO PORT
#byte GPIO        =  0x05 // Dirección del GPIO PORT
#define GP0 PIN_A0
#define GP1 PIN_A1
#define GP2 PIN_A2
#define GP3 PIN_A3
#define GP4 PIN_A4
#define GP5 PIN_A5
/*#byte OSCCAL = 0x80*/


/*******************************************************

*

*  driver de moteur pas a pas unipolaire (2 bobinages B1, B2 à point milieu)

*  les paires de bobines toujours alimentées en opposition de phase sont :

*  sur B1 : bobines B1A et B1C

*  sur B2 : bobines B2B et B2D

*  pilotage par deux phases compatible IF CNC25 : le cycle est le suivant :

*  N° seq : B1A B2B B1C B2D

*   0       ON  ON  OFF OFF

*   1       OFF ON  ON  OFF

*   2       OFF OFF ON  ON

*   3       ON  OFF OFF ON

*

*   p7 : GP0 = sortie bobine B1A

*   p6 : GP1 = sortie bobine B1C

*   p5 : GP2 = entrée step (doit être mis à 1, puis à 0 ==> avance d'un pas)direction (sens de rotation)

*   p4 : GP3 = entrée direction (sens de rotation)

*   p3 : GP4 = sortie bobine B2B

*   p2 : GP5 = sortie bobine B2D

*

***********************************************************/

/* programme principal */

/***********************/
void init()
{
  SET_TRIS_A (0b001100);
/*set_tris_a( 0b11111101 ); // set GP1 output, all other inputs*/
setup_comparator( NC_NC_NC_NC ); // disable comparators
setup_adc_ports( NO_ANALOGS ); // disable analog inputs
setup_adc( ADC_OFF ); // disable A2D

}
main (void)

{


   unsigned char numseq;   /* n° de sequence de mise ON des bobines */
   unsigned char direction; /* sens de rotation des moteurs (0 ou 1) */
   unsigned char i;

   init();



  
 /* initialisations */

   
   OUTPUT_A(0b100000);


   /*GPIO = 0b010001;*/      /* init du moteur : B1A, B2B ON*/

     numseq = 0;               /* init numero sequence */

filtre :

   do    {

   } while (input(GP2) == 0);   /* attente front montant bit step */

   direction = input(GP3);



   if (input(GP2) == 0) goto filtre;   /* filtre parasite */

   i = input(GP3);

   if (direction != i) goto filtre ; /* le bit direction doit être stable */



   do    {

      } while (input(GP2) == 1);   /* attente front descendant bit step */



   if (input(GP2) ==1) goto filtre ;

   if (direction == 0)   /* marche avant */

      {

         numseq++;

         if (numseq == 8) numseq = 0;

      }

   else                  /* marche arriere */

      {

         if (numseq == 0) numseq = 8;

         numseq--;

      }

   switch (numseq) {

      case 0:   

          /*GPIO = 0b010001;*/
          OUTPUT_A(0b100000);

           break;

      case 1:

          /*GPIO = 0b010010;*/
          OUTPUT_A(0b110000);

         break;

      case 2:

          /*GPIO = 0b100010;*/
          OUTPUT_A(0b010000);

         break;

      case 3:

          /*GPIO = 0b100001;*/
          OUTPUT_A(0b010010);

         break;
         
      case 4:   

          /*GPIO = 0b010001;*/
          OUTPUT_A(0b000010);

           break;

      case 5:

          /*GPIO = 0b010010;*/
          OUTPUT_A(0b000011);

         break;

      case 6:

          /*GPIO = 0b100010;*/
          OUTPUT_A(0b000001);

         break;

      case 7:

          /*GPIO = 0b100001;*/
          OUTPUT_A(0b100001);

         break;

      

      default : numseq = 0;

      }

   goto filtre;

}


Este código fue probado con Proteus sin ningún problema, pero cuando se probó con un arduino no funcionaba o giraba a trompicones, según dice el profesor que sería problema del sincronismo.

This code was tested with Proteus without any problem, but when tested with arduino not working or turned stumbled, according to the professor who would say sync problem.


El microcontrolador de la derecha genera impulso que manda al microcontrolador de la izquierda, dependiendo del pulsador de la izquierda el motor gira a la izquierda o a la derecha.
Así que nos toca a calentarnos la cabeza si es posible que funcionara, podríamos diseñar drivers para motores de 4, 5, 6, 8 cables, unipolares e bipolares y de cualquier potencia.

The microcontroller creates impulse right commands to the microcontroller on the left, depending on the button on the left engine turns left or right.
So we head up to keep warm if possible make it work, drivers could design engines 4, 5, 6, 8 cables, unipolar and bipolar and any power.





En la imagen podemos diferenciar un motor bipolar con otro unipolar, solo que uno tiene cuatro cables mientras el otro posee 6 cables con una toma común en cada uno.

In the picture we can differentiate bipolar unipolar motor engine with another, only one has four wires while the other has 6 wires with a common outlet in each.





Ahora lo que vamos a hacer es adaptar el driver con todos tipos de motores, pero como ya no me queda bipolares, he cogido uno cualquier motor unipolar y anular la toma intermedia como si fuera bipolar y probar si funciona.

Now what we will do is adapt the driver with all types of engines, but as I have no more bipolar, I have taken one any unipolar motor and void the intermediate tap like bipolar and test if it works.




Hemos ido modificando los valores de los impulsos  ALTO, BAJO para ver si responde, y en la imagen se ve el efecto de los impulsos.

We have modified the values ​​of the pulse HIGH, LOW to see if it responds, and the image effect is seen impulse.


Aquí vemos con detalles el montaje del Arduino con sus drivers, en realidad venía montado desde la fresadora que posee tres motores, lo he aprovechando para estudiar los impulso eligiendo uno de ellos para calcular el anchu de impulso y adaptarlo al PIC 12F675. 

Here we see in detail the assembly Arduino with drivers actually came mounted from the router that has three motors, I have to study the pulse advantage by choosing one of them to calculate the pulse width and adapt it to the PIC 12F675.






Y comprobando que efectivamente, los impuso trabaja a 1700 ms de anchura, lo que quiere decir que lo que muestra el osciloscopio van exacto para poder estudiar para diseñar con los PICS.

And verify that indeed, the works at 1700 ms pulse width, which means that the oscilloscope displays are exact to study for designing with PICS.







No hay comentarios:

Publicar un comentario