Modelism - RHC Forum: Care este rolul si cum functioneaza un PID control? - Modelism - RHC Forum

Salt la continut

  • 3 Pagini +
  • 1
  • 2
  • 3

Care este rolul si cum functioneaza un PID control?

#1 Useril este offline   moro696 

  • Membru
  • PipPipPipPip
  • Grup: Members
  • Postari: 163
  • Inregistrat: 01-January 15
  • Gender:Male
  • Location:Timisoara

Postat 11 January 2015 - 07:18 PM

Va salut,

Am vazut in robotica folosirea asa numitelor PID controlere.
Fiind incepator in domeniul asta, mai ales ca m-am incapatanat sa-mi fac softul de la zero, va intreb pe dumneavoastra:

Care este rolul unui pid controler? filtreaza semnalul?

Il stabilizeaza ca si raspuns dinamic? Adica acolo unde semnalul variaza foarte repede in limite mici, adica un fel de filtru?

Daca sa ii pun Setpoint de 100 sa zicem, cam ce output ar trebui sa am cu KP 1, KI si KD 0 amandoua?

Va intreb pentru ca m-am apucat sa fac un pid control cu Control al saturatiei (wind guard)

Fiind familiar cu limbajul C, asa arata codul meu.


/// FUNCTIA PID

    float error;
    float dTerm,dTerm1,dTerm2;
    float dSum;
    float iTerm;
    float lastState;

float myPid(float SetPoint, float FeedbackIn, float deltaT, float windguard  ){

float Kp=1;
float Ki=0;
float Kd=0;
      
      
  error = SetPoint - FeedbackIn;
  iTerm += error * deltaT;


if (iTerm < -windguard ) return -windguard;
	else if(iTerm>windguard ) return windguard;
	else return iTerm ;



    dTerm = (FeedbackIn - lastState) / deltaT;
    lastState = FeedbackIn;
    
    dSum =  dTerm+dTerm1 + dTerm2;
    dTerm2 = dTerm1;
    dTerm1 = dTerm;
  

   return(Kp*error)+(Ki*iTerm)-(Kd*dSum); 
  
  
}



//PROGRAMUL PRINCIPAL

int main(void){ 
  

char pidtxt[10];


float cucu;

while(1){

// Setpoint este 1.4, Input 1.4 , Windguard 2.5, Integrarea dt este 100hz, 0.01secunde

cucu=myPid(1.4,1.4,0.01,2.5); 
sprintf(pidtxt,"%f",cucu);

    }
}


Din cate am citit pe net, de exemplu cu Kp =1 , I si D zero, atunci pid-ul nu face absolut nimic, este bypased.

De ce imi returneaza zero? Nu ar trebui sa arate 1.4, adica cat ii dau in Setpoint?
0

#2 Useril este offline   mihalyn90 

  • Membru de onoare
  • PipPipPipPipPipPip
  • Grup: Members
  • Postari: 617
  • Inregistrat: 19-December 13
  • Gender:Male
  • Location:Oradea
  • Interests:RC Car, Robotics, Reading, Music

Postat 11 January 2015 - 07:36 PM

Ciao,

Sunt prea obosit sa iti dau explicatii super sofisticate si sa iti tin teorie un an de zile...

la un robot care urmareste o linie... tu vei folosi doar PD, rareori PID.

P iti regleaza overshoot-ul,
D iti regleaza corectarea overshoot-ului
I este eroarea in timp... tu nu ai nevoie de asa ceva.


Uite un grafic sa intelegi:
http://upload.wikimedia.org/wikipedia/commons/a/a3/PID_varyingP.jpg

albastru este linia ce robotul trebuie sa il urmareasca, ca sa fie perfect, vei avea nevoie de alte info, precum distanta dintre robot la curba etc sa ai o decelerare buna pana la curba, si faci o intoarcere pe loc... ma rog sa revenim aici la ceva banal.
Deci ai linia albastra... Daca tie P este prea mare... robotul tau va oscila precum linia mov.
Daca este prea mic, va avea o traiectorie ca cea rosie, in cazul cel mai bun, sau pur si simplu pleaca de pe pista...
Daca ai P si D reglat corect, vei avea o traiectorie precum cea verde.. :)

Ideea PID-ului, ca la viteze mari, unde simple if-uri nu iti mai pot atenua overshooturile... ai nevoie de un PID care reactioneaza rapid si in cazul overreactului sa stabilizeze contra...
Tu daca mergi pe if-uri, sigur nu vei putea lua curba cum trebuie...

In cazul asta P este prea mare, D prea mic.

https://www.youtube....h?v=nEbxmQD3Y-4

Acuma unul cu PID reglat bine :) si cu tunel EDF desigur pentru aderenta:
https://www.youtube....h?v=cvkveIf2o9g


Sper ca te-am lamurit...
Imagine postata
0

#3 Useril este offline   mihalyn90 

  • Membru de onoare
  • PipPipPipPipPipPip
  • Grup: Members
  • Postari: 617
  • Inregistrat: 19-December 13
  • Gender:Male
  • Location:Oradea
  • Interests:RC Car, Robotics, Reading, Music

