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);
où
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.