Exemple: PasEntiers
Ce programme est une des rares fois ou je considère que le pas entier est plus utile que le micro-pas. Une suite de déplacements est mémorisée dans une table.
Liens
Pour faire fonctionner cet exemple, il faut soit télécharger QuickStepExemples.zip
contenant tous les fichiers d'exemples, soit télécharger PasEntiers.zip
contenant cet exemple, soit créer un répertoire du nom de l'exemple et mettre dedans:
- le fichier PasEntiers.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)
// Hybride 200pas/tr en mode pas entiers #define UN_TOUR 200 pas_ou_micro_pas #define STEP 12 #define DIR 13 #define ENABLE 8
PasEntiers.ino
# $menu = ":QS"; include "QuickStep.h" // A changer pour ajuster la vitesse au moteur #define VITESSE /4 // possible: >>2 /4 /4.0 *0.25 ... const word MICROSECONDES_PAR_PAS[] = { 46114, 44658, 43360, 46114, 28274, 44658, 43360, 26382, 26382, 26976, 26976, 46114, 44658, 43360, 46114, 28274, 44658, 43360, 26382, 25291, 13346, 25291, 41675, 42766, 26976, 44658, 43360, 26382, 25291, 11890, 25291, 41675, 42766, 26976, 44658, 43360, 26382, 25291, 11890, 46114, 44658, 43360, 46114, 28274, 44658, 43360, 26382, 26382, 26976, 26976, 46114, 44658, 43360, 46114, 28274, 44658, 43360, 26382, 25291, 13346, 1, 42766, 42766, 42766, 41675, 24319, 25291, 42766, 40703, 41675, 41675, 9998, 42766, 42766, 42766, 41675, 24319, 25291, 42766, 40703, 41675, 41675, 9998, 41675, 41675, 41675, 41675, 29730, 29730, 41675, 42766, 43360, 44658, 13346, 42766, 42766, 42766, 41675, 24319, 25291, 42766, 40703, 41675, 41675, 9998, 0}; void setup() { quickStepInit(); // Obligatoire pour utiliser QuickStep } word indice = -1; // Parcours de la table des périodes void loop() { if (MICROSECONDES_PAR_PAS[++indice] < 2) // Fin de la liste { if (MICROSECONDES_PAR_PAS[indice] == 0) indice = -1; // On recommence au début delay(4000); // Séparation des mouvements } else // Vraie vitesse { quickStepBaseDeTemps((MICROSECONDES_PAR_PAS[indice] & 0x3FFF) VITESSE); // La table contient sur 14 bits le nb de µs/pas if (quickStepGetPosition() > 0) quickStepRotation(-MAX_PAS, 3000 RPM); // Pour être le plus proche l'origine else quickStepRotation(MAX_PAS, 3000 RPM); switch (MICROSECONDES_PAR_PAS[indice] >> 14) // La table contient sur les 2 bits de poids fort la durée du déplacement { case 0: delay(400); case 1: delay(200); default: delay(150); } quickStepStopMoteur(); delay(50); } }
le temps de base est donnée par les 14 bits de poids faibles d'une valeur de la table par:
(MICROSECONDES_PAR_PAS[indice] & 0x3FFF)
Pour mon moteur ce temps est 4 fois trop grand, il faut le diviser par 4 en mettant en début de programme
#define VITESSE /4
Comme c'est des entiers, on peut utiliser >>2, ce qui ne change pas forcément car le compilateur optimise. Mais on peut
remplacer "/4" par "/3.5" ou toute autre valeur, certaines zones de fréquence conviennent à mon moteur mais pas forcément
au vôtre.
Le temps de la rotation est donné par les deux bits de poids fort des valeurs de la table. On les récupère par:
(MICROSECONDES_PAR_PAS[indice] >> 14)
Si le résultat est 0, tous les delay() sont appelés et la rotation durera 750ms suivi d'un arrêt de 50ms, soit
800ms en tout. Pour un résultat de 1, le tout durera 400ms et pour un résultat de 3, le tout durera 200ms. C'est pour
cela qu'il n'y a pas de break; dans le case.
le sens de rotation dépend du signe de quickStepGetPosition(). Le moteur va donc osciller autour de la position d'origine, un peu comme l'archet d'un violon ou le soufflet d'un accordéon qui peut aller dans les deux sens, mais dont le choix du sens permet de rester dans des limites acceptables.