[Risolto] DRV8825 + Motore Passo Passo + Codice di Esempio

Salve a tutti, come da titolo sto riscontrando un problema durante l'utilizzo del DRV8825 per controllare un motore passo passo.

I collegamenti sono così fatti:

M0 -> D10
M1 -> D11
M2 -> D12

/Reset -> +5V
/Sleep -> +5V

Step -> D9
Dir -> D10

B2,B1,A1,A2 -> Motore Bipolare Passo Passo

Vmot -> Batteria 9V +
GND -> GND

Questo è il codice che sto usando:

#define DIR 8
#define STEP 9

#define M0 10
#define M1 11
#define M2 12

int pause    =  500;
int dirLevel  = LOW;
 
void setup ( ) {
  pinMode ( DIR, OUTPUT );
  pinMode ( STEP, OUTPUT );
  pinMode ( M0, OUTPUT );
  pinMode ( M1, OUTPUT );
  pinMode ( M2, OUTPUT );
 
  digitalWrite ( M0, LOW );
  digitalWrite ( M1, LOW );
  digitalWrite ( M2, LOW );
  digitalWrite ( DIR, dirLevel );
  
  Serial.begin ( 9600 );
  Serial.println ( "Test" );
}
 
void loop ( ) {
  digitalWrite ( STEP, HIGH );
  delayMicroseconds ( pause );
  digitalWrite ( STEP, LOW );
  delayMicroseconds ( pause );
}

Utilizzando un Voltmetro misuro queste tensioni:

Tensione della batteria: 6.89V

DIR : 0V
STEP: 2.47V

/SLEEP: 4.98V
/RESET: 4.98V

M0: 0V
M1: 0V
M2: 0V

Enable: Non connesso a niente 

VMot: 6.89V
GND: 0V

B2: 1.67V
B1: 1.67V
A1: 6.66V
A2:6.66V

/FAULT: 4.94V
 
GND: 0V

La VREF è: 2.14V per ottenere una corrente di uscita di circa 1.3A come richiesta dal motore

E come risultato ottengo un bel niente, nessun rumore, nessun movimento... Forse il driver è rotto, voi che ne pensate ?

Grazie,
Andrea

ps: In allegato ci sono 2 foto del DRV8825 e dei collegamenti

20160920_161926.jpg

  1. Non hai detto che motore usi
  2. con una piletta da 9V non vai da nessuna parte

La VREF è: 2.14V

Visto che il calcolo è Current Limit = VREF × 2 , non credi che sia un pò alta ?

  1. Sicuro di aver collegato il motore con le giuste fasi ?

Intanto grazie mille, allora:

  1. Il motore è questo quì: Stepper Nema 17

  2. Come alimentazione prima di provare con 12V esterni, stavo provando con una batteria per non fare troppi danni nel caso di errori, comunque ho appena provato prendendo i 12V dall'alimentatore di un PC, ma non funziona ancora

  3. Ho regolato la Vref a 1.5V

  4. Si il motore è collegato bene

Grazie

Anche secondo me........
io non mi fiderei dei colori e li controllerei con un multimetro

  1. la Vref andrebbe regolata a 0.6V

Sappi che i DRV8825 sono abbastanza permalosi, specialmente se stacchi e riattacchi il motore con l'alimentazione collegata

Ho regolato la VRef a 0.6V ma ancora niente, secondo me quando avevo la VRef troppo alta e ho alimentato il tutto con l'alimentatore del PC, il driver si è rotto..perchè adesso non dà proprio alcun segno di vita.
Come faccio a controllare se è rotto ?
Grazie mille

Oggi mi sono arrivati i driver nuovi, adesso funziona tutto, ho impostato la Vref a 0.65V per ottenere una corrente di 1.3A, ho provato i microstep e tutto funziona perfettamente, però ho modificato molto il codice, quindi lo riposto nel caso possa servire a qualcuno per provare il driver drv8825.

Questo è il nuovo programma di prova, fa due giri e poi torna indietro:

#define DIR 8
#define STEP 9

#define M0 10
#define M1 11
#define M2 12

#define HALF_STEP_PAUSE  10
#define STEP_PAUSE       ( HALF_STEP_PAUSE * 2 )
#define PAUSE_FOR_RPM(x) ( 300000 / x )

int rpm = 200;
int dirLevel;
boolean forward = true;
int count = 0;
 
void setup ( ) {
  pinMode ( DIR, OUTPUT );
  pinMode ( STEP, OUTPUT );
  pinMode ( M0, OUTPUT );
  pinMode ( M1, OUTPUT );
  pinMode ( M2, OUTPUT );
 
  digitalWrite ( M0, LOW );
  digitalWrite ( M1, LOW );
  digitalWrite ( M2, LOW );
  
  Serial.begin ( 9600 );
  Serial.println ( "Test" );
}
 
void loop ( ) {
  dirLevel = forward;
  digitalWrite ( DIR, dirLevel );

  digitalWrite ( STEP, LOW );
  delayMicroseconds ( HALF_STEP_PAUSE );
  digitalWrite ( STEP, HIGH );
  delayMicroseconds ( HALF_STEP_PAUSE );
  
  if ( forward == true ) {
    count ++;
  } else if ( forward == false ) {
    count --;
  }
  if ( count > 400 ) {
    forward = false;
  } else if ( count < 0 ) {
    forward = true;
  }
  
  delayMicroseconds ( PAUSE_FOR_RPM ( rpm ) - STEP_PAUSE );
}

Ciao a tutti, Andrea