programmation des boucles PID en C

11

Je suis un ingénieur électricien qui a été plongé dans le monde numérique et a appris au fur et à mesure. Je programme un processeur TI pour faire une boucle PID (proportionnelle-intégrale-dérivée) , illustrée par ce diagramme:

Image de boucle PID de Wikipedia

Je vais également le décrire:

Ampli op à rétroaction négative, avec borne non inverseuse mise à la terre. Entrée par borne négative. La boucle de rétroaction est un circuit série RE en parallèle avec une résistance et tout cela en parallèle avec un capuchon.

Quelqu'un a une idée de comment convertir ce circuit en code C? Je suis un peu hors de mon élément à ce sujet et je pourrais utiliser l'aide.

Ingénieur Jedi
la source
Vous pouvez créer un lien vers une image et quelqu'un pourra utilement convertir ce lien en une image réelle pour vous.
Joachim Sauer
2
Le lien que vous avez publié vous-même fournit un pseudocode de base pour vous y prendre. Si cela ne vous dérange pas C #, voici un exemple de boucle pid en C # .
Neil
1
Neil a raison. J'ai implémenté presque exactement cette boucle en C sur TI. Un conseil: utilisez une boucle à temps constant et factorisez le fixe dtdans les constantes, au lieu de faire des divisions et des multiplications supplémentaires dans la boucle.
AShelly
1
@Neil était un lien que j'ai ajouté dans la révision 2 parce que je ne savais pas ce qu'était une boucle PID et je soupçonnais que beaucoup d'autres non plus.
@MichaelT, ah mes excuses alors.
Neil

Réponses:

18

Le circuit

Ok, je viens de créer un compte ici quand j'ai vu cette question. Je ne suis pas en mesure de modifier votre question afin que je puisse corriger la faute de frappe que vous avez faite. Je pense que vous vouliez dire un circuit de la série RC en parallèle au lieu de RE (si c'est le cas, je n'ai aucune idée de ce que cela signifie)

On dirait que le circuit analogique que vous souhaitez simuler en utilisant C ressemble à ceci

                         Ci
                  |------| |--------------|
                  |           Rp          |
                  |----/\/\/\/\-----------|
                  |          Rd    Cd     |
           Rf     |----/\/\/\---| |-------|
Vin o----/\/\/\---|                       |
                  |    |\                 |
                  |    | \                |
                  |----|- \               | 
                       |   \              |
                       |    \-------------|---------o  Vout
                       |    /
                       |   /
                       |+ /
                   ----| /
                  |    |/
                  |
                  |
               ___|___ GND
                _____
                 ___
                  _

LEGEND:
  Vin is the input signal.
  Vout is the Output.
  Rp controls the propotional term ( P in PID) 
  Ci controls the Integral term ( I id PID)
  Rd and Cd controls the differential term ( D in PID)
  Rf is the gain control, which is common to all of the above controllers.

(Je n'ai pas pu résister à mon envie de dessiner cela car je voulais vous dire comment les ingénieurs électriciens / électroniciens communiquaient dans les forums et les e-mails sans images ... et pourquoi nous adorons le courrier, la police à largeur fixe)

Je dois avouer que le circuit que vous utilisez est simple à configurer mais est très complexe mathématiquement, quand il s'agit de régler les constantes promotionnelles, intégrales et dérivées du système à une valeur souhaitée individuellement, ce n'est pas possible.

Je vous suggère fortement d'utiliser le circuit de cette source pour étudier.

Même s'il est un peu fastidieux à mettre en place, mathématiquement, c'est beaucoup plus simple à analyser car vous pouvez le relier directement à la forme mathématique standard au lieu de la forme idéale.

Enfin, le Vout sert à contrôler un moteur ou tout ce qui doit être contrôlé. Et Vin est la tension variable Process.

Avant de se mouiller les pieds en C (mer?)

Je suppose que vous lisez les signaux d'une sorte de convertisseur analogique-numérique. Sinon, vous devrez simuler le signal en entrée.

Si nous utilisons le formulaire standard, nous avons,

En supposant que le temps de fonctionnement de la boucle est suffisamment petit (un processus lent), nous pouvons utiliser la fonction suivante pour calculer la sortie,

output = Kp * err + (Ki * int * dt) + (Kd * der /dt);

Kp = Proptional Constant.
Ki = Integral Constant.
Kd = Derivative Constant.
err = Expected Output - Actual Output ie. error;
int  = int from previous loop + err; ( i.e. integral error )
der  = err - err from previous loop; ( i.e. differential error)
dt = execution time of loop.

où initialement «der» et «int» seraient nuls. Si vous utilisez une fonction de retard dans le code pour régler la fréquence de boucle pour dire 1 KHz, votre dt serait de 0,001 seconde.

Dessiner en C

J'ai trouvé cet excellent code pour PID en C, bien qu'il n'en couvre pas tous les aspects, c'est un bon néanmoins.

//get value of setpoint from user
while(1){
  // reset Timer
  // write code to escape loop on receiving a keyboard interrupt.
  // read the value of Vin from ADC ( Analogue to digital converter).
  // Calculate the output using the formula discussed previously.
  // Apply the calculated outpout to DAC ( digital to analogue converter).
  // wait till the Timer reach 'dt' seconds.
}

Si nous prenons un processus lent, alors nous pouvons utiliser une fréquence plus basse telle que le temps d'exécution du code dt >>> pour une seule boucle (bien plus que). Dans de tels cas, nous pouvons supprimer la minuterie et utiliser une fonction de retard à la place.

D34dman
la source
6
Le diagramme Ascii m'a époustouflé. +1
l46kok
1
lien "cette source" ne fonctionne pas
Ccr
Oh, je suis désolé d'entendre cela, une bonne ressource s'est perdue :(. Eh bien, le concept a été expliqué dans l'exemple de code de boucle while que j'avais partagé. Je ne sais pas comment gérer cette situation, peut-être que certains éditeurs peuvent le corriger avec message correct. (le lien mort)
D34dman
2
La "source" manquante pourrait être disponible ici: educypedia.karadimov.info/library/piddocs.pdf
David Suarez