Någon som kan förklara integrerade delen på PID-regulator?

Robot, CNC, Pneumatik, Hydraulik, mm
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Någon som kan förklara integrerade delen på PID-regulato

Inlägg av Al_Bundy »

Jaha?

Så vad är det för fel på min PID regulator?
När e är 0 eller negativ så ska I regulatorn inte fungera.
Jag kan inte summera ihop sumIntegral hur mycket som helst? Eller?

EDIT:
Jag tog bort nollningen av sumIntegral då jag kom på att om systemet svänger över så måste sumIntegral minska.

En fråga till: T2-T1 är deltaT. Är det nödvändigt att jag använder tid? Kan jag inte bara skriva T2-T2 = 1 ? Jag sparar minne.

Kod: Markera allt

static int U_pump(float PHar, long *T2_point)
      {
        float e = PHbor - PHar;                                              // The wrong value
        static const byte Td = 5;                                            // Td value 
        static const byte Ti = 3;                                            // Ti value
        long T2 = *T2_point;                                                 // a pointer 
        static int sumIntegral =+ e_before*(T2-T1);
        
        double PH_voltage = K*(e + Td*(e-e_before)/(T2-T1) + (1/Ti)*sumIntegral);                 // Lovely PID-regulator 
        
        e_before = e;                                                        // save e as e_before for next loop
        T1 = T2;                                                             // save T2 as T1 for next loop
Senast redigerad av Al_Bundy 14 november 2014, 21:07:44, redigerad totalt 2 gånger.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Någon som kan förklara integrerade delen på PID-regulato

Inlägg av Al_Bundy »

qx5 skrev:Liten PID regulator i Perl som jag testade ett tidigare inlägg med..

Kod: Markera allt

for($in=0,$P=0.5, $I=0.05, $D=0.01, $B=10;  ;  $i++){
  $e=($B-$in);
  $eI+=$e*$I; $eP=$e*$P; $eD=$e*$D*($eD-$eD_last);
  $in+=$eP+$eI+$eD;
  printf("%02d  %.2f\n", $i, $in);

  $in_last=$in; $eD_last=$eD;
  }
$in - Värdet på signalen
$P - Proportionalitetskonstant
$I - Integrationskonstant
$D - Derivatakonstant
$B - Börvärde
Din PID regulator verkar inte stämma. Du måste ta hänsyn till tid också.
Nerre
Inlägg: 27205
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Någon som kan förklara integrerade delen på PID-regulato

Inlägg av Nerre »

Tiden är ju avstånden mellan samplen. När du jobbar med tidsdiskreta signaler så kan du integrera genom att bara summera samplen.
Användarvisningsbild
SeniorLemuren
Inlägg: 8415
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Någon som kan förklara integrerade delen på PID-regulato

Inlägg av SeniorLemuren »

Om du besvärat dig med att kolla PID Theory.pdf som jag bifogade, så hade du funnit flödes scheman och mycket enkla förklaringar om hur du får till det.
Gimbal
Inlägg: 8664
Blev medlem: 20 april 2005, 15:43:53

Re: Någon som kan förklara integrerade delen på PID-regulato

Inlägg av Gimbal »

"Din PID regulator verkar inte stämma. Du måste ta hänsyn till tid också."

Måste och måste, det är inte direkt ovanligt att man kör reglerloopen med en fast takt. Dvs det är en fast tid mellan samplingarna varpå tidsperioden är en konstant som kan kvittas bort.
danei
EF Sponsor
Inlägg: 27414
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Re: Någon som kan förklara integrerade delen på PID-regulato

Inlägg av danei »

Jo visst kan du summera. Men T1 kommer ju att växa hela tiden. Ta bort den helt. Det är fullständigt ointressant hur länge sedan du startade regulatorn. Se till att du har en jämn sampeltakt bara.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Någon som kan förklara integrerade delen på PID-regulato

Inlägg av Al_Bundy »

Nerre skrev:Tiden är ju avstånden mellan samplen. När du jobbar med tidsdiskreta signaler så kan du integrera genom att bara summera samplen.
Ja. Jag jobbar med tidsdiskreta signaler...vad det nu betyder haha. Har en bok om det, men jag kan inte direkt den "korrekta svenska översättningen" på ordet. Så jag summerar bara sumIntegral = e ?
SeniorLemuren skrev:Om du besvärat dig med att kolla PID Theory.pdf som jag bifogade, så hade du funnit flödes scheman och mycket enkla förklaringar om hur du får till det.
Men jag läser boken Modern reglerteknik av Bertil Thomas.
Gimbal skrev:"Din PID regulator verkar inte stämma. Du måste ta hänsyn till tid också."

Måste och måste, det är inte direkt ovanligt att man kör reglerloopen med en fast takt. Dvs det är en fast tid mellan samplingarna varpå tidsperioden är en konstant som kan kvittas bort.

Så jag kan säga att T2-T1 = 1 typ?
Användarvisningsbild
SeniorLemuren
Inlägg: 8415
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Någon som kan förklara integrerade delen på PID-regulato

Inlägg av SeniorLemuren »

"Men jag läser boken Modern reglerteknik av Bertil Thomas. "

Ja, men det hjälper dig ju tydligen inte så värst mycket. :doh:
Gimbal
Inlägg: 8664
Blev medlem: 20 april 2005, 15:43:53

Re: Någon som kan förklara integrerade delen på PID-regulato

Inlägg av Gimbal »

Själv fördrar jag följande variant:
double PH_voltage = Tp*e + Td*(e-e_before)/(T2-T1) + (1/Ti)*sumIntegral;

Eftersom det då är lättare att justera enbart P-delen om man vill det.

Rätt eller fel?

Edit:
"Så jag kan säga att T2-T1 = 1 typ?"

Ja.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Någon som kan förklara integrerade delen på PID-regulato

Inlägg av Al_Bundy »

Det där är nog fel. K ska gångras med både D-delen och I-delen :)

