 |

|
Elektronika.lt portalo forumas
Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo.
Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.
Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius,
kurie nesilaiko forumo taisyklių.
Pastebėjus nusižengimus, prašome pranešti.
Dabar yra 2025 04 10, 08:40. Visos datos yra GMT + 2 valandos.
|
|
|
 |
Forumas » Mikrovaldikliai » PID algoritmaa
|
Jūs negalite rašyti naujų pranešimų į šį forumą Jūs negalite atsakinėti į pranešimus šiame forume Jūs negalite redaguoti savo pranešimų šiame forume Jūs negalite ištrinti savo pranešimų šiame forume Jūs negalite dalyvauti apklausose šiame forume
|
|
|
Puslapis 2 iš 2 Pereiti prie Atgal 1, 2 |
|
 |
PID algoritmaa |
Parašytas: 2017 04 18, 18:40 |
|
|
|
Uzvesiu biski ant kelio:
Jei mechaninis pasipriesinimas i abi puses daug maz vienodas, tai kiek energijos idesi geritejant, panasiai tiek reikes sustabdant, jei pradesi stabdyti per tiek pat laipsniu anskciau tikslo.
Po keli(u)olikos iteraciju turesi atatinkama statistika ir galesi tiksliau pataikyti is pirmo karto. |
|
|
|
|
 |
PID algoritmaa |
Parašytas: 2017 04 19, 08:34 |
|
|
|
AlgisL pamiršo variklio starto charakteristikas...  |
|
|
|
|
 |
PID algoritmaa |
Parašytas: 2017 04 19, 12:10 |
|
|
|
andriusa rašo: |
Kadangi visose PID formulėse dalyvauja laipsniai, tai ir u(t) gauname laipsnius. |
Netiesa. Formulės yra bendro pobūdžio, vienetai gali būti ir metrai ir temperatūros laipsniai, ir kampo laipsniai.
Tavo atveju duty cycle apsprendžia įtampą. O "apmokymas" vyksta eksperimentiškai parenkant Kp, Ki, Kd. Yra ir savireguliavimo algoritmai, bet tai tikrai sudėtinga. |
|
|
|
|
 |
PID algoritmaa |
Parašytas: 2017 04 19, 13:09 |
|
|
|
krienas rašo: |
AlgisL pamiršo variklio starto charakteristikas...  |
Cia priklauso kaip parinksi variklio darbo rezima.
Jei kaip tu matomai siulai parinkti pacioj pradzioj, kai variklis teisnaudoja 10% savo galios, tai tavo tiesa, jis tikrai sunkiai prades suktis...
Jei parinksi taip, kad variklis darbo metu bus isnaudojamas arti 80% - bus atvirksciai, nes tie 20% nueis tik tepimo/dilimo nuostoliams kompensuoti. |
|
|
|
|
 |
 |
PID algoritmaa |
Parašytas: 2017 04 19, 13:54 |
|
|
|
Gerai imkim iškarto realius pavyzdžius. Pasisukus išorinei ašiai (yra pavarų dėžė) 360 laipsnių bus sugeneruota 1102500 impulsų iš encoderio. Tarkim ta ašis turi rodyklę ir stovi ties 100 laipsnių (skaičius d'306250' REAL_POSITION registre mikrovaldiklyje). Iš klaviatūros įvedama nauja pozicija, 120 laipsnių (įrašoma d'367500' į NEED_POSITION registrą mikrovaldiklyje). Taigi pirmasis reikšmių erroras bus e(t) = d'367500' - d'306250' = d'61250'. Sakykim esam pasirinkę visus gain koeficientus lygius 1. Tada
P(t) = Kp * e(t) = d'1' * d'61250' = d'61250';
I(t) = I(t 1) + Ki * e(t) = d'0' + d'1' * d'61250' = d'61250';
D(t) = Kd * {e(t) e(t 1)} = d'1' * {d'61250' d'0'} = d'61250';
u(t) = P(t) + I(t) + D(t) = d'61250' + d'61250' + d'61250' = d'183750'
Ir kas toliau? Gavau, kad reikia atlikti poveikį d'183750', bet vis dar nežinau kaip tai valgoma. |
|
|
|
|
 |
 |
PID algoritmaa |
Parašytas: 2017 04 19, 15:46 |
|
|
|
Po pido stovi dėžė kur max sūkiai riboti, ir stovi dėžė kur rampa...
Čia dėžė tipo struktūrinis elementas... |
|
|
|
|
 |
