cs_NISANDSYSTEMS
Messages postés178Date d'inscriptionvendredi 1 novembre 2002StatutMembreDernière intervention 9 janvier 2010
-
12 déc. 2004 à 11:39
mimid38
Messages postés1Date d'inscriptionmardi 24 novembre 2009StatutMembreDernière intervention 1 mars 2012
-
1 mars 2012 à 09:39
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
mimid38
Messages postés1Date d'inscriptionmardi 24 novembre 2009StatutMembreDernière intervention 1 mars 2012 1 mars 2012 à 09:39
Bonjour,
Ce code est-il compatible et utilisable depuis Excel 2007 ?
Merci
DIma
abdelssami
Messages postés1Date d'inscriptionmercredi 28 juillet 2010StatutMembreDernière intervention25 janvier 2011 25 janv. 2011 à 10:36
salut
Je suis en train d'essayer de coder de la simulation d'un correcteur PID de la vitese et la position d'un moteur cc ,Je voudrai aussi savoir s'il y a des idées pour cette application
David78390
Messages postés197Date d'inscriptionjeudi 27 avril 2006StatutMembreDernière intervention10 juillet 2011 8 mai 2010 à 00:18
Pour ce qui est du code, je ne l'ai plus et ne peut le télécharger actuellement pour me replonger dedans.
Mais pour répondre a ta question, peut importe la valeur de tes coéficiant, l'essentiel c'est que ton système réagisse bien.
Toute foi, un petit bémol a ce principe:
- il faut tant que possible que ton système reste dans le domaine linéaire; c.a.d que ta sortie ne soit pas à 100% (vu que tu est sur un PIC Sr!=+VCC) , sinon ca veut dire que ton PID sature et ce n'est jamais top.
loulouuuuu
Messages postés5Date d'inscriptionlundi 30 novembre 2009StatutMembreDernière intervention 5 mai 2010 5 mai 2010 à 18:09
Re-Salut,
je relis ma question et je me dis: c'est pas clair ce que je dis !
alors pour résumer, ce que je ne comprend pas c'est le choix des valeurs des P,I et D, sur la fiche on a par exemple P = 1 mais dans le code, le P qui est utilisé dans la boucle PID vaut bien 100 , non !
merci et bonne soirée.
loulouuuuu
Messages postés5Date d'inscriptionlundi 30 novembre 2009StatutMembreDernière intervention 5 mai 2010 4 mai 2010 à 14:46
Salut David,
oui t'as bien raison sur mes types, et comme tu dis, ceci reste acceptable tant que le PID réagi bien.
Mais juste une dernière question si tu le permet, la valeur initiale du Kp (gain_proportionnel) est bien 100 (je m'en rappelle plus ..) elle ne serait pas "trop" grande ou est ce que son ordre de grandeur importe peu tant que le résultat est bon ? (5,100,200...)
Bonne journée à tous.
David78390
Messages postés197Date d'inscriptionjeudi 27 avril 2006StatutMembreDernière intervention10 juillet 2011 26 avril 2010 à 23:42
Desolé, j'avais un peu zapé ta demande.
Et je n'ai pas de quoi les tester en ce moment via un pic.
Tout d'abord, attention avec le pic sur une opération avec des virgule : type /0.1, il vaut mieux utiliser *10.
Sinon tu peux le faire comme tu a fait, mais normalement tes 2 coéf doivent être le même pour B0 et B1:
En sortant de l'erreur (Epsylon) tu fais tes calcul P, I et D, puis tu les additionnes, et aprés tu peux tout a fait les multiplier par un coéf.
En espérant que le crobar passe
Si tu regarde le 4eme commentaire, RECEVELOR, a nommé Kp son coéf qui est le même pour b0 , b1 et b2.
Voila en espérant que ca peut t'aider.
loulouuuuu
Messages postés5Date d'inscriptionlundi 30 novembre 2009StatutMembreDernière intervention 5 mai 2010 26 avril 2010 à 10:26
Alors David, t'as pu tester ?
Bonne journée a tous.
loulouuuuu
Messages postés5Date d'inscriptionlundi 30 novembre 2009StatutMembreDernière intervention 5 mai 2010 18 avril 2010 à 19:40
Salut a tous et merci pour ta réponse David,
en fait je rajoute les 2 coef comme ceci (un meilleur résultat avec 5 et 3):
coef_B0 = "5" * (gain_proportionnel / 100) * (1 + ((temps_dérivée / 10) / 0.1))
coef_B1 = "3" * (gain_proportionnel / 100) * (-1 + (0.1 / (temps_intégrale / 100)) - (2 * (temps_dérivée / 10) / 0.1))
(dans Private Sub boucle_PID() ' algotithme PID)
voila, tenez moi au courant.
David78390
Messages postés197Date d'inscriptionjeudi 27 avril 2006StatutMembreDernière intervention10 juillet 2011 18 avril 2010 à 17:46
Je ne comprend pas bien a quels endroit tu mets les coef multiplicateurs.
Si c'est dans le P, le I ou le D , y'a pas de soucis.
Idem si tu fais X*(Kp*P+Ki*I+Kd*D), ca reste toujours un PID
Maintenant sur certain système il arrive de mettre un coef sur la boucle de retour, je crois (a confirmer) que c'est une p'tite triche, mais je ne peut te dire si il s'agit tjrs d'un PID.
Par exemple pour connaitre un debit, on fait une mesure différentiel, puis on fait une extraction de la racine carré.
Peux-tu corriger la formule suivante en disant ou tu mets tes coef:
S=(Consigne-retour)*Kglobal*(Kp*P+Ki*I+Kd*D)
loulouuuuu
Messages postés5Date d'inscriptionlundi 30 novembre 2009StatutMembreDernière intervention 5 mai 2010 13 avril 2010 à 16:10
Salut tout le monde, et merci David pour ton code.
néanmoins j'ai remarqué qu'on rajoutant 2 coeffecient dans la formule , la regulation s'ameliore (dépassement de la consigne et durée d'oscilliations):
Coef_B0 := 5 * l'ancienne valeur que vous avez mis
Coef_B1 := 3 * l'ancienne valeur que vous avez mis
(j'amplifie les mesures de la première et la deuxième erreur calculées)
mais en modifiant ainsi ce n'est plus un PID, ai-je tord ??
siwar2010
Messages postés5Date d'inscriptionvendredi 19 mars 2010StatutMembreDernière intervention23 mars 2010 23 mars 2010 à 17:14
Merci David ; je vais voir ce ke ça donne
merci beaucoup :-)
David78390
Messages postés197Date d'inscriptionjeudi 27 avril 2006StatutMembreDernière intervention10 juillet 2011 22 mars 2010 à 23:33
Mince, y'a mon crobar qui n'est pas passé ;)
.
.
.
.
.
Le voila:
Cons-----O---Epsy----(PI)---S---Interface de puissance pour
| Ton Systeme
| |
| |
|--Retour-----------------
David78390
Messages postés197Date d'inscriptionjeudi 27 avril 2006StatutMembreDernière intervention10 juillet 2011 22 mars 2010 à 23:33
Sur le principe, pour faire le I, il te faut 2 valeurs de ton entrée pour determiner l'evolution de ton retour, puis faire le calcul, et renvoyer la correction
Cons-----O---Epsy----(PI)---S---Interface de puissance pour
| Ton Systeme
| |
| |
|--Retour-----------------
Bon a la volée, rete a voir ce que ca donne.
Par contre decompose bien 1 calcul par ligne pour eviter les overflow, et evite les chiffer<1 car tu va avoir 0 en sortie
//Variables globales
long cpt=0;
long tmp;
long Epsy=Resultat du CAN;
Long S; //Qui en fait est ton CNA
// tu lance le timer, dés qu'il a fini, tu appel ca :
//Tes propres variables
long Calcul; // pour les * / +
int echant=XX;//Mettre la periode de ton timer
int P=?; //Les 2 coef que tu veux
int I=?;
cpt++;
if(cpt&0x01==0x01)
{ //si on est au 1er passage, on n'a qu'1 echantillon donc impossble de calculer une integrale, par contre on va juste mettre un coup de P
S=P*Epsy
tmp=Epsy; // on sauvegare la valeur de Epsylon
}
else if(cpt&0x02==0x02) //maintenant on a 2 point pour connaitre l'evolution du systeme
{
//1- on calcul la pente:
calcul=Epsy-tmp;
//2- l'intégrale d'une pentee=> (pente/2)*t²+point d'origine*t+constante
calcul=calcul/2;
calcul=calcul*echant; //*t²
calcul=calcul*echant;
calcul=calucl+tmp*echant; // +point d'origine*t
calcul=calucl+tmp; // pour la constante, soit on la considere nulle, mais suivant ce que tu fait, on peut y remettre le point d'origine
calcul=calcul*I;
S=calcul;
cpt=0;
}
Tien mois au courant
siwar2010
Messages postés5Date d'inscriptionvendredi 19 mars 2010StatutMembreDernière intervention23 mars 2010 22 mars 2010 à 19:23
BONSOIR
merci David
en fait je suis bloqué au niveau de la programmation de l'equation du PI
j'ai meme la fonction qui me permet d'ecrire et de lire dans la memoire du pic
mais c'est juste la boucle de l'équation elle meme qui me pose probleme pouvez vous m'aidez s'il vous plait.
Merci
David78390
Messages postés197Date d'inscriptionjeudi 27 avril 2006StatutMembreDernière intervention10 juillet 2011 21 mars 2010 à 12:50
Aprés, il me faudrait plus d'info pour savoir ce qui te bloque exactement ...
David78390
Messages postés197Date d'inscriptionjeudi 27 avril 2006StatutMembreDernière intervention10 juillet 2011 21 mars 2010 à 12:48
Pour l'ecriture d'un PID dans un pic (notament le 16F876), je te repond de mémoire par rapport a ce que j'ai fait a l'epoque (c'étais pas pour un PID, mais y'avais des calcul)
1er chose, il faut que tu utilise le timer, qui te permettera de definir l'echantillonage de ton regulateur.
A chaque coup de timer, tu lance l'aquisition de ton CAN.
Ensuite il faudra que tu utilise le fonction mullong et divlong (a verifier sur les nom de fonction) pour pouvoir faire tes equation.
Fais gaffe aux tailles de tes variables, car tu risque des overflows.
Ensuite tu envoi le resultat dans ton CNA.
Voila pour dégrossir.
siwar2010
Messages postés5Date d'inscriptionvendredi 19 mars 2010StatutMembreDernière intervention23 mars 2010 20 mars 2010 à 17:46
Bonsoir
j'ai besoin de programmer un correcteur PI avec un pic16F876 et je suis totalement bloqué
svp est ce que quelqu'un a un code qui pourrait m'aider à faire cela ?
Merci d'avance
idortan
Messages postés1Date d'inscriptionvendredi 13 février 2009StatutMembreDernière intervention13 février 2009 13 févr. 2009 à 11:39
Bonjour,
Cette analyse concerne un PID en parallele. S = K [E + 1/Ti |Edt + Td dE/dt)
il existe aussi un PID en parallèle S = K.E (Ti+Td)/Ti + K/Ti |Edt + K.Td dE/dt
et mixte que je ne connais pas !
David78390
Messages postés197Date d'inscriptionjeudi 27 avril 2006StatutMembreDernière intervention10 juillet 2011 22 mars 2008 à 12:06
Salut Goguy60,
Pour le type de fonction:
E(t)=S(t) + DS(t)/dt + D²S(t)/dt²
Qu'entends tu par D²S(t)/dt² ?
La dérivé au carré vu ta question??????
Si tu entend la derivée seconde pour D²S(t)/dt², elle est nulle dans nos cas, car:
entre t et t+1
l'équation de la pente est du genre (S1-S2)*t+S1
donc la dérivé est (S1-S2)
d'ou la derivé seconde est 0
Pour que la derivé seconde existe, il faut une équation du type at²+bt+c qui sera 2a
Voila en esperant t'avoir aidé si tu parlais de la derivée seconde .
@+
goguy60
Messages postés1Date d'inscriptionmercredi 10 octobre 2007StatutMembreDernière intervention19 mars 2008 19 mars 2008 à 09:34
Bonjour Arthur,
Je trouve ton programme excellent. Travaillant sur des process de régulations, j'ai adapté tes calcul pour modéliser des process du 1 er ordre
Fonction temporelle : E(t)=S(t)+ DS(t)/dt avec E(t) l'entreée et S(t) la sortie
Comme il n'y a pas d'intégrale c'est assez simple. Par contre, sais tu comment modéliser un système du 2 ordre?
Fonction temporelle est : E(t)=S(t) + DS(t)/dt + D²S(t)/dt²
Est qu'il suffit de faire (Err(k)-Err(k-1)/pe)² ?
Comment intégrer un retard au fonction (ex en Laplace : F(p)=e(-Tp)/(1+T1p)
Cordialement
Goguy
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 16 mars 2008 à 14:42
rien ne t'empêche de refaire le zip ici pour ajouter un 2e cas ou mettre l'explication de type, voire ajouter le pdf ;)
je supprimerai la V1 dans la journée, merci d'avoir répondu si vite
++
arthur81
Messages postés4Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention16 mars 2008 16 mars 2008 à 07:30
Si une version est en trop, il faut conserver la version "V2".
Mais supprimer la première fera disparaitre des explications.
Pour information : les algorithmes de la première version sont basés sur des nombres entiers; ceux de la version "V2" sont basés sur des nombres réels. Les résultats ne sont pas identiques.
Arthur
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 16 mars 2008 à 00:16
avec ou sans PDF, puisqu'à l'époque (2004) il n'y a pas simplement eu de mise à jour de la source, merci de me dire laquelle des 2 supprimer
bonne soirée
David78390
Messages postés197Date d'inscriptionjeudi 27 avril 2006StatutMembreDernière intervention10 juillet 2011 15 mars 2008 à 23:28
Royal !!!!!!! 10/10
La version 1 m'a un peu paumé sur certainnes chose,
Mais la le PDF est parfait.
Perso j'essaie de faire un PD position sur un moteur,
je pense que ca va m'etre bien utile.
Chapeauxxxx bas mister
megamor
Messages postés1Date d'inscriptiondimanche 13 janvier 2008StatutMembreDernière intervention14 février 2008 14 févr. 2008 à 22:26
j'arrive pas a executé le telechargemet c'est tre compliqué se site si quel qu'un peut m'envoiyer se logiciel dans mon email megamor@hotmail.fr . merci
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 24 nov. 2007 à 10:18
darkbeyret
Messages postés1Date d'inscriptionvendredi 23 novembre 2007StatutMembreDernière intervention24 novembre 2007 24 nov. 2007 à 10:17
Bonjour ,je suis un nouvel inscrit .Lorsque je télécharge ,je n'ai que 220 KO de donnée et un raccorcie internet qui ne marche pas .Help .
cs_mcgyver
Messages postés4Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 septembre 2007 10 sept. 2007 à 03:02
Bonjour.
Quelqu'un aurait-il l'équivalent de cette source
pour Delphi ?
Je ne connais pas VB.
Merci d'avance.
nnizarr
Messages postés11Date d'inscriptionvendredi 16 mars 2007StatutMembreDernière intervention19 juillet 2007 13 juin 2007 à 11:00
bonjour,
eh oui c'est encord moi, alors voila je vue que dans ton programme tu utilise un timer mais ce que je veux savoir c'est comment tu fait pour ne pas avoir l'initialisation de tes variables(que tu utilise dans ton programme) a chaque fois que tu appel ton timer????
merci a l'avance
nnizarr
Messages postés11Date d'inscriptionvendredi 16 mars 2007StatutMembreDernière intervention19 juillet 2007 29 mai 2007 à 12:19
Bonjour,
en premier je tiens a te dire bravo pour ce programme bien expliquer et surtout bien commente.mais je ne comprend pas les valeur que tu donne en premier pour les parametres du PID et surtout cette partie de code
Label_gain_propor.Caption = "01.00"
VScroll_gain_propor.Value 500 - 100 ' (coef de départ Kp 1)
Label_temps_intégra.Caption = "00.25"
VScroll_temps_integra.Value 1000 - 25 ' (coef de départ Ti 0,25 s)
Label_temps_dériv.Caption = "01.00"
VScroll_temps_dériv.Value 200 - 10 ' (coef de départ Td 1 s)
gain_proportionnel = Val(Label_gain_propor.Caption)
temps_intégrale = Val(Label_temps_intégra.Caption)
temps_dérivée = Val(Label_temps_dériv.Caption)
es ce que qq peut m'explique ca svp?
Merci a l'avance
Hrod
Messages postés6Date d'inscriptionmercredi 22 novembre 2006StatutMembreDernière intervention 7 octobre 2007 22 nov. 2006 à 12:37
Bonjour, je suis très nouveau ici, parce que je n'ai découvert ce site qu'il y a quelque sminutes, à l'occasion d'une recherche sans véritable rapport avec le sujet traité ! Comme quoi... le hasard fait parfois bien les choses.
Je trouve que le développement sujet de cet article est un très bon travail qui pourra aider bien des techniciens.
Bien qu'utilisant depuis de nombreuses années des régulateurs "solid state" (HCTL1000 puis HCTL1100) principalement pour des asservissements de position, je trouve que ce code peut servir de base à tous ceux qui souhaitent construire, par exemple, un système de régulation thermique ou tout autre dispositif à relativement grande constante de temps.
Bravo, et grand merci à tous ces développeurs qui partagent leur passion.
otis44
Messages postés19Date d'inscriptionlundi 18 juillet 2005StatutMembreDernière intervention 4 juillet 2006 8 juin 2006 à 23:41
Très intéressant ce simulateur mais....assez imprécis côté calcul.J'essaie de l'améliorer en calculant l'intégrale par la méthode de SIMPSON (au lieu de la méthode des rectangles) et la dérivée par la méthode de Richardson pour voir ce que ça donne.Pour l'instant côté rapidité c'est pas trop fameux je dois faire des simplifications et puisque j'écris trop mal(eh oui je suis de la vieille école)pas facile de voir certaines choses.Si quelqu'un y arrive avant moi faîte moi signe et pour ceux qui ont envie de s'y mettre:
SIMPSON : I(a,b)=((a+b)/6) * (f(a)+f(b)+4* f((a+b)/2))
RICHARDSON : f'(x0) = [8 * f(x0 + pas/4)- 8 * f(x0 - pas/4)+f(x0 - pas/2)-f(x0+ pas/2)] / (3*pas)
A vos claviers !!!
cs_GLANDU
Messages postés3Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention14 février 2008 27 avril 2006 à 23:57
Sympa ce simulateur de PID du Beau Boulot !!
RECEVELOR
Messages postés3Date d'inscriptionmardi 31 août 2004StatutMembreDernière intervention11 octobre 2005 11 oct. 2005 à 11:48
Donc résumons nous :
Mon problème est effectivement sur le calcul de l'intégral qui nécessiterai la mémorisation glissante de trop de valeurs.
Si l'on prend la base du document PDF de la simulation du PID, il ressort que l'on ne doit mémoriser que 3 valeurs de Err en % (l'écart % consigne%? mesure % Set Point%- Process Value%)
Err à l'instant t, t(-1) et à t(-2) c'est-à-dire à t , t(-pe), t (? 2*pe)
Et si la période d'échantillonnage des valeurs est de 1 seconde : Err(t), Err(t-1s) et Err(t-2s).
Ti et Td seront en secondes aussi, S(t) la commande de sortie en % comme la consigne et la mesure.
Consigne %= 100 *(Valeur physique consigne-Mini de l'échelle physique) / (maxi-mini de l'échelle physique)
Mesure %= 100 * (Valeur physique mesure-Mini de l'échelle physique) / (maxi-mini de l'échelle physique)
Kp=1 ' à régler a votre convenance
Ti=60 ' à régler a votre convenance en s
Td=0 ' à régler a votre convenance en s
Err2=Err1
Err1=Err0
Consigne = (conversion en % de la valeur physique) 'en %
Mesure = (conversion en % de la valeur physique) 'en %
pe=1 ' en sec ou t - t(-1) si calcul de la fréquence d'échantillonnage
Err0= Consigne - mesure 'en %
b0=Kp*(1+Td/pe)
b1=Kp*(-1+pe/Ti-2*Td/pe)
b2=Kp * Td/pe
S=S+ b0 * Err0 + b1 * Err1 + b2 * Err2 'en %
Je l'ai testé directement dans Excel dans les cellules en calcul itératif (un pas = une seconde) Cela a l'air de fonctionner !
BZY1
Messages postés214Date d'inscriptionjeudi 10 mars 2005StatutMembreDernière intervention12 avril 2008 18 juil. 2005 à 10:58
ca a l'air très bien et très interressant cela dit je n'ai pas essayer ton prog. Est ce que c'est toi qui met tes blocs de régulations ou est ce que tu doit obligatoirement prendre l'exemple que l'on voit? deplus je vois qu'il s'agit d'une pompe mais si on veut réguler un four ou faire de la régulation de vitesse d'un moteur, est ce que l'on peut?
cs_babounlehobbit
Messages postés12Date d'inscriptionsamedi 14 février 2004StatutMembreDernière intervention23 octobre 2005 3 juil. 2005 à 13:48
Je suis en train d'essayer de coder un algo de boucle de regulation avec correcteur PID en fortran...
J'aurai voulu m'inspirer de ta logique et de ton raisonnement.
Mais apparement ton code comporte un certain nombre de lignes pour l'interface graphique... comment est-ce que je peux faire pour discerner ca du code pur de régulation...
awasarr
Messages postés5Date d'inscriptionlundi 20 septembre 2004StatutMembreDernière intervention15 juin 2005 14 juin 2005 à 12:06
Je suis depuis plus d'un an maintenant sur le SNCC Foxboro I/A Séries et depuis 5ans déjà dans le domaine des automatismes, de la régulation et de l'instrumentation. Je suis donc très content de tomber sur ce sujet dans le réseau codes sources. Courage et tenez moi au courant.
Je voudrai aussi savoir s'il y a un contrôle qui peut me permettre de tracer des courbes avec des valeurs données dans un tableau.
cs_NISANDSYSTEMS
Messages postés178Date d'inscriptionvendredi 1 novembre 2002StatutMembreDernière intervention 9 janvier 2010 12 déc. 2004 à 11:39
Je ne vois pas ou ton <l'algorithme du PID > est traité en vb.
Ton pdf explique tres bien je le conçois, les lois sur ce sujet, mais à part cela, explique nous ou ton l'algorithme du PID est conçu en code vb.
Sinon c'est pas mal pour ceux qui sont passionnés par ce sujet.
1 mars 2012 à 09:39
Ce code est-il compatible et utilisable depuis Excel 2007 ?
Merci
DIma
25 janv. 2011 à 10:36
Je suis en train d'essayer de coder de la simulation d'un correcteur PID de la vitese et la position d'un moteur cc ,Je voudrai aussi savoir s'il y a des idées pour cette application
8 mai 2010 à 00:18
Mais pour répondre a ta question, peut importe la valeur de tes coéficiant, l'essentiel c'est que ton système réagisse bien.
Toute foi, un petit bémol a ce principe:
- il faut tant que possible que ton système reste dans le domaine linéaire; c.a.d que ta sortie ne soit pas à 100% (vu que tu est sur un PIC Sr!=+VCC) , sinon ca veut dire que ton PID sature et ce n'est jamais top.
5 mai 2010 à 18:09
je relis ma question et je me dis: c'est pas clair ce que je dis !
alors pour résumer, ce que je ne comprend pas c'est le choix des valeurs des P,I et D, sur la fiche on a par exemple P = 1 mais dans le code, le P qui est utilisé dans la boucle PID vaut bien 100 , non !
merci et bonne soirée.
4 mai 2010 à 14:46
oui t'as bien raison sur mes types, et comme tu dis, ceci reste acceptable tant que le PID réagi bien.
Mais juste une dernière question si tu le permet, la valeur initiale du Kp (gain_proportionnel) est bien 100 (je m'en rappelle plus ..) elle ne serait pas "trop" grande ou est ce que son ordre de grandeur importe peu tant que le résultat est bon ? (5,100,200...)
Bonne journée à tous.
26 avril 2010 à 23:42
Et je n'ai pas de quoi les tester en ce moment via un pic.
Tout d'abord, attention avec le pic sur une opération avec des virgule : type /0.1, il vaut mieux utiliser *10.
Sinon tu peux le faire comme tu a fait, mais normalement tes 2 coéf doivent être le même pour B0 et B1:
En sortant de l'erreur (Epsylon) tu fais tes calcul P, I et D, puis tu les additionnes, et aprés tu peux tout a fait les multiplier par un coéf.
En espérant que le crobar passe
|-----P------|
| |
Erreur-|-----I--Sommateur--- *Coef ---- Interface puissance
| |
|-----D------|
Si tu regarde le 4eme commentaire, RECEVELOR, a nommé Kp son coéf qui est le même pour b0 , b1 et b2.
Voila en espérant que ca peut t'aider.
26 avril 2010 à 10:26
Bonne journée a tous.
18 avril 2010 à 19:40
en fait je rajoute les 2 coef comme ceci (un meilleur résultat avec 5 et 3):
coef_B0 = "5" * (gain_proportionnel / 100) * (1 + ((temps_dérivée / 10) / 0.1))
coef_B1 = "3" * (gain_proportionnel / 100) * (-1 + (0.1 / (temps_intégrale / 100)) - (2 * (temps_dérivée / 10) / 0.1))
(dans Private Sub boucle_PID() ' algotithme PID)
voila, tenez moi au courant.
18 avril 2010 à 17:46
Si c'est dans le P, le I ou le D , y'a pas de soucis.
Idem si tu fais X*(Kp*P+Ki*I+Kd*D), ca reste toujours un PID
Maintenant sur certain système il arrive de mettre un coef sur la boucle de retour, je crois (a confirmer) que c'est une p'tite triche, mais je ne peut te dire si il s'agit tjrs d'un PID.
Par exemple pour connaitre un debit, on fait une mesure différentiel, puis on fait une extraction de la racine carré.
Peux-tu corriger la formule suivante en disant ou tu mets tes coef:
S=(Consigne-retour)*Kglobal*(Kp*P+Ki*I+Kd*D)
13 avril 2010 à 16:10
néanmoins j'ai remarqué qu'on rajoutant 2 coeffecient dans la formule , la regulation s'ameliore (dépassement de la consigne et durée d'oscilliations):
Coef_B0 := 5 * l'ancienne valeur que vous avez mis
Coef_B1 := 3 * l'ancienne valeur que vous avez mis
(j'amplifie les mesures de la première et la deuxième erreur calculées)
mais en modifiant ainsi ce n'est plus un PID, ai-je tord ??
23 mars 2010 à 17:14
merci beaucoup :-)
22 mars 2010 à 23:33
.
.
.
.
.
Le voila:
Cons-----O---Epsy----(PI)---S---Interface de puissance pour
| Ton Systeme
| |
| |
|--Retour-----------------
22 mars 2010 à 23:33
Cons-----O---Epsy----(PI)---S---Interface de puissance pour
| Ton Systeme
| |
| |
|--Retour-----------------
Bon a la volée, rete a voir ce que ca donne.
Par contre decompose bien 1 calcul par ligne pour eviter les overflow, et evite les chiffer<1 car tu va avoir 0 en sortie
//Variables globales
long cpt=0;
long tmp;
long Epsy=Resultat du CAN;
Long S; //Qui en fait est ton CNA
// tu lance le timer, dés qu'il a fini, tu appel ca :
//Tes propres variables
long Calcul; // pour les * / +
int echant=XX;//Mettre la periode de ton timer
int P=?; //Les 2 coef que tu veux
int I=?;
cpt++;
if(cpt&0x01==0x01)
{ //si on est au 1er passage, on n'a qu'1 echantillon donc impossble de calculer une integrale, par contre on va juste mettre un coup de P
S=P*Epsy
tmp=Epsy; // on sauvegare la valeur de Epsylon
}
else if(cpt&0x02==0x02) //maintenant on a 2 point pour connaitre l'evolution du systeme
{
//1- on calcul la pente:
calcul=Epsy-tmp;
//2- l'intégrale d'une pentee=> (pente/2)*t²+point d'origine*t+constante
calcul=calcul/2;
calcul=calcul*echant; //*t²
calcul=calcul*echant;
calcul=calucl+tmp*echant; // +point d'origine*t
calcul=calucl+tmp; // pour la constante, soit on la considere nulle, mais suivant ce que tu fait, on peut y remettre le point d'origine
calcul=calcul*I;
S=calcul;
cpt=0;
}
Tien mois au courant
22 mars 2010 à 19:23
merci David
en fait je suis bloqué au niveau de la programmation de l'equation du PI
j'ai meme la fonction qui me permet d'ecrire et de lire dans la memoire du pic
mais c'est juste la boucle de l'équation elle meme qui me pose probleme pouvez vous m'aidez s'il vous plait.
Merci
21 mars 2010 à 12:50
21 mars 2010 à 12:48
1er chose, il faut que tu utilise le timer, qui te permettera de definir l'echantillonage de ton regulateur.
A chaque coup de timer, tu lance l'aquisition de ton CAN.
Ensuite il faudra que tu utilise le fonction mullong et divlong (a verifier sur les nom de fonction) pour pouvoir faire tes equation.
Fais gaffe aux tailles de tes variables, car tu risque des overflows.
Ensuite tu envoi le resultat dans ton CNA.
Voila pour dégrossir.
20 mars 2010 à 17:46
j'ai besoin de programmer un correcteur PI avec un pic16F876 et je suis totalement bloqué
svp est ce que quelqu'un a un code qui pourrait m'aider à faire cela ?
Merci d'avance
13 févr. 2009 à 11:39
Cette analyse concerne un PID en parallele. S = K [E + 1/Ti |Edt + Td dE/dt)
il existe aussi un PID en parallèle S = K.E (Ti+Td)/Ti + K/Ti |Edt + K.Td dE/dt
et mixte que je ne connais pas !
22 mars 2008 à 12:06
Pour le type de fonction:
E(t)=S(t) + DS(t)/dt + D²S(t)/dt²
Qu'entends tu par D²S(t)/dt² ?
La dérivé au carré vu ta question??????
Si tu entend la derivée seconde pour D²S(t)/dt², elle est nulle dans nos cas, car:
entre t et t+1
l'équation de la pente est du genre (S1-S2)*t+S1
donc la dérivé est (S1-S2)
d'ou la derivé seconde est 0
Pour que la derivé seconde existe, il faut une équation du type at²+bt+c qui sera 2a
Voila en esperant t'avoir aidé si tu parlais de la derivée seconde .
@+
19 mars 2008 à 09:34
Je trouve ton programme excellent. Travaillant sur des process de régulations, j'ai adapté tes calcul pour modéliser des process du 1 er ordre
Fonction temporelle : E(t)=S(t)+ DS(t)/dt avec E(t) l'entreée et S(t) la sortie
Comme il n'y a pas d'intégrale c'est assez simple. Par contre, sais tu comment modéliser un système du 2 ordre?
Fonction temporelle est : E(t)=S(t) + DS(t)/dt + D²S(t)/dt²
Est qu'il suffit de faire (Err(k)-Err(k-1)/pe)² ?
Comment intégrer un retard au fonction (ex en Laplace : F(p)=e(-Tp)/(1+T1p)
Cordialement
Goguy
16 mars 2008 à 14:42
je supprimerai la V1 dans la journée, merci d'avoir répondu si vite
++
16 mars 2008 à 07:30
Mais supprimer la première fera disparaitre des explications.
Pour information : les algorithmes de la première version sont basés sur des nombres entiers; ceux de la version "V2" sont basés sur des nombres réels. Les résultats ne sont pas identiques.
Arthur
16 mars 2008 à 00:16
http://www.vbfrance.com/codes/REGULATION-SIMULATEUR-PID_28033.aspx
http://www.vbfrance.com/codes/REGULATION-SIMULATEUR-PID-V2_28142.aspx
avec ou sans PDF, puisqu'à l'époque (2004) il n'y a pas simplement eu de mise à jour de la source, merci de me dire laquelle des 2 supprimer
bonne soirée
15 mars 2008 à 23:28
La version 1 m'a un peu paumé sur certainnes chose,
Mais la le PDF est parfait.
Perso j'essaie de faire un PD position sur un moteur,
je pense que ca va m'etre bien utile.
Chapeauxxxx bas mister
14 févr. 2008 à 22:26
24 nov. 2007 à 10:18
http://www.vbfrance.com/doc/faq.aspx#vb_src
24 nov. 2007 à 10:17
10 sept. 2007 à 03:02
Quelqu'un aurait-il l'équivalent de cette source
pour Delphi ?
Je ne connais pas VB.
Merci d'avance.
13 juin 2007 à 11:00
eh oui c'est encord moi, alors voila je vue que dans ton programme tu utilise un timer mais ce que je veux savoir c'est comment tu fait pour ne pas avoir l'initialisation de tes variables(que tu utilise dans ton programme) a chaque fois que tu appel ton timer????
merci a l'avance
29 mai 2007 à 12:19
en premier je tiens a te dire bravo pour ce programme bien expliquer et surtout bien commente.mais je ne comprend pas les valeur que tu donne en premier pour les parametres du PID et surtout cette partie de code
Label_gain_propor.Caption = "01.00"
VScroll_gain_propor.Value 500 - 100 ' (coef de départ Kp 1)
Label_temps_intégra.Caption = "00.25"
VScroll_temps_integra.Value 1000 - 25 ' (coef de départ Ti 0,25 s)
Label_temps_dériv.Caption = "01.00"
VScroll_temps_dériv.Value 200 - 10 ' (coef de départ Td 1 s)
gain_proportionnel = Val(Label_gain_propor.Caption)
temps_intégrale = Val(Label_temps_intégra.Caption)
temps_dérivée = Val(Label_temps_dériv.Caption)
es ce que qq peut m'explique ca svp?
Merci a l'avance
22 nov. 2006 à 12:37
Je trouve que le développement sujet de cet article est un très bon travail qui pourra aider bien des techniciens.
Bien qu'utilisant depuis de nombreuses années des régulateurs "solid state" (HCTL1000 puis HCTL1100) principalement pour des asservissements de position, je trouve que ce code peut servir de base à tous ceux qui souhaitent construire, par exemple, un système de régulation thermique ou tout autre dispositif à relativement grande constante de temps.
Bravo, et grand merci à tous ces développeurs qui partagent leur passion.
8 juin 2006 à 23:41
SIMPSON : I(a,b)=((a+b)/6) * (f(a)+f(b)+4* f((a+b)/2))
RICHARDSON : f'(x0) = [8 * f(x0 + pas/4)- 8 * f(x0 - pas/4)+f(x0 - pas/2)-f(x0+ pas/2)] / (3*pas)
A vos claviers !!!
27 avril 2006 à 23:57
11 oct. 2005 à 11:48
Mon problème est effectivement sur le calcul de l'intégral qui nécessiterai la mémorisation glissante de trop de valeurs.
Si l'on prend la base du document PDF de la simulation du PID, il ressort que l'on ne doit mémoriser que 3 valeurs de Err en % (l'écart % consigne%? mesure % Set Point%- Process Value%)
Err à l'instant t, t(-1) et à t(-2) c'est-à-dire à t , t(-pe), t (? 2*pe)
Et si la période d'échantillonnage des valeurs est de 1 seconde : Err(t), Err(t-1s) et Err(t-2s).
Ti et Td seront en secondes aussi, S(t) la commande de sortie en % comme la consigne et la mesure.
Consigne %= 100 *(Valeur physique consigne-Mini de l'échelle physique) / (maxi-mini de l'échelle physique)
Mesure %= 100 * (Valeur physique mesure-Mini de l'échelle physique) / (maxi-mini de l'échelle physique)
Ce qui nous amènerai à :
b0= Kp*(1+Td/1)
b1=Kp*(-1+1/Ti-2*Td/1)
b2=Kp * Td/1
et donc la commande de Sortie en % =
S(t)=S(t-1) + b0 * Err(t) + b1 * Err(t-1) + b2 * Err(t-2)
Plus basiquement :
Kp=1 ' à régler a votre convenance
Ti=60 ' à régler a votre convenance en s
Td=0 ' à régler a votre convenance en s
Err2=Err1
Err1=Err0
Consigne = (conversion en % de la valeur physique) 'en %
Mesure = (conversion en % de la valeur physique) 'en %
pe=1 ' en sec ou t - t(-1) si calcul de la fréquence d'échantillonnage
Err0= Consigne - mesure 'en %
b0=Kp*(1+Td/pe)
b1=Kp*(-1+pe/Ti-2*Td/pe)
b2=Kp * Td/pe
S=S+ b0 * Err0 + b1 * Err1 + b2 * Err2 'en %
Je l'ai testé directement dans Excel dans les cellules en calcul itératif (un pas = une seconde) Cela a l'air de fonctionner !
18 juil. 2005 à 10:58
3 juil. 2005 à 13:48
J'aurai voulu m'inspirer de ta logique et de ton raisonnement.
Mais apparement ton code comporte un certain nombre de lignes pour l'interface graphique... comment est-ce que je peux faire pour discerner ca du code pur de régulation...
14 juin 2005 à 12:06
Je voudrai aussi savoir s'il y a un contrôle qui peut me permettre de tracer des courbes avec des valeurs données dans un tableau.
12 déc. 2004 à 11:39
Ton pdf explique tres bien je le conçois, les lois sur ce sujet, mais à part cela, explique nous ou ton l'algorithme du PID est conçu en code vb.
Sinon c'est pas mal pour ceux qui sont passionnés par ce sujet.
Nisand-Systems