Nu när jag kör jämna hastigheter på ca en sekund så tog jag bort tiden.
Koden har nu bara ett argument istället för tidsvariabel som pekare.

sumIntegral summeras med e varje gång. När felvärdet blir negativt, dvs översvägningar så minskas sumIntegral.
På D-delen så tar jag derivatan av e d.v.s e minus e_before. Vilket kommer ge en negativ lutning när e minskar och därmed variabeln PH_voltage kommer minska. :)

Kod: Markera allt

static int U_pump(float PHar)
      {
        static const byte Td = 5;                                            // Td value 
        static const byte Ti = 3;                                            // Ti value
        
        float e = PHbor - PHar;                                              // The wrong value
        static long sumIntegral =+ e;                                        // I-part
        
        double PH_voltage = K*(e + Td*(e-e_before) + (1/Ti)*sumIntegral);    // Lovely PID-regulator 
        
        e_before = e;    
danei
EF Sponsor
Inlägg: 27414
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Re: Någon som kan förklara integrerade delen på PID-regulato

Inlägg av danei »

Sen får man ju räkna om konstanterna efter sampeltiden. Men om man bara rattar så kvittar ju det.
Man kan göra som gimbal föreslår också, det funkar lika bra. Bara man vet hur man gör.
Nerre
Inlägg: 27205
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Någon som kan förklara integrerade delen på PID-regulato

Inlägg av Nerre »

Al_Bundy skrev: Så jag kan säga att T2-T1 = 1 typ?
Nej, poängen är att du behöver inte ha en numeriskt korrekt integral till din I-reglering. Du behöver ett värde som är proportionellt mot integralen, och det blir det om du summerar alla fel.

Hela vitsen med integralen är att om du har ett litet fel så ska du få en utsignal som justerar så felet blir noll. Eftersom vitsen med integralen är att styra felet till noll så blir det jättefel om du nollar integralen när felet är noll. När felet närmar sig noll kommer integralen per automatik att gå mot noll.

Det du kan göra är att ha ett maxvärde för integralen, bestämma att den får bli t.ex. max +/- 100.


Det verkar som om du inte har förstått det du har läst i den där boken. Läs en gång till. Eller varför inte två gånger till.
danei
EF Sponsor
Inlägg: 27414
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Re: Någon som kan förklara integrerade delen på PID-regulato

Inlägg av danei »

T2-T1 är konstant. Vad det är beror ju på hur du samplar. Men det finns ingen anledning att räkna ut den konstanten för varje sample.
Gimbal
Inlägg: 8664
Blev medlem: 20 april 2005, 15:43:53

Re: Någon som kan förklara integrerade delen på PID-regulato

Inlägg av Gimbal »

Al_Bundy skrev:Det där är nog fel. K ska gångras med både D-delen och I-delen :)
Det kompenserar man givetvis genom att justera konstanterna framför just D och I-delen.

Man kan se det så här:
double PH_voltage = K*(Tp*e + Td*(e-e_before)/(T2-T1) + (1/Ti)*sumIntegral);

Sen sätter man K = 1;
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Någon som kan förklara integrerade delen på PID-regulato

Inlägg av Al_Bundy »

danei skrev:Sen får man ju räkna om konstanterna efter sampeltiden. Men om man bara rattar så kvittar ju det.
Man kan göra som gimbal föreslår också, det funkar lika bra. Bara man vet hur man gör.
Jag brukar använda zigler nichols metod.
Nerre skrev:
Al_Bundy skrev: Så jag kan säga att T2-T1 = 1 typ?
Nej, poängen är att du behöver inte ha en numeriskt korrekt integral till din I-reglering. Du behöver ett värde som är proportionellt mot integralen, och det blir det om du summerar alla fel.

Hela vitsen med integralen är att om du har ett litet fel så ska du få en utsignal som justerar så felet blir noll. Eftersom vitsen med integralen är att styra felet till noll så blir det jättefel om du nollar integralen när felet är noll. När felet närmar sig noll kommer integralen per automatik att gå mot noll.

Det du kan göra är att ha ett maxvärde för integralen, bestämma att den får bli t.ex. max +/- 100.


Det verkar som om du inte har förstått det du har läst i den där boken. Läs en gång till. Eller varför inte två gånger till.
Så du menar att jag måste summera alla fel i en statisk variabel? Typ som jag redan gör nu?

Jo. Jag kom på att om jag nollar statiska variabeln sumIntegral så kommer allt bara totalt falla då sumIntegral håller upp systemet så e blir 0.

Jag förstog inte varför integralen blir noll när e går mot noll? Du missar att det är en statisk variabel vi talar om. Den sparar på minnet.

Ja. Jag funderar på ha ett marxvärde för integralen. Det kan vara skonsamt för processorn.
Skriv svar