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 ?
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
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.
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
Post a Comment