Go Down

Topic: moteur pas à pas bipolaire (Read 27877 times) previous topic - next topic

jfs

#15
May 03, 2008, 10:30 am Last Edit: May 03, 2008, 10:35 am by jfs Reason: 1

La solution est peut-être d'utiliser un L297 :

http://www.positron-libre.com/electronique/moteurpasapas/circuit-commande-l297.htm

La datasheet :

https://www.distrelec.com/distrelec/datasheets.nsf/WebAttachments/7C8F59AD8B3B6E93C12570EA007410FE/$File/647106.pdf
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

Vincent

#16
May 03, 2008, 01:12 pm Last Edit: May 03, 2008, 01:19 pm by Vincent Reason: 1
Oui le L297 est un driver pour commander des moteurs pas à pas. Suivant ton moteur il faut peut être rajouté un L298 (pour la puissance) par contre ces circuits coûtes assez chère si mes souvenirs sont bon, donc acheter un moteur avec plus de pas serait plus rentable. Tu veux que ton moteur tourne à quel vitesse ? et dans quel but ?

jfs

#17
May 03, 2008, 01:48 pm Last Edit: May 03, 2008, 02:25 pm by jfs Reason: 1
J'ai vu qu'un L297 tournait autour de 4 ?uros, c'est encore acceptable...

Pour l'instant j'essaye surtout de me familiariser avec ces sbsfasdfjksaiuuu de moteur PAP.  ;D


J'ai revérifié mes séquences demi-pas avec un autre site :

http://www.fresnel.fr/perso/kuhlmey/nik/stepper.html


et je trouvais un truc bizarre dans mon premier code, j'ai refait ça et la rotation est plus "onctueuse", en plus je peux varier la vitesse sur une petite plage.

Je vais réessayer la "pseudo" PWM de tout à l'heure.

Pour le moment j'essaye de faire démarrer le moteur à un régime et de l'accélérer, mais en faisant une boucle de cette façon je bloque sur un step et le moteur ne tourne pas :

Code: [Select]
int del= 816;

void loop() {

              Step_1();
             
 delayMicroseconds(del);

              Step_2();
             
 delayMicroseconds(del);
 
              Step_3();
             
 delayMicroseconds(del);
 
              Step_4();
             
 delayMicroseconds(del);

              Step_5();
             
 delayMicroseconds(del);

              Step_6();
             
 delayMicroseconds(del);

              Step_7();
             
 delayMicroseconds(del);
 
              Step_8();
             
 delayMicroseconds(del);
 i++;
if (i>=10)
{
if (del>=594)
{
  del--;
}
}
}


On dirait que ça me rallonge le "delay" entre la phase 8 à 1.  :-?
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

jfs

J'ai fait un essai en mettant un petit potentiomètre sur analog 5 :

Code: [Select]
...

int analogPin = 5;

int freq = 1;
int del = 200;
int L;
int H;

...


