Sida 1 av 1

Arduino och PID reglerat varvtal

Postat: 30 april 2014, 20:14:58
av thewho
Hejsan var ett tag sen jag kollade här :)

Håller på att fixa varvtalsreglering till min hemmabyggda (mini) skotare. Motorn är en 2cyl 500cc diesel från en mopedbil, men nog om det :lol:

Setup:
Insprutningspumpen styrs av ett rc servo som i sin tur får sin styrning av en arduino.
Jag har en givare på svänghjulet som ger en puls per varv. Inställning av varvtal sker med en 10k pot. (tomgång > maxvarv)

Koden är en väldig röra som jag helst inte vill visa :oops: Men jag använde mig av ett PID bibliotek ( http://playground.arduino.cc/Code/PIDLibrary )
Problemet är att det är väldigt dåliga instruktioner på hur man använder det. Tex. så får man inte veta hur relationen mellan inställt varvtal (setpoint) och verkligt varvtal (input) påverkar utgången.
Men efter en koll i koden till biblioteket så har jag ganska bra koll på det.

Men mitt största problem är att pid rutinen självsvänger om jag ger den 100% kontroll över gasreglaget och jag vet egentligen inte vad jag ska ändra upp eller ner (p eller i) för önskat resultat..
Jag får den att gå ganska bra om jag ställer minsta värdet (servovinkeln) till ca 1300rpm, dock svänger den fortfarande hörbart :tumner: Men då kompenserar den ganska bra när man belastar motorn.

Min fråga är alltså, hur hittar jag startvärden till P,I & D? Jag vet ju inte om det är 0.01, 10 eller 100 värden jag ska ha :?
I ett exempel i biblioteket används 2,5,1 och i ett annat 1, 0.05, 0.25

Tack på förhand :)

Re: Arduino och PID reglerat varvtal

Postat: 30 april 2014, 20:30:48
av konig7070
Har du testat någon metod för att få fram PID-parametrar, typ Lambdametoden http://sv.wikipedia.org/wiki/Lambdametoden eller Ziegler-Nichols http://sv.wikipedia.org/wiki/Ziegler-Nicholsmetoden ?
Annars så skulle väl det bästa vara att beräkna fram PID-parametrarna utifrån motorns överföringsfunktion.

Re: Arduino och PID reglerat varvtal

Postat: 1 maj 2014, 12:05:45
av SeaGull
P-delen i utsignalen från regulatorn är felet (börvärde - ärvärde) multiplicerat med P.
Om utsignalen är i procent, och ärvärdet i v/min, så kan du tex. börja med ett P=100/5000/2=0.01.
Intressant är att du redan fått regulatorn att svänga, och känner till cykeltiden för svängningen, börja med att sätta I-tiden till dubbla cykeltiden.
Hur ofta exekveras PID-regulatorn? Lämpligt här är kanske 100ms. Regulatorn måste känna till hur ofta den exekveras för att kunna beräkna I/D-delen. Borde finnas en inparameter till regulatorn för detta.
Börja med att koppla bort D-delen.
När du fått regulatorn stabil är det bara att ändra börvärdet och fila på parametrarna.
Har inte kollat på länken.

Re: Arduino och PID reglerat varvtal