PID algoritmaa |
Parašytas: 2017 04 19, 15:51 |
|
|
|
Kadangi gain=1 tai ir gaunasi neaiškumas
Pradėkim nuo P. Jei erroras 61250, o PWM 8 bitų, tai Kp galima įsivaizduoti 0,001 (teks parinkti eksperimentiškai). Tada poveikis gaunasi 61.
Toliau D. Spėju Kd galėtų būti 0,0005. Tada D poveikis bus -30. Bet tu neteisingai skaičiuoji, momentu t jis bus 0.
I kol kas nerūpi. Taigi bendras poveikis 61-30=31.
Aiškiau?
Aš kai PID aiškinaus, Excelyje formules surašiau ir kreives paišiau. |
|
Paskutinį kartą redagavo bachurelis, 2017 04 19, 16:02. Redaguota 3 kartus(ų) |
|
|
|
 |
PID algoritmaa |
Parašytas: 2017 04 19, 15:53 |
|
|
|
Na taip, šiuo atveju bendrą poveikį reikia riboti 255 (8 bitų PWM) |
|
|
|
|
 |
 |
PID algoritmaa |
Parašytas: 2017 05 08, 21:00 |
|
|
|
As domejausi ant arduino PID.
Gal ka pritaikysi. Cia bicas pasakoja kaip jis tobulino ta koda nuo nulio gali pasiskaityti. As tai ne programeris tai man labai daug klausimu ten kilo. Cia parasyta biblioteka arduinui kuri toliau naudojama arduino programoje. Nudojant sia programa gali pats susikonfiguruot kokiu daznumu skaiciuosi PID, nustatyti integravimo, diferenciavimo ir proporcini koficiantus. As bandziau su skaitmeniniu temperaturos davikliu tai gavos nesamones matyt kaskas nesutinka, reikia analoginio matyt.
http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/
Kodas: |
/*working variables*/
unsigned long lastTime;
double Input, Output, Setpoint;
double ITerm, lastInput;
double kp, ki, kd;
int SampleTime = 1000; //1 sec
double outMin, outMax;
bool inAuto = false;
#define MANUAL 0
#define AUTOMATIC 1
void Compute()
{
if(!inAuto) return;
unsigned long now = millis();
int timeChange = (now - lastTime);
if(timeChange>=SampleTime)
{
/*Compute all the working error variables*/
double error = Setpoint - Input;
ITerm+= (ki * error);
if(ITerm> outMax) ITerm= outMax;
else if(ITerm< outMin) ITerm= outMin;
double dInput = (Input - lastInput);
/*Compute PID Output*/
Output = kp * error + ITerm- kd * dInput;
if(Output> outMax) Output = outMax;
else if(Output < outMin) Output = outMin;
/*Remember some variables for next time*/
lastInput = Input;
lastTime = now;
}
}
void SetTunings(double Kp, double Ki, double Kd)
{
double SampleTimeInSec = ((double)SampleTime)/1000;
kp = Kp;
ki = Ki * SampleTimeInSec;
kd = Kd / SampleTimeInSec;
}
void SetSampleTime(int NewSampleTime)
{
if (NewSampleTime > 0)
{
double ratio = (double)NewSampleTime
/ (double)SampleTime;
ki *= ratio;
kd /= ratio;
SampleTime = (unsigned long)NewSampleTime;
}
}
void SetOutputLimits(double Min, double Max)
{
if(Min > Max) return;
outMin = Min;
outMax = Max;
if(Output > outMax) Output = outMax;
else if(Output < outMin) Output = outMin;
if(ITerm> outMax) ITerm= outMax;
else if(ITerm< outMin) ITerm= outMin;
}
void SetMode(int Mode)
{
bool newAuto = (Mode == AUTOMATIC);
if(newAuto && !inAuto)
{ /*we just went from manual to auto*/
Initialize();
}
inAuto = newAuto;
}
void Initialize()
{
lastInput = Input;
ITerm = Output;
if(ITerm> outMax) ITerm= outMax;
else if(ITerm< outMin) ITerm= outMin;
} |
andriusa rašo: |
Gerai imkim iškarto realius pavyzdžius. Pasisukus išorinei ašiai (yra pavarų dėžė) 360 laipsnių bus sugeneruota 1102500 impulsų iš encoderio. Tarkim ta ašis turi rodyklę ir stovi ties 100 laipsnių (skaičius d'306250' REAL_POSITION registre mikrovaldiklyje). Iš klaviatūros įvedama nauja pozicija, 120 laipsnių (įrašoma d'367500' į NEED_POSITION registrą mikrovaldiklyje). Taigi pirmasis reikšmių erroras bus e(t) = d'367500' - d'306250' = d'61250'. Sakykim esam pasirinkę visus gain koeficientus lygius 1. Tada
P(t) = Kp * e(t) = d'1' * d'61250' = d'61250';
I(t) = I(t 1) + Ki * e(t) = d'0' + d'1' * d'61250' = d'61250';
D(t) = Kd * {e(t) e(t 1)} = d'1' * {d'61250' d'0'} = d'61250';
u(t) = P(t) + I(t) + D(t) = d'61250' + d'61250' + d'61250' = d'183750'
Ir kas toliau? Gavau, kad reikia atlikti poveikį d'183750', bet vis dar nežinau kaip tai valgoma. |
360 bus 1102500 impulsai, tuomet vienas laipsnis bus ~3 impulsai jei neskaityti pavaru dezes, jei skaityti turi ziureti jos redukcija ir atatinkamai ivertinti poslinkio ir impulsu santykį. gauni d'183750 tuomet atatinkamai turi suktis ir variklis ta kryptimi ir tiek laipsnių, tačiau kai ašis artėja prie tikslo PID perskaičiuoja viską ir gaunasi vis mažesnis erroras ir nebūna overshooto, cia tavo PID reiksme yra laiko momente t ji keisis kai rodykle artes prie tikslo. Jei didele integracija ir pokytis gali buti oversotas tai cia vienetai gali buti ir per dideli cia kaip ir sake turi ekperimentuoti. As taip suprantu. PID tai nera kad daviau signala sukis ten ir tiek laipsniu PID yra kai sukimosi metu skaiciuojama viskas ir isduodama komanda pastoviai keciasi. Noreciau pabresti PID reikalingas jei istikruju tas overshootas galimas jei inercijos nera didele ir variklis tiksliai sustoja kur reikia jam pid ir nereikia |
|
Paskutinį kartą redagavo valentinas, 2017 05 08, 21:28. Redaguota 2 kartus(ų) |
|
|
|
 |
 |
