Programme C regulation PI ou PID
Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

Programme C regulation PI ou PID



  1. #1
    maxredphenix

    Programme C regulation PI ou PID


    ------

    Bonjour a tous,

    Je viens de finir un programme en C pour réguler la température, via un systeme à hysteresis ( voir pièce jointe), mais pour obtenir de meilleurs resultats je voudrais changer l'hystérésis en un systeme à PI ou à PID, malheureusement je ne sais pas comment on peut faire en programmation.

    Est ce quelqu'un pourrais m'aider dans cette transformation?

    Je vous remercie d'avance
    maxredphenix

    -----
    Fichiers attachés Fichiers attachés

  2. #2
    gienas
    Modérateur

    Re : Programme C regulation PI ou PID

    Bonjour maxredphenix et tout le groupe

    Que dirais-tu de la création d'une constante Hysteresis que tu fixes à ta valeur voulue, et que tu "l'ajoutes" dans les expressions qui provoquent la chauffe? (il faut ajouter ou retrancher, suivant la "forme" de l'expression dans laquelle elle intervient)

    Le but de l'opération étant de créer une "marge" entre l'état de la grandeur qui fait chauffer et celle qui arrête de chauffer.

  3. #3
    maxredphenix

    Re : Programme C regulation PI ou PID

    Bonjour gienas, et merci pour ta réponse,

    Normalement, la valeur d'hystérésis est deja créer c'est la valeur delta dans le programme, je l'ai fixée a 1 degrée.
    Mais mon prof (et oui, en stage) trouve que cela ne suffit pas, il veut que se soit plus precis maintenant qu'un systeme à hysteresis, donc j'ai penser au PI (D), mais je ne sais pas si c'est simplement une formule a PI ou PID du type G(s)= Kp(1+1/sTi), que l'on rentre dans le programme ou autre chose. Si tu sais comment on fait sa me serait d'un grand secour car je n'arrive pas a trouver comment faire

    Encore merci de ton aide
    Maxredphenix

  4. #4
    invite936c567e

    Re : Programme C regulation PI ou PID

    Bonjour

    Juste une remarque avant de te répondre...

    Code:
     /* Cas numero 3 - Temperature égale a celle demandée*/
                    else if(temp_reelle == temp_finale )
                    {
                         chauffage_on();
                    }
    Je suis assez surpris de trouver ce dernier test accompagné de la mise en route du chauffage .

    Les deux premiers tests du programme sont suffisants pour réaliser l'hystérésis, mais ce rajout fausse complètement le fonctionnement:
    1) en allumant le chauffage à Tfinale au lieu de Tfinale+T, et
    2) sans le signaler (absence de chauffage = 1;).

  5. A voir en vidéo sur Futura
  6. #5
    invite936c567e

    Re : Programme C regulation PI ou PID

    Sinon...

    Pour réaliser une régulation PI ou PID, il faut commencer par établir une base de temps correctement calibrée. Les calculs et l'activation de la commande doivent être programmés de façon très régulière, sous peine de fausser le comportement du terme I ("intégral") du régulateur.

    Si le programme est le seul à tourner, une temporisation par boucle de comptage peut suffire, mais si d'autres processus tournent en parallèle (réponse à des interruptions, multitâche, etc.) il faut faire appel à un timer.

    Ensuite, il faut introduire deux variables, afin de pouvoir réaliser de manière approchée le calcul suivant dans la boucle:
    avec
    et
    AP : coefficient "proportionnel"
    AI : coefficient "intégral"
    AD : coefficient "dérivée"
    Ce qui donne numériquement:
    Code:
    while(1)
    {
       /* temporisation pendant dt */
       tempo( dt );
    
       /* calcul de l'erreur */
       delta_temp = temp_finale - temp_reelle;
    
       /* calcul de la derivee */
       derivee = delta_temp - ancienne_valeur;
       ancienne_valeur = delta_temp;
    
       /* calcul de l'integrale */
       integrale += delta_temp;
    
       /* calcul de la commande */
       commande = Ap*delta_temp + Ai*dt*integrale + Ad/dt*derivee;
    
       /* commande */
       if (commande>0)
       {
          chauffage_on();
          chauffage = 1;
       }
       else
       {
          chauffage_off();
          chauffage = 0;
       }
    }
    Les variables servant à la mémorisation sont ancienne_valeur et integrale.

    Ap, Ai, Ad et dt sont des constantes.


    Je ne donne ce code que pour exposer le principe. Il faut en effet en plus penser à:
    - étoffer le programme de manière à réduire les erreurs d'arrondi et empêcher les dépassements de capacité pendant le calcul.
    - remplacer Ai*dt et Ad/dt par de simples constantes, voire remplacer les multiplications par des divisions, afin de simplifier les calculs.
    - initialiser correctement les variables.

    Bon courage pour la suite.

  7. #6
    maxredphenix

    Re : Programme C regulation PI ou PID

    Bonjour a tous,

    Je te remercie PA5CAL pour tes réponses, cela va beaucoup m'aider. J'avoue que j'avais pas penser au faite que la troisieme commande dans le code a hysteresis pouvais pertuber le fonctionnement, j'ai betement suivie le schema d'un hysteresis et ces trois conditions.

    Je vais me pencher maintenant sur les constantes et les variables du programme.

    Encore merci de ton aide
    A bientot
    Maxredphenix

  8. #7
    maxredphenix

    Re : Programme C regulation PI ou PID

    J'ai oublié de te demander,

    Sais tu comment on fait pour envoyer des données et les enregistrer dans un registre spécifique, comme par exemple stocker toutes les 100 ms la valeur de la temperature réelle sans effacer les précedentes, pour pouvoir les recuperer ensuite et ainsi pouvoir tracer sa courbe dans le temps.

    Je te remercie d'avance
    maxredphenix

  9. #8
    invite936c567e

    Re : Programme C regulation PI ou PID

    ...............

  10. #9
    invite936c567e

    Re : Programme C regulation PI ou PID

    Là on rentre dans des détails qui concernent plus spécifiquement le type de matériel que tu utilises (la manière dont tu récupères la valeur de temp_reelle en fait partie).

    Selon le type de processeur, l'accès à un registre d'entrée-sortie peut se faire de la même manière qu'on adresse une mémoire (c'est la philosophie Motorola) ou bien par le biais de fonctions spécifiques IN et OUT (c'est la philosophie Intel).


    En ce qui concerne le stockage des données, on le fait bêtement dans un tableau, avec un index qui avance d'un pas à chaque enregistrement.

    Comme 100 ms représentent probablement plusieurs fois le temps de répétition de la boucle de régulation PID, on décompte le temps passé et on ne stocke la mesure désirée que le moment venu.
    Code:
    /* initialisation */
    decompte = 0;
    index_ecriture = 0;
    
    /* boucle de régulation PID
        (prévoir une condition de sortie de la boucle) */
    while (...)
    {
       /* mesure et régulation */
       ...
    
       /* toutes les 100ms, stockage de la mesure
          si le tableau n'est pas plein */
       if (decompte == 0 )
       {
          if ( index_ecriture < taille_tableau )
          {
             tableau[ index_ecriture ] = mesure;
             index_ecriture ++;
          }
          /* nouveau décompte de 100ms */
          decompte = decompte_100ms;
       }
       decompte--;
    }
    ...
    
    /* envoi du nombre de mesures */
    envoi_valeur( index_ecriture );
    /* envoi du tableau de mesures */
    for ( index_lecture=0 ;
           index_lecture<index_ecriture ;
            index_lecture++)
    {
       envoi_valeur( tableau[ index_lecture ] );
    }


    Toutefois, si l'on veut faire des enregistrements sur de longues durées (la régulation de température est un processus assez lent), on risque d'atteindre la taille des mémoires généralement disponibles sur les petits systèmes embarqués.

    Il est possible de transmettre en temps réel les mesures effectuées au travers d'un UART vers l'interface RS232 d'un PC. Le code devient alors beaucoup plus simple:
    Code:
    /* initialisation */
    decompte = 0;
    
    /* boucle de régulation PID */
    while (1)
    {
       /* mesure et régulation */
       ...
    
       /* toutes les 100ms, envoi de la mesure */
       if ( decompte == 0 )
       {
          envoi_valeur( mesure );
    
          /* nouveau décompte de 100ms */
          decompte = decompte_100ms;
       }
       decompte--;
    }

  11. #10
    maxredphenix

    Re : Programme C regulation PI ou PID

    Bonjour a tous,

    Encore une fois je te remercie, ce code va bien m'aider dans l'avancement de mon projet. C'est vraiment super que des gens comme toi et gienas aide des personnes dans la galère comme moi.

    Encore merci
    A bientot

Discussions similaires

  1. méthodes d'analyse dynamique, régulation PID
    Par invite22af2154 dans le forum Électronique
    Réponses: 8
    Dernier message: 05/04/2009, 12h19
  2. régulation PID analogique
    Par invite7e9cb89a dans le forum Électronique
    Réponses: 38
    Dernier message: 08/06/2008, 12h05
  3. [Thermique] Regulation Pid Temperature Chaudiere.
    Par inviteebf9910c dans le forum Dépannage
    Réponses: 13
    Dernier message: 04/11/2007, 10h16
  4. Comment faire une régulation PID ?
    Par invite3e697557 dans le forum Physique
    Réponses: 0
    Dernier message: 04/04/2007, 18h34
  5. régulation PID
    Par invitee0608ee8 dans le forum Physique
    Réponses: 3
    Dernier message: 14/03/2007, 16h52
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...