Asservissement-Positionnement 
          Le LM629 - Utilisation 
             
           
           
          Approche intuitive de l'asservissement 
            Aspect Electronique 
            Liste des commandes 
            Utilisation - Comportements 
            limites - Fonctionnement Interne 
           
           
            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 ... 
                 
               
             
           
         
        
         
           
            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.  
           
          
           
            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. 
             
           
         
        
         
           
             
              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. 
               
             
           
          
          
            -  
              
 
                 
                   
                    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). 
         
        
       |