le coeur de MTobjects
Cette partie est plus complexe à comprendre et à utiliser. Les réglages de la bibliothèque par défaut servent dans la pluspart des cas. En réglant de façon optimale les horloges, on peut diminuer notablement le temps pris par la bibliothèque, ou pouvoir aller plus vite pour certains traitements.
La base des 100µs
Ces 100µs est la résolution par défaut pour le softPWM et le temps minimum entre deux pas (ou micro-pas) pour les moteurs pas à pas. Avec 100µs on peut utiliser environ 11 softPWM ou bien 29 moteurs pas à pas tournant à maximum 10000 pas/s (ou encore un habile mélange des deux). C'est suffisant pour beaucoup d'applications.
la fonction MTtimeBase() permet de choisir la base de temps entre 10µs (si on veut aller vite) et 1ms (si on n'a pas besoin de vitesse et que l'on ne souhaite pas passer trop de temps dans la fonction d'interruption).
MTtimeBase(100 micro_secondes); // Par défaut MTtimeBase(10 micro_secondes); // Minimum MTtimeBase(1024 micro_secondes); // Maximum
La base de temps système
La base de temps système permet d'utiliser micro(), millis() et delay(). Les fonctions delaymicroseconds(), _delay_ms() et _delay_us() utilisent quand à elles des boucles et dépendent très fortement du temps passé dans les interruptions. Elles seraient justes sans les interruptions. La base de temps système tournant à 1024µs (si le quartz était parfait), millis() s'incrémente parfois de 1, parfois de 2. La résolution de millis() est donc de 2ms. Cette base de temps est fixe, la modifier modifirait micro(), millis() et delay().
La bibliothèque MTobjects n'utilise pas cette horloge, et si on n'utilise pas les 3 fonctions, on peut la désactiver, ce qui économise du temps de calcul et permet par exemple de faire tourner un pas à pas plus vite.
MTstopDelayMillis(); // Désactive l'horloge système MTstartDelayMillis(); // Réactive l'horloge système
Dès que l'on utilise un quelconque objet de MTobjects, ces fonctions sont accessibles. Il n'est donc pas utile de mettre un #include en plus.
Si on a besoin de millis() mais pas de micro() ou delay(), on peut aussi désactiver cette horloge et utiliser MTmillis() à la place;
Le partage du temps
Bien entendu pour que tout cela fonctionne, il ne faut pas dépasser certaines limites temporelles. Si ce n'est pas le cas, les pas à pas peuvent ne pas tourner à la bonne vitesse, les boutons peuvent ne plus être pris en compte...
Note sur les boutons: dans un fonctionnement normal, un bouton est pris en compte, mais son traitement peut être différé si le traitement des autres événements est long.
Voici les limites à ne pas dépasser:
∑A < 100µs
∑A + ∑B < 16ms (quasiment impossible de dépasser les 16ms)
A | B | |
Base | 6,2µs | 10µs |
Bouton | / | 8,5µs |
Servo | / | 8µs |
hardPWM | / | / |
softPWM | 8µs | / |
MTulnStepper | 4,8 à 31,1µs | / |
MTstepStepper | 4,8 à 24,3µs | / |
Horloges | / | / |
Notes:
- il faut compter autant de fois le temps qu'il y a d'objets, et on compte une base sur A ou sur B si au moins un objet
A ou B est utilisé. Si on utilise 2 moteurs pas à pas et une horloge, ∑A=6,2+31,1+31,1=68,4µs et ∑B=10µs
- pour un moteur pas à pas, les temps donnés sont celui nécessaire quand il n'avance pas et quand il avance d'un pas.
Si on a 10 moteurs pas à pas qui avancent à faible vitesse, on va consommer la plus par du temps 48µs, et quand
un des moteurs fait un pas, on a besoin de 9*4,8+31,1=74,3µs. Cela passe. Si deux ou trois moteurs avancent d'un pas en
même temps, on dépasse les 100µs, mais comme cela ne se produit pas à chaque fois, le retatd est rattrappé. Cela fonctionne
donc. C'est donc plus les 4,8µs qui limitent le nombre de pas à pas si les moteurs ne tournent lentement
- pour les boutons, le temps donné est celui qui est nécessaire si le bouton n'est pas sollicité. Dans la pratique, on
ne sollicite pas souvent les boutons devant les 16ms. Un bouton ordinaire va "consommer" 16µs lors de son activation
et un bouton radio va "consommer" 18µs. Mais ce n'est pas la peine d'en tenir compte.
- les 100µs viennent de la base de temps par défaut. On peut modifier cette base de temps entre 10µs et 1ms. La base de
temps est le temps minimum entre deux pas pour un moteur ou pour un changement de niveau pour un softPWM. Plus cette
valeur est petite plus on peut aller vite, mais plus on surcharge le programme.
Applications:
- j'ai un moteur pas à pas commandé par step (les 28BYJ48 ne peuvent pas aller aussi vite), et je garde les 100µs par
défaut: je peux faire maximum 10000pas/s et je prend environ 9,4µs toutes les 100µs pour faie cela. J'utilise 9,4% du temps pour mon moteur.
- j'ai deux moteurs pas à pas, et je garde les 100µs par défaut: je peux faire maximum 10000pas/s et je prend environ
30,5µs toutes les 100µs pour faie cela. J'utilise 30% du temps pour mes moteurs.
- je garde les 100µs par défaut: je peux faire maximum 10000pas/s et je peux mettre 3 moteurs 6,2+3*24,3=79µs.
- j'ai un moteur pas à pas qui doit tourner à maximum 1pas/ms. Je peux alors choisir une base de temps de 1000µs, et
j'utilise 3% du temps pour mon moteur.
- j'ai un seul moteur pas à pas et je veux tourner à 30000pas/s. C'est possible si je choisis la base de tempss à 33µs,
mais j'utilise 93% du temps pour mon moteur.
- j'ai 4 moteurs pas à pas et je veux tourner le plus vite possible. Ils consomment6,2+4*24,3=104µs, je peux alors
utiliser une base de temps de 110µs et avoir 9000pas/s mais je passe 95% du temps à gérer les moteurs. En se limitant à
4500pas/s, je peux prendre comme base de temps 210µs et je ne passe plus que 50% du temps pour mes moteurs.
- je veux mettre un maximum de boutons. Je peux donc en mettre environ 10m6/8,5µs soit plus de 1800. On peut utiliser
une même broche pour plusieurs boutons mais la taille du code ne le permettra pas.
Pour les pas à pas (calculs faits avec un MTstepStepper):
Un moteur qui fait N pas/s avec une horloge qui bat M fois/s (l'horloge à 100µs va battre 10000 fois par seconde) va consommer
en une seconde N*24,3+(M-N)*4,8 microsecondes. Par exemple avec une horloge à 100µs (celle par défaut) et pour des moteurs
tournant à 1 tr/s en 8 micro-pas (200*8 µpas/s), on a N=1600, M=10000, on consomme 1600*24,3+(10000-1600)*4,8 = 79200µs. On
pourait mettre maximum 12 moteurs. Les temps ne seraient plus bien réguliers, et on risque de perdre des impulsions si plusieurs
moteurs ont un pas en même temps.
En fait si on ne dépasse jamais les 100µs, les pas arrivent au moment prévu. Si le temps consommé est une fois entre 100 et 200µs,
on ne perd pas d'impulsion, mais il faut avoir le temps de rattrapper. Au dela d'un temps consommé de 200µs, on perd des impulsions
les moteurs vont moins vite. Mais les nombres de pas finaux sont corrects.
C'est donc assez compliqué de donner une formule générale.