Postat 11 January 2015 - 07:40 PM

apropo...

in log de float... incerca te rog:
int32_t
Imagine postata
0

#4 Useril este offline   t_alex92 

  • Junior
  • PipPipPip
  • Grup: Members
  • Postari: 54
  • Inregistrat: 27-December 14
  • Gender:Male
  • Location:Targu Mures

Postat 11 January 2015 - 07:42 PM

Vezi postareamoro696, la 11 January 2015 - 07:18 PM, a spus:

Va salut,

Am vazut in robotica folosirea asa numitelor PID controlere.
Fiind incepator in domeniul asta, mai ales ca m-am incapatanat sa-mi fac softul de la zero, va intreb pe dumneavoastra:

Care este rolul unui pid controler? filtreaza semnalul?

Il stabilizeaza ca si raspuns dinamic? Adica acolo unde semnalul variaza foarte repede in limite mici, adica un fel de filtru?

Daca sa ii pun Setpoint de 100 sa zicem, cam ce output ar trebui sa am cu KP 1, KI si KD 0 amandoua?

Va intreb pentru ca m-am apucat sa fac un pid control cu Control al saturatiei (wind guard)

Fiind familiar cu limbajul C, asa arata codul meu.


/// FUNCTIA PID

    float error;
    float dTerm,dTerm1,dTerm2;
    float dSum;
    float iTerm;
    float lastState;

float myPid(float SetPoint, float FeedbackIn, float deltaT, float windguard  ){

float Kp=1;
float Ki=0;
float Kd=0;
      
      
  error = SetPoint - FeedbackIn;
  iTerm += error * deltaT;


if (iTerm < -windguard ) return -windguard;
	else if(iTerm>windguard ) return windguard;
	else return iTerm ;



    dTerm = (FeedbackIn - lastState) / deltaT;
    lastState = FeedbackIn;
    
    dSum =  dTerm+dTerm1 + dTerm2;
    dTerm2 = dTerm1;
    dTerm1 = dTerm;
  

   return(Kp*error)+(Ki*iTerm)-(Kd*dSum); 
  
  
}



//PROGRAMUL PRINCIPAL

int main(void){ 
  

char pidtxt[10];


float cucu;

while(1){

// Setpoint este 1.4, Input 1.4 , Windguard 2.5, Integrarea dt este 100hz, 0.01secunde

cucu=myPid(1.4,1.4,0.01,2.5); 
sprintf(pidtxt,"%f",cucu);

    }
}


Din cate am citit pe net, de exemplu cu Kp =1 , I si D zero, atunci pid-ul nu face absolut nimic, este bypased.

De ce imi returneaza zero? Nu ar trebui sa arate 1.4, adica cat ii dau in Setpoint?

Este un regulator PID (Proportional Integrator Dervivator). Rolul lor este de a genera semnal de comanda unui element de executie care poate fi o valva proportionala, punte cu tiristoare, motoare etc. Este defapt un bloc foarte important dintr-o schema SRA (sistem de reglare automat).Ca si semnal de intrare primeste semnalul de eroare venit de la comparator(alt bloc din SRA). Acest comparator face diferenta dintre referinta(set point) si iesire(de obicei notata cu Y). Pe scurt cu ajutorul lor se pot regla procese cum ar fi temperatura, nivel, presiune,presiune etc.Daca cauti pe internet scheme SRA vei vedea la ce ma refer. Am spus totul foarte pe scurt si foarte vag... daca vrei detalii pot sa-ti dau si detalii pentru ca la facultatea de Automatica asta studiez.

Aceasta postare a fost editata de t_alex92: 11 January 2015 - 07:46 PM

0

#5 Useril este offline   t_alex92 

  • Junior
  • PipPipPip
  • Grup: Members
  • Postari: 54
  • Inregistrat: 27-December 14
  • Gender:Male
  • Location:Targu Mures

Postat 11 January 2015 - 07:54 PM

Am uitat sa precizez. Daca pui K=1, I=0 si D=0 inseamna ca ai doar un regulator proportional cu un factor de amplificare kp.uite un link poate te ajuta sa intelegi mai bine: Linkul meu
0

#6 Useril este offline   renatoa 

  • Sky Sapiens
  • PipPipPipPipPipPipPip
  • Grup: Members
  • Postari: 19176
  • Inregistrat: 28-April 05
  • Gender:Male

Postat 11 January 2015 - 07:59 PM

Inteleg dorinta de a invata, dar nu inteleg de ce nu studiati chestiile considerate clasice in domeniul asta... mai precis APM-ul ? :unsure:
... cu picioarele pe pamant ...
0

#7 Useril este offline   moro696 

  • Membru
  • PipPipPipPip
  • Grup: Members
  • Postari: 163
  • Inregistrat: 01-January 15
  • Gender:Male
  • Location:Timisoara

Postat 12 January 2015 - 12:06 AM

Pe mine ma interesa in mare parte, sa luam cazul ideal.

