Augmenter la vitesse d'un moteur pap

Bonjour,

J'ai ce programme:

//----------- Attribution des pins -----------
const int step_polulu = 7;
const int dir_polulu = 6;
const int btn_av = 2; // Bouton avant
const int btn_ar = 3; // Bouton arrière

const int ptr_vit = 0; // Potentiomètre réglage vitesse

//----------- Variables globales -----------
int intervale=0;

void setup() {
//Serial.begin(9600);

pinMode(btn_av, INPUT);
pinMode(btn_ar, INPUT);

pinMode(step_polulu, OUTPUT);

pinMode(dir_polulu, OUTPUT);
digitalWrite(dir_polulu, LOW);
}

void loop() {

if(digitalRead(btn_av)==LOW || digitalRead(btn_ar)==LOW)
{
intervale = map(analogRead(ptr_vit),0,1024,0,124); // Convertit la valeur lue sur le potar en millisecondes : 1ms < délais entre les pas < 125ms
//Serial.println(intervale);

if(digitalRead(btn_av)==LOW)
{
digitalWrite(dir_polulu, HIGH);
}
else
{
digitalWrite(dir_polulu, LOW);
}

digitalWrite(step_polulu, HIGH);
delay(0.1);
digitalWrite(step_polulu, LOW);
delay(intervale+1);
}
}

et je voudrais augmenter la vitesse du moteur pap.

J'ai agit sur la ligne intervale = map(analogRead(ptr_vit),0,1024,0,124); en modifoant les valeur 1024 et 124 mais rien y fait

Sur quoi dois je agir?

Est ced cela fonctionnerais mieux en PWM?

serge

modifie ton post, et utilise les balises code stp

désolé, comment fait on?

diiity:
désolé, comment fait on?

En lisant la charte du forum

Bonjour,

J'ai ce programme:

//----------- Attribution des pins -----------
const int step_polulu = 7;   
const int dir_polulu = 6;
const int btn_av = 2;    // Bouton avant
const int btn_ar = 3;    // Bouton arrière

const int ptr_vit = 0;  // Potentiomètre réglage vitesse

//----------- Variables globales -----------
int intervale=0;

void setup() {               
  //Serial.begin(9600);
 
  pinMode(btn_av, INPUT);
  pinMode(btn_ar, INPUT);
 
  pinMode(step_polulu, OUTPUT);
 
  pinMode(dir_polulu, OUTPUT);
  digitalWrite(dir_polulu, LOW);
}

void loop() {
 
  if(digitalRead(btn_av)==LOW || digitalRead(btn_ar)==LOW)
  {
    intervale = map(analogRead(ptr_vit),0,1024,0,124); // Convertit la valeur lue sur le potar en millisecondes : 1ms < délais entre les pas < 125ms
    //Serial.println(intervale);
   
    if(digitalRead(btn_av)==LOW)
    {
      digitalWrite(dir_polulu, HIGH);
    }
    else
    {
      digitalWrite(dir_polulu, LOW);
    }
   
    digitalWrite(step_polulu, HIGH);
    delay(0.1);
    digitalWrite(step_polulu, LOW);
    delay(intervale+1);       
  }
}

et je voudrais augmenter la vitesse du moteur pap.

J'ai agit sur la ligne intervale = map(analogRead(ptr_vit),0,1024,0,124); en modifoant les valeur 1024 et 124 mais rien y fait

Sur quoi dois je agir?

Est ced cela fonctionnerais mieux en PWM?

serge

tes 2 delay à la fin sont bizarres.
Je pense qu'il faudrait que les aient la même valeur si tu veux quelque chose de régulier.
En plus, delay n'accepte qu'un int en parametre. Si tu veux des microsecondes, il faut utiliser delayMicroseconds

j'ai mis les mêmes valeur au delay ça ne change rien.

si je mets delayMicroseconds, la vitesse est très basse et le potentiomètre n'agit plus

Bonjour,

Il y a un moyen de changer cela, diminuer le temps entre chaque pas?

Désolé je débute avec arduino.

serge

