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

dimanche 5 mai 2013

Un programme plus simple pour contrôler l'axe d'imprimanrte

J'ai trouvé beaucoup plus simple que mon post précédent pour contrôler l'axe d'imprimante. J'utilise pour cela deux bibliothèques : Encoder et PID.

Le programme ci-dessous fait bouger l'axe de gauche à droite :


/*
* Contrôle d'un axe d'imprimante en utilisant les bibliothèques
* Encoder et Pid
*
*/


#include <Encoder.h>
#include <PID_v1.h>

const int pin_channelA = 2;  // codeur optique
const int pin_channelB = 3;  // codeur optique
const int pin_t1 = 10;       // moteur, pont en H
const int pin_t2 = 9;        // moteur, pont en H
double Setpoint, Input, Output;

Encoder encoder(pin_channelA, pin_channelB);
PID myPID(&Input, &Output, &Setpoint, 6.4, 0.32, 0.00064, DIRECT);

unsigned long time;
unsigned long last_time = 0;
int cons = 1;
int val = 1;

void setup() {
  myPID.SetMode(AUTOMATIC);  // demarrer Pid
  pinMode(pin_t1, OUTPUT);
  pinMode(pin_t2, OUTPUT);
  myPID.SetSampleTime(1);
  myPID.SetOutputLimits(-255, 255);
  Output = 0;
}

void loop() {
  Input = encoder.read() + cons;  // En entrée du Pid : valeur du codeur + consigne
  myPID.Compute();
  if (Output > 0) {  // sens avant
    analogWrite(pin_t1, Output);
    digitalWrite(pin_t2, LOW);
  }
  else if (Output < 0){  // sens arrière
    analogWrite(pin_t2, -Output);
    digitalWrite(pin_t1, LOW);
  }
  else {  // arrêt
    digitalWrite(pin_t1, LOW);
    digitalWrite(pin_t2, LOW);
  }

  // on incrémente ou décremente la consigne toute les 2 ms
  time = millis();
  if (time-last_time > 2) {
    cons+=val;
    if (cons>500)
      val=-1;
    if (cons==0)
      val = 1;
    last_time = time;
  }
}