PID vreau sa folosesc la un multirotor (quad), de exemplu orientarea pe axele X,y,z.
Fiecare axa am vazut ca are pid-ul sau.

Acum mie ce imi este neclar... Sa zicem ca la PID semnalul de referinta imi vine din IMU (axa X de exemplu) si intra in PID, pentru P=1, I si D=0, cam ce ar trebui sa astept la output?

Banuiesc ca mecanismul este urmatorul.

Masor axa X, apoi valoarea este pusa ca SetPoint/Referinta in PID, si feedback iau tot prin citirea a doua de pe axa x?

In cazul ideeal daca am 100 referinta in PID, Kp=1, cam ce ar trebui sa am la iesire din PID, tot 100? Asta e marea mea dilema.

Citeaza

Inteleg dorinta de a invata, dar nu inteleg de ce nu studiati chestiile considerate clasice in domeniul asta... mai precis APM-ul ?
- am petrecut aproape jumatate de an studiind filtre kalman si algebra cu quaternioni pana sa-i dau de cap sistemului de orientare.
Degeaba vad sute de linii de cod, daca nu incerc principiul sa il inteleg:P

Va multumesc pentru explicati tuturor.

Aceasta postare a fost editata de moro696: 12 January 2015 - 12:09 AM

0

#8 Useril este offline   hash84 

  • DreamTeam member
  • PipPipPipPipPipPipPip
  • Grup: Members
  • Postari: 2183
  • Inregistrat: 28-November 06
  • Gender:Male
  • Location:Bucuresti

Postat 12 January 2015 - 02:53 PM

Vezi postareamoro696, la 11 January 2015 - 07:18 PM, a spus:

Care este rolul unui pid controler?


Vezi postareamoro696, la 12 January 2015 - 12:06 AM, a spus:

Degeaba vad sute de linii de cod, daca nu incerc principiul sa il inteleg:P


rolul unui controller PID este de a genera un semnal care controleaza un sistem conform unor specificatii.
in cazul tau, un quadrocopter.
Luam de exemplu doar axa X.
Dorim sa tinem quadul la orizontala.
Axa X, cand quadul este la orizontala , sa spunem ca are valoare 0.
Setpointul, pentru noi este 0 (valoarea la orizontala). vrem mereu sa tinem quadul la orizontala.
Trebuie sa comandam motoarele astfel incat axa x sa aibe mereu valoarea 0.
semnalul (comanda) catre motoare, se genereaza folosind acest algoritm PID.
Semnalul are trei componente : proportionala, integrativa, derivativa.
in functie de comportamentul sistemului, vei avea nevoie doar de 1 componenta, de doua, sau toate 3.
ai un pic de citit, inainte de a te apuca sa scrii cod.
http://en.wikipedia..../PID_controller
PS: vezi ca gasesti sursele de la arduino PID care sunt foarte ok explicate
http://brettbeaurega...d-introduction/
    /------------------------\              |~~\_____/~~\__  |
    |        Hash84          |______________ \______====== )-+
    |                        |                      ~~~|/~~  |
    \------------------------/                         ()
0

#9 Useril este offline   moro696 

  • Membru
  • PipPipPipPip
  • Grup: Members
  • Postari: 163
  • Inregistrat: 01-January 15
  • Gender:Male
  • Location:Timisoara

Postat 12 January 2015 - 03:25 PM

Sa inteleg ca ouputul ca si valoare in unitate de masura este diferit de ouput? ( Asta era marea mea dilema, intra sa zicem 100grade si semnalul care iasa tot in grade este exprimat?) sau este doar un semnal de control

Adica atunci cand deviatia (eroarea) este mare fata de setpoint, ouput-ul acestuia creste proportional, respectiv creste factorul de compensare?

Daca este asa, atunci s-ar explica dece eu cu un setpoint de 1.4 si un input fix de 1.4, pe output aveam 0? cu KP=1 iar Ki si Kd puse pe 0
0

#10 Useril este offline   moro696 

  • Membru
  • PipPipPipPip
  • Grup: Members
  • Postari: 163
  • Inregistrat: 01-January 15
  • Gender:Male
  • Location:Timisoara

Postat 12 January 2015 - 03:34 PM

Eeee si practic eu cu P,I, si D reglez sa zic asa raspunsul prin compensare (ouput) la deviatia fata de setpoint? Si aici intervine curba aceea de raspuns ?
Va rog sa ma corectati daca am inteles gresit, oricum ma voi pune sa citesc mai multe , insa pana acum cam ce am scris mai sus am dedus...

Sa zicem ca am o referinta de 100 grade ( Setpoint) , iar Input vine de la un senzor de temperatura.
Pid-ul compara referinta cu inputul, si de aici el calculeaza erroarea.
Cu cat diferenta intre input si referinta este mai mare, cu atat creste semnalul de eroare, respectiv creste outputul...
In cazul ideeal cand Input este egal cu Setpoint, practic eroarea imi este 0, si pid-ul nu compenseaza cu nimic (ouput 0)

