Programme de commande de moteur pas à pas avec accélération


bonjour à tous,

je dois commander un moteur pas à pas de taille nema 23 (200 pas) avec un driver ms542. le driver est configuré en 400 pas
il s'agit d'une simple rotation avec une variation de vitesse.

j'ai fait des essais avec accelstepper et avec le programme constantspeed.pde
si j'ai bien compris, avec accelstepper et une vitesse constante, il n'est pas possible de gérer les accélérations --> commande "stepper.runspeed();"
les accélérations sont gérées dans le cas ou la distance entre en jeux et non la vitesse --> commande "stepper.run();"

finalement, j'ai fait un petit programme avec une boucle.

j'ai une variable de vitesse de démarrage "vitessedemar1" qui est placée dans le loop.
a chaque passage de la boucle, la variable augmente d'un pas "pasaccel1" jusqu'à atteindre la vitesse de marche du moteur "vitessemax1"

ce programme simple fonctionne parfaitement, mon moteur se lance et accélère sans problème.
reste à faire la même chose pour la décélération.

qu'en pensez-vous ?

code: [select]


const int pul1 = 26; // pas du moteur
const int dir1 = 28; // direction du moteur
int capteurmarche = 1; // interuuption n°1 --> pin n°3 mega 2560
int capteurarret = 2; // interuuption n°2 --> pin n°21  mega 2560
const int enable = 30; // enable driver

int pulsewidthmicros1 = 5;  // variable delaymicroseconds
float vitessemax1 = 400 ;// variable delaymicroseconds -- >  pour la vitesse de fonctionnement maximun. plus la valeur est grande, plus rapide est la vitesse
float vitessedemar1 = 1000; // variable delaymicroseconds --> pour la vitesse de démarrage
float vitesse1 = vitessedemar1; // varable utilisée dans la fonction "moteur1"
float pasaccel1 = 0.7;  // pas pour l'acceleration
volatile int volatilemarche = low; // varle volatile utilisée dans l'interruption



void setup()
{
 serial.begin(9600);

 pinmode(dir1, output);
 pinmode(pul1, output);
 pinmode(enable, output);
 digitalwrite(dir1, high);
 digitalwrite(enable, high); // desactive enable

}

void loop()
{
  attachinterrupt(capteurmarche,cyclemarche, change); // interruption bouton marche
  attachinterrupt(capteurarret,cyclearret, change); // interruption bouton arret
 
 
  if (volatilemarche  == high) // test si l'interruption est activée
    {
       if (vitesse1 < vitessedemar1) // test si la variable vitesse est < que la vitesse de démarrage
        {
           vitessedemar1 = vitessedemar1 - pasaccel1; // ajustement à chaque boucle de la vitesse
           vitesse1 = vitessedemar1; // renseigne la vitesse pour la fonction moteur1
           moteur1(); // lance la fonction qui fait tourner le moteur
         }
 else
    {
      vitesse1 = vitessemax1; // dans ce cas la vitesse du moteur = la vitesse maximum
      moteur1();// lance la fonction qui fait tourner le moteur
     }  
  }
}



void cyclemarche() // fonction interruption
{
 serial.println("moteur marche"); // message
 volatilemarche = high ; // active la variable
 digitalwrite(enable, low); // active enable
}



void cyclearret() // fonction interruption
{
 serial.println("moteur arret"); // message
 volatilemarche = low ; // désactive la variable
 digitalwrite(enable, high); // desactive enable
 digitalwrite(pul1, low); // desactive la sortie pul du driver
 vitessedemar1 = 1000;  // recharge la variable de vitesse de démarrage
}


void moteur1()
{
   digitalwrite(pul1, high); // active la sortie pul du driver
   delaymicroseconds(pulsewidthmicros1); // pause en microsecondes
   digitalwrite(pul1, low);  // desactive la sortie pul du driver
   delaymicroseconds(vitesse1); // pause en microsecondes
}




le rapport cyclique devrai etre voisin de 50%, mais tu gere la vitesse en jouant sur la durée de l'état bas.

tu devrai plutot adapter genre
code: [select]

void moteur1()
{
    pulsewidthmicros1=vitesse1/2;
    digitalwrite(pul1, high); // active la sortie pul du driver
    delaymicroseconds(pulsewidthmicros1); // pause en microsecondes
    digitalwrite(pul1, low);  // desactive la sortie pul du driver
    delaymicroseconds(pulsewidthmicros1); // pause en microsecondes
}


en fonction de la vitesse du moteur et de ton code, tu risque d'avoir quand meme des dérapages car cette fonction n'est pas elle meme cyclique la vitesse du moteur.


Arduino Forum > International > Français (Moderators: jfs, Snootlab) > Programme de commande de moteur pas à pas avec accélération


arduino

Comments

Popular posts from this blog

Connecting Raspberry Pi 2 to P10(1R)-V706 LED Dot Matrix - Raspberry Pi Forums

TypeError: <unknown> is not a numpy array - Raspberry Pi Forums

datso and removing imagetitle - Joomla! Forum - community, help and support