Discussions au sujet de NI LabVIEW

cancel
Showing results for 
Search instead for 
Did you mean: 

Attendre un évènement avant calcul de PID

Bonjour,

 

Je travaille sur un dispositif qui a pour but d’étalonner des capteurs rotatifs utilisés sur des vannes papillon.

 

Il est composé d'un moteur pas à pas, d'un codeur optique et du capteur à étalonner.

Le moteur pas à pas est contrôlé par une carte de pilotage DRV8825 qui reçoit les instruction de Labview par l'intermédiaire d'une carte Arduino Uno. Il entraine un axe sur lequel sont montés les deux autres éléments.

Le codeur optique sert de référence pour la mesure d'angle, mais il n'est pas utilisé dans cette partie.

Le capteur à étalonner transmet sa position par l'intermédiaire de deux tensions (deux bobinages internes). Ces tensions sont mesurées par une carte d'acquisition NI9215.

 

Mon objectif actuel avec Labview est de piloter le moteur de manière à ce qu'il se positionne à l'angle où les deux tensions sont égales.

Pour cela, j'ai mis en place un VI  qui fonctionne avec un PID.

Programme V1=V2.PNG

 

La consigne est réglée à zéro. L'entrée est la différence des deux tensions, tronquées à un centième. La sortie bornée entre -800 et 800 correspond au nombre de pas que l'on demande au moteur de réaliser.

 

Mon problème est le suivant: le moteur étant assez lent à exécuter les commandes qu'on lui envoie, le PID surcorrige avant même que le moteur ait eu le temps de manœuvrer.

J'aimerai donc trouver un moyen d'attendre que le moteur ait finit de manœuvrer et qu'à partir de ce moment le PID se recalcule.

 

Je veux éviter d'utiliser la fonction Attendre car le temps de réponse du moteur est variable.

J'ai pensé lire une réponse qu'enverrait l'arduino grâce à VISA read. Je sais modifier mon programme arduino pour qu'il envoie une réponse lorsqu'il a traité la commande qu'on lui a envoyé et je sais comment la récupérer sur Labview. En revanche je ne sais pas comment faire pour que cette réponse soit la condition pour l'itération suivante du PID.

 

J'espère avoir été assez clair, vous trouverez mon programme en pièce jointe à ce message.

Si vous avez des idées de solution alternative je prends aussi.

 

Merci d'avance !

0 Kudos
Message 1 of 3
(1,169 Views)

En principe tout cela ne doit pas avoir beaucoup d'importance, car tout système régulé peut avoir un temps de retard plus ou moins important à la réception de la consigne. Comme par exemple un chauffage. Dans ce cas, l'important est que le capteur puisse être lu rapidement. Donc je pense que le PID est simplement beaucoup trop violent. Pour rappel de mes études, on met D et I à 0, on monte K jusquà ce que le système commence à osciller, puis on divise K par 2. Ensuite on adapte I et D. 

 

Par contre il y a quelque chose qu'il faut changer à mon sens, c'est de piloter le moteur en vitesse-direction plutôt qu'en position. Effectivement, le régulateur va donner en sortie une consigne de direction et d'intensité, il ne donne pas une position. Repense au chauffage. On chauffe plus ou moins fort, mais on ne peut pas dire au chauffage : +2 degrés. Si on pouvait faire ça, on aurait pas besoin d'un régulateur...

 

Ma deuxième remarque concerne la méthode. Est-ce vraiment d'un régulateur dont tu as besoin? Pour ma part je ferais différement. Par exemple en faisant un procédé itératif basé sur l'approche petit à petit du point zéro en utilsant la méthode de bissection

 

Concrétement :

ETAPE 1

Je vais à la position 1000, le capteur répond 8.

Je vais à la position -1000, le capteur répond 17.

Estimation1 : le point zéro est  à ~2777

 

Je vais à la position 2777+10, le capteur répond +0.01

Je vais à la position 2777-10, le capteur répond -0.02.

Estimation1 : le point zéro est  à ~2777.zzzz

 

Suis-je dans ma tolérance? Si oui, j'arrête, sinon j'affine par une itération en plus.

 

etc, etc

 

Message 2 of 3
(1,099 Views)

Salut !

Depuis que j'ai posté ce topic, j'ai exploré d'autres manières de faire et je pense être proche du but.

En effet, le PID n'est pas adapté à mon application et je ne l'utiliserai plus.

Ma nouvelle solution est un procédé itératif différent de celui que tu décris; j'ai déterminé un coefficient qui lie ma variation de différence de tension à la variation de la position angulaire.

Je prends la différence de tension, je la convertis en angle et j'additionne ou soustrait cette valeur à la position actuelle. Le résultat devient alors la consigne pour mon sous-VI qui sert à piloter le moteur. 

Cela fonctionne plutôt bien, les problèmes que je rencontre actuellement ne sont plus liés au pilotage en lui même.

 

En tout cas merci pour ta réponse, elle me fût instructive ! 🙂

0 Kudos
Message 3 of 3
(1,093 Views)