Va rog sa ma corectati daca am inteles gresit, oricum ma voi pune sa citesc mai multe , insa pana acum cam ce am scris mai sus am dedus...
0

#11 Useril este offline   renatoa 

  • Sky Sapiens
  • PipPipPipPipPipPipPip
  • Grup: Members
  • Postari: 19176
  • Inregistrat: 28-April 05
  • Gender:Male

Postat 12 January 2015 - 03:42 PM

Uite inca o lectura... din seria aia care la noi s-a tradus "pentru to()ti" :)

http://www.csimn.com...forDummies.html
... cu picioarele pe pamant ...
0

#12 Useril este offline   hash84 

  • DreamTeam member
  • PipPipPipPipPipPipPip
  • Grup: Members
  • Postari: 2183
  • Inregistrat: 28-November 06
  • Gender:Male
  • Location:Bucuresti

Postat 12 January 2015 - 04:22 PM

Vezi postareamoro696, la 12 January 2015 - 03:25 PM, a spus:

Sa inteleg ca ouputul ca si valoare in unitate de masura este diferit de ouput? ( Asta era marea mea dilema, intra sa zicem 100grade si semnalul care iasa tot in grade este exprimat?) sau este doar un semnal de control

offff tinerete si graba...pune mana si citeste !
input si output trebuie sa aibe aceeasi unitate de masura.
in principiu se normalizeaza marimile pe o scara de 0-100%.
ex: ai un cazan cu temperatura de proces intre 0-200 grade. temperatura de 100 grade va fi transformata in 50%.
cazanul este incalzit de o flacara comandata de o vana pe care o vei comanda sa se deschida/inchida intre 0-100%.

Vezi postareamoro696, la 12 January 2015 - 03:34 PM, a spus:

Eeee si practic eu cu P,I, si D reglez sa zic asa raspunsul prin compensare (ouput) la deviatia fata de setpoint? Si aici intervine curba aceea de raspuns ?

da

Vezi postareamoro696, la 12 January 2015 - 03:34 PM, a spus:

Sa zicem ca am o referinta de 100 grade ( Setpoint) , iar Input vine de la un senzor de temperatura.
Pid-ul compara referinta cu inputul, si de aici el calculeaza erroarea.

corect

Vezi postareamoro696, la 12 January 2015 - 03:34 PM, a spus:

Cu cat diferenta intre input si referinta este mai mare, cu atat creste semnalul de eroare, respectiv creste outputul...

partial corect. sunt sisteme unde eroare si outputul sunt invers proportionale. ex : nivelul intr-un bazin constant. poti controla doar golirea bazinului. daca nivelul de referinta este peste nivelul actual in bazin (adica vrei mult mai multa apa in bazin), o sa inchizi golirea bazinului ca sa strangi apa, nu o sa dai drumul mai tare

Vezi postareamoro696, la 12 January 2015 - 03:34 PM, a spus:

In cazul ideeal cand Input este egal cu Setpoint, practic eroarea imi este 0, si pid-ul nu compenseaza cu nimic (ouput 0)

partial corect. depinde de sistem. sa luam exemplul tau. ai butoiul cu boasca la fiert ca sa faci tuicomicina. sa zicem ca trebuie sa mentii temperatura la 65 grade. ca sa mentii aceasta temperatura, trebuie un pic de flacara la cazan ca altfel se raceste, nu o poti opri de tot (output 0). trebuie sa ai un output care sa mentina flacara la un anumit nivel, care mentine temperatura cazanului la 65 grade. Acest nivel tot PID ti-l calculeaza, componenta I. CITESTE CITESTE CITESTE ;)

Aceasta postare a fost editata de hash84: 12 January 2015 - 04:26 PM

    /------------------------\              |~~\_____/~~\__  |
    |        Hash84          |______________ \______====== )-+
    |                        |                      ~~~|/~~  |
    \------------------------/                         ()
0

#13 Useril este offline   moro696 

  • Membru
  • PipPipPipPip
  • Grup: Members
  • Postari: 163
  • Inregistrat: 01-January 15
  • Gender:Male
  • Location:Timisoara

Postat 12 January 2015 - 04:23 PM

Ahaaaaa deci functioneaza ceva similar cu amplificatorul operational, ala macar stiu cum functioneaza :))

Va multumesc .

O sa revin pe aici cu eventuale intrebari, o sa incerc sa imi adaptez placa de dezvoltare in matlab sa fac un pid plotting...
0

#14 Useril este offline   hash84 

  • DreamTeam member
  • PipPipPipPipPipPipPip
  • Grup: Members
  • Postari: 2183
  • Inregistrat: 28-November 06
  • Gender:Male
  • Location:Bucuresti

Postat 12 January 2015 - 04:28 PM

Vezi postareamoro696, la 12 January 2015 - 04:23 PM, a spus:

Ahaaaaa deci functioneaza ceva similar cu amplificatorul operational, ala macar stiu cum functioneaza :))

pai tot cam aia e, si kp, ki, kd sunt rezistentele aferente ;)
da ce vrei sa faci mai exact ?
    /------------------------\              |~~\_____/~~\__  |
    |        Hash84          |______________ \______====== )-+
    |                        |                      ~~~|/~~  |
    \------------------------/                         ()
0

#15 Useril este offline   renatoa 

  • Sky Sapiens
  • PipPipPipPipPipPipPip
  • Grup: Members
  • Postari: 19176
  • Inregistrat: 28-April 05
  • Gender:Male

Postat 12 January 2015 - 04:29 PM

Vezi postareahash84, la 12 January 2015 - 04:22 PM, a spus:

...sa luam exemplul tau. ai butoiul cu boasca la fiert ca sa faci tuicomicina. sa zicem ca trebuie sa mentii temperatura la 65 grade. ca sa mentii aceasta temperatura, trebuie un pic de flacara la cazan ca altfel se raceste, nu o poti opri de tot (output 0). trebuie sa ai un output care sa mentina flacara la un anumit nivel, care mentine temperatura cazanului la 65 grade...


Te-ai demascat !!! metanolul te intereseaza, nu zama de pruna !!! :D

Ca ala are fierbere la 64.7 °C, etilicu are 78.37 °C . Deci asa faci compustibil gratis... :D
... cu picioarele pe pamant ...
0

#16 Useril este offline   renatoa 

  • Sky Sapiens
  • PipPipPipPipPipPipPip
  • Grup: Members
  • Postari: 19176
  • Inregistrat: 28-April 05
  • Gender:Male

Postat 12 January 2015 - 04:39 PM

Vezi postareahash84, la 12 January 2015 - 04:28 PM, a spus:

pai tot cam aia e, si kp, ki, kd sunt rezistentele aferente ;)
da ce vrei sa faci mai exact ?


Rezistente numai pentru P, pentru I si D este si un condensator...

https://www.gully.org/~mackys/lj/opamp-pid.png
... cu picioarele pe pamant ...
0

#17 Useril este offline   vlad1 

  • MEGA Membru
  • PipPipPipPipPipPipPip
  • Grup: Members
  • Postari: 2652
  • Inregistrat: 02-December 02
  • Gender:Male
  • Location:Oradea

Postat 12 January 2015 - 04:54 PM

O soluie profesionala ar fi :

http://www.tehnoelec..._de_temperatura si
http://www.tehnoelec..._de_temperatura
0

#18 Useril este offline   moro696 

  • Membru
  • PipPipPipPip
  • Grup: Members
  • Postari: 163
  • Inregistrat: 01-January 15
  • Gender:Male
  • Location:Timisoara

Postat 12 January 2015 - 05:10 PM

Vezi postareahash84, la 12 January 2015 - 04:28 PM, a spus:

da ce vrei sa faci mai exact ?


PID controlul pt axele ce imi vin din IMU, atittude roll, pitch si yaw. Am vazut pe google ceva blocuri/diagrame cu intercalarea pid-urilor in montaj. Deocamdata astept sa imi vina motoarele (emax cf2822), elicile ( elici de 10" x4.5) si niste esc-uri cu simonk de 30A.

Dupa ce imi vin jucariile, pana atunci sper sa pun la punct softeala pt pid control, si apoi urmeaza sa suspend cadrul cu motoarele in functiune si sa fac tuning "pe masasa", n-as vrea sa zboare drona la vecinul in curte sa-i omoare pisica :ph34r:
0

#19 Useril este offline   moro696 

  • Membru
  • PipPipPipPip
  • Grup: Members
  • Postari: 163
  • Inregistrat: 01-January 15
  • Gender:Male
  • Location:Timisoara

Postat 12 January 2015 - 09:01 PM

Va salut, m-am apucat de simulat in matlab, am o oarecare nelamurire.

Cand calibrez, sau mai bine zis, cand testez curba de raspuns a pid-ului, aceasta se face cu un INPUT fix ?
0

#20 Useril este offline   hash84 

  • DreamTeam member
  • PipPipPipPipPipPipPip
  • Grup: Members
  • Postari: 2183
  • Inregistrat: 28-November 06
  • Gender:Male
  • Location:Bucuresti

Postat 13 January 2015 - 08:28 AM

Vezi postareamoro696, la 12 January 2015 - 09:01 PM, a spus:

Va salut, m-am apucat de simulat in matlab, am o oarecare nelamurire.

Cand calibrez, sau mai bine zis, cand testez curba de raspuns a pid-ului, aceasta se face cu un INPUT fix ?

buna intrebare :)
input ai setpoit(care e fix), si valoarea marimii pe care vrei sa o controlezi, in cazul tau deviatia de la orizontala, care variaza. am facut in matlab, o groaza de simulari, dar acum 5 ani. sincer nu mai retin ce si cum....dar uite aici ceva folositor : http://www.mathworks...disc_rw_cts_bod
    /------------------------\              |~~\_____/~~\__  |
    |        Hash84          |______________ \______====== )-+
    |                        |                      ~~~|/~~  |
    \------------------------/                         ()
0

#21 Useril este offline   Cirip 

  • Membru de onoare
  • PipPipPipPipPipPip
  • Grup: Members
  • Postari: 732
  • Inregistrat: 07-January 05

