Présentation de QuickStep
Bibliothèque pour moteurs pas à pas et Uno, Nano ou Mega

Sommaire:
      Présentation rapide
      Ressources utilisées
      Performances
      Comparaisons avec d'autres bibliothèques

 

Présentation rapide

QuickStep est une bibliothèque paramétrable permettant de gérer des moteurs pas à pas utilisant des timers et des interruptions. Elle est écrite pour répondre à deux exigences. D'une part aller vite, et d'autre part pouvoir faire tourner des moteurs pas à pas même avec du code bloquant. On peut utiliser des moteurs pilotés par STEP/Dir (A4988, TB6600...) ou par commande directe des enroulements (ULN2803 par exemple). Elle permet:
- de programmer le temps exact entre deux pas (si on demande 10µs, on a 10µs!)
- de faire tourner un moteur à 3000tr/mn même en 16 microsteps pour un 200pas/tr... si il en a la force (je veux dire le couple)
- de pouvoir enchaîner des ordres de rotation sans temps morts
- de pouvoir mémoriser à l'avance plusieurs ordres de rotation
- de faire tourner les moteurs même pendant que l'on utilise du code bloquant
- d'enchaîner plusieurs ordres de rotations pendant un code bloquant (les ordres peuvent être donnés à l'avance)
- de faire des accélérations et des décélérations (par paliers, entre 4 à 128)
- de gérer les moteurs individuellement ou par paire
Elle ne tourne pour l'instant que sur Uno ou Nano (un moteur ou une paires de moteurs associés) ou sur Mega (4 moteurs indépendants ou paires de moteurs associés)

QuickStep fonctionne par interruption. Il faut un timer (16 bits actuellement, 8 bits dans le futur?) par moteur ou par paire de moteurs (pour un nombre illimté de moteurs dans le futur?). QuickStep utilise éventuellement une pile pour mémoriser les ordres de rotation à l'avance (maxi 255 ordres).

 

Ressources utilisées

QuickStep utilise pour l'instant un timer 16 bits pour faire tourner un moteur indépendant ou deux moteurs associés. Celui ci n'est donc pas utilisable pour gérer autre chose. Certaines bibliothèques utilisent des timers, comme SERVO qui les bloquent tous (crée la même fonction d'interruption que QuickStep). On ne peut donc pas utiliser cette bibliothèque en même temps que servo. Le PWM matériel utilise aussi les timers:

CarteTimerBroches PWM
Uno     1     9 et 10
    Nano     19 et 10
Mega1     11, 12 et 13    
32, 3 et 5
46, 7 et 8
544, 45 et 46

Par exemple, on ne peut pas utiliser le PWM de la broche 9 d'une Uno si on utilise le timer 1 pour faire avancer un moteur pas à pas.

 

Performances

Je ne donnerai pas toutes les mesures que l'on peut faire. Comme en plus on peut utliser de 1 à 4 timers en même temps, et que les limites dépendent des rapports de vitesses, il n'est pas possible de donnet toutes les mesures pour tous les cas de figure.

Note: Pour faire avancer un moteur, il faut donner le temps entre deux pas (ou micro-pas). L'inverse de ce temps représente la vitesse. Je vais donc parler de vitesse ou d'intervalle de temps.

Quand un seul moteur fonctionne, la vitesse demandée (inverse passé en paramètre) est la vitesse réelle. Quand deux moteurs asssociés fonctionnent ensembles, la vitsse demandée est la vitesse résultante. Chaque moteurs allant donc un peu plus lentement. Si par exemple deux moteurs associés doivent faire avancer une tête d'usinage à une vitesse donnée (vitesse programmée, dont on passe l'inverse en paramètre) la vitesse résultante est donc la vitesse demandée, mais chacun des deux moteurs aura une vitesse moindre. Par exemple si on fait une diagonale (même vitesse pour les deux moteurs), la vitesse réelle de la tête est la vitesse programmée, et la vitesse de chaque moteur est de √2 fois plus faible.

La largeur minimale des impulsions STEP que QuickStep génère est de 1,688µs à l'état haut et de 4,062µs à l'état bas pour un moteur indépendant. On peut donc générer une impulsion toutes les 5,75µs. Le driver A4988, a besoin d'une impulsion d'au moins 1µs pour chacun des deux états, et cela fonctionne donc avec une marge. Le driver DM860, par contre, a besoin d'une impulsion d'au moins 1,9µs, et il faut donc rallonger le temps de l'état haut de l'impulsion; cela diminue ainsi la vitesse maximale. Quand les moteurs sont associés, le programme d'interruption commun est plus long et il n'y a pas besoin de rallonger les impulsions.

Les mesures sont effectuées timer 0 désactivé. Le timer 0 consomme environ 8µs toutes les ms environ. C'est autant d'indisponible pour faire tourner les moteurs pas à pas. En réalité, cela peut éventuellement ralentir les moteur d'un maximum de 0,6% dans le pire des cas (il n'y a pas jamais perte de pas).

