PID regulator ger endast värdet 4 hela tiden?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

PID regulator ger endast värdet 4 hela tiden?

Inlägg av Al_Bundy »

Hej!

Det är så att jag har byggt en PID regulator som verkar vara lite knas...ibland.
Jag har gjort så att en funktion skickar tillbaka på vilket bittvärde den ger ut till en PWM-pinne på min ATmega. Men av någon konstig anledning så fungerar det inte. PWM-pinnen är kopplad till en pump som roterar, beroende på vilken spänning den får.

0 är så klar 0 volt.
255 är så klart 5 volt.
Det är variablen Bit_int som endast blir 4:a hela tiden.

Här är min kod.

Då har jag några frågor.
1. Är detta smart sätt att skriva en kod? Klarar en ATmega av dessa låga tal?

Kod: Markera allt

double e = pow(10, -PHar) - pow(10, -PHbor); 
Tänk att PHar och PHbor kan vara mellan 0 och 14, men oftast i praktiken mellan 10 och 4 för det är där man jobbar med pH.

2.

Kod: Markera allt

double PH_voltage = K*(e + D + I);      


Detta K, förstärkningen, måste vara ENORM. Då talar jag typ 1*10^9. Är detta rimligt?

Vad tror ni?
Jobbar jag med allt för stora och för små tal?

Kod: Markera allt


static int U_pump(float PHar)
      {
        // The wrong values
        double e = pow(10, -PHar) - pow(10, -PHbor);      // logaritmisk PH.                    
        
        // Derivate
        double D = Td*(e-e_before);
        
        // Integral - This can increase and decrease
        static double I;  
        I += (1/Ti)*e;
        
        // The roof of the integral
        if (I >= MAX)
        {
          I = MAX;
        }
        
        if (PHar >= PHbor)
        {
          I = 0; // reset integral. 
        }
        
        double PH_voltage = K*(e + D + I);                                       // PID-regulator 
        
        e_before = average_before(e);                                            // Här gör jag ett medelvärde av felet e_before. 

        int Bit_int;
        if (PH_voltage >= 1)   // om PH_voltage är över 1.
        {
          Bit_int = 255;                                                         // The pump will run at max.
        }
        else if (PH_voltage <= 0)  // om PH_voltage är under 0.
        {
          Bit_int = 0;                                                            // The pump will stop.
        }
        else
        {
          Bit_int = 255*PH_voltage;
        }
        analogWrite(9, Bit_int);
        return Bit_int;                                                           // Return a integer value between 0 and 255 for logging. 
      }
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: PID regulator ger endast värdet 4 hela tiden?

Inlägg av Icecap »

Nej, du jobbar utan tal så att säga.

Deklarera variablerna först!
Använd dom sedan.

Exempelvis hittar jag ingen deklaration av 'e_before'.

Du jämför flyttal med heltal.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: PID regulator ger endast värdet 4 hela tiden?

Inlägg av Al_Bundy »

Detta är bara en del av min kod.
Jag har satt t.ex. K och e_before som globala variabler, yes i'm easy and borring.

Går det inte bra att jämföra flyttal med heltal?
svanted
Inlägg: 5280
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: PID regulator ger endast värdet 4 hela tiden?

Inlägg av svanted »

jag antar du vill styra pH värdet på ngt sätt mha pumpen.......
du behöver inte omvandla pH till faktiska vätejonaktiviteten när det ger så galet små tal....
LarryXz
Inlägg: 669
Blev medlem: 13 mars 2013, 20:31:08
Ort: Norra Uppland

Re: PID regulator ger endast värdet 4 hela tiden?

Inlägg av LarryXz »

Al_Bundy skrev:Går det inte bra att jämföra flyttal med heltal?
What Every Computer Scientist Should Know About Floating-Point Arithmetic
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: PID regulator ger endast värdet 4 hela tiden?

Inlägg av Al_Bundy »

svanted skrev:jag antar du vill styra pH värdet på ngt sätt mha pumpen.......
du behöver inte omvandla pH till faktiska vätejonaktiviteten när det ger så galet små tal....
Enligt kemiingenjörerna så är PH inte linjärt, men man får det linjärt om man tar det 10^-PH.
Jag tycker det låter lite overkill.

Det vi har gjort är att vi linjärisera pH via att lösa ut en y = kx + m formel med en ADC på 10 Bit.
danei
EF Sponsor
Inlägg: 27426
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Re: PID regulator ger endast värdet 4 hela tiden?

Inlägg av danei »

Vad håller du på med, och mellan vilka pH värden räknar du med att jobba?
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: PID regulator ger endast värdet 4 hela tiden?