PID algoritmaa |
Parašytas: 2017 05 08, 21:25 |
|
|
|
andriusa rašo: |
Gerai imkim iškarto realius pavyzdžius. Pasisukus išorinei ašiai (yra pavarų dėžė) 360 laipsnių bus sugeneruota 1102500 impulsų iš encoderio. Tarkim ta ašis turi rodyklę ir stovi ties 100 laipsnių (skaičius d'306250' REAL_POSITION registre mikrovaldiklyje). Iš klaviatūros įvedama nauja pozicija, 120 laipsnių (įrašoma d'367500' į NEED_POSITION registrą mikrovaldiklyje). Taigi pirmasis reikšmių erroras bus e(t) = d'367500' - d'306250' = d'61250'. Sakykim esam pasirinkę visus gain koeficientus lygius 1. Tada
P(t) = Kp * e(t) = d'1' * d'61250' = d'61250';
I(t) = I(t 1) + Ki * e(t) = d'0' + d'1' * d'61250' = d'61250';
D(t) = Kd * {e(t) e(t 1)} = d'1' * {d'61250' d'0'} = d'61250';
u(t) = P(t) + I(t) + D(t) = d'61250' + d'61250' + d'61250' = d'183750'
Ir kas toliau? Gavau, kad reikia atlikti poveikį d'183750', bet vis dar nežinau kaip tai valgoma. |
360 bus 1102500 impulsai, tuomet vienas laipsnis bus ~3 impulsai jei neskaityti pavaru dezes, jei skaityti turi ziureti jos redukcija ir atatinkamai ivertinti poslinkio ir impulsu santykį. gauni d'183750 tuomet atatinkamai turi suktis ir variklis ta kryptimi ir tiek laipsnių, tačiau kai ašis artėja prie tikslo PID perskaičiuoja viską ir gaunasi vis mažesnis erroras ir nebūna overshooto, cia tavo PID reiksme yra laiko momente t ji keisis kai rodykle artes prie tikslo. Jei didele integracija ir pokytis gali buti oversotas tai cia vienetai gali buti ir per dideli cia kaip ir sake turi ekperimentuoti. As taip suprantu. PID tai nera kad daviau signala sukis ten ir tiek laipsniu PID yra kai sukimosi metu skaiciuojama viskas ir isduodama komanda pastoviai keciasi. |
|
|
|
|
 |
|
 |
Google paieška forume |
|
 |
Naujos temos forume |
|
 |
FS25 Tractors
Farming Simulator 25 Mods,
FS25 Maps,
FS25 Trucks |
 |
ETS2 Mods
ETS2 Trucks,
ETS2 Bus,
Euro Truck Simulator 2 Mods
|
 |
FS22 Tractors
Farming Simulator 22 Mods,
FS22 Maps,
FS25 Mods |
 |
VAT calculator
VAT number check,
What is VAT,
How much is VAT |
 |
LEGO
Mänguköök,
mudelautod,
nukuvanker |
 |
KCD2 Mods
Installing KCD 2 Mods,
KCD 2 Guides,
KCD 2 Cheats |
 |
FS25 Mods
FS25 Harvesters,
FS25 Tractors Mods,
FS25 Maps Mods |
 |
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija |
 |
FS25 Mods
FS25 Maps,
FS25 Cheats,
FS25 Install Mods |
 |
GTA 6 Wiki
GTA 6 Map,
GTA 6 Characters,
GTA 6 News |
 |
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
 |
ATS Trailers
American Truck Simulator Mods,
ATS Trucks,
ATS Maps |
|

|
 |