Postat: 1 maj 2014, 15:02:18
av thewho
konig7070:
Om jag ska vara ärlig så förstod jag inte mycket av dina länkar tyvärr :(
"motorns överföringsfunktion" = ?

SeaGull:
Jag håller på att skriva om koden nu för att få lite ordning i den. Pid beräkningen körs normalt varje 100ms och det går att ändra.
Jag tror att jag kan sätta 'D' till 0 och då göra så att jag får 'PI' reglering istället.
Dvs
"output = kp * error + ITerm - kd * dInput;"
i koden nedan.

Kod: Markera allt

bool PID::Compute()
{
   if(!inAuto) return false;
   unsigned long now = millis();
   unsigned long timeChange = (now - lastTime);
   if(timeChange>=SampleTime)
   {
      /*Compute all the working error variables*/
	  double input = *myInput;
      double error = *mySetpoint - input;
      ITerm+= (ki * error);
      if(ITerm > outMax) ITerm= outMax;
      else if(ITerm < outMin) ITerm= outMin;
      double dInput = (input - lastInput);
 
      /*Compute PID Output*/
      double output = kp * error + ITerm - kd * dInput;
      
	  if(output > outMax) output = outMax;
      else if(output < outMin) output = outMin;
	  *myOutput = output;
	  
      /*Remember some variables for next time*/
      lastInput = input;
      lastTime = now;
	  return true;
   }
   else return false;
}
Jag kommer ha:
Input = Motorns varvtal i rpm (0-3000)
Setpoint = Förarens inställda värde (0-1023)
Output = Kan vara vad som helst, men jag kommer map'a den till 130-85 (ingen gas-full gas i servograder)
Är det något problem att den har möjlighet att stänga av motorn? Servo @ 130º = inget bränsle? Borde jag höja det lite så att minimum värdet ger tomgång ist?

Re: Arduino och PID reglerat varvtal

Postat: 1 maj 2014, 19:29:44
av thewho
Snabb fråga, om man ökar:
P = snabbare reaktion
I = mer "dämpning" när är och börvärdet närmar sig varandra?
D = ? (Använder iof inte den nu, men kan ju va kul att veta)
Så upplever jag iaf funktionen efter lite "simuleringar" med en arduino som imiterar en motor :lol:

En annan fråga när jag ändå är på gång, är en puls/varv tillräckligt för att få en stabil och snabb reglering av motorns varvtal?

Re: Arduino och PID reglerat varvtal

Postat: 1 maj 2014, 20:29:42
av Miramithe
P är en multipel. Bör - är * P = reglervärde. P ska då vara en siffra. P ger ju lite reglerfel som man ser felet blir större ju högre siffra man har på P. För stort värde ger självsvängning och för lågt ger långsam reglering.

I är typ som en dämpning. Den ställs med en tid. Den tar hand om reglerfel i P delen. Högt värde tar det lång tid innan den jämnar ut och stannar på rätt värde och för lågt kan den svänga.

D fungerar lite annorlunda och förutspår värde och jämnar ut. Den ställs med en tid.

Läste det kortfattade kapitlet i skolboken igår men tror jag fick det rätt.

Re: Arduino och PID reglerat varvtal

Postat: 1 maj 2014, 20:35:35
av Nerre
Tycker Wikipedias artikel sammanfattar det hela rätt bra
http://sv.wikipedia.org/wiki/PID-regulator

Re: Arduino och PID reglerat varvtal

Postat: 1 maj 2014, 22:54:19
av thewho
Tackar :) Tänkte inte ens på att söka på svenska wikipedia :oops:
Imorgon ska jag koppla in två potentiometrar som justerar P och I så att jag kan ändra dom "on the fly" istället för att programmera om varje gång..
Här är en bild som visar var jag har stått och fryst ikväll :lol:
Bild

Re: Arduino och PID reglerat varvtal

Postat: 4 maj 2014, 20:08:19
av thewho
Nu har jag kört några lass ved, och det fungerar någorlunda. Inte så bra så att jag är nöjd dock :(
När jag får den att inte självsvänga så tycker jag att regleringen är lite för långsam och överskjuter (?) ganska mycket.. Men det kanske inte går att få så mycket bättre när jag bara har en puls per varv? P och I hamnade på ca 0.20 respektive 0.10
Högre P gav snabba svängningar men med liten amplitud (?)
Högre I gav långsamma svängningar men ganska våldsamma.

Ska jag leka med I ? Eller är det försumbart i mitt fall?

Re: Arduino och PID reglerat varvtal

Postat: 5 maj 2014, 22:45:26
av Krille Krokodil
Du kanske inte behöver göra det så komplicerat... Om du tex testar ut vilken
gasinställning du ska ha för ett visst varvtal i 10 punkter på plan mark så
har du göra en funktion som ger grundgasvärdet, sedan kan du
experimentera med en P-återkoppling ovanpå detta för att ge snabbare
svar. D och I är luringar kan springa iväg hit och dit och man inte har full
koll.