lundi 2 septembre 2013

Contrôle d'un moteur pas à pas

Bonjour à tous,
Au début de mon projet de CNC, j'avais parlé d'acheter mes contrôleurs de moteur pas à pas sur internet. J'ai cependant changé d'avis et je vais plutôt les réaliser moi même car cela est plus intéressant et moins cher.

Pour cela j'ai utilisé le composant TB6600HG qui est un driver de moteur pas à pas et qui possède les caractéristiques suivantes :

  • Mode pas entier, demi-pas, 1/4, 1/8, 1/16
  • Tension d'alimentation maximale de 50 V
  • Courant maximal par phase 4.5 A




J'ai effectué un premier test avec un Arduino Uno et le montage suivant :

Ainsi que le programme suivant sur l'Arduino :


const int M1 = 13;
const int M2 = 12;
const int M3 = 11;
const int CC_CCW = 10;
const int CLK = 9;
const int RESET = 8;
const int ENABLE = 7;
const int Latch_Auto = 6;
const int TQ = 5;

void setup() {
  pinMode(9, OUTPUT);

  // Réglage du timer afin de génerer un signal PWM sur la pin 9
  TCCR1A = _BV(COM1A0) 
         | _BV(COM1B0)      
         | _BV(WGM10)
         | _BV(WGM11);
  TCCR1B = _BV(WGM12)
         | _BV(WGM13);     
         
  OCR1B = 0;             
  OCR1A = 15383;        
  TCCR1B |= _BV(CS11);   
  
  pinMode(M1, OUTPUT); 
  pinMode(M2, OUTPUT); 
  pinMode(M3, OUTPUT); 
  pinMode(CC_CCW, OUTPUT); 
  pinMode(CLK, OUTPUT); 
  pinMode(RESET, OUTPUT); 
  pinMode(ENABLE, OUTPUT); 
  pinMode(Latch_Auto, OUTPUT); 
  pinMode(TQ, OUTPUT); 
  
  digitalWrite(CC_CCW, HIGH);
  digitalWrite(Latch_Auto, HIGH);
  digitalWrite(TQ, HIGH);
  
  // mode 1/16 de pas
  digitalWrite(M1, HIGH);
  digitalWrite(M2, HIGH);
  digitalWrite(M3, LOW);
   
  digitalWrite(RESET, HIGH);
  digitalWrite(ENABLE, HIGH);
}

const int N = 50;
unsigned int top;
void loop() {
  long val = 0;
  // moyennage du potentiomètre
  for (int i=0; i<N; i++)
    val += analogRead(A5);
   val /= N;
   
   OCR1A = map(val, 0, 1023, 0, 500);
   delay(1);
}

Voici le résultat en vidéo :



J'ai aussi fait un autre programme afin de mieux voir les différents modes de fonctionnement du contrôleur :


const int M1 = 13;
const int M2 = 12;
const int M3 = 11;
const int CC_CCW = 10;
const int CLK = 9;
const int RESET = 8;
const int ENABLE = 7;
const int Latch_Auto = 6;
const int TQ = 5;

void setup() {
  pinMode(9, OUTPUT);

  TCCR1A = _BV(COM1A0) 
         | _BV(COM1B0)      
         | _BV(WGM10)
         | _BV(WGM11);
  TCCR1B = _BV(WGM12)
         | _BV(WGM13);      
         
  OCR1B = 0;          
  OCR1A = 15383;     
  TCCR1B |= _BV(CS11);      
  
  pinMode(M1, OUTPUT); 
  pinMode(M2, OUTPUT); 
  pinMode(M3, OUTPUT); 
  pinMode(CC_CCW, OUTPUT); 
  pinMode(CLK, OUTPUT); 
  pinMode(RESET, OUTPUT); 
  pinMode(ENABLE, OUTPUT); 
  pinMode(Latch_Auto, OUTPUT); 
  pinMode(TQ, OUTPUT); 
  
  digitalWrite(CC_CCW, HIGH);
  digitalWrite(Latch_Auto, HIGH);
  digitalWrite(TQ, HIGH);
   
  digitalWrite(RESET, HIGH);
  digitalWrite(ENABLE, HIGH);
}


void loop() { 
  // 1/1
  OCR1A = 60000;
  digitalWrite(M1, LOW);
  digitalWrite(M2, LOW);
  digitalWrite(M3, HIGH);
  delay(5000);
  
  // 1/2
  OCR1A = 30000;
  digitalWrite(CC_CCW, LOW);
  digitalWrite(M1, LOW);
  digitalWrite(M2, HIGH);
  digitalWrite(M3, LOW);
  delay(5000);

  // 1/4 
  OCR1A = 20000;
  digitalWrite(CC_CCW, HIGH);
  digitalWrite(M1, HIGH);
  digitalWrite(M2, LOW);
  digitalWrite(M3, LOW);
  delay(5000);
  
  // 1/8
  OCR1A = 15000;
  digitalWrite(CC_CCW, LOW);
  digitalWrite(M1, HIGH);
  digitalWrite(M2, LOW);
  digitalWrite(M3, HIGH);
  delay(5000);
  
  // 1/16
  OCR1A = 10000;
  digitalWrite(CC_CCW, HIGH);
  digitalWrite(M1, HIGH);
  digitalWrite(M2, HIGH);
  digitalWrite(M3, LOW);
  delay(5000);
  
  //stop
  digitalWrite(M1, LOW);
  digitalWrite(M2, LOW);
  digitalWrite(M3, LOW);
  delay(2000);
  
  digitalWrite(M1, HIGH);
  digitalWrite(M2, HIGH);
  digitalWrite(M3, LOW);
  for (int i=5000; i>15; i--){
    delay(2);
    OCR1A = i;
  }
  delay(2000);
  //stop
  digitalWrite(M1, LOW);
  digitalWrite(M2, LOW);
  digitalWrite(M3, LOW);
  delay(2000);
}

Et toujours le résultat en vidéo :


On ne voit pas trop de différence de vitesse entre les modes du fait que je la compense en augmentant la fréquence de la PWM à chaque fois (sinon cela serait trop lent).

Aucun commentaire:

Enregistrer un commentaire