YAPSC est le diminutif de Yet Another dsPic Servo Controller -Encore un autre contrôleur de servos à dsPIC-. C'est le projet sur lequel je bosse le plus.
Par curiosité je me suis penché sur le contrôle des servomoteurs, et après quelques heures de recherche sur google je me suis rendu compte qu'il existait de multiples types de servomoteurs: Moteurs DC avec ou sans balais, moteurs syncrones à aimants parmanents, moteurs AC à induction, pas à pas; il existe par ailleurs de nombreuseuses sous familles pour chaque type de moteur, chacune ayant ses spécificités.
Bien qu'il existe des contrôleurs de servomoteurs DC à environ 80€ l'unité (ce qui est relativement abordable), je me suis rendu compte que les moteurs DC sans balais (BLDC pour Brushless DC) et les moteurs AC à induction n'avaient pas de contrôleurs abordable pour un amateur.
Et comme ces types de moteurs sont disponibles à bon prix (moins de 60€ pour un servomoteur AC 1KW avec encodeur 2000 pas) et extrêmement robustes (leur quasi totalité répond aux exigences industrielles), je me suis mis dans le crâne de leur faire un contrôleur.
Mais comme le contrôle des moteurs AC est plutôt complexe (cherchez "AC motor vectorial control" sur google) je vais commencer par le contrôle des servomoteurs DC à balais; viendra ensuite le contrôle des BLDC puis des moteurs AC.
Après de nombreuses heures de codage à partir de rien, j'ai trouvé un projet similaire sur le net (ici). Pour le momment j'ai modifié le code original de Lawrence Glaister, mais une version "à moi" verra bientôt le jour, beaucoup plus perfectionnée et utilisant toute la puissance des microcontrôleurs dsPIC.
La théorie du contrôle en boucle fermée
Contrairement aux moteurs pas à pas, qui sont généralement contrôlés sans retour de position, un servomoteurs requiert une interface plus complexe, qui compare la position voulue du moteur avec sa position actuelle, et agit en fonction pour corriger l'erreur de positionnement : C'est ce que l'on apelle une boucle de commande
Trois facteurs: P, I et D
Mais alors, comment vas-t-on asservir la position de notre servomoteur?
Tout simplement, nous allons calculer l'écart entre la position actuelle et la position désirée de l'axe (ce que l'on apellera l' erreur), et nous allons lui faire subir une multiplication (d'un facteur P), une intégrétion (d'un facteur I) et une dérivation (vous l'aurez compris, d'un facteur D).
la tension de sortie dépendra directement du résultat de cette opération.
Le facteur proportionnel: P
les plus basics des contrôleurs boucle fermée ne fonctionne qu'avec le terme P: plus l'erreur sera grande, plus on modifiera la sortie pour que cette erreur diminue.
Prenez le cas d'un poids attaché à un ressort par exemple: quant vous lachez le poids, il tombe (logique), et tend de plus en plus le rossort.
Mais le ressort tirera d'autant plus la masse vers le haut que celle-ci s'écarte de sa position d'équilibre (l'erreur augmente); la masse va donc être de plus en plus freinée au fur et à mesure qu'elle descend, jusqu'au momment où elle va s'arêter. Arrêt sur image: l'effet P (le ressort) a donc augmenté la précision du système (la masse s'est arêtée au lieu de tomber jusqu'à vos pieds).
Mais la masse ne s'arête pas là, bien au contraire!
Elle file droit vers le haut, s'arrête, et recommence à tomber. S'ensuit alors une oscillation du sytème: le masse ne s'arêtera pas à la position d'équilibre avant longtemps, lorsque les pertes (frottements) auront absorbé toute l'énergie du sytème.
Deuxiemme problème, la position d'équilibre du sytème correspond à une position où le ressort est tendu: l'erreur n'est pas nulle à la fin! nous ne sommes donc pas à la bonne position.
En pratique, on appelle ça l' erreur statique, et c'est ici qu'intervient le fadcteur I:
Le facteur intégral: I
Il devient maintenant plustôt difficile (et assez abstrait) de schématiser le système par une masse reliée par un ressort, mais nous allons considérer que la ressort est tel que sa tension (la force qu'il développe) est proportionnelle (P) à son élongation (erreur), mais aussi qu'il augmente avec le temps.
En général il sera assez faible que pour n'agir que sur l'erreur statique:
la tension du ressort va augmenter petit à petit et jusqu'à ce que la masse soit à la position où l'élongation du ressort (erreur) est nulle.
Nous nous sommes donc débarassés de cette erreur statique.
Le facteur dérivé: D
Rajoutons encore une propriété à nôtre ressort: Il va s'opposer aux variations brusques de sa longueur.
Ici par contre il existe un exemple concret, que vous conaissez tous: les amortisseurs de voiture!
Et, dans un système PID comme sur les voitures, les amortisseurs sont là garder la voiture à une certaine hauteur de la route (et donc ratrappent l'erreur) et à éviter que la voiture oscille (ces oscillations sont absorbées par l'huile des amortisseurs).
Ici le coefficient D servira à aténuer les oscillations du système: ça a un double effet positif: ça a tendance à améliorer le temps qu'il faut au système à se stabiliser, et à réduire (ou éliminer) le dépassement (quant nôtre masse remonte trop haut, au dessus du ressort)
Ce schémas résume le fonctionnement d'un asservissement PID: l'encodeur nous informe sur la position exacte de servo et permet de boucler notre système
YAPSC
Passsons aux choses sérieuses: Le codage du DSP et la mise en pratique!
Le codage a été assé chaotique au début, car je suis parti de rien, avec des bases en programmation en C mais peu de conaissances des dsPIC. J'ai donc tourné en rond pendant des semaines autour de bugs que je ne comprenais pas; jusqu'à ce que je trouve un projet similaire, créé pas Lawrence Glaister (je vous conseille d'aller voir son site car il a produit d'autres inventions intéressantes), et qui plus est il mettait à disposition le code source.
J'ai donc travaillé depuis sur la base de son code, et j'y ai apporté plusieurs modification:
La partie puissance qui fournit son énergie au moteur est basée sur un pont en H, plus puissant et efficace que l'amplificateur linéaire audio d'origine
L'entrée commande est une entrée type direction/horloge (step/dir)
Pas très esthétique, mais assez fonctionel que pour me permettre de modifier/améliorer le circuit rapidement.
La petite alimentation à découpage me permet de disposer d'environ 50W sous 35V, ce qui est suffisant pour le développement de YAPSC. Le pont en H (il y en a deux actuellement) se trouve sur une carte séparée, avec les résistances de mesure du courant. Pour le momment l'amplification/mise en forme de la sortie mesure de courant est confiée à un AOP type LM324N, mais il n'est pas assez rapide et pas capable de sortir un signal sur l'entièreté de la plage 0-5V, ce qui bride la précision de mesure du courant.
J'attends d'ailleurs des AOP rail à rail de chez microchip, qui ont une bande passante plus haute (2MHz), et qui me permettront j'espère une mesure plus précise du courant.
Résultats:
Le premier test (tout moisi) avec un AOP 10W et une alimentation 12V:
Actuellement (ça change niveau accélération/vitesse un pont en H à 35V!) :
Voila pour la première partie, je posterai un nouveau billet quant j'aurais avancé un peu plus.