Postat 14 January 2015 - 09:18 AM

Va salut,

Interesant topicul despre PID si as vrea sa va povestesc si eu ceva.

Acordul PIDului se face pe saltul treapta al referintei, respectiv al erorii. Se porneste cu Ki=Kd=zero si se mareste treptat Kp pana cand iesirea are tendinta sa oscileze. Apoi se reduce putin Kp a.i. sa nu mai oscileze, dar se va constata ca eroarea de regim permanent nu este zero. In acest moment se incepe cresterea progresiva a lui Ki urmarind simultan atingerea cat mai rapida a valorii de referinta, fara tendinta de oscilatie. Ki introduce un pol in origine in functia de transfer, ceea ce conform teoremei valorii finale a transformatei Laplace, conduce la eroare zero cand t tinde la infinit. In realitate eroarea e f aproape de zero mult mai repede.

Implementarea PIDului digital se face fara "if-uri". Ceea ce trebuie facut este determinarea unei ecuatii recursive cu diferente finite care se evalueaza la fiecare perioada de esantionare. If-urile ar putea sa apara doar pentru limitarea iesirii, dar nu ptr calculul propriu zis.

Matematic, controlorul PID si elementul de executie formeaza un sistem cu reactie. Daca s-ar cunoaste transformatele Laplace individuale, s-ar putea determina functia combinata si verifica absenta polilor in semiplanul drept (stabilitatea). Cum asa ceva nu e posibil, se recurge la metodologia de acord descrisa mai sus. Interesant e ca un PID corect acordat poate sa transforme un sistem instabil intr-unul stabil. Exemplu: pendulul inversat. Exista o aplicatie de la Microcip pe tema asta.

Acum 12 ani am facut un PID pentru un termostat de facut bors. Merge si azi. Marimea de intrare este diferenta dintre temperatura masurata si cea setata, iar iesirea este o intarziere in timp cu care fac comanda in faza a triacului de alimentare a rezistentelor de incalzire. Totul a fost implementat in asamblare pe un PIC16C63. Esantionarea se face la 1 secunda, deci e timp destul de calcul ptr picul la 4MHz :-)

Spor la desepit!
Teorie este atunci cand stii totul, dar nu merge nimic.
Practica este cand toate merg, dar nu stii de ce.
Montajele mele imbina teoria cu practica: nu merge nimic si nu stiu de ce.
0

#22 Useril este offline   renatoa 

  • Sky Sapiens
  • PipPipPipPipPipPipPip
  • Grup: Members
  • Postari: 19176
  • Inregistrat: 28-April 05
  • Gender:Male

Postat 14 January 2015 - 10:51 AM

La un multicopter in faza a doua umblam la D, nu la I.
La I umblam doar in circumstante nelegate de oscilatii.
... cu picioarele pe pamant ...
0

#23 Useril este offline   hash84 

  • DreamTeam member
  • PipPipPipPipPipPipPip
  • Grup: Members
  • Postari: 2183
  • Inregistrat: 28-November 06
  • Gender:Male
  • Location:Bucuresti

Postat 14 January 2015 - 01:46 PM

Vezi postarearenatoa, la 14 January 2015 - 10:51 AM, a spus:

La un multicopter in faza a doua umblam la D, nu la I.
La I umblam doar in circumstante nelegate de oscilatii.

eu fac ca Cirip :p.
e Ziegler-Nichols clasic

Aceasta postare a fost editata de hash84: 14 January 2015 - 01:46 PM

    /------------------------\              |~~\_____/~~\__  |
    |        Hash84          |______________ \______====== )-+
    |                        |                      ~~~|/~~  |
    \------------------------/                         ()
0

#24 Useril este offline   renatoa 

  • Sky Sapiens
  • PipPipPipPipPipPipPip
  • Grup: Members
  • Postari: 19176
  • Inregistrat: 28-April 05
  • Gender:Male

Postat 14 January 2015 - 01:55 PM

Si, mai precis, ce urmaresti prin reglarea I-ului ?
Si vrei sa zici ca zbori cu D zero ?! Sau ca nu umblii la el, pentru ca default este un pic mai mare ca zero ;)
... cu picioarele pe pamant ...
0

#25 Useril este offline   hash84 

  • DreamTeam member
  • PipPipPipPipPipPipPip
  • Grup: Members
  • Postari: 2183
  • Inregistrat: 28-November 06
  • Gender:Male
  • Location:Bucuresti

Postat 14 January 2015 - 02:30 PM

Vezi postarearenatoa, la 14 January 2015 - 01:55 PM, a spus:

Si vrei sa zici ca zbori cu D zero ?!

fix asa. D=0
am doar K si I. valorile le dau diseara
    /------------------------\              |~~\_____/~~\__  |
    |        Hash84          |______________ \______====== )-+
    |                        |                      ~~~|/~~  |
    \------------------------/                         ()
0

