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.