Le montage fonctionne, j'ai un inter qui me sert d'inversion de sens de rotation et d'un potentiomètre de vitesse de 10k analogique.

Alors je dispose d'un moteur pap 428YGH33-1334A acheté ici

et d'un pololu A4988 Reprap Module Motor Driver 3D Step acheté là

serge

bonjour,
ca serait pas 1023 et 255?

J'ai agit sur la ligne intervale = map(analogRead(ptr_vit),0,1024,0,124); en modifoant les valeur 1024 et 124 mais rien y fait

après tu n'a pris que la possibilité de tout en LOW, que se passe t'il si un est en HIGH?
le enable est ou dans le code?

prends cet exemple A4988 — MCHobby - Wiki

#define pinEnable 13 // Activation du driver/pilote
#define pinStep    9 // Signal de PAS (avancement)
#define pinDir     8 // Direction 


void setup(){
  Serial.begin(9600);
  Serial.println("Test A4988");
  
  pinMode( pinEnable, OUTPUT );
  pinMode( pinDir   , OUTPUT );
  pinMode( pinStep  , OUTPUT );
}

void loop(){
  int i = 0;
  
  digitalWrite( pinDir   , HIGH); // Direction avant
  digitalWrite( pinStep  , LOW);  // Initialisation de la broche step
  
  // Avance de 200 pas
  for( i=0; i<200; i++){
    Serial.println( i );
    digitalWrite( pinStep, HIGH );
    delay( 10 );
    digitalWrite( pinStep, LOW );
    delay( 10 );
  } 
  
  // Changer de direction
  digitalWrite( pinDir   , LOW); // Direction avant
  
  // Refaire 200 pas dans l'autre sens
  for( i=0; i<200; i++){
    Serial.println( i );
    digitalWrite( pinStep, HIGH );
    delay( 1 );
    digitalWrite( pinStep, LOW );
    delay( 1 );
  } 
  
  // Pas de step et pas d'ordre... 
  //   l'axe du moteur est donc bloqué 
  Serial.println("Axe bloqué + attendre 5 sec");
  delay( 5000 );
  
  // déblocage de l'axe moteur
  Serial.println("Deblocage axe");
  digitalWrite( pinEnable, HIGH ); // logique inversée
  
  // Fin et blocage du programme
  // Presser reset pour recommander
  Serial.println("Fin de programme");
  while( true );
}

infobarquee:
bonjour,
ca serait pas 1023 et 255?
après tu n'a pris que la possibilité de tout en LOW, que se passe t'il si un est en HIGH?
le enable est ou dans le code?

En ce qui concerne les valeurs ça ne change rien.

En ce qui concerne HIGH, ça bloque, rien ne se passe

infobarquee:
bonjour,

prends cet exemple http://mchobby.be/wiki/index.php?title=A4988

#define pinEnable 13 // Activation du driver/pilote

#define pinStep    9 // Signal de PAS (avancement)
#define pinDir     8 // Direction

void setup(){
 Serial.begin(9600);
 Serial.println("Test A4988");
 
 pinMode( pinEnable, OUTPUT );
 pinMode( pinDir   , OUTPUT );
 pinMode( pinStep  , OUTPUT );
}

void loop(){
 int i = 0;
 
 digitalWrite( pinDir   , HIGH); // Direction avant
 digitalWrite( pinStep  , LOW);  // Initialisation de la broche step
 
 // Avance de 200 pas
 for( i=0; i<200; i++){
   Serial.println( i );
   digitalWrite( pinStep, HIGH );
   delay( 10 );
   digitalWrite( pinStep, LOW );
   delay( 10 );
 }
 
 // Changer de direction
 digitalWrite( pinDir   , LOW); // Direction avant
 
 // Refaire 200 pas dans l'autre sens
 for( i=0; i<200; i++){
   Serial.println( i );
   digitalWrite( pinStep, HIGH );
   delay( 1 );
   digitalWrite( pinStep, LOW );
   delay( 1 );
 }
 
 // Pas de step et pas d'ordre...
 //   l'axe du moteur est donc bloqué
 Serial.println("Axe bloqué + attendre 5 sec");
 delay( 5000 );
 
 // déblocage de l'axe moteur
 Serial.println("Deblocage axe");
 digitalWrite( pinEnable, HIGH ); // logique inversée
 
 // Fin et blocage du programme
 // Presser reset pour recommander
 Serial.println("Fin de programme");
 while( true );
}

