Exemple: SurVitesseMaxi

Ce programme fait tourner le moteur de plus en plus vite. La dernière vitesse pour laquelle le moteur n'a pas perdu de pas est la sur-vitesse maximale. Les données sont affichées sur la console. En passant en revue toutes les vitesses du moteur, cela permet aussi de voir si il y a des résonances et pour quelles vitesses.

Liens

Pour faire fonctionner cet exemple, il faut soit télécharger QuickStepExemples.zip contenant tous les fichiers d'exemples, soit télécharger SurVitesseMaxi.zip contenant cet exemple, soit créer un répertoire du nom de l'exemple et mettre dedans:
- le fichier SurVitesseMaxi.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 // Indispensable si on utilise RPM ou RPS
#define VITESSE_MAXI 3000 RPM // Rajouter l'unité: micro_secondes_par_pas, RPM, ou RPS
#define STEP 2 // N° de la broche pour STEP
#define DIR 5 // N° de la broche pour DIR, facultatif
#define ENABLE 8 // N° de la broche pour ENABLE. Si on la veut à l'état bas

Le timer 1 est utilisé car sa résolution est meilleure, et il permet des valeurs de vitesses plus proches.

Comme on cherche à faire varier la vitesse, on va choisir une base de temps en µs et on va diminuer de temps de 1% à chaque itération de loop(). Comme la vitesse est limité par la base de temps, si on demande par QuickStepDeplacement() une vitesse trop grande, la vitesse sera fixé par la base de temps. C'est pour cela que je donne pour la vitesse maximale du moteur une vitesse plus grande, par exemple la limite mécanique.

La limite basse dû à la bibliothèque est de 12µs/pas, ce qui peut éventuellement ne pas permettre de déterminer la vitesse maxi.

SurVitesseMaxi.ino

#
  $menu = ":QS";
  include "QuickStep.h"

void setup()
{
  quickStepInit(); // Obligatoire pour utiliser QuickStep
  Serial.begin(115200); // Pour pouvoir lire les vitesses
  quickStepRotation(MAX_PAS, VITESSE_MAXI); // Mise en route
}

float tempsEntrePasDemande = 60 micro_secondes; // Au départ
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 est de "));
  Serial.print(tempsEntrePasObtenu = quickStepBaseDeTemps(tempsEntrePasDemande));
  Serial.println(F("µs"));
  // Affichage de la vitesse du moteur
  Serial.print(F("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.99;

  // Rotation pendant seconde
  delay(1000);
}

Il faut choisir une vitesse "lente" pour commencer. Ici est choisi un temps minimum entre 2 ordres step de 200µs. Ce temps va dépendre du moteur et de son mode (pas? micro-pas?). Si le moteur ne tourne pas à cette vitesse 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 connaît 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 1% à chaque boucle à cause de
tempsEntrePasDemande *= 0.99;
Pour affiner 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.99 par 0.999 (soit 0.1%).