Le LM629 - Utilisation


Approche intuitive de l'asservissement
Aspect Electronique
Liste des commandes
Utilisation - Comportements limites - Fonctionnement Interne
[Retour au sommaire]


Utilisation

L'utilisation de ce composant peut être très diverse. Obtenir le fonctionnement désiré est souvent un jeu de piste et demande une certaine persévérence.

Cible

Selon la cible choisie et l'utilisation du LM629, les approches peuvent différer. L'utilisation du LM629 va entrainer plusieurs recommandations.

On distingue 2 cas, que l'on peut considérer d'extrêmes :

  • Utilisation sur une cible plutôt limitée, à la fois en entrées/sorties, en possibilité de manipulations de données et surtout de calcul mathématique. (Une très grande majorité des microcontrôleurs sont dans ce cas : PIC ...).
    Si réaliser plusieurs opérations en virgule flottante demande une place mémoire, et un temps d'exécution considérable, alors on est dans ce cas.
    Ici, la communication avec le LM peut déjà demander un certain nombre de ressources (recréation d'un bus, etc). Le LM629 sera utilisé comme un périphérique à part entière. Il n'y a pas non plus de calculs (Conversions d'unité) entre les différentes grandeurs (vitesse, position, etc) du LM.
    C'est à dire, qu'il lui sera demandé d'effectuer une trajectoire. On ne se soucie pas de l'exécution proprement dite de la trajectoire. Seules la fin de la trajectoire, les erreurs ... sont importantes.
    • L'utilisation de l'IT devient intéressante, pour signaler les différents problèmes, erreurs, etc.
    • Les commandes demandées resteront simples.
    • Les communications avec le LM ne seront pas permanentes, mais juste en cas de nécessité.
    • Lors du codage, si la place est limitée, on essaiera de faire au mieux pour s'adapter aux différents formats des valeurs à envoyer (COUNT,SAMPLE, entier, virgule fixe, etc). Ces unités n'ayant souvent rien à voir avec les réalités physiques (mètres, secondes, etc). Il sera envisagé soit des "précalculs", soit des raisonnements exclusivement basés dans les unités du LM (COUNT, etc).
    • Le LM dans cette optique permet de conserver une position du moteur, une vitesse et les différents paramètres de la commande. Il soulage le micro de ce travail et permet de libérer de la place mémoire et du temps de calcul.
    • Cela impose de se soucier de l'action exacte de chaque commande pour ne pas venir 'corrompre' une des valeurs internes du LM (position), etc.
    • Cette approche est réalisable dans le cas de la commande d'un moteur devant effectuer un déplacement d'un certain angle ou d'une certaine distance, un maximum de paramètres étant "précalculés" lorsque cela est possible.

  • Utilisation sur une cible pouvant réaliser aisément des calculs en virgule floattante (typiquement un DSP, gros µC ayant des fonctions de multiplication en hard) sur des procédés plus complexes. Ce cas peut se poser lorsqu'il s'agit de commander de façon coordonnée plusieurs moteurs.
    • Il est souhaitable de réaliser une couche (plusieurs fonctions) permettant de "s'abstraire" des différents formats utilisés par le LM (COUNT, etc), d'une part pour commander le LM via des unités plus parlantes (mètres, secondes, etc) et d'autre part pour ne pas avoir de problèmes lors de calculs entre les différents valeurs utilisées.
    • L'utilisation va se limiter à un périphérique capable de réaliser l'asservissement du moteur et de gérer le codeur (compteur/décompteur) permettant d'avoir une information absolue.
      La génération de trajectoire sera utilisée mais peut aussi être détournée par l'envoi régulier et à fréquence élevée de consignes.
    • Les paramètres contenus dans le LM seront avantageusement mémorisés dans la cible (DSP, etc) permettant une utilisation plus souple, en permettant notamment de redémarrer le LM sans se soucier de la perte ou de la corruption de ses données internes.
    • L'utilisation de l'IT peut être remplacée par une communication régulière (lecture de position, vitesse, etc) : polling.

Ces 2 approches sont des cas plus ou moins antagonistes, mais dans la pratique on peut être entre les deux.

Utilisation

Le développement d'applications avec le LM est grandement simplifié, si l'on peut visualiser les différentes valeurs que peut retourner le LM. Sur des architectures micro limitées, cela peut être assez complexe (afficheurs, sortie analogique, etc). Sur des structures plus grosses, il faut souvent réaliser une couche logicielle supplémentaire permettant cette visualisation.

Dans tous les cas, en testant les éléments les uns après les autres on réduit les sources de problèmes potentiels en fractionnant la recherche des erreurs. Le temps "perdu" à l'implémentation de fonctions qui ne sont pas directement utiles pourra être gagné par la suite en réduisant le temps de recherche des erreurs ...

Tester le fonctionnement du LM

Cette étape permet de s'assurer à la fois du fonctionnement de la communication avec le LM et du fonctionnement du codeur optique.

Il faut alimenter le LM et y relier une horloge ainsi que le signal de reset.

Le codeur optique doit être alimenté et relié aux broches A et B du LM (L'index IN étant ramené à 1 via une résistance de pull up, 1k par exemple). On doit pouvoir détecter des impulsions lorsque l'on tourne le codeur (plus le codeur est précis et plus il faudra tourner peu). On peut soit regarder ces impulsions à l'oscilloscope, soit les tester au multimètre (ce qui impose d'avancer TRES peu le codeur pour avancer d'un demi pas ...). Ces impulsions arrivant au LM, celui-ci peut travailler et compter/décompter la position actuelle.

Il est possible de relier le LM directement sur un bus (DSP, gros µC par ex), ou sur un bus recréé (petit µC).

Il est nécessaire de commencer par coder la fonction permettant de lire le registre de status (il s'agit d'une lecture sur le registre de commande). On pourra donc :

  • Attendre que le bit 'BUSY', ne soit plus à 1.
  • Faire attention que le bit 'COMMAND ERROR' soit à 0. Dès qu'il y a une erreur de protocole (lecture/écriture sur le mauvais registre,etc), ce bit passe à 1 et bloque toute autre commande ! Dans un premier temps, on peut se contenter de le signaler (led, message, etc) et réinitialiser le LM à la main. Par la suite, on peut gérer ce cas et aller effacer cette erreur (RESET_INTERRUPTS)

On peut envisager ensuite l'envoi de la commande READ_REAL_POSITION et la lecture de cette position réelle (lecture de 4 octets de données). On doit voir la valeur lue évoluer en fonction de la rotation du codeur.

On s'assure ainsi que :

  • Le LM fonctionne.
  • La communication par le BUS est correcte.
  • Le fonctionnement du codeur est correct.

Récupérer la position actuelle

La commande présentée comme test au-dessus permet de récupérer la position réelle. Elle peut être effectuée périodiquement (si l'on souhaite garder une trace de la position actuelle ou la traiter avec d'autres capteurs) ou sur demande lorsque cela est nécessaire.

Tester le fonctionnement du générateur de trajectoire

Pour tester le générateur de trajectoire, il est nécessaire de :

  • Charger une trajectoire par LOAD_TRAJECTORY_PARAMETERS on indique :
    • Une position à atteindre (qui peut être déterminée par les essais effectués sur le codeur plus haut)
    • La vitesse maximale en COUNT/SAMPLE
    • L'accélération maximale en COUNT/SAMPLE/SAMPLE

      Des valeurs trop petites peuvent entrainer une trajectoire trop rapide et l'on ne pourra pas voir son évolution.

  • Effectuer un START_MOTION, pour lancer cette trajectoire.
  • Lire la position désirée actuelle par READ_DESIRED_POSITION. Cette position doit évoluer pendant la génération de la trajectoire et finir par atteindre la position à atteindre ...

Démarrer une trajectoire 'physique'

Démarrer une trajectoire physique (effectuant donc un déplacement) demande nettement plus d'opérations. Il est nécessaire de :

  • Pouvoir communiquer correctement avec le LM (cf tester le fonctionnement).
  • Pouvoir générer une trajectoire (cf tester le fonctionnement du générateur de trajectoire).
  • Connecter l'étage de puissance en sortie du LM (PWM et sens).
  • S'assurer du fonctionnement du codeur en lisant la position réelle par exemple.

Le démarrage de cette trajectoire physique demande de :

  • Charger une trajectoire.
    On choisira avec interêt une trajectoire devant effectuer un déplacement assez lent (vitesse maximum assez faible) de préférence. (en utilisant le test du fonctionnement du générateur de trajectoire au dessus par exemple). On ne réduira pas trop l'accélération pour assurer un démarrage assez rapide.
  • Charger un filtre PID par LOAD_FILTER_PARAMETERS. On indiquera uniquement un coefficient sur P, assez faible mais NON NUL.

  • Appliquer ce filtre par UPDATE_FILTER.

  • Lancer la trajectoire par START_MOTION.

A ce moment, le générateur de trajectoire doit se lancer. L'erreur entre la position réelle et la position désirée doit augmenter. Le filtre PID va donc envoyer au moteur une commande (tension) proportionnelle à cette erreur. Si le système se trouve cablé dans le bon sens, la tension appliquée va tendre à réduire cette erreur et la vitesse va se stabiliser. Sinon, l'erreur va tendre à augmenter et le système va diverger jusqu'à entrer en saturation. Il faut dans ce cas inverser les 2 fils du moteur par exemple.

Tester la fin d'une trajectoire

La fin du travail du générateur de trajectoire est déterminée par le bit 2 du registre de status. A ce moment, le générateur de trajectoire a terminé, mais l'erreur entre la position désirée et la position actuelle n'est pas forcément nulle (donc le mouvement pas forcément réellement terminé).

En fonction de ce que l'on souhaite faire (enchainer une autre trajectoire ou déterminer un arrêt complet) il faudra utiliser d'autres commandes (position réelle ...)

Arrêter une trajectoire prématurément

L'opération peut s'avérer plus hardue que l'on ne peut le penser.
Si l'on souhaite arrêter le générateur de trajectoire, il est possible (en théorie -- non testé) de charger par LOAD_TRAJECTORY_PARAMETERS (pendant la trajectoire), une commande de trajectoire ne spécifiant aucun paramètre mais positionnant un des 3 bits suivant à 1 :

  • bit 2: Arrêt "doux" du moteur, le générateur de trajectoire va commencer directement à générer une décélération. La vitesse va donc ralentir "doucement" jusqu'à l'arrêt. Il faudra ensuite attendre que l'erreur d'asservissement diminue (ce qui sera sans doute très bref).
  • bit 1: Arrêt "rapide", la position à atteindre et la position désirée vont immédiatement être forcées à la position actuelle. On perd donc la position à atteindre. Il faudra ensuite attendre que l'erreur diminue (ce qui sera sans doute très bref).
  • bit 0: Arrêt "immédiat", l'asservissement est désactivé et le moteur finit par s'arrêter en roue libre.

Aucun de ces 3 fonctionnements n'a été vérifié, leur description peut être fausse mais elle est la plus probable.

L'autre technique consiste à réinitialiser (RESET) le LM ... ce qui permet d'être sûr du comportement mais implique par contre un renvoi de tous les paramètres. L'ensemble des paramètres internes du LM sont perdus (position, filtre, etc). Cette méthode peut s'avérer plus simple, surtout lorsque l'on dispose de la puissance de calcul nécessaire.

Modifier la trajectoire

On peut modifier une trajectoire pendant son exécution. Cette opération permet de l'allonger ou d'augmenter la vitesse par exemple. Le LM va alors modifier sa génération de trajectoire pour tenir compte de ces nouveaux paramètres. Il n'est pas possible de changer l'accélération (que l'on utilise le mode vitesse ou le mode position).

On demande cette trajectoire :

Trajectoire simple.

On envoie un ordre (LOAD_TRAJECTORY_PARAMETERS) et on l'applique (START_MOTION) au moment noté par le point vert, on aura :

Trajectoire modifiée "à la volée"

Pour effectuer cette modification, on effectue un chargement de trajectoire. On ne peut pas changer d'accélération, sinon on reçoit COMMAND ERROR. On suppose que la trajectoire initiale est la trajectoire "simple" suivante :

 

  • On charge une nouvelle position en absolu ou en relatif par rapport à la position à atteindre indiquée dans l'ordre initial.

    On indique donc la nouvelle position à atteindre.

    • Si la position à atteindre est plus "loin" que la position initiale :



    • Si la position à atteindre est moins "loin" :





  • On charge une nouvelle vitesse en absolu ou en relatif (par rapport à la vitesse maximale actuelle)

    • La vitesse va augmenter/diminuer pour s'adapter à la nouvelle consigne.
    • Ici, la nouvelle consigne ne va rien changer car ce n'est pas elle qui limite.

On peut évidemment mélanger les 2 ...

 

Comportements limites

Le LM629 ne va faire que ce qu'on lui dit de faire.

Si on lui dit de générer une trajectoire à la vitesse de 15m/s, le générateur de trajectoire va générer une trajectoire à 15m/s.

Par contre, le filtre PID ne pourra pas rattraper la différence entre la position désirée (avançant à 15m/s) et la position actuelle. En fait l'erreur va devenir si grande que le LM629 va sortir la valeur maximale pour la PWM, et se retrouvera limité par la 'saturation'.

C'est à dire que l'erreur va augmenter de plus en plus car il ne sera pas possible (même en donnant la consigne maximale) de la corriger. Le fonctionnement n'est plus "linéaire" et la trajectoire n'est plus asservie. Cette limite dépend de l'actionneur (moteur par exemple) que l'on utilise, de la tension d'alimentation, etc, etc.

Que se passe-t-il concrêtement lorsque l'on demande une vitesse trop grande, c'est à dire non réalisable ?

Le générateur de trajectoire va générer cette trajectoire (en noir). Très vite l'erreur va faire que le moteur recevra la consigne maximale. A ce moment, la vitesse ne peut plus physiquement augmenter (saturation)-- mais ça, ce n'est pas le problème du générateur de trajectoire qui continue à générer ...

L'erreur va continuer à augmenter. Arrivé au moment de la décélération (dans la trajectoire générée), l'erreur sera maximale et l'éerreur maximale. Le moteur sera toujours à "fond".

Lorsque la génération sera terminée, l'erreur ne sera toujours pas nulle, loin de là. Le moteur continuera à tourner, jusqu'à ce que l'on se rapproche de la position désirée. Et là d'un coup, l'erreur va passer par 0, et ré-augmenter dans l'autre sens à cause de l'inertie. Des oscillations autour de la position finale vont se produire jusqu'à la stabilisation du système.

 

Il est à remarquer que si l'on enchaine ici, un autre ordre à la fin de la génération de trajectoire, on va recommencer une autre trajectoire avant d'avoir réellement fini la première.

Il faut donc éviter au maximum ce phénomène. Pour l'éviter, il faut déterminer la vitesse maximale admissible en faisant des tests par exemple.

 

Il est toujours possible de limiter les effets d'une erreur qui ne cesse de grandir, grâce aux commandes LOAD_POSITION_FOR_ERROR, LOAD_POSITION_FOR_STOPPING.

Inversement, l'utilisation de ces fonctions ne doit pas faire oublier qu'une trajectoire peut s'arrêter tout simplement parce que l'erreur est devenue trop grande (blocage, gros frottements, etc).

 

Les mêmes remarques s'appliquent à l'accélération.

Action du Filtre PID

Cette action est totalement transparente. Le filtre est toujours actif et se borne simplement à extraire l'erreur (position désirée-position actuelle). Il effectue ensuite les calculs (intégrale, dérivée) et applique les coefficients. Le résultat constitue la PWM de consigne du moteur.

Juste après un reset, (avant toute exécution de trajectoire), le LM se trouve dans un mode spécial, où l'action du filtre PID est annulée, car la position désirée est toujours égale à la position actuelle (la position désirée change de telle façon que l'erreur soit toujours nulle).
Dès que l'on effectue la première trajectoire (même si celle-ci consiste à ne pas bouger !), la position désirée n'est plus "flottante" mais se fixe. A ce moment le filtre retrouve toute son action.
Un des moyens pour revenir à l'état d'origine (aucune action du filtre PID) est de réinitialiser le LM.

Fonctionnement interne - Utilisation avancée

Comprendre le fonctionnement interne peut présenter un interêt, surtout lorsque l'on utilise le LM629 avec un processeur évolué dans le but de recréer un générateur de trajectoire par exemple.

 

A chaque SAMPLE :

  • Le LM calcule la nouvelle position désirée.
    • Si le LM est juste initialisé, celle-ci est égale à la position actuelle.
    • Si le LM est stoppé, celle-ci ne change pas.
    • Si une trajectoire est en cours :
      • Le LM ajoute la valeur de la vitesse actuelle désirée à la position désirée. La vitesse désirée peut être lue par READ_DESIRED_VELOCITY
      • Si la vitesse désirée augmentée de l'accélération est inférieure à la vitesse maximale de consigne, la vitesse désirée est augmentée de la valeur de l'accélération.
  • Le LM calcule l'erreur entre la position désirée et la position actuelle. Cette erreur va servir après passage par le filtre PID à donner le rapport cyclique de la PWM à appliquer au moteur.

La vitesse désirée ne sera donc pas forcément exacte, mais peut être inférieure à celle qu'on indique au LM (vitesse maximale désirée). La différence maximale correpond à la valeur de l'accélération. Donc, si on met une accélération importante, on perd en précision sur la vitesse. Tout ceci reste tout de même assez minime.

On peut recréer un générateur de trajectoire, en utilisant le mode vitesse. A la première commande, on indique une accélération élevée (identique par exemple, à l'accélération maximale possible). On vient ensuite périodiquement indiquer une vitesse de consigne (que l'on a calculée avec le processeur que l'on utilise).


Pages écrites par Bat : manu_bat_manu@yahoo.fr
Relecture, améliorations par Coco : coco_corp@yahoo.fr

Voir ausi : Club de Robotique E.S.E.O.