En ce qui concerne le code, j'ai fait l'essai, avec ou sans enable, le résultat est le même.

Le moteur fait un tour sur lui même puis revient rapidement à sa position d'origine, un appui sur reset recomence l'opération

pepe:
Le fait est que ce n'est pas directement un moteur pas-à-pas que l'Arduino doit piloter, mais un contrôleur de moteur intelligent. Ce n'est donc pas une commande directe de moteur qu'on doit réaliser, mais une communication numérique avec le contrôleur.

D'après la doc, le contrôleur est un A1988 (datasheet par ici) mis en œuvre suivant ce schéma :

La commande est envoyée sur le front montant du signal STEP. Cette commande peut être une incrémentation ou une décrémentation de la consigne de position, selon l'état du signal DIR.

Le mode de commande du moteur par le contrôleur (pas entier, 1/2 pas, ... 1/16 pas) est fixé par l'état des trois entrées MS1, MS2 et MS3 (voir tableau page 6 de la datasheet).

La vitesse d'évolution de la consigne de position dépend à la fois de la fréquence des fronts montants de STEP et de l'état des entrées MS1 à MS3. La vitesse effective du moteur dépend de celle de la consigne, mais également des limitations imposées par le contrôleur et par la charge mécanique du moteur.

On peut déjà conclure qu'une commande par PWM (à fréquence fixe) ne convient pas.

En ce qui concerne les raisons de ton problème, il faudrait déterminer toutes les causes de limitation de la vitesse, en commençant par calculer la relation entre la fréquence de STEP et la vitesse attendue d'après l'état de MS1 à MS3 et la résolution angulaire du moteur pas-à-pas. Il est possible que l'exécution du programme Arduino (en dehors des délais) soit simplement trop lente, mais pas seulement.

J'ai effectivement appliqué ce schéma sur ma platine.

Par contre je ne sais pas comment utiliser MS1 à MS3 et le dire dans le code.

J'ai compris qu'il fallait les mettre en niveau haut ou bas en fonction du pas choisi

re,
Tu as l'explication de MS1 à MS3 ici

c'est bon j'ai trouvé, cela n'augmente pas la vitesse mais la diminue.

Ce que je voulais faire c'est pouvoir varier la vitesse jusqu'au décrochage comme sur des tests de vitesses sur une machine CNC comme sur la capture de ma machine.

pepe:
J'ai indiqué à quelle page trouver l'explication :Quant à l'état de ces entrées, il doit être fixé matériellement.

Pour pouvoir agir dessus par programme, il faudrait d'abord relier les pins correspondantes à des sorties de l'Arduino. Mais cela n'est pas forcément utile.

En reliant ces trois entrées de façon permanente à GND, la vitesse de variation de la consigne sera maximale.

J'aivais pas lu la fin de ton post.

Tu parles de variation de vitesse de la consigne et bien c'est de cela dont je voudrais modifier, la vitesse de consigne

pepe:
En toute logique, mettre les trois entrées à GND devrait diminuer la vitesse.

Si ce n'est pas le cas, alors la situation est anormale. Le moteur a peut-être déjà décroché, ou alors le contrôleur refuse une partie des commandes reçues.

Que je mette à GND ou en l'air ne change rien par contre si je met à VDD alors là ça baisse

pepe:
Gare à la confusion.

Une vitesse de consigne, c'est une valeur donnée en consigne pour indiquer une vitesse. Ici on n'a pas affaire à ce type de commande.

La vitesse de variation de la consigne dont je parle ici, c'est la rapidité d'évolution de la consigne de position.

Donc pour cela y a pas de solution, je ne peux pas faire tourner le pap aussi vite que sur ma machine