void  Step_3(){  H=0;
for(L=255;L>=0;L=L-freq)
{
   digitalWrite(A_Pin,LOW);  
   digitalWrite(B_Pin,H);
   digitalWrite(C_Pin, L);  
   digitalWrite(D_Pin, LOW); H=H+freq;
}

...

void loop() {
 freq = analogRead(analogPin)/4;

              Step_1();
             
 delayMicroseconds(del);

...


Le potentiomètre de 10k[ch937] permet de faire varier la vitesse du PWM. :)
J'arrive à me caler à n'importe quelle "régime" de rotation et de pouvoir régler une rotation plus onctueuse en agissant sur le potar.
Par contre il me semble que les boucles de PWM ne sont pas assez rapides pour que cela soit intéressant, j'arrive à une rotation plus élevée sans cet essais de mode micro-pas.   :-?
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

jfs

#19
May 10, 2008, 10:35 am Last Edit: May 10, 2008, 10:36 am by jfs Reason: 1
J'arrive à faire tourner ce moteur à des vitesses différentes, mais je me pose un question, comment faire pour n'avancer que de 1 (ou plusieurs) pas dans un direction et m'arrêter ?  :-?
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

Vincent

Tu peux faire un compteur. En fait tu met un for(i=0;i<nb_pas;i++) et dans ce dernier tu mets ton programme qui génère une séquence.

jfs

#21
May 10, 2008, 11:33 am Last Edit: May 10, 2008, 02:48 pm by jfs Reason: 1
En faisant ça :

Code: [Select]
int nb_pas = 4;

void loop() {
 
for  (i=0;i<nb_pas;i++){

              Step_1();
             
 delayMicroseconds(del);

              Step_2();
             
 delayMicroseconds(del);
 
              Step_3();
             
 delayMicroseconds(del);
 
              Step_4();
             
 delayMicroseconds(del);

              Step_5();
             
 delayMicroseconds(del);

              Step_6();
             
 delayMicroseconds(del);

              Step_7();
             
 delayMicroseconds(del);
 
              Step_8();
             
 delayMicroseconds(del);
 }


}


Le moteur tourne en continu, sans s'arrêter.

Autrement en suivant le lien ci-après, il est décrit une façon d'utiliser la force contre électromotrice (FCEM) du moteur pour connaitre sa position et ajuster la fréquence du signal : commande pour moteur brushless
Par contre je ne comprend pas comment il fait pour capter et traiter cette FCEM, il utilise également des Atmega, mais pas en C.

Edit : j'ai rajouté le "for" qui avait disparu pour je ne sais quelle raison.
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

Vincent

Ton moteur tourne en continu car tu es dans la fonction loop(), en gros ton for ce fait en boucle (d'ailleurs pourquoi tu n'as pas écrit le for ?). Si tu fait après le for une boucle d'attente, ton moteur ne fera que 4 pas.

jfs

#23
May 10, 2008, 03:20 pm Last Edit: May 10, 2008, 03:21 pm by jfs Reason: 1
En mettant une boucle d'attente à la fin :

Code: [Select]
...
              Step_8();
             
 delayMicroseconds(del);
 }
for (a=0;a<35000;a++)


}



En ayant la valeur "a" à 30'000, ça tourne en continu et à 35'000 plus rien ne se passe...  :o
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

jfs

#24
May 10, 2008, 05:17 pm Last Edit: May 10, 2008, 05:17 pm by jfs Reason: 1
Avec ça, c'est ok :

Code: [Select]
...
              Step_8();
             
 delayMicroseconds(del);
 }
for (a=0;a < 1 ;a++)
{
Step_0();
delay (1000);
}


Mais la position n'est pas verrouillée.
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

Vincent

C'est à dire ? tu peux tourner l'axe ?

jfs

#26
May 10, 2008, 05:41 pm Last Edit: May 11, 2008, 06:45 am by jfs Reason: 1
Oui, j'arrive à le tourner entre chaque pas.

Si je met une pseudo fonction Step_stop() avec toutes les positions à High, non seulement le moteur chauffe, mais au bout du deuxième tours il se produit une sorte de résonnance.
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

Vincent

Au lieu de toutes les mettent à 1, essaye d'en mettre que 2 des 4.

jfs

J'ai déjà essayé et ça ne fonctionne pas, le moteur est libre entre chaque cycle.
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

jfs

J'essaye avec ce code pour faire avancer le moteur d'un nombre de pas déterminé, mais le moteur reste sur sa position et fait une série de 5 secousses puis s'arrête pendant environ 5 secondes :

Code: [Select]
int del=1250;

int nb_pas =2;
int tempo = 1;

void loop() {
 
for  (i=0;i<nb_pas;i++)
{
if (i<=nb_pas && pos ==8)
{
              Step_1();
                  pos=1;
                  delayMicroseconds(del);
                  i++;
                 
}
else if (i<=nb_pas && pos ==1)
 {
                  Step_2();
              pos=2;
                  delayMicroseconds(del);
                  i++;
}
 else if (i<=nb_pas && pos ==2)
 {
              Step_3();
                  pos=3;
                  delayMicroseconds(del);
                  i++;        
                 
}

...

...

else if (i<=nb_pas && pos ==7)
 {
                  Step_8();
              pos=8;
                  delayMicroseconds(del);
                  i++;
 }
 }
for (a=0;a < tempo ;a++)
{
Step_0();
delay (1000);
}

}


Je pensais que de cette façon le moteur ferait le nombre de pas déterminés par "nb_pas", s'arrêterait  pendant la durée définie par "tempo" et recommencerait son cycle.
La variable "pos" devrait permettre de savoir ou le cycle s'est terminé si "nb_pas" n'est pas un multiple de 4 et de repartir à la position où se trouve le moteur.
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

Go Up