Exemple: Acceleration
Ce programme fait tourner le moteur de plus en plus vite avec un phase d'accélération et une phase de décélération, ce qui permet par exemple de mesurer la vitesse maximale que l'on peut atteindre aisément avec QuickStep.
Note: La limite basse du temps entre deux pas dû à la bibliothèque est de 9µs/pas, ce qui peut éventuellement ne pas permettre de déterminer la vitesse maxi.
Liens
Pour faire fonctionner cet exemple, il faut soit télécharger QuickStepExemples.zip
contenant tous les fichiers d'exemples, soit télécharger Acceleration.zip
contenant cet exemple, soit créer un répertoire du nom de l'exemple et mettre dedans:
- le fichier Acceleration.ino de l'exemple
- le fichier de configuration QuickStepConf.h propre à cet exemple
- les trois fichiers (QuickStep.h, QuickStep.cpp
et digitalWriteFast.h) pour avoir la bibliothèque (identiques pour toutes les
applications)
QuickStepConf.h (extrait)
#define timer1pourQuickStep // Hybride 200pas/tr en mode 16 micro-pas #define UN_TOUR (200L*16) pas_ou_micro_pas #define VITESSE_MAXI 3000 RPM #define STEP 2 #define DIR 5 #define ENABLE 8 #define NB_ORDRES_DANS_LA_PILE 255 #define NB_ORDRES_ACCELERATION 255
On a des accélérations donc des enchaînements. Il faut donc une pile pouvant contenir plusieurs ordres. Pour pouvoir avoir largement le temps de calculer les différents paliers, on va prendre la pile d'ordres la plus grande. Avec une Uno/Nano, on va avoir un avertissement pour espace de donnée faible, mais cela fonctionne encore.
Avec 255 ordres dans la pile, et 255 paliers d'accélération et 255 paliers de décélération quickStepRotation() sera bloquant, mais ici on s'en moque, on n'a rien d'autre à faire. Le nombre de paliers maximum de QuickStep est de 255, et cela permet le démarrage le plus doux possible.
Acceleration.ino
# $menu = ":QS"; include "QuickStep.h" void setup() { quickStepInit(); // Obligatoire pour utiliser QuickStep Serial.begin(115200); // Pour povoir lire les vitesses } float tempsEntrePasDemande = 40 micro_secondes; // Soit 25000 µpas/s float tempsEntrePasObtenu; void loop() { // Choix et affichage du temps entre deux pas ou micro-pas Serial.print(F("Le temps entre deux pas ou deux micro-pas au maximum de la vitesse est de ")); Serial.print(tempsEntrePasObtenu = quickStepBaseDeTemps(tempsEntrePasDemande)); Serial.println(F("µs")); // Affichage de la vitesse du moteur Serial.print(F("A ce moment, le moteur tourne à ")); serialPrintFloat3(60000000.0 / (tempsEntrePasObtenu * UN_TOUR)); Serial.print(F("tr/mn soit ")); serialPrintFloat3(1000000.0 / (tempsEntrePasObtenu * UN_TOUR)); Serial.println(F("tr/s\n")); //Préparation pour la prochaine fois. tempsEntrePasDemande *= 0.80; // 50 tour dans un sens, une seconde d'arrêt quickStepRotation(50 * UN_TOUR, tempsEntrePasObtenu, acceleration_sur 20*UN_TOUR, deceleration_sur 20*UN_TOUR); quickStepWait(); // Attente de la fin de la rotation delay(1000); }
Il faut choisir une vitesse "lente" pour commencer. Ici est choisi un temps minimum entre 2 ordres step de 40µs. Ce temps va dépendre du moteur et de son mode (pas? micro-pas?). Si le moteur ne tourne pas à cette vitsse multiplier ce temps par 10 et refaire les essais tant qu'il ne démarre pas. Plus ce nombre est petit, plus le moteur va vite. Si on connait le moteur, on peut commencer avec un temps légèrement plus grand pour éviter trop d'essais
La vitesse va augmenter (l'espace entre impulsion diminue) d'environ 20% à chaque boucle à cause de
tempsEntrePasDemande *= 0.80;
Pour afiner la mesure, on peut recommencer en remplaçant la valeur de démarrage par une valeur légèrement supérieure
à la valeur qu'elle avait lors du dernier mouvement correct et remplacer ce 0.80 par 0.99 (soit 1%).
En prennant 20 tours pour accélérer, 10 tours à vitesse maximale, 20 tours pour freiner, cela permet au moteur d'avoir le temps de se stabiliser sur chaque palier avant d'attaquer le suivant.