Sida 2 av 3

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

Postat: 14 november 2014, 20:43:55
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

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

Postat: 14 november 2014, 20:54:33
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å.

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

Postat: 14 november 2014, 20:57:51
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.

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

Postat: 14 november 2014, 20:58:08
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.

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

Postat: 14 november 2014, 21:05:25
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.

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

Postat: 14 november 2014, 21:06:05
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.

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

Postat: 14 november 2014, 21:10:11
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?

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

Postat: 14 november 2014, 21:14:02
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:

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

Postat: 14 november 2014, 21:14:54
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.

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

Postat: 14 november 2014, 21:19:15
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;    

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

Postat: 14 november 2014, 21:22:12
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.

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

Postat: 14 november 2014, 21:22:50
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.

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

Postat: 14 november 2014, 21:25:52
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.

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

Postat: 14 november 2014, 21:28:00
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;

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

Postat: 14 november 2014, 21:33:18
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.