Description de l’asservissement numérique mis en œuvre sur le PIC16F877 I. INTRODUCTION .................................................................................................. 2 1. Généralités : ............................................................................................................................................... 2 2. Cas d’un système continu : ....................................................................................................................... 2 3. Cas d’un système discret : ........................................................................................................................ 2 II. DESCRIPTION DE L’ENSEMBLE ASSERVISSEMENT + COMMANDE MOTEUR .................................................................................................................... 3 1. Aspect général : ......................................................................................................................................... 3 Ensemble moteur + codeur ................................................................................................................................... 3 Carte de puissance : .............................................................................................................................................. 3 a.) Principe de base : ................................................................................................................................ 3 b.) Schéma simplifié : ............................................................................................................................... 4 Fonctionnement :................................................................................................................................................. 4 4. Carte d’asservissement ............................................................................................................................. 5 a.) Description : ........................................................................................................................................ 5 b.) Schéma simplifié de la carte :.............................................................................................................. 5 Détail de la carte : ............................................................................................................................................... 5 III. L’ASSERVISSEMENT NUMERIQUE................................................................ 6 1. Généralités ................................................................................................................................................. 6 2. Méthodologie de synthèse ......................................................................................................................... 6 Cas de la carte 2000/2001 ..................................................................................................................................... 7 boucle de vitesse ................................................................................................................................................. 7 boucle de position ............................................................................................................................................... 7 IV. ETUDE DU CODE ASSEMBLEUR DE LA CARTE 2001 ................................. 8 I. Introduction 1. Généralités : Un asservissement a pour but de désensibiliser un système à une perturbation de sortie. Le principe repose sur un système dont on reboucle la sortie vers l’entrée. On parle alors de système bouclé. On utilise généralement une représentation par schéma block : Signal d’erreur Signal de consigne + Signal de commande Correcteur - Procédé physique Signal de sortie Signal de retour Le correcteur introduit dans la chaîne directe sert à modifier le comportement du système selon les fréquences. Un tel système est conçu de façon à respecter trois critères : Rapidité (début de la réponse à une consigne) Stabilité (fin du régime transitoire) Précision (régime établi) Ces trois critères permettent de définir le comportement du système dans 3 zones de fréquences : Hautes fréquences : rapidité Moyennes fréquences : stabilité Basses fréquences : précision L’analyse d’un système linéaire asservi repose sur l’étude de la transmittance de sa boucle ouverte (du signal d’erreur au signal de retour). 2. Cas d’un système continu : G0 G( p) A0 A1 p A2 p 2 ... An p n 3. Cas d’un système discret : G( z 1 ) A1 z 1 A2 z 2 A3 z 3 ... An z n B1 z 1 B2 z 2 B3 z 3 ... Bm z m Dans ce cas, pour simplifier l’étude, on se placera de préférence dans le domaine pseudo-continu, par la transformée bilinéaire : G ( w) G0 A0 A1w A2 w A3 w3 ... An wn 1 2 On remarque que la forme ressemble à celle d’un système continu. En effet, l’étude dans le domaine pseudocontinu peut se faire avec les même méthodes que dans le domaine continu. II. Description de l’ensemble asservissement + commande moteur 1. Aspect général : Carte mère (intelligence) Carte PIC (asservissement) Carte de puissance Codeur Domaine discret Moteur Domaine continu 2. Ensemble moteur + codeur Ce bloc mécanique se compose d’un moteur avec son réducteur et d’un codeur incrémental. Le codeur incrémental génère deux signaux carrés de fréquence proportionnelle à la vitesse du moteur. La caractéristique essentielle du codeur incrémental est son nombre de pas par tour (chaque pas correspond au nombre de périodes de chaque signal pour un tour du codeur). Ces deux signaux sont déphasés l’un par rapport à l’autre de 90° ou –90° selon le sens de rotation. Ex : 3. Carte de puissance : a.) Principe de base : Le principe repose sur le fait que la vitesse d’un moteur est proportionnelle à la tension d’induit. De plus, un moteur étant généralement très inductif, il va se comporter comme un passe bas, et ne va donc être sensible qu’à la valeur moyenne de la tension si la première harmonique est de fréquence suffisamment haute. b.) Schéma simplifié : V+ T1 T3 M T2 T4 V- c.) Fonctionnement : La commande du moteur se fait par l’intermédiaire des transistors T1 à T4 selon un montage dit en H. Les transistors T1 T4 et T2 T3 sont commandés simultanément. Les couples T1 T4 et T2 T3 sont commandés en alternance et exclusivement. Le signal d’entrée est signal rectangulaire de rapport cyclique variable et de fréquence telle qu’elle soit filtrée par le moteur : Signal d’entrée Signal de sortie Valeur moyenne Le signal de sortie est donc lui aussi de forme rectangulaire dont les niveaux haut et bas correspondent aux alimentations. La valeur moyenne vaut : U 2 (V V ) Où est le rapport cyclique (0<<1). Dans le cas où les alimentations sont symétriques : 1 U 4 ( ) Va lim 2 Ce montage permet donc de contrôler la vitesse et le sens du moteur à partir du rapport cyclique du signal d’entrée. 4. Carte d’asservissement a.) Description : Cette carte est centrée autour d’un microcontrôlleur PIC16F877. Elle reçoit les ordres de la carte mère par l’intermédiaire d’un bus SPI et délivre en sortie les signaux nécessaires à la commande des cartes de puissance des deux moteurs. Elle reçoit, de plus, les signaux en provenance des codeurs de chaque moteur. b.) Schéma simplifié de la carte : Bloc logique Pic16F877 Codeur 1 Moteur 1 Codeur 2 Moteur 2 Bloc logique c.) Détail de la carte : Sur la carte, apparaissent deux blocs logiques : le premier sert à modifier les signaux en provenance des codeurs en deux signaux mieux adaptés pour le PIC. le deuxième sert à générer les signaux pour commander chaque paire de transistor sur les cartes de puissance. Le premier bloc logique a pour but de générer un signal d’horloge et un signal de sens, pour permettre de mieux exploiter les possibilités offertes par le PIC (utilisation des timer internes). Sur les cartes 2000 et 2001, le signal d’horloge génère 500 fronts montants pour chaque tour. Le deuxième bloc logique a deux fonctions. Il permet de générer deux signaux en opposition de phase mais en prenant soin de respecter un temps mort au moment des commutations pour empêcher la conduction des branches du pont H sur la carte de puissance. Ce temps mort est nécessaire du fait des temps de blocage des transistor. On évite ainsi des provoquer un courtcircuit entre les alimentations : III. L’asservissement numérique 1. Généralités Un asservissement est une méthode de régulation d’une grandeur physique par l’intermédiaire d’un système numérique. La majorité des systèmes numériques (microcontrolleurs processeurs…) sont cadencés à partir d’une horloge. Le temps est donc discrétisé. Il en résulte qu’une grandeur physique ne peut être mesurée qu’à certains instant. On parle alors d’échantillonnage. De par même la nature d’une représentation numérique, on doit tenir compte du fait qu’un nombre a une limite inférieure et une limite supérieure. Le temps étant discret, on se placera dans le domaine dit discret ou dans le domaine pseudo-continu et on utilisera les outils adéquats (transformée en Z, échantillonnage, transformée bilinéaire…). L’implantation d’un correcteur numérique se fait à partir de sa transmittance discrète C(z -1) de la forme : C ( z 1 ) A1 z 1 A2 z 2 A3 z 3 ... An z n B1 z 1 B2 z 2 B3 z 3 ... Bm z m Cette transmittance est le rapport du signal de commande U(z) et du signal d’erreur e(z) : D’où : C ( z 1 ) U ( z 1 ) e( z 1 ) U ( z 1 ) A1 z 1 A2 z 2 A3 z 3 ... An z n e( z 1 ) B1 z 1 B2 z 2 B3 z 3 ... Bm z m A1 U ( z 1 ) A2 U ( z 2 ) ... An U ( z n ) B1 e( z 1 ) B2 e( z 2 ) ... Bm e( z m ) Soit encore : Or, dans le domaine discret, U(z-n) représente la n-ième précédante de U. On en déduit ainsi une formule récurrente (avec A1=1) : U ( z 1 ) B1 e( z 1 ) B2 e( z 2 ) ... Bm e( z m ) A2 U ( z 2 ) ... An U ( z n ) L’implantation d’un correcteur numérique consiste juste en une équation récurrente. 2. Méthodologie de synthèse Pour synthétiser un correcteur numérique, il nous faut connaître la fonction de transfert du procédé, vu du système numérique, en l’occurrence le microcontrolleur dans notre cas. La méthode qui permet de connaître toute la chaîne externe en s’affranchissant du plus de calcul, est l’identification : On applique un échelon de commande, et on relève la grandeur de sortie. A partir de cette réponse, on en déduit le modèle. Dans le cas d’un moteur, le modèle est du premier ordre : t g (t ) A e B G( p) A 1 p Pour connaître le modèle, il suffit de déterminer A et . Afin de s’affranchir des frottements secs qui perturberaient l’identification, on effectue l’échelon alors que le moteur tourne déjà : Commande De là, tous les calculs se feront à l’aide du logiciel TPA pour plus de simplicité. Méthode : Transmittance G(p) On en déduit : G0 ( p) B0 ( p) G( p) Echantillonneur bloqueur On calcule la transmittance discrète : G( z ) Z B0 ( p) G( p) Transformée bilinéaire Passage dans le domaine pseudo-continu : G0(w) Calcul du correcteur C(w) en utilisant les même méthodes qu’en continu. Transformée bilinéaire -1 On en déduit C(z ) Implantation du correcteur à partir des coefficients de C(z-1) 3. Cas de la carte 2000/2001 Sur la carte PIC, deux correcteurs sont implantés : - une boucle de vitesse - une boucle de position par dessus la boucle de vitesse a.) boucle de vitesse + - Correcteur de vitesse Carte de puissance d dt Codeur PIC Moteur b.) boucle de position + - Correcteur de position PIC + - Correcteur de vitesse d dt Carte de puissance Codeur Moteur IV. Etude du code assembleur de la carte 2001 1. Structure générale Le code se compose principalement d’une boucle principale effectuant le séquençage, à savoir, l’échantillonnage de la position, et le calcul des équations récurrentes de chaque boucle. La gestion des codeurs, la génération des signaux pour les moteurs (PWM), la gestion des timer (horloge et codeurs) et la gestion de la communication se fait en interruptions. Le code continu.asm se compose de plusieurs parties : - Définitions - Interruptions - Initialisation - Boucle principale - Sous-routines Le code bank23.asm comporte des sous fonctions : - mise à jour des compteurs pour la position - fonction de saturation pour les sorties PWM - fonction d’envoie des commandes PWM - gestion de la communication avec la carte mère (interprétation des ordres) - fonctions d’effacage de la RAM - autres fonctions (fonction « 2 puissance X », fonction d’attente) La RAM (plus précisément, les registres) sont utilisés de facon a simplifier le code, et à le rendre générique pour les 2 moteurs. En effet, les deux moteurs devant etre traites de facon semblable, la plupart des fonctions sont génériques et peuvent etre appelees indifferement pour les deux moteurs. Il en résulte un « gaspillage » de la RAM (éternel dillemne taille RAM vs. Complexite du code). C’est ainsi que les fonctions mathématiques (bibliotheque pour les calculs flottants) utilisent selon le contexte les même régions mémoires vu du début de chaque debut de banque RAM. Les banques 0 et 2 seront plutot reservees pour les operations sur le moteur 1, tandis que les banques 1 et 3 seront plutot reservees pour le moteur 2. De meme, les parametres ou toutes autres valeurs associes au moteur 1 seront dans les banques 0 et 2, et dans les banques 1 et 3 pour le moteur 2. (voir mapping mémoire pages suivantes) 2. Fonctionnalites specifiques au PIC utilisées Dans le cas de la carte 2001, les fontions utilisées sont les suivantes : - modules PWM (1 pour chaque moteur) - module SPI (communication avec la carte mère - compteurs TIMER0 et TIMER1 pour les codeurs - compteur TIMER2 pour la base de temps (contraintes liées au module PWM à ne pas oublier) - 2 broches sensibles à un changement d’état (utilisées pour connaître le sens du moteur) Au total, il faut donc gérer plusieurs interruptions : - 3 interruptions associées aux TIMER. - L’interruption du changement d’état sur le port B - L’interruption de la liaison SPI pour la communication 3. Mapping mémoire Bank0 (moteur 1) Bank1 (moteur 2) Bank2 (moteur 1) 0 00 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 33 34 consigne_pos 35 36 37 38 delta_t 39 3A 3B 3C consigne 3D 3E 3F 40 41 42 43 44 Temp1 45 var2 46 47 var1 48 commande 49 4A 4B 4C epsilon 4D 4E 4F temp_asked_vit temp_asked_pos_l temp_asked_pos_m asked_pos_l asked_pos_m asked_pos_h asked_vit_l asked_vit_h commande_l commande_h commande_m vit_l vit_m vit_h increment_def_l increment_def_h commande_pos pos_reel vit_reel vit_reel1 Temp1b PCLATH_TEMP pos_reel1 INT_STATUS commande1 commande2 Bank3 (moteur 2) 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 50 epsilon1 51 52 53 54 epsilon2 55 56 57 58 K1 59 5A 5B 5C K2 5D 5E 5F 60 K3 61 62 63 64 K4 65 66 67 68 K5 69 6A 6B 6C unite_temps 6D 6E 6F 70 BITS 71 TIM1_G 72 TIM1_H 73 TIM1_L 74 TIM0_G 75 TIM0_H 76 TIM0_L 77 W_TEMP 78 STATUS_TEMP 79 SPI_BUF 7A SPI_STATUS 7B FPFLAGS 7C add_temp 7D TIME_l_old 7E time_h 7F time_l Pos_courante_l Pos_courante_m Pos_courante_h Pos0_l Pos0_m Pos0_h v_increment_l v_increment_h Kpos_1 Kpos_2 epsilon_pos epsilon1_pos Kadj Pos1_l Pos1_m Pos1_h 4. Particularité du code Avant de détailler le code, il existe un point délicat à propos des codeurs. En effet, les TIMER 0 et 1 ne savent que compter, or, les moteurs peuvent aller dans les deux sens. A partir de la, deux solutions étaient possibles. Soit les codeurs étaient gérés en temps réel, ce qui voulait dire interrompre le PIC sur chaque front, soit les codeurs étaient gérés de facon independante. La premiere solution aurait solicite beaucoup le PIC (mais n’aurait pas forcement ete perturbante) mais était simple a mettre en œuvre. La deuxieme solution, a consiste a ruser pour utiliser au maximum les TIMER. C’est la deuxieme solution qui a ete choisie (meme si elle est moins evolutive). Cette ruse consiste a stocker la position courante en mémoire, et à utiliser les TIMER seulement pour compter des déplacements par rapport a la valeur en memoire. Pour avoir la position instantannee, il faut donc ajouter ou retrancher a la position « courante » la valeur du TIMER, selon que le moteur tourne dans un sens ou dans l’autre. Ainsi, tant que le moteur tourne dans le meme sens, la position « courante » ne bouge pas, mais le TIMER s’incrémente. On a donc la position reelle en ajoutant ou retranchant la valeur du TIMER. Si le moteur change de sens a un moment (detecte grace aux interruptions sur changement d’etat sur le port B), on met alors a jour la position « courante » en ajoutant ou retranchant la valeur du TIMER selon le sens précédant du moteur. Cette ruse, complique la gestion des codeurs et empeche notablement toute amelioration possible, mais à l’aventage de ne monopoliser que tres peu le pic du point de vue des interruptions. D’autre part, pour ceux qui oseront s’aventurer dans cette partie du code, il faut signaler qu’il n’a pas été possible de mettre à jour la position reelle a chaque tour de boucle du programme principal. En effet, et ceci pour une raison obscure le fait de remettre a zéro trop souvent le TIMER1 (le probléme ne survient apparement pas sur le TIMER0) inhibbe le TIMER1 pour une durée et un nombre d’impulsion de comptage aléatoire. Avis, donc, à ceux qui pourront dire pourquoi, car le datasheet de microchip ne fait pas mention d’un tel phénomène. Cette ruse mise à part, le reste du code est relativement simple a comprendre. Le detail du sequencage devrait permettre de comprendre le fonctionnement. 5. Séquencage des operations Le séquenceur, cadencé à une période de 13,12ms (imposé par le module PWM), gère le fonctionnement de l’asservissement. La boucle principale se charge dans un premier temps de générer les consignes pour la boucle de position. Cette génération de consigne a été implantée en 2001 pour soulager la carte mère en lui évitant de générer la rampe de position. Dans un deuxieme temps, on met a jour la position reelle (sans remettre a zero les TIMER donc) pour chaque moteur. Dans un troisieme temps, on mémorise les anciennes valeurs utilisees pendant le précédant calcul de l’équation reccurente, puis on calcule la nouvelle valeur de la vitesse ainsi que les nouvelles valeurs qui seront utilisées pour l’équation reccurente. Dans cette étape, on vient donc de calculer toutes les valeurs nécessaires, aussi bien en binaire simple (complément à deux) qu’en flottant. L’étape suivante, consiste donc à appliquer la (ou les, selon le type de boucle désirée) formule récurrente ou pas, si on se limite à une consigne en boucle ouverte. La derniere etape consiste donc à envoyer au module PWM la commande ainsi déterminée. 6. Protocole de communication avec la carte mère (bus SPI) Le protocole utilisé est un protocole simple, qui n’utilise aucune vérification dans les ordres de transmission, si ce n’est l’utilisation de deux commandes particulières pour vérifier si la communication est toujours valide. Les ordres sont donc supposés bien recus sans place à une erreur de transmission. Pour les non initiés, le principe d’échange d’octet mis en œuvre sur un bus SPI, peut troubler car très souvent, la moitié des données transmises sont perdues (tout au moins dans le cas qui nous concerne). Dans notre cas, le PIC étant configuré en esclave, il ne peut donc jamais provoquer une communication. La carte mère (configurée en maitre) peut seule initier un échange d’octet. Trois types d’instructions sont implémentées : - la lecture - l’écriture - l’ordre Dans le cas d’une écriture, la carte mère procède à deux envois de données, selon l’ordre : operation demandée puis opérande. Dans ce cas, pour effectuer l’envoie d’une donnée plus longue qu’un octet, il faudra procéder à plusieurs écritures. Dans le cas d’une lecture, la carte mère procède toujours à deux transmissions, mais le premier consiste en l’envoie d’un octet représentant la donnée a recuperer. La transmission suivante consistera donc a recuperer la donnée préparée par le PIC. Dans le cas d’un ordre, la carte mère ne procéde qu’à une transmission. Tout se passe comme si on faisait une lecture ou une ecriture pour laquelle aucun argument n’est necessaire. L’octet transmis est interprete directement par le PIC. 7. Jeu d’instruction : Voici le jeu d’instruction implémenté sur le PIC. On notera que dans le cas de l’envoie d’une valeur sur plusieurs octets, la valeur finale est supposée envoyée après réception (du coté du PIC) de l’octet de poids fort. Ceci justifie les variables précédées de « temp » dans le code (et le mapping). a.) Ecriture: Pour l’écriture, l’octet correspond à « l’opération demandée » vit mot1 l vit mot1 h : 00000001 0x01 : 00010001 0x11 vit mot2 l vit mot2 h : 00100001 0x21 : 00110001 0x31 pos mot1 l pos mot1 m pos mot1 h : 01000001 0x41 : 01010001 0x51 : 10000001 0x81 pos mot2 l pos mot2 m pos mot2 h : 01100001 0x61 : 01110001 0x71 : 10010001 0x91 w addresse 0/1 w donnee w addresse 2/3 : 11000001 0xC1 : 11010001 0xD1 : 11110001 0xF1 vitesse ass1 l vitesse ass1 h : 10100001 0xA1 : 10110001 0xB1 vitesse ass2 l vitesse ass2 h : 10101001 0xA9 : 10111001 0xB9 pos mot1 l pos mot1 m pos mot1 h : 00000010 0x02 : 00010010 0x12 : 01000010 0x42 pos mot2 l pos mot2 m pos mot2 h : 00100010 0x22 : 00110010 0x32 : 01010010 0x52 b.) Lecture: vit mot1 l vit mot1 m vit mot1 h : 01100010 0x62 : 01110010 0x72 : 10010010 0x92 vit mot2 l vit mot2 m vit mot2 h : 10100010 0xA2 : 10110010 0xB2 : 11000010 0xC2 ping1 ping2 : 10000010 0x82 : 11100010 0xE2 r donnee : 11010010 0xD2 r interrupts : 11110010 0xF2 -> (7 ,6 ,5 ,4 ,3 ,fin_2 ,fin_1 ,boucle_asserv ) c.) Ordre: Mode pwm Mode asserv : 00110100 : 00100100 Asserv vit Asserv pos : 00000100 : 00010100 Reboot : 10000100 Reset positions : 00001100 Arret urgence : 11110100 d.) Remarques : On pourra remarquer la présence d’instruction particulières, telles que « w adresse » ou « w/r donnée ». Ces instructions permettent de pouvoir directement lire ou écrire toute la RAM (registres) du PIC. Ces instructions peuvent donc être très utiles pour debugger le fonctionnement d’un programme. On notera aussi la présence de « ping 1 » et « ping 2 » qui permettent de vérifier si la communication se fait bien, et par la même occasion de vérifier si le PIC réagit. 8. Modes de fonctionnement possibles Grâce aux ordres transmissibles au PIC, il est possible de fonctionner dans différents mode pour l’asservissement. Par défaut, le PIC est en boucle ouverte et est commandé à partir de consignes en « vitesse » qui correspondent au rapport cyclique des sorties PWM. Le PIC peut être passé en boucle fermée à l’aide de l’odre « mode asserv », et sera par defaut un asservissement en vitesse (consignes en nombre de tour par minute). Si on désire une boucle de position il faut, AVANT de passer en boucle fermée, envoyer l’odre « asserv pos », mais attention, les ordres qu’il recevra, seront des consignes relatives en nombre de pas à effectuer, le PIC générant de lui meme la rampe (vitesse constante) nécessaire. Une amélioration possible serait de pouvoir choisir aussi s’il doit générer tout seul la rampe de position, sachant qu’il est assez delicat de générer autre chose qu’une rampe, ou si la carte mère lui envoie une rampe (et non pas des échelons). A noter, qu’un reset soft est possible, mais est à n’utiliser que rarement mis à part en tant qu’initialisation (avant de passer en boucle de position au démarrage par exemple).