Monorailcat

Asservissement

icon 2015-12-24

Le principe d'un asservissement est d'utiliser un capteur pour contrôler un actionneur.
Si le capteur est fiable et qu'on reste dans les limites de l'actionneur, il est possible de le contrôler précisément, même avec des perturbations (tension d'alimentation, frottements, contraintes mécaniques...).
L'asservissement d'un système ne va pas augmenter ses performances, au contraire, il faut disposer de "marge" pour qu'un asservissement soit efficace.
Global schematics servo controlled system

Ici, j'ai utilisé un moteur/réducteur d'imprimante Canon Pixma, avec un disque/encodeur optique (QEI) de 720pas/tour. (résolution de 150LPI).
Le codeur optique est branché sur les entrées d'interruption d'une carte Arduino Uno (qui permet de coder vite et mal...), et une / commande le moteur, alimenté en 12V.
servomechanism setup

Asservissement numérique
Plutôt que d'asservir avec un système analogique, on acquiert les capteurs et commande l'actionneur à intervalles fixes. Le système est en boucle ouverte entre ces instants. L'approximation d'un système discret équivalent à un système continu n'est vallable que pour une constante de temps grande devant la période d'asservissement (10ms).

Asservissement en position
ErreurPosition = ConsignePosition - MesurePosition;
Commande = PPosition*ErreurPosition;


Sur la courbe et sur la video, on peut voir qu'on donne au système la consigne de faire un déplacement, puis un déplacement en frottant sur le moteur, ensuite on force sur l'arbre du moteur immobile.

Position servo control

Avec un tel système, on a une erreur statique (0.4%), des dépassements (4.3%) et un courant énorme (400mA au démarrage, 1.2A en forçant, pour un moteur spécifié à ~250mA). Par contre le temps de réponse est très faible (320ms).

Un système PID bien réglé permet de réduire les dépassements et de réduire l'erreur statique, mais le temps de montée dépend toujours des contraintes exterieures.

Asservissement en vitesse
Comme on ne dispose pas de capteur de vitesse mais d'un capteur de position, sa dérivée va nous donner la vitesse moyenne avec un retard d'une demi-période.
EstimationVitesse = MesurePosition - AnciennePosition;
AnciennePosition = MesurePosition;
ErreurVitesse = ConsigneVitesse - EstimationVitesse;
Commande = PVitesse*ErreurVitesse;


Pour éviter les dépassements, on va commander le moteur en vitesse plutôt qu'en puissance. Un contrôleur PI permet d'avoir une erreur statique faible sur la vitesse, et donc aussi sur la position.
Position and velocity servo control
Une grande partie du déplacement s'effectue à vitesse constante. Mais le courant reste très élevé pendant l'accélération.
On a réduit l'erreur statique (0.13%), les dépassements (1.67%) et même le courant au démarrage (200mA). Par contre on a légèrement ralenti le système (400ms) et le courant est toujours trop élevé en forçant sur l'arbre (425mA).
Pour éviter d'avoir une mesure de vitesse aussi peu précise, il faudrait diminuer la fréquence de l'asservissement, ou utiliser un capteur avec une résolution plus fine.

Asservissement en couple
Ici, on ne dispose pas de dynamomètre, mais les cartes de puissance ont un retour sur le courant consommé. Comme ce signal est assez bruité (offset + bruit de commutation du moteur), il a été filtré avec un filtre passif (RC à 16Hz) et un filtre numérique à 50Hz.
Position, velocity and torque servo control
On ralentit encore le système (440ms) et on n'a pas réduit l'erreur statique et les overshots, mais le courant est contrôlé (overshoot à 145mA en début d'accélération et 240mA quand le rotor est bloqué).


Intégrateur
Les intégrateurs intègrent l'erreur. Cela veut dire que la correction augmente de plus en plus jusqu'à ce que l'erreur statique du système soit compensée. Seulement la correction varie lentement (une correction proportionnelle est quasi instantannée), ce qui rend les dépassements quasi obligatoires.
Pour éviter cela, le plus courant est d'avoir un intégrateur avec un faible gain et une période d'intégration relativement rapide (<50 fois plus lent que la boucle d'asservissement).
Le problème c'est qu'un intégrateur peut diverger et tendre vers l'infini. Une bonne pratique est de borner son entrée et sa sortie (à la manière des intégrateurs analogiques qui saturent).

Réglages
Le système se régle du plus petit en plus grand.
On commande par la boucle de courant avec une valeur fixe, en réglant ses gains et son temps d'intégration pour avoir un faible écart statique et peu de dépassements. Il faut perturber le système manuellement pour vérifier la correction. Il est utile de borner la vitesse pour contrôler un minimum le moteur.

La boucle de vitesse va directement commander la boucle de courant, et est réglée de la même façon.

En dernier, la boucle de position va commander la boucle de vitesse.

Il faut tout faire pour éviter d'avoir un système qui oscille (même si ce n'est qu'un couinement à la fréquence d'asservissement).

Tips and tricks
La seule ruse restante permet d'avoir un écart statique rapidement compensé (avec un gain assez élevé) sans risquer des instabilités.
Il suffit de réduire la valeur de saturation au voisinage de la consigne, et donc de limiter l'action de l'intégrateur.

Une technique souvent utilisée est de compenser une action externe (typiquement le poids d'un objet "monté" par un actionneur linéaire) directement dans la boucle. Même une compensation partielle suffit à "aider" l'asservissement.

Une autre méthode est de faire varier les coefficients (P, I, D, saturations) en fonction du système : montée/descente, tension des batteries, masse (pas forcément constante si on attrape des objets).

Les problèmes les plus gênants viennent de la précision des capteurs ("sauts" sur des potentiomètres), mais surtout de problèmes mécaniques (jeu dans les engrenages, courroies élastiques, frottements non-constants, glissement de courroies/roues). Le plus grand risque est d'avoir un système oscillant.

Update (07.2016) :
Graphes HTML + JS

icon Tags de l'article : ,

No comments

icon Flux RSS des commentaires de cet article

Notice : Your comment will be visible after approbation by the webmaster.