Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C#] Régulation de vitesse (PID)

    31 mai 2011 à 11:25:35

    Bonjour à toutes et à tous.

    J'ai créé une application qui me permet de contrôler la vitesse d'un ventilateur. La seule commande que je peux envoyer est + ou - suivi d'une valeur, sur une échelle de ratio de 1000 (ex : +100, -600 ...).

    J'ai donc procédé à un étalonnage pour établir la relation entre la valeur du ratio envoyé et la vitesse obtenue et ainsi contrôler la vitesse. En utilisant un timer, j'envoie à chaque Tick la valeur correspondante de ratio pour atteindre la bonne vitesse. Mon problème : lorsque l'écart entre la vitesse actuelle et la vitesse voulue est important, le programme envoie plusieurs commandes (temps de montée en puissance lent = plusieurs tick de timer), j'ai donc un dépassement très important. Le problème est identique pour des écarts moins grands, mais il est bien entendu moins conséquent. Si j'augmente l'intervalle de mon timer, ce sera trop lent pour atteindre la vitesse voulue.

    Je ne pense pas que ce soit la meilleure méthode, j'aimerai donc revoir mon modèle et intégrer un régulateur PID. Je connais le principe du régulateur, mais je ne sais pas comment identifier les facteurs P, I et D, et surtout comment les faire interagir avec la vitesse dans mon code (multiplier, diviser la vitesse, ou le ratio ...).

    - Est ce qu'utiliser un étalonnage ratio/vitesse est une bonne solution ?
    - Est-ce qu'il vaudrait mieux envoyer des ratios proportionnels à l'écart de vitesse et réguler par la suite ?
    - Est-ce que mon modèle est bon si j'intègre un régulateur PID ?
    - Les autres idées sont les bienvenues :-)

    Merci, et bonne journée à tous !

    Brygoth
    • Partager sur Facebook
    • Partager sur Twitter
      31 mai 2011 à 13:39:08

      Salut,

      Avant d'avancer une solution, je pense qu'il serait bien de savoir avoir quoi exactement tu modifies la valeur de vitesse. Un trackbar?

      Si c'est ça, et que la valeur 0 est l’arrêt, avec un maximum de 1000, tu peux :

      à chaque tick, tu lit la valeur courante du trackbar, disons A. B - A, B étant la dernière valeur lancer au ventilateur.

      Ceci te donne C, une valeur positive ou négative, que tu envoie au ventilateur. Ça te permet donc t'envoyer précisément ce que l'utilisateur choisi comme vitesse, que se soit une progression lente ou rapide du trackbar.

      EDIT : Exemples :

      A = 0, B = 200, C = 200 - 0 => 200, tu envoie + 200
      A = 200, B = 100, C = 100 - 200 => -100, tu envoie donc -100
      etc.

      Ceci ce fait à chaque tick, bien entendu.
      • Partager sur Facebook
      • Partager sur Twitter
        31 mai 2011 à 14:37:32

        Je pense aussi que c'est dans cette direction qu'il faut aller, mais l'oscillation autour de la vitesse demandée est un peu trop importante. Voilà le graphe de la vitesse en fonction du temps.

        Image ici

        Lorsque j'envoie une commande, j'ai un dépassement, et une oscillation autour de la valeur au départ, pour atteindre un système stable ensuite. C'est pour ça que j'aimerais utiliser le principe du régulateur PID, en jouant sur les valeur P, I et D, je pourrais combler cette instabilité.

        J'ai préparé ce genre d'interface (j'utilise Measurement Studio) :

        Image ici

        L'utilisateur sélectionne son type de régulation, P, PI ou PID, fixe les valeurs Kp, Ti et Td, mais je ne sais pas comment utiliser ces valeurs dans le code, et surtout comment les déterminer.
        • Partager sur Facebook
        • Partager sur Twitter

        [C#] Régulation de vitesse (PID)

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown