Este é o primeiro tópico do meu Blog ! Irei divulgar tudo que eu for aprendendo sobre o Driver de Motor de Passo DRV8825.

Translation: If you want to translate this tutorial into your language, I suggest using the Google Chrome browser. Right-click – it will be translated into your language. If you have questions, you can post in any language for me!

Já criei inúmeros tutoriais no Laboratório de Garagem. E agora estou inaugurando o meu Blog. Espero que gostem ! Estou aprendendo a usá-lo. Se perceberem algum problema, favor me avisar. Obrigado.

Alguns Tutoriais no Lab de Garagem:

Conhecendo o ESP8266

Conhecendo o Raspberry Pi

Arduino + Driver A4988 + Motor de Passo NEMA 17

Arduino + Driver ULN2003 + Motor de Passo 28BYJ-48

Essas são as primeiras fotos do Módulo Driver DRV8825. Faço sempre essa montagem fotográfica , pois facilita o desenho do diagrama da placa. Clique na foto para acessar o Álbum no FLICKR ou clique na seta para visualizar em  sequência.

DRV8825 01

Conhecendo  o Chip DRV8825

O chip que faz o controle do motor é o DRV8825 fabricado pela Texas Instruments. Usa uma tecnologia bem avançada e apesar do pequeno tamanho, suporta correntes de até 2,5 Ampéres (com dissipador de calor).  A faixa de tensão de alimentação vai de 8,2V até 45 V !

Esse driver pode ser usado somente com Motores de Passo Bipolares.

Permite o modo de micropasso de 1/2, 1/4, 1/8, 1/16 e também 1/32.

O bloco de saída possui pontes H formadas por transistores Mosfet com baixa resistência direta ( 0,2 Ω).

Os pinos de controle do Driver ( Passo, Direção, Modos) podem ser acionados com níveis de tensão de 3,3V ou 5V ( muito bom ! Serve para Arduino, Raspberry Pi, etc) .

A frequência interna PWM  usada no controle de corrente de saída é de 30 KHz (fixa).

A frequência máxima usada no pino Passo (Step) é de 250 KHz (T = 4 µs).

Funções de desligamento internos são fornecidos para:
– Desativação térmica (TSD), sobrecorrente, curto-circuito, bloqueio de sub tensão e sobre temperatura.

As condições de falha são indicados através do pino nFault.

Esse é o link da folha de especificações do Chip DRV8825 .

drv8825-pinout
Pinagem do Chip DRV8825

E esse é o diagrama interno em blocos do DRV8825 :

drv8825-diagrama-em-blocos

Pinos do Chip DRV8255:

STEP (passo) – um sinal com transição de baixo para alto avança um passo (pulldown interno),
DIR – permite a alteração no sentido da rotação do motor (pulldown interno),
nENBL– um sinal baixo ativa os drivers do motor (pulldown interno),
nRESET – um sinal baixo dá um reset no chip, desativando todas os drivers de saída (pulldown interno),
nSLEEP (dormir) – esse pino quando nível baixo, desabilita alguns circuitos internos para economizar energia (pulldown interno),
nFAULT – esse pino de saída quando nível baixo, indica alguma falha no chip como corrente ou temperatura excessiva,

MODE 0, MODE 1 e MODE 2 – são entradas para selecionar o modo da sequência dos passos (micro stepping) de acordo com essa tabela (pulldown interno):

drv8825-micropasso

AOUT 1, AOUT 2, BOUT 1 e BOUT 2– são os pinos de saída dos circuitos drivers, conectados diretamente nas bobinas dos motores,
ISENA e ISENB – são os pinos conectados nos resistores para controle de corrente das duas pontes Hs.

VM – esse é o pino de alimentação do Motor / Driver ( 8,2V até 45 V).  A fonte de alimentação deverá fornecer a corrente suficiente para o motor (max 2,5A).

DECAY – Esse pino serve para a seleção do modo de Decadência do sinal nas saídas.
(obs : nesse módulo DRV8825, esse pino esta isolado)
baixo – decadência lenta ,
isolado – decadência mista,
alto – decadência rápida.

Todos os outros pinos servem para alimentação, regulador de tensão interno, referência de tensão, etc.

Módulo Driver DRV8825  da Pololu

Esse módulo Driver de Motor de Passo DRV8825 foi desenvolvido pela POLOLU, mas percebo que ele tem sido clonado pelos chineses.

Esse é o site do DRV8825 da Pololu, onde tem todas informações e tutorial :

DRV8825 Stepper Motor Driver Carrier – POLOLU

Esse é o diagrama do circuito interno do módulo DRV8825 (fonte: Pololu)

Tamanho do módulo = 2,0 x 1,5 cm.

Veja que para o DRV8825, os resistores R Sense são de 0,10 Ω.

module-drv8825

Nas fotos do módulo, eu fiz a edição com a identificação dos pinos ( em pé e deitado) :

DRV8825 pinagem deitado

DRV8825 pinagem em pé

drv8825-module-pinout3drv8825-module-pinout2

Recomendações Importantes antes de usar o módulo DRV8825 !

 (para evitar de danificá-lo) 

– Esse módulo foi feito para motores de passo Bipolares, não use um motor unipolar. ( exceto se o motor Unipolar puder ser usado no modo Bipolar)

– Antes de fazer a conexão dos fios das bobinas do motor, certifique-se que a identificação dos fios esta correta. Recomendo que meça o valor da resistência das bobinas.

– Use um motor que se encaixe nas especificações do módulo – tensão máxima 45V e corrente máxima de 2,5 A.

– Conecte os fios das bobinas, antes de alimentar o módulo.

– Não desconecte os fios da bobina, quando o módulo estiver energizado.

– Se o módulo tiver aquecendo muito, cole o dissipador no chip.

Circuito  Arduino + DRV8825 + Motor de Passo 

Baseando-me na montagem que eu já havia feito com o Driver A4988 (veja link no início), fiz esse diagrama do esquema do circuito de teste do DRV8825 com um Arduino Nano ( no diagrama esta como Uno) . Prefiro usar o Arduino Nano, pois ele pode ser inserido em um Protoboard. Lembrando que o motor de passo a ser usado deve ser Bipolar. Pode ser usado motor com quatro fios ou mais, desde que no modo bipolar série ou bipolar paralelo, respeitando a corrente máxima do motor.  A tensão da fonte no meu circuito é de 12V. Use um capacitor (C1) de no mínimo 100 uF para filtrar ruídos na alimentação do motor.

O Módulo Driver DRV8825 tem um potênciometro (POT) de ajuste de corrente máxima. Se a corrente ultrapassar o limite, o chip é desativado para proteção dos circuitos.

Não se esqueça de conectar o terra (GND) do Arduino no terra do módulo (GND).

Criei um Sketch para permitir o teste de todos os pinos de controle / funções do Módulo DRV8825. Usei oito portas digitais do Arduino. A designação de cada porta foi escolha minha. Nada impede que você utilize outras portas, desde que altere as ligações no circuito e no seu sketch.

Link do diagrama DRV8825 + Arduinodrv8825-arduino-nano

Ajuste de corrente do Módulo DRV8825 

Antes de fazer os testes no Módulo DRV8825, recomendo que faça o ajuste de corrente para se adequar ao motor de passo. Nas especificações do motor, poderá encontrar a corrente ideal para ser usada. Durante a fase de testes do circuito, não recomendo que ajuste para a corrente máxima, pois qualquer prendimento no motor fará aumentar a corrente que passa por ele. E assim poderá sobrecarregar o mesmo. Depois que os  testes forem realizados com sucesso, ajuste para a corrente especificada para o motor.

O ajuste de corrente é feito através de um potenciômetro (POT). Existe uma fórmula no Datasheet do DRV8825 para se calcular a corrente do driver. O Chip DRV8825 tem um regulador interno de tensão de 3,3V. Essa tensão é aplicada no POT e fazendo o ajuste, pode-se variar a tensão de Referência VREF entre 0 e 3,3V. Essa tensão VREF determina a corrente no motor.

I chopp = VREF / 5  x  R Sense 

( como já havia informado, no meu módulo DRV8825, R Sense tem o valor de 0,10 Ω)

Portanto ,

I chopp = VREF / 5  x 0,10  =  VREF /  0,50

Exemplos :

Para VREF = 1,25V          I chopp = 1,25 / 0,50 = 2,5 A (máxima corrente !)

Para VREF = 1,0V           I chopp = 1,0 / 0,50 = 2,0 A

Para VREF = 0,5V           I chopp = 0,5 / 0,50 = 1,0 A (esse foi o ajuste do meu módulo) 

Para facilitar a medição de VREF , aplique a ponta de prova Positivo sobre o POT como na foto. É claro, conecte o Negativo do Voltímetro no terra do módulo (GND). E gire suavemente o POT com uma pequena chave de fenda ( de relojoeiro).

Girando no sentido do relógio – diminui  VREF

Girando no sentido anti-horário – aumenta VREF

drv8825-ajuste-corrente

Mas , importante – para um ajuste adequado nas condições que o Driver deva estar, eu fiz um pequeno programa Sketch que configura o DRV8825 para o modo de passo completo ( FULL).

PasteBin : DRV8825Ajuste.INO

// Controle de Motor de Passo Bipolar com Modulo driver DRV8825 
// Ajuste de corrente
// https://jgamblog.wordpress.com/2016/09/24/tutorial-arduino-drv8825-motor-de-passo/
// Modulo DRV8825 / Arduino Nano / IDE 1.6.7
// OBS: Motor Unipolar 6 fios configurado como Bipolar
// Gustavo Murta 26/set/2016

// Definições das Portas Digitais do Arduino

int RST = 8;              // Porta digital D08 - reset do DRV8825
int SLP = 9;              // Porta digital D09 - dormir (sleep) DRV8825
int ENA = 7;              // Porta digital D07 - ativa (enable) DRV8825
int M0 = 4;               // Porta digital D04 - M0 do DRV8825
int M1 = 5;               // Porta digital D05 - M1 do DRV8825
int M2 = 6;               // Porta digital D06 - M2 do DRV8825
int DIR = 3;              // Porta digital D03 - direção (direction) do DRV8825
int STP = 2;              // Porta digital D02 - passo(step) do DRV8825

void setup()
{
  Serial.begin(9600);
  DDRD = DDRD | B11111100;  // Configura Portas D02 até D07 como saída
  disa_DRV8825();           // Desativa as saidas DRV8825
  
  DDRB = 0x0F;              // Configura Portas D08,D09,D10 e D11 como saída
  digitalWrite(SLP, HIGH);  // Desativa modo sleep do DRV8825
  rst_DRV8825();            // Reseta o chip DRV8825
  digitalWrite(ENA, LOW);   // Ativa as saidas DRV8825

  ajuste_DRV8825();         // Ajuste de corrente DRV8825
}

void rst_DRV8825()
{
  digitalWrite(RST, LOW);     // Realiza o reset do DRV8825
  delay (1);                  // Atraso de 1 milisegundo
  digitalWrite(RST, HIGH);    // Libera o reset do DRV8825
  delay (10);                 // Atraso de 10 milisegundos
}

void disa_DRV8825()
{
  digitalWrite(ENA, HIGH);    // Desativa o chip DRV8825
  delay (10);                 // Atraso de 10 milisegundos
}

void ena_DRV8825()
{
  digitalWrite(ENA, LOW);     // Ativa o chip DRV8825
  delay (10);                 // Atraso de 10 milisegundos
}

void ajuste_DRV8825()
{
  FULL();       // Selecione o Modo do Passo
  Serial.println(" Ajuste a corrente no POT do DRV8825 ");
}

void FULL()
{
  digitalWrite(M0, LOW);    // Configura modo Passo completo (Full step)
  digitalWrite(M1, LOW);
  digitalWrite(M2, LOW);
  Serial.println(" Passo Completo ");
}

void loop()
{
}

Montagem no Protoboard – Arduino + DRV8825 

Essa é a montagem de teste do Módulo DRV8825 com o Arduino Nano. Usei um motor de passo Unipolar conectado no modo Bipolar. A tensão do motor é  5V e a corrente é 1A. Cada passo tem 1,8 °, portanto para dar uma volta são necessários 200 passos. Eu montei um resistor de 1,0 Ω em série com o terminal positivo da fonte, para que eu possa medir a corrente usada na montagem.  ( V = R x I ) .

Link da foto da montagem

drv8825-arduino

Esse é o Sketch de teste. Fiz ele com propósitos didáticos. Usei uma programação estruturada com várias funções. O Sketch permite o uso de todos os modos de passo : Full, Half, Micro-passo de 1/4, Micro-passo de 1/8, Micro-passo de 1/16 e Micro-passo de 1/32. Permite também que configure a frequência dos pulsos (passos), a quantidade de passos, o sentido de rotação, etc.

PasteBin : DRV8825A.INO

// Controle de Motor de Passo Bipolar com Modulo driver DRV8825
// https://jgamblog.wordpress.com/2016/09/24/tutorial-arduino-drv8825-motor-de-passo/
// Modulo DRV8825 / Arduino Nano / IDE 1.6.7
// OBS: Motor Unipolar 6 fios configurado como Bipolar
// Gustavo Murta 26/set/2016

// Definições das Portas Digitais do Arduino

int RST = 8;              // Porta digital D08 - reset do DRV8825
int SLP = 9;              // Porta digital D09 - dormir (sleep) DRV8825
int ENA = 7;              // Porta digital D07 - ativa (enable) DRV8825
int M0 = 4;               // Porta digital D04 - M0 do DRV8825
int M1 = 5;               // Porta digital D05 - M1 do DRV8825
int M2 = 6;               // Porta digital D06 - M2 do DRV8825
int DIR = 3;              // Porta digital D03 - direção (direction) do DRV8825
int STP = 2;              // Porta digital D02 - passo(step) do DRV8825

int MeioPeriodo = 30;   // MeioPeriodo no pulso em microsegundos  correcao de +10 ms 1490
float PPS = 200;          // Pulsos por segundo
boolean sentido = true;   // Variavel de sentido
int PPR = 200;            // Número de passos por volta
int Pulsos;               // Pulsos para o driver do motor
int Voltas;               // voltas do motor
float RPM;                // Rotacoes por minuto

void setup()
{
  Serial.begin(9600);
  DDRD = DDRD | B11111100;  // Configura Portas D02 até D07 como saída
  disa_DRV8825();           // Desativa as saidas DRV8825
  FULL();                    // Seleciona modo Passo Completo

  DDRB = 0x0F;              // Configura Portas D08,D09,D10 e D11 como saída
  digitalWrite(SLP, HIGH);  // Desativa modo sleep do DRV8825
  rst_DRV8825();            // Reseta o chip DRV8825
  digitalWrite(ENA, LOW);   // Ativa as saidas DRV8825
}

void rst_DRV8825()
{
  digitalWrite(RST, LOW);     // Realiza o reset do DRV8825
  delay (1);                  // Atraso de 1 milisegundo
  digitalWrite(RST, HIGH);    // Libera o reset do DRV8825
  delay (10);                 // Atraso de 10 milisegundos
}

void disa_DRV8825()
{
  digitalWrite(ENA, HIGH);    // Desativa o chip DRV8825
  delay (10);                 // Atraso de 10 milisegundos
}

void ena_DRV8825()
{
  digitalWrite(ENA, LOW);     // Ativa o chip DRV8825
  delay (10);                 // Atraso de 10 milisegundos
}

void HOR()                                    // Configura o sentido de rotação do Motor
{
  digitalWrite(DIR, HIGH);                    // Configura o sentido HORÁRIO
  Serial.print(" Sentido Horario ");
}

void AHR()                                    // Configura o sentido de rotação do Motor
{
  digitalWrite(DIR, LOW);                     // Configura o sentido ANTI-HORÁRIO
  Serial.print(" Sentido Anti-horario ");
}

void PASSO()                    // Pulso do passo do Motor
{
  digitalWrite(STP, LOW);            // Pulso nível baixo
  delayMicroseconds (MeioPeriodo);   // MeioPeriodo de X microsegundos
  digitalWrite(STP, HIGH);           // Pulso nível alto
  delayMicroseconds (MeioPeriodo);   // MeioPeriodo de X microsegundos
}

void Frequencia()                     // Configura Frequencia dos pulsos
{
  Pulsos = PPR * Voltas;              // Quantidade total de Pulsos  PPR = pulsos por volta
  PPS = 1000000 / (2 * MeioPeriodo);  // Frequencia Pulsos por segundo
  RPM = (PPS * 60) / PPR;             // Calculo do RPM
}

void FULL()
{
  PPR = 200;                // PPR pulsos por volta
  digitalWrite(M0, LOW);    // Configura modo Passo completo (Full step)
  digitalWrite(M1, LOW);
  digitalWrite(M2, LOW);
  Serial.println(" Passo Completo ");
}

void HALF()
{
  PPR = 400;                 // PPR pulsos por volta
  digitalWrite(M0, HIGH);    // Configura modo Meio Passo (Half step)
  digitalWrite(M1, LOW);
  digitalWrite(M2, LOW);
  Serial.println(" Meio Passo ");
}

void P1_4()
{
  PPR = 800;                // PPR pulsos por volta
  digitalWrite(M0, LOW);    // Configura modo Micro Passo 1/4
  digitalWrite(M1, HIGH);
  digitalWrite(M2, LOW);
  Serial.println(" Micropasso 1/4 ");
}

void P1_8()
{
  PPR = 1600;                // PPR pulsos por volta
  digitalWrite(M0, HIGH);    // Configura modo Micro Passo 1/8
  digitalWrite(M1, HIGH);
  digitalWrite(M2, LOW);
  Serial.println(" Micropasso 1/8 ");
}

void P1_16()
{
  PPR = 3200;               // PPR pulsos por volta
  digitalWrite(M0, LOW);    // Configura modo Micro Passo 1/16
  digitalWrite(M1, LOW);
  digitalWrite(M2, HIGH);
  Serial.println(" Micropasso 1/16 ");
}

void P1_32()
{
  PPR = 6400;                // PPR pulsos por volta
  digitalWrite(M0, HIGH);    // Configura modo Micro Passo 1/32
  digitalWrite(M1, LOW);
  digitalWrite(M2, HIGH);
  Serial.println(" Micropasso 1/32 ");
}

void TesteMotor()            // Gira motor nos dois sentidos
{
  HOR();
  Serial.print(" / Voltas = ");
  Serial.println(Voltas);
  for (int i = 0; i <= Pulsos; i++)       // Incrementa o Contador
  {
    PASSO();                              // Avança um passo no Motor
  }
  disa_DRV8825();
  delay (750) ;                           // Atraso de 750 mseg
  ena_DRV8825();
  AHR();
  Serial.print(" / Voltas = ");
  Serial.println(Voltas);
  for (int i = 0; i <= Pulsos; i++)       // Incrementa o Contador
  {
    PASSO();                              // Avança um passo no Motor
  }
  disa_DRV8825();
  delay (750) ;                           // Atraso de 750 mseg
  ena_DRV8825();
}

void Print_RPM ()
{
  Serial.print(" PPR = ");
  Serial.print(PPR);
  Serial.print(" / Pulsos = ");
  Serial.println(Pulsos);
  Serial.print(" 1/2 T = ");
  Serial.print(MeioPeriodo);
  Serial.print(" us / ");
  Serial.print(" PPS = ");
  Serial.print(PPS, 2);
  Serial.print(" / RPM = ");
  Serial.println(RPM, 2);
}

void loop()
{
  Serial.println();
  Voltas = 8;         // Numero de voltas no Motor

  P1_16();            // Selecione o Modo do Passo FULL() HALF() P1_4() P1_8() P1_16() P1_32()
  
  Frequencia();       // Calcula RPM
  Print_RPM ();       // Imprime configuracao
  TesteMotor();       // Testa o Motor
}

drv8825-editado