#26 Useril este offline   moro696 

  • Membru
  • PipPipPipPip
  • Grup: Members
  • Postari: 163
  • Inregistrat: 01-January 15
  • Gender:Male
  • Location:Timisoara

Postat 19 January 2015 - 07:49 AM

Va salut, am revenit sa zic asa cu vesti ceva mai bune.

Intampin o mica problema in simularea pid-ului pe microcontrolerul meu, poate unii dintre voi ati mai patit ceva similar.


Pana imi vin motoarele si toate cele... am zis sa incerc o simulare in matlab cu pid-ul ruland direct pe microcontroler citind un simpul ADC cuplat la potentiometru ( valorile variaza de la 0 la 4 ), cu potentiometrul pe idle am aprox 2.3 volti desi conversia este oarecum la plezneala, am vrut doar niste valori pt input la pid.


Nasolia consta in faptul ca nu vad acel spike pe output-ul pid-ului in matlab, cu setpoint pe 2, cand rotesc potentiometrul la 0, ouputul pid-ului imi creste la 2.0 cat e normal ( eroarea este full = 2 - 0 )



rulez urmatorul cod pe microcontroler, am atasat si graficul cu datele de pe serial ( linia albastra este valoarea curenta a potentiometrului, iar linia rosie este ouput-ul pid-ului)

int main(void){
   
SystemInit();
cycleCounterInit(); 
SysTick_Config(SystemCoreClock / 1000);
lcd_init();
init_leds();
serial_init();
 
 
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
 
  ADC_CommonInitTypeDef ADC_CommonInitStructure;
  ADC_InitTypeDef ADC_InitStructure;
  
  /* ADC Common Init */
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  ADC_CommonInit(&ADC_CommonInitStructure);
  
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 1 Channel
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // Conversions Triggered
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; // Manual
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_TRGO;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfConversion = 1;
  ADC_Init(ADC1, &ADC_InitStructure);
  
  /* ADC1 regular channel 11 configuration */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_144Cycles); // PC1
  
  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);
 
 
 
char adctxt[10];
char pidtxt[10];
float Kp=1;
float Ki=0;
float Kd=0;
 
float windupGuard=2;
float SetPoint=2.0;
float input=0;
float error=0;
float output=0;
float current_time=0;
float last_time=0;
float deltaT=0;
float integral=0;
float derivative=0;
float prevErr=0;
 
 
while(1){
 
loop_20hz(){    // a 20hz interrupt every 20000 us systick count
 
 
ADC_SoftwareStartConv(ADC1);
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
float   bbb = ADC_GetConversionValue(ADC1);
           bbb=bbb*5/4096;
 
 
 
input=bbb;
current_time = micros(); // returns curent time from systick in uS
deltaT = (current_time - last_time)/1000000.0;
error=SetPoint-input;
integral=constrain((integral+error*deltaT),0,windupGuard);
derivative = (input-prevErr)/deltaT;
output =(Kp*error)+(Ki*integral)+(Kd*derivative);
prevErr =input;
last_time = micros(); // returns curent time from systick in uS
 
if(output<0){ output=0; }
 
sprintf(txtadc,"%0.1f",input);
sprintf(pidtxt,"%0.1f",output);
 
USART_Puts(txtadc); // send to matlab curent adc value
USART_Puts("@");   
USART_Puts(pidtxt); // sends to matlab curent pid output
USART_Puts("\r\n"); // sends the terminator chars
  
}}
}


http://s9.postimg.org/mt8y0p1p7/pid_stm32.jpg

aici am atasat si codul matlab cu care am facut testele
clc
clear all
if ~isempty(instrfind)
    fclose(instrfind);
    delete(instrfind);
end
close all
clc
disp('Serial Port Closed') 
clear
clc
 
%User Defined Properties
serialPort = 'COM7';            % define COM port #

plotTitle = 'Serial Data Log';  % plot title
xLabel = 'Elapsed Time (s)';    % x-axis label
yLabel = 'Data';                % y-axis label
plotGrid = 'on';                % 'off' to turn off grid
min =0;                     % set y-min
max = 3;                      % set y-max
scrollWidth = 5;               % display period in plot, plot entire data log if <= 0
delay = .01;                    % make sure sample faster than resolution
 
%Define Function Variables
time = 0;
data = 0;
count = 0;
bdata = 0;
btime = 0;

%Set up Plot
plotGraph = plot(time,data,'b');
             
title(plotTitle,'FontSize',25);
xlabel(xLabel,'FontSize',15);
ylabel(yLabel,'FontSize',15);
axis([0 10 min max]);
grid(plotGrid);
 
%Open Serial COM Port
s = serial(serialPort)
set(s,'DataBits',8);
set(s,'StopBits',1);
set(s,'BaudRate',9600 );
set(s,'Parity','none');

disp('Close Plot to End Session');
fopen(s);

tic
  



Setpoint=1;
Kp=2;
Ki=3;
Kd=0;
lastt=0;
dsum=0;
ddt=0.03
err=0;
itt=0;
dtr1=0;
dtr2=0;

