Advertisement
jgustavoam

DRV8825 + Arduino

Sep 28th, 2016
1,001
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.05 KB | None | 0 0
  1. // Controle de Motor de Passo Bipolar com Modulo driver DRV8825
  2. // https://jgamblog.wordpress.com/2016/09/24/tutorial-arduino-drv8825-motor-de-passo/
  3. // Modulo DRV8825 / Arduino Nano / IDE 1.6.7
  4. // OBS: Motor Unipolar 6 fios configurado como Bipolar
  5. // Gustavo Murta 26/set/2016
  6.  
  7. // Definições das Portas Digitais do Arduino
  8.  
  9. int RST = 8;              // Porta digital D08 - reset do DRV8825
  10. int SLP = 9;              // Porta digital D09 - dormir (sleep) DRV8825
  11. int ENA = 7;              // Porta digital D07 - ativa (enable) DRV8825
  12. int M0 = 4;               // Porta digital D04 - M0 do DRV8825
  13. int M1 = 5;               // Porta digital D05 - M1 do DRV8825
  14. int M2 = 6;               // Porta digital D06 - M2 do DRV8825
  15. int DIR = 3;              // Porta digital D03 - direção (direction) do DRV8825
  16. int STP = 2;              // Porta digital D02 - passo(step) do DRV8825
  17.  
  18. int MeioPeriodo = 30;   // MeioPeriodo no pulso em microsegundos  correcao de +10 ms 1490
  19. float PPS = 200;          // Pulsos por segundo
  20. boolean sentido = true;   // Variavel de sentido
  21. int PPR = 200;            // Número de passos por volta
  22. int Pulsos;               // Pulsos para o driver do motor
  23. int Voltas;               // voltas do motor
  24. float RPM;                // Rotacoes por minuto
  25.  
  26. void setup()
  27. {
  28.   Serial.begin(9600);
  29.   DDRD = DDRD | B11111100;  // Configura Portas D02 até D07 como saída
  30.   disa_DRV8825();           // Desativa as saidas DRV8825
  31.   FULL();                    // Seleciona modo Passo Completo
  32.  
  33.   DDRB = 0x0F;              // Configura Portas D08,D09,D10 e D11 como saída
  34.   digitalWrite(SLP, HIGH);  // Desativa modo sleep do DRV8825
  35.   rst_DRV8825();            // Reseta o chip DRV8825
  36.   digitalWrite(ENA, LOW);   // Ativa as saidas DRV8825
  37. }
  38.  
  39. void rst_DRV8825()
  40. {
  41.   digitalWrite(RST, LOW);     // Realiza o reset do DRV8825
  42.   delay (1);                  // Atraso de 1 milisegundo
  43.   digitalWrite(RST, HIGH);    // Libera o reset do DRV8825
  44.   delay (10);                 // Atraso de 10 milisegundos
  45. }
  46.  
  47. void disa_DRV8825()
  48. {
  49.   digitalWrite(ENA, HIGH);    // Desativa o chip DRV8825
  50.   delay (10);                 // Atraso de 10 milisegundos
  51. }
  52.  
  53. void ena_DRV8825()
  54. {
  55.   digitalWrite(ENA, LOW);     // Ativa o chip DRV8825
  56.   delay (10);                 // Atraso de 10 milisegundos
  57. }
  58.  
  59. void HOR()                                    // Configura o sentido de rotação do Motor
  60. {
  61.   digitalWrite(DIR, HIGH);                    // Configura o sentido HORÁRIO
  62.   Serial.print(" Sentido Horario ");
  63. }
  64.  
  65. void AHR()                                    // Configura o sentido de rotação do Motor
  66. {
  67.   digitalWrite(DIR, LOW);                     // Configura o sentido ANTI-HORÁRIO
  68.   Serial.print(" Sentido Anti-horario ");
  69. }
  70.  
  71. void PASSO()                    // Pulso do passo do Motor
  72. {
  73.   digitalWrite(STP, LOW);            // Pulso nível baixo
  74.   delayMicroseconds (MeioPeriodo);   // MeioPeriodo de X microsegundos
  75.   digitalWrite(STP, HIGH);           // Pulso nível alto
  76.   delayMicroseconds (MeioPeriodo);   // MeioPeriodo de X microsegundos
  77. }
  78.  
  79. void Frequencia()                     // Configura Frequencia dos pulsos
  80. {
  81.   Pulsos = PPR * Voltas;              // Quantidade total de Pulsos  PPR = pulsos por volta
  82.   PPS = 1000000 / (2 * MeioPeriodo);  // Frequencia Pulsos por segundo
  83.   RPM = (PPS * 60) / PPR;             // Calculo do RPM
  84. }
  85.  
  86. void FULL()
  87. {
  88.   PPR = 200;                // PPR pulsos por volta
  89.   digitalWrite(M0, LOW);    // Configura modo Passo completo (Full step)
  90.   digitalWrite(M1, LOW);
  91.   digitalWrite(M2, LOW);
  92.   Serial.println(" Passo Completo ");
  93. }
  94.  
  95. void HALF()
  96. {
  97.   PPR = 400;                 // PPR pulsos por volta
  98.   digitalWrite(M0, HIGH);    // Configura modo Meio Passo (Half step)
  99.   digitalWrite(M1, LOW);
  100.   digitalWrite(M2, LOW);
  101.   Serial.println(" Meio Passo ");
  102. }
  103.  
  104. void P1_4()
  105. {
  106.   PPR = 800;                // PPR pulsos por volta
  107.   digitalWrite(M0, LOW);    // Configura modo Micro Passo 1/4
  108.   digitalWrite(M1, HIGH);
  109.   digitalWrite(M2, LOW);
  110.   Serial.println(" Micropasso 1/4 ");
  111. }
  112.  
  113. void P1_8()
  114. {
  115.   PPR = 1600;                // PPR pulsos por volta
  116.   digitalWrite(M0, HIGH);    // Configura modo Micro Passo 1/8
  117.   digitalWrite(M1, HIGH);
  118.   digitalWrite(M2, LOW);
  119.   Serial.println(" Micropasso 1/8 ");
  120. }
  121.  
  122. void P1_16()
  123. {
  124.   PPR = 3200;               // PPR pulsos por volta
  125.   digitalWrite(M0, LOW);    // Configura modo Micro Passo 1/16
  126.   digitalWrite(M1, LOW);
  127.   digitalWrite(M2, HIGH);
  128.   Serial.println(" Micropasso 1/16 ");
  129. }
  130.  
  131. void P1_32()
  132. {
  133.   PPR = 6400;                // PPR pulsos por volta
  134.   digitalWrite(M0, HIGH);    // Configura modo Micro Passo 1/32
  135.   digitalWrite(M1, LOW);
  136.   digitalWrite(M2, HIGH);
  137.   Serial.println(" Micropasso 1/32 ");
  138. }
  139.  
  140. void TesteMotor()            // Gira motor nos dois sentidos
  141. {
  142.   HOR();
  143.   Serial.print(" / Voltas = ");
  144.   Serial.println(Voltas);
  145.   for (int i = 0; i <= Pulsos; i++)       // Incrementa o Contador
  146.   {
  147.     PASSO();                              // Avança um passo no Motor
  148.   }
  149.   disa_DRV8825();
  150.   delay (750) ;                           // Atraso de 750 mseg
  151.   ena_DRV8825();
  152.   AHR();
  153.   Serial.print(" / Voltas = ");
  154.   Serial.println(Voltas);
  155.   for (int i = 0; i <= Pulsos; i++)       // Incrementa o Contador
  156.   {
  157.     PASSO();                              // Avança um passo no Motor
  158.   }
  159.   disa_DRV8825();
  160.   delay (750) ;                           // Atraso de 750 mseg
  161.   ena_DRV8825();
  162. }
  163.  
  164. void Print_RPM ()
  165. {
  166.   Serial.print(" PPR = ");
  167.   Serial.print(PPR);
  168.   Serial.print(" / Pulsos = ");
  169.   Serial.println(Pulsos);
  170.   Serial.print(" 1/2 T = ");
  171.   Serial.print(MeioPeriodo);
  172.   Serial.print(" us / ");
  173.   Serial.print(" PPS = ");
  174.   Serial.print(PPS, 2);
  175.   Serial.print(" / RPM = ");
  176.   Serial.println(RPM, 2);
  177. }
  178.  
  179. void loop()
  180. {
  181.   Serial.println();
  182.   Voltas = 8;         // Numero de voltas no Motor
  183.   P1_16();            // Selecione o Modo do Passo FULL() HALF() P1_4() P1_8() P1_16() P1_32()
  184.   Frequencia();       // Calcula RPM
  185.   Print_RPM ();       // Imprime configuracao
  186.   TesteMotor();       // Testa o Motor
  187. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement