Tutorial · Iniciante · 30 min

A4988: ligação e Vref para definir o limite de corrente

Ligue um A4988 a um Arduino e a um NEMA 17, depois defina o limite de corrente com um multímetro. Veja a fórmula de Vref e a armadilha do resistor.

Para que serve realmente o driver

Um A4988 não é um interruptor. É um regulador de corrente que também faz comutação.

Essa distinção importa porque a bobina de um motor de passo é um indutor de baixa resistência — de 2 a 4 ohms é o típico. Conecte diretamente uma bobina de 2,8 Ω a 24 V e a lei de Ohm resulta em 8,6 A, o que destruiria o motor em segundos. O trabalho do driver é fazer o circuito chopper chavear a fonte milhares de vezes por segundo para que a corrente média se estabilize em um valor escolhido por você e, depois, fazer essa corrente alternar entre as duas bobinas de maneira que o campo gire.

Portanto, o driver precisa receber um número: quantos ampères por fase. Esse é o limite de corrente, e defini-lo é o único ajuste na placa. Todo o resto — microstepping, direção, habilitação — é um pino que se configura uma vez.

Placa adaptadora A4988 vista de cima, com oito contatos dourados de cada lado. A coluna esquerda traz ENABLE, MS1, MS2, MS3, RESET, SLEEP, STEP e DIR, com STEP e DIR destacados. A coluna direita traz VMOT, GND, 2B, 2A, 1A, 1B, VDD e GND, com VMOT destacado em vermelho. Um potenciômetro de ajuste no topo é identificado como o potenciômetro de VREF, que deve ser sondado com um multímetro, e um dissipador de aletas cobre o chip do driver. Dois pequenos resistores de amostragem de corrente na parte inferior da placa são indicados como R100 igual a 0,1 ohms ou R050 igual a 0,05 ohms, com um aviso para ler o seu antes de fazer qualquer cálculo.
Dezesseis contatos, um potenciômetro e dois resistores minúsculos que mudam a aritmética. STEP e DIR são os únicos dois pinos que seu código interage em execução; todo o resto é configuração. Baixar SVG

Ligando

Pino do A4988 Vai para Observação
VMOT Fonte de alimentação do motor de 8–35 V Não a 5 V do Arduino. Nunca.
GND (ao lado de VMOT) Massa da fonte de alimentação do motor Retorno de corrente elevada
VDD 5 V do Arduino Fonte lógica, alguns miliampères
GND (ao lado de VDD) GND do Arduino Precisa compartilhar a massa com a fonte do motor
1A, 1B Uma bobina do motor Qualquer ordem — isso só inverte o sentido
2A, 2B A outra bobina do motor Errar o pareamento é o erro fatal
STEP Qualquer saída do Arduino Um pulso, um micropasso
DIR Qualquer saída do Arduino Nível alto ou baixo escolhe o sentido
ENABLE GND, ou um pino do Arduino Ativo em baixo: conecte ao baixo para energizar
RESET, SLEEP Ligados um ao outro Ambos precisam estar altos; o jumper entre eles faz isso
MS1, MS2, MS3 Veja a tabela abaixo Flutuante significa passo completo

Duas regras de ligação concentram quase todo o risco:

  • Um capacitor eletrolítico de 100 µF entre VMOT e GND, próximo da placa. Não é opcional. A folha de dados e a documentação de todas as placas adaptadoras dizem isso, e o motivo é que o circuito chopper consome corrente em picos abruptos; sem um capacitor de reserva próximo, a indutância dos fios da fonte transforma esses picos em surtos de tensão que excedem a tensão nominal de 35 V do chip. As placas morrem na alimentação, não durante a operação, e essa é geralmente a razão.
  • Nunca desconecte o motor enquanto o driver estiver ligado. Interromper uma bobina energizada produz um grande surto indutivo sem caminho por onde escoar. Desligue a fonte primeiro, sempre.

Se os quatro fios do motor não estiverem identificados, encontre os pares com um multímetro: dentro de uma bobina você mede alguns ohms e entre bobinas lê circuito aberto. Identifique-os por continuidade e conecte um par a 1A/1B e o outro a 2A/2B.

Definindo o limite de corrente

Há um potenciômetro na placa, e girá-lo altera uma tensão de referência que o chip compara com a tensão através de seus resistores de amostragem de corrente. Meça essa referência — Vref — entre o cursor do potenciômetro e a massa.

A fórmula do A4988 é:

Vref = I_phase × R_sense × 8

Aqui está a armadilha que faz muita gente perder motores. O R_sense não é o mesmo em todas as placas. As placas adaptadoras vêm com resistores de amostragem de corrente de 0,1 Ω ou 0,05 Ω, e a resposta da fórmula muda por um fator de dois:

Resistor de amostragem Marca na placa Vref para 1,0 A Vref para 1,2 A Vref para 1,5 A
0,1 Ω R100 0,80 V 0,96 V 1,20 V
0,05 Ω R050 0,40 V 0,48 V 0,60 V
0,068 Ω R068 0,54 V 0,65 V 0,82 V

Leia a marca dos dois resistores SMD pretos próximos à parte inferior da placa antes de calcular qualquer coisa. Definir 1,2 V em uma placa com resistores de 0,05 Ω é pedir 3 A através de um motor de 1,7 A.

O procedimento:

  1. Alimente a placa — VMOT conectado, motor desconectado. O chip precisa da tensão do motor para regular, mas você não precisa fazer o motor girar.
  2. Consulte a corrente nominal por fase do motor. Um NEMA 17 comum é de 1,5 A ou 1,7 A.
  3. Use de 70–85% dela como alvo. A corrente nominal pressupõe as condições de resfriamento especificadas na folha de dados que talvez você não tenha, e os últimos 20% de corrente acrescentam muito pouco torque enquanto produzem muito calor.
  4. Calcule Vref a partir da fórmula e do resistor de amostragem de corrente que você realmente tem.
  5. Coloque a ponta preta do multímetro em um pino de massa e a ponta vermelha no parafuso metálico do potenciômetro. Gire-o lentamente — um quarto de volta já é uma grande mudança — até o multímetro indicar o valor desejado.

Vale usar uma chave de fenda cerâmica pequena. Uma metálica que faz ponte entre o potenciômetro e outra coisa enquanto a placa está energizada é uma forma comum de danificar o driver de motor.

Vale dizer claramente: o limite de corrente é o T_peak na equação de torque que governa tudo o que um motor de passo faz. Defina-o baixo e o motor ficará cada vez mais atrasado para a mesma carga e perderá passos mais cedo. Defina-o alto e o motor aquece para obter torque que talvez não precise. É o único valor que exige uma decisão criteriosa.

Pinos de microstepping

MS1, MS2 e MS3 têm pull-downs internos, portanto qualquer coisa que você deixe flutuando será lida como nível baixo:

MS1 MS2 MS3 Resolução Passos por volta
baixo baixo baixo Passo completo 200
alto baixo baixo Meio passo 400
baixo alto baixo Quarto de passo 800
alto alto baixo Oitavo de passo 1600
alto alto alto Décimo-sexto passo 3200

A maioria das montagens conecta os três pinos em alto e os deixa assim. O motivo não é a precisão — microstepping não compra precisão sob carga — mas sim que o décimo-sexto passo reduz as oscilações do motor em cada passo, o que deixa a máquina silenciosa e evita que a ondulação fique visível no trabalho. O custo é que seu microcontrolador agora precisa emitir dezesseis vezes mais pulsos por milímetro, uma restrição real em um Arduino Uno acima de aproximadamente 10 000 passos por segundo.

Acionando-o

O código mínimo útil. Observe que não há biblioteca aqui: um passo é um pulso, e é literalmente isso.

const int STEP_PIN = 3;
const int DIR_PIN  = 4;
const int EN_PIN   = 5;   // active LOW

void setup() {
  pinMode(STEP_PIN, OUTPUT);
  pinMode(DIR_PIN, OUTPUT);
  pinMode(EN_PIN, OUTPUT);
  digitalWrite(EN_PIN, LOW);      // energise the coils
  digitalWrite(DIR_PIN, HIGH);
}

void loop() {
  // One revolution at 1/16 stepping = 3200 pulses.
  for (int i = 0; i < 3200; i++) {
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(2);         // datasheet minimum is 1 us
    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(300);       // this delay IS the speed
  }
  delay(1000);
}

Esse código funciona e também é exatamente o que você não deve usar em produção, por dois motivos.

O primeiro é que a taxa de passos salta imediatamente de zero para a máxima. Ao solicitar uma taxa acima do limite de partida do motor, ele vai vibrar sem avançar — com os padrões do simulador de motor de passo, comandar velocidade máxima a partir da parada perde 280 passos completos em um movimento de 60 mm e deixa o eixo em 4 mm. O mesmo movimento com uma rampa chega exatamente ao alvo. Essa é a diferença que um perfil de aceleração faz, e não é um refinamento.

O segundo é que delayMicroseconds bloqueia. Enquanto o laço está dando passos, mais nada no microcontrolador é executado — nenhuma verificação de fim de curso, nenhuma leitura pela serial, nenhum segundo eixo. Para qualquer coisa real, use o padrão de temporização não bloqueante ou entregue a tarefa ao AccelStepper, que implementa a rampa e o agendamento para você:

#include <AccelStepper.h>
AccelStepper axis(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);

void setup() {
  pinMode(EN_PIN, OUTPUT);
  digitalWrite(EN_PIN, LOW);
  axis.setMaxSpeed(8000);        // steps/s  -> 100 mm/s at 80 steps/mm
  axis.setAcceleration(16000);   // steps/s2 -> 200 mm/s2
  axis.moveTo(80 * 50);          // 50 mm
}

void loop() {
  axis.run();                    // returns immediately; call it constantly
}

setMaxSpeed e setAcceleration fornecem um perfil trapezoidal e nada mais — não há opção de curva S. Se quiser um perfil com limite de jerk, gere o valor de referência você mesmo.

A4988 ou uma das alternativas?

Driver de motor Corrente Microstepping Ruído Escolha quando
A4988 1 A sem refrigeração, ~1,5 A com refrigeração até 1/16 Audível Barato, disponível em todo lugar e bem documentado
DRV8825 1,5 A sem refrigeração, ~2,2 A com refrigeração até 1/32 Audível Você precisa de mais corrente ou micropassos mais finos
TMC2208 ~1,2 A até 1/256 Quase silencioso O ruído importa; é por isso que as impressoras migraram
TMC2209 ~1,7 A até 1/256 Quase silencioso O mesmo caso, mais referenciamento sem sensor
ULN2003 + 28BYJ-48 ~0,3 A Meio passo Zumbido Uma demonstração em escala de brinquedo, não uma máquina

O DRV8825 é compatível com os pinos, mas sua fórmula de Vref é diferente — Vref = I × 0.5 — e o potenciômetro gira no sentido oposto. Trocar um sem reler a fórmula é uma forma clássica de queimar um motor.

Os drivers TMC valem o dinheiro assim que uma máquina fica em um lugar onde você pode ouvi-la. Eles fazem o mesmo trabalho com uma forma de onda de corrente mais suave, e é por isso que uma impressora com eles faz ruído de ventilador em vez de ruído de motor.

Quando algo dá errado

Sintoma Causa Solução
O motor vibra, mas não gira Pares de bobinas ligados incorretamente Encontre os pares por continuidade e religue
Nada acontece ENABLE flutuante ou alto, ou RESET/SLEEP baixo Conecte ENABLE ao baixo; conecte RESET a SLEEP
O driver fica quente demais para tocar e desliga Limite de corrente alto demais Meça Vref novamente; adicione dissipador e fluxo de ar
O motor fica quente, mas o driver está bem Normal É normal esperar 60–80 °C na carcaça
Passos perdidos apenas em movimentos rápidos Tensão de alimentação baixa demais para essa velocidade Aumente VMOT — mais corrente não ajudará
Passos perdidos em acelerações fortes Rampa muito agressiva ou corrente baixa demais Reduza a aceleração ou aumente Vref em direção à corrente nominal
A placa morreu assim que foi alimentada Falta o capacitor de reserva em VMOT Capacitor eletrolítico de 100 µF, próximo aos pinos
O motor mantém a posição, mas gira de forma irregular Passo completo Conecte MS1–MS3 em alto para 1/16
A resistência aparece em circuito aberto em um “par” Os dois fios são de bobinas diferentes Refaça o pareamento

Próximo passo

Com o driver definido, a questão restante é quantos pulsos valem um milímetro de deslocamento — o que depende inteiramente do que o eixo está girando. Isso é passos por milímetro, e é o número com o qual todas as outras partes da máquina são calibradas.

Explore o grafo

Faz parte destas montagens

Projetos e caminhos de aprendizagem que incluem este tutorial.

Leitura complementar

Referências