Inlägg av Al_Bundy »

Jag jobbar mellan 10 och 4 pH men jag ingår i en grupp och där säger dem att vi ska ta 10^(-Ph).
Jag tycker det låter onödigt.
För om vi tar 10^(-Ph) så måste vi ha ett ENORMT MEGA K som förstärkning då. Annars kan man ha ett K på t.ex. 4 eller 7.


Men deras argument är att då får man PH linjärt på riktigt. Annars är PH inte linjärt.
danei
EF Sponsor
Inlägg: 27426
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Re: PID regulator ger endast värdet 4 hela tiden?

Inlägg av danei »

Du menar de inte dem.

pH (inte PH) är exponenten med inverterat tecken för vätejonaktiviteten. Så det stämmer att man bör räkna så om man vill reglera mot vätejonaktiviteten. Men det finns ju ingen anledning till att du ska ha alla tal skalade enligt verkliga enheter i beräkningen.

Är det en hypotetisk regler algoritm ni ska ta fram eller är det någon typ av process ni ska reglera. Är det i så fall en labuppställning som ni vet hur den kommer att se ut. Andra normala applikationer kan vara poler eller akvarier, men då är man ju inom ett väldigt litet område och reglerar.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: PID regulator ger endast värdet 4 hela tiden?

Inlägg av Al_Bundy »

Exakt. Jag ska reglera pH!

Jag bryr mig inte direkt om vätejonsaktiviteten. Det är inte mitt område. Jag bara programmerar efter hur kemister vill ha det som. Men av någon konstig anledning så blir bara variabeln Bit_int 4 hela tiden. Jag skulle helst vilja att inte använda så låga och stora tal.

Vi ska reglera ett system med PID-regulator. Jag har redan byggt ett program för att reglera allt. Fixat en pump som jag skickar en viss spänning i för att den ska snurra osv. Mycket elektronik. JA! Jag har byggt apparaten själv! =)

Först gör vi en linjärisering med punkterna pH 4, pH 7 och pH 7. Vi använder oss av en ADC på 10 bit.
Då får vi ut en y = k*x + m formel.
Med den så kan vi räkna ut pH beroende på vart vi är någonstans på linjen. Men dock så är linjen linjär jämfört med en titrerkurva som är linjär mellan 4 och 10, annars olinjär.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: PID regulator ger endast värdet 4 hela tiden?

Inlägg av Al_Bundy »

Maximala värde min ATmega kan ha är 10E+10 och även vid 10E-10 så blir det 0.000000000100005454656.
Jag tror att det är där det sitter i.
danei
EF Sponsor
Inlägg: 27426
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Re: PID regulator ger endast värdet 4 hela tiden?

Inlägg av danei »

Vad mycket lättare att skulle vara om du kunde ta till dig svaren du får.
svanted
Inlägg: 5280
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: PID regulator ger endast värdet 4 hela tiden?

Inlägg av svanted »

Al_Bundy skrev:Maximala värde min ATmega kan ha är 10E+10 och även vid 10E-10 så blir det 0.000000000100005454656.
Jag tror att det är där det sitter i.
försök att förstå nu...
du behöver inte använda jonaktivitetsvärdet!!!!
du få pH värden typ 4 - 10, använd dessa direkt

om du vill styra pumpen till pH 7? gör så att pumpen nätt och jämt stannar vid 7 som input och går på full sprutt vid 8 eller vid 5? (eller kanske 9 eller 4)
beroende på om du tillför en syra eller en bas.

men du vill kanske ha svar på varför ditt program ger 4 ut hela tiden?
och inte ha hjälp med att lösa problemet :roll:

och inte heller exakt vad som ska styras?
gäller det pH i ett akvarium är hela idén vansklig, blir det fel så dör firrarna, det ska man nog göra manuellt...och inte med en PID regulator till en pump.
är det däremot ett teoretiskt projekt är det...?
tja, varför ska vi då hjälpa till öht, du lär dig ju inget, i dubbel bemärkelse...
om vi hjälper till här...
danei
EF Sponsor
Inlägg: 27426
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Re: PID regulator ger endast värdet 4 hela tiden?

Inlägg av danei »

Om det är en buffrande lösning så är processen allt annat än linjär. Men efter som ts vägrar att ta till sig tips och svara på frågor är det ju svårt. Jag fattar inte varför jag fortsätter att svara på trådarna.
svanted
Inlägg: 5280
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: PID regulator ger endast värdet 4 hela tiden?

Inlägg av svanted »

hoppet är det sista man överger :lol:
Skriv svar