On peut considérer, en première approximation, que le temps minimum entre impulsions est de 6µs par moteur. Si on veut par exemple faire tourner 3 moteurs, les temps entre impulsions doivent être d'au moins 18µs. Voici ce que j'obtiens avec un A4988 (aux vitesses maximum, il n'y a plus de temps pour le programme principal):
ConditionsDriverTemps maxi entre
  deux pas programmé  
Temps mini entre
deux pas programmé
  Vitesse maxi pour 200pas/tr  
en 16 micro-pas
Un seul moteur  A4988  4s5,75µs54tr/s
3260 tr/mn
Deux moteurs associés
  un seul tourne
Tous2.8s10,19µs30tr/s
1840tr/mn
Deux moteurs associés
  même vitesse
Tous2.8s10,44µs30tr/s
1800tr/mn
Deux moteurs associés
  vitesse V et 2V
Tous2.8s11,9µs26tr/s
1570tr/mn
  Quatre moteurs indépendants  
même vitesse
A49884s23,81µs13tr/s
780tr/mn
Quatre moteurs indépendants
pas de T1, T2, T3, T4
Vitesses V1, V2, V3, V4
A49884s V1+V2+V3+V4
= 54tr/s = 3260tr/mn

Pour un seul moteur, en fonction du driver, cela donne (liste non exaustive):
ConditionsDriverTemps maxi entre
  deux pas programmé  
Temps mini entre
  deux pas programmé  
  Vitesse maxi pour 200pas/tr  
en 16 micro-pas
  Vitesse maxi pour 200pas/tr  
en mode pas
  Un seul moteur  A4988
  AMIS-30543  
DRV8880
MP6500
STSPIN220
STSPIN820
TB67S109
TB67S128
TB67S279
TB67S249
4s5,75µs 54tr/s
3260tr/mn
mode déconseillé
Un seul moteurDRV8825
DRV8711
DRV8834
4s6µs52tr/s
3125tr/mn
mode déconseillé
Un seul moteurDM556
L9942
4s6,06µs51tr/s
3100tr/mn
mode déconseillé
Un seul moteurTB66004s6,31µs49,5tr/s
2970tr/mn
mode déconseillé
Un seul moteurDM8604s6,56µs48tr/s
2850tr/mn
mode déconseillé
Un seul moteurULN????
2 signaux
4s6,5µsImpossible770tr/s
45000tr/mn
Un seul moteurULN????
4 signaux
4s6,75µsImpossible670tr/s
40000tr/mn
Si on double le nombre de micro-pas, la vitesse est divisée par deux. C'est intéressant d'avoir des vitesses élevées si on a plusieurs moteurs car on doit partager la vitesse maximum. Je ne recommande pas d'utiliser les drivers STEP/Dir à moins de 8 micro-pas, sauf cas particuliers. Tenez aussi compte du fait que la vitesse maximale d'un pas à pas est en général de 3000tr/mn à cause de la mécanique.

 

Comparaisons avec d'autres bibliothèques

Pour comparer QuickStep avec d'autres bibliothèques, j'ai écrit un programme pour Uno faisant tourner un moteur de 200 pas par tour en mode 16 micro-pas à la vitesse de 1tr/s pendant 1 tour dans un sens et un tour dans l'autre infiniment. Notez que la bibliothèque Stepper n'est pas prévue pour utiliser un driver STEP/Dir, mais elle peut être détournée en utilisant l'information bobine1 sur Step et bobine2 sur Dir. Il faut alors lui demander 4 pas pour avancer d'un seul.

Un programme qui ne fait rien (TailleVide.ino) sur une Uno utilise 444 octets de Flash et 9 octets de Ram. Je déduis donc ces valeurs des mesures. Par exemple le programme utilisant AccelStepper utilise 3778 octets de programme et 64 octets de données, je reporterai 3778-444 octets de Flash et 64-9 octets de Ram. Les pourcentages sont calculés avec QuickStep comme base.

Avec Step et Dir en mode 16 micro-pas
BibliothèqueOctets de
  programme  
  Octets de  
données
  Largeur d'impulsion  
mini à l'état haut  
Temps minimum
  entre 2 impulsion Step  
  Vitesse de rotation  
16 micro-pas, 200pas/tr
  Temps pris entre deux  
ordres de rotation
QuickStep440 (100%)18 (100%)1,6888µs5,75µs (100%)3260tr/mn (100%)0
AccelStepper3334 (760%)55 (300%)3,875µs250µs (4300%)75tr/mn (2,3%)10µs
  StepperDriver  3954 (900%)74 (400%)17,4µs38µs (660%) (2)490tr/mn (15%)160µs
(1) Rapport cyclique de 1/2 correspondant à l'alimentation d'une bobine.
(2) Cette impulsion dure en général 38µs, mais une impulsion toutes les 28 impulsion dure 44µs!

Pour moteurs bipolaires
BibliothèqueOctets de
  programme  
  Octets de  
données
  Largeur d'impulsion  
mini à l'état haut  
Temps minimum
  entre 2 impulsion Step  
  Vitesse de rotation  
200pas/tr
  Temps pris entre deux  
ordres de rotation
QuickStep440 (100%)18 (100%)1,6888µs6,75µs (100%)40000tr/mn (100%)0
Stepper1630 (370%)26 (150%)1/2 (1)32µs (470%)  9400tr/mn (21%) (3)  4µs

 


dansetrad.fr Contactez-moi