while ishandle(plotGraph) %Loop when Plot is Active
    zz=fscanf(s);
    uu=regexp(zz,'@', 'split');
    dat =sscanf(uu{1},'%f');
    bdat =sscanf(uu{2},'%f');
    
    
 
  
    if(~isempty(dat) && isfloat(dat)&& isfloat(bdat)) %Make sure Data Type is Correct       
        count = count + 1;   
        time(count) = toc;    %Extract Elapsed Time
        data(count) = dat(1); %Extract 1st Data Element        
        bdata(count) = bdat(1);
        
    
      set(plotGraph,'XData',time(time > time(count)-scrollWidth),'YData',data(time > time(count)-scrollWidth));hold on
        btime=time;
     
        plot(btime,bdata,'r');hold off
        
       axis([time(count)-scrollWidth time(count) min max]);
        else
       set(bplotGraph,'XData',time,'YData',bdata);
       axis([0 time(count) min max]);
 
    end    
      
    drawnow;
end
 
%Close Serial COM Port and Delete useless Variables
fclose(s);
clear count dat delay max min plotGraph plotGrid plotTitle s ...
        scrollWidth serialPort xLabel yLabel;
 
 
disp('Session Terminated...');




Mai jos am pus si o poza cu simulare doar in matlab unde se vede destul de clar acel spike pe frontul crescator

http://s4.postimg.org/hrwqch6t5/PID_IMAGE.jpg


Sa fac eu prea rapid conversia pe microcontroler pana s-o vad in matlab?
0

#27 Useril este offline   hash84 

  • DreamTeam member
  • PipPipPipPipPipPipPip
  • Grup: Members
  • Postari: 2183
  • Inregistrat: 28-November 06
  • Gender:Male
  • Location:Bucuresti

Postat 24 January 2015 - 09:20 AM

de unde ai luat functia de transfer a "fabricii" in matlab ?
    /------------------------\              |~~\_____/~~\__  |
    |        Hash84          |______________ \______====== )-+
    |                        |                      ~~~|/~~  |
    \------------------------/                         ()
0

#28 Useril este offline   hash84 

  • DreamTeam member
  • PipPipPipPipPipPipPip
  • Grup: Members
  • Postari: 2183
  • Inregistrat: 28-November 06
  • Gender:Male
  • Location:Bucuresti

Postat 24 January 2015 - 09:40 AM

CITESTE CITESTE CITESTE!
e cumva proiect de diploma ?

https://www.google.r...on%20quadcopter

http://andrew.gibian...d%20Control.pdf
    /------------------------\              |~~\_____/~~\__  |
    |        Hash84          |______________ \______====== )-+
    |                        |                      ~~~|/~~  |
    \------------------------/                         ()
0

#29 Useril este offline   hash84 

  • DreamTeam member
  • PipPipPipPipPipPipPip
  • Grup: Members
  • Postari: 2183
  • Inregistrat: 28-November 06
  • Gender:Male
  • Location:Bucuresti

Postat 24 January 2015 - 09:42 AM

https://www.youtube....h?v=kIgwZFGlgio
    /------------------------\              |~~\_____/~~\__  |
    |        Hash84          |______________ \______====== )-+
    |                        |                      ~~~|/~~  |
    \------------------------/                         ()
0

#30 Useril este offline   moro696 

  • Membru
  • PipPipPipPip
  • Grup: Members
  • Postari: 163
  • Inregistrat: 01-January 15
  • Gender:Male
  • Location:Timisoara

Postat 25 January 2015 - 03:12 PM

Salut, nu este proiect de diploma, desi sunt abia anul 1, nu exclud ca pe viitor sa fie chiar lucrarea de diploma.

Am destula experienta in hardware si de cativa ani ma joc cu microcontrolere, am luat acest proiect mai mult din ambitie.

Puteam foarte usor sa imi cumpar un phantom sau un apm kit, dar unde e fun-ul de`al face singur, chiar daca nu e ceva de genul sa aprin/sting un led cu microcontrolerul, cu atat mai mult acum ca am reusit sa pun la punct sistemul de orientare ar fi pacat sa ma las batut.

Legat de "fabrica" acolo am simulat un simplu pid control, fara o anume fabrica, stiu ca la multirotoare se poate aplica alta forma pt "fabricutza"

Insa pe mine ma interesa corectitudinea datelor, si ma tem ca aici ori e vorba de o limitare hardware ori tre sa fac ploting manual intr-un excel si apoi sa le incarc in matlab... ramane de vazut. Momentan astept sa imi ajunga esc-urile (au ajuns motoarele:D ) sa vad real cum se comporta.

La simulare am folosit modelul de aici https://www.youtube....h?v=ThA7zhLX98A

Is curios cei care au facut simulari de genul in matlab ce fabricute au folosit


intre timp m-am apucat de constructia modulelor wireless pentru telecomanda si receptor

http://s15.postimg.org/d15mpzthj/lol.jpg
0

Arata acest topic


  • 3 Pagini +
  • 1
  • 2
  • 3

11 useri citesc topicul
0 membri, 11 vizitatori, 0 utilizatori anonimi

913Creative.ro