Sommaire:
Présentation rapide
Ressources utilisées
Performances
Comparaisons avec d'autres bibliothèques
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).
Carte | Timer | Broches PWM |
Uno | 1 | 9 et 10 |
Nano | 1 | 9 et 10 |
Mega | 1 | 11, 12 et 13 |
3 | 2, 3 et 5 | |
4 | 6, 7 et 8 | |
5 | 44, 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.
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):
Conditions | Driver | Temps maxi entre deux pas programmé | Temps
mini entre deux pas programmé | Vitesse maxi pour 200pas/tr
en 16 micro-pas |
Un seul moteur | A4988 | 4s | 5,75µs | 54tr/s 3260 tr/mn |
Deux moteurs associés un seul tourne | Tous | 2.8s | 10,19µs | 30tr/s 1840tr/mn |
Deux moteurs associés même vitesse | Tous | 2.8s | 10,44µs | 30tr/s 1800tr/mn |
Deux moteurs associés vitesse V et 2V | Tous | 2.8s | 11,9µs | 26tr/s 1570tr/mn |
Quatre moteurs indépendants même vitesse | A4988 | 4s | 23,81µs | 13tr/s 780tr/mn |
Quatre moteurs indépendants pas de T1, T2, T3, T4 Vitesses V1, V2, V3, V4 |
A4988 | 4s | ![]() |
V1+V2+V3+V4 = 54tr/s = 3260tr/mn |
Pour un seul moteur, en fonction du driver, cela donne (liste non exaustive):
Conditions | Driver | Temps 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 | 4s | 5,75µs | 54tr/s 3260tr/mn | mode déconseillé |
Un seul moteur | DRV8825 DRV8711 DRV8834 | 4s | 6µs | 52tr/s 3125tr/mn | mode déconseillé |
Un seul moteur | DM556 L9942 | 4s | 6,06µs | 51tr/s 3100tr/mn | mode déconseillé |
Un seul moteur | TB6600 | 4s | 6,31µs | 49,5tr/s 2970tr/mn | mode déconseillé |
Un seul moteur | DM860 | 4s | 6,56µs | 48tr/s 2850tr/mn | mode déconseillé |
Un seul moteur | ULN???? 2 signaux | 4s | 6,5µs | Impossible | 770tr/s 45000tr/mn |
Un seul moteur | ULN???? 4 signaux | 4s | 6,75µs | Impossible | 670tr/s 40000tr/mn |
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èque | Octets 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 |
QuickStep | 440 (100%) | 18 (100%) | 1,6888µs | 5,75µs (100%) | 3260tr/mn (100%) | 0 |
AccelStepper | 3334 (760%) | 55 (300%) | 3,875µs | 250µs (4300%) | 75tr/mn (2,3%) | 10µs |
StepperDriver | 3954 (900%) | 74 (400%) | 17,4µs | 38µs (660%) (2) | 490tr/mn (15%) | 160µs |
Pour moteurs bipolaires
Bibliothèque | Octets 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 |
QuickStep | 440 (100%) | 18 (100%) | 1,6888µs | 6,75µs (100%) | 40000tr/mn (100%) | 0 |
Stepper | 1630 (370%) | 26 (150%) | 1/2 (1) | 32µs (470%) | 9400tr/mn (21%) (3) | 4µs |