Elektronika.lt
 2024 m. kovo 28 d. Projektas | Reklama | Žinokite | Klausimai | Prisidėkite | Atsiliepimai | Kontaktai
Paieška portale
EN Facebook RSS

 Kas naujo  Katalogas  Parduotuvės  Forumas  Tinklaraščiai
 Pirmas puslapisSąrašas
 Forumas / + pokalbiai
 - Paieška forume
 - D.U.K. / Forumo taisyklės
 - Narių sąrašas
 - Registruotis
 - Prisijungti

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 2024 03 28, 12:14. 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 22
Pereiti prie Atgal  1, 2
Pradėti naują temą  Atsakyti į pranešimą Rodyti ankstesnį pranešimą :: Rodyti kitą pranešimą 
 PID algoritmaa
PranešimasParašytas: 2017 04 18, 17:40 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
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
PranešimasParašytas: 2017 04 19, 07:34 Pranešti apie taisyklių pažeidimą Atsakyti su citata
krienas
Patyręs dalyvis
Patyręs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
AlgisL pamiršo variklio starto charakteristikas... Very Happy
 PID algoritmaa
PranešimasParašytas: 2017 04 19, 11:10 Pranešti apie taisyklių pažeidimą Atsakyti su citata
bachurelis
Dažnas dalyvis
Dažnas dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
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
PranešimasParašytas: 2017 04 19, 12:09 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
krienas rašo:
AlgisL pamiršo variklio starto charakteristikas... Very Happy

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
PranešimasParašytas: 2017 04 19, 12:54 Pranešti apie taisyklių pažeidimą Atsakyti su citata
andriusa
Patyręs dalyvis
Patyręs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą Siųsti el. laišką Apsilankyti vartotojo tinklapyje
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
PranešimasParašytas: 2017 04 19, 14:46 Pranešti apie taisyklių pažeidimą Atsakyti su citata
krienas
Patyręs dalyvis
Patyręs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Po pido stovi dėžė kur max sūkiai riboti, ir stovi dėžė kur rampa...
Čia dėžė tipo struktūrinis elementas...
 PID algoritmaa
PranešimasParašytas: 2017 04 19, 14:51 Pranešti apie taisyklių pažeidimą Atsakyti su citata
bachurelis
Dažnas dalyvis
Dažnas dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Kadangi gain=1 tai ir gaunasi neaiškumas Smile
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, 15:02. Redaguota 3 kartus(ų)
 PID algoritmaa
PranešimasParašytas: 2017 04 19, 14:53 Pranešti apie taisyklių pažeidimą Atsakyti su citata
bachurelis
Dažnas dalyvis
Dažnas dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Na taip, šiuo atveju bendrą poveikį reikia riboti 255 (8 bitų PWM)
 PID algoritmaa
PranešimasParašytas: 2017 05 08, 20:00 Pranešti apie taisyklių pažeidimą Atsakyti su citata
valentinas
Patyręs dalyvis
Patyręs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą Siųsti el. laišką
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, 20:28. Redaguota 2 kartus(ų)
 PID algoritmaa
PranešimasParašytas: 2017 05 08, 20:25 Pranešti apie taisyklių pažeidimą Atsakyti su citata
valentinas
Patyręs dalyvis
Patyręs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą Siųsti el. laišką
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.
Pradėti naują temą  Atsakyti į pranešimą Pereiti prie Atgal  1, 2
 
Forumo sistema: phpBB
 „Google“ paieška forume
 Kas naujesnio?
 Naujos temos forume

Global electronic components distributor – Allicdata Electronics

Electronic component supply – „Eurodis Electronics“

LOKMITA – įvairi matavimo, testavimo, analizės ir litavimo produkcija

Full feature custom PCB prototype service

GENERAL FINANCING BANKAS

Mokslo festivalis „Erdvėlaivis Žemė

LTV.LT - lietuviškų tinklalapių vitrina

„Konstanta 42“

Technologijos.lt

Buitinė technika ir elektronika internetu žemos kainos – Zuza.lt

www.esaugumas.lt – apsaugok savo kompiuterį!

PriedaiMobiliems.lt – telefonų priedai ir aksesuarai

„Deinavos baldai“ — šeimos baldai

FS 22 Tractors
Farming Simulator 19 Mods, FS 22 Maps, FS22 Mods
ETS2 Mods
ETS2 Trucks, ETS2 Bus, Euro Truck Simulator 2 Mods
FS22 Tractors
Farming Simulator 22 Mods, FS22 Maps, FS22 Trucks
VAT calculator
VAT number check, What is VAT, How much is VAT
Paskola internetu
Vartojimo paskola, paskola automobiliui, paskola būsto remontui
Thermal monocular
Thermal vision camera,
Night vision ar scope,
Night vision spotting scope
FS22 Mods
FS22 Harvesters, FS22 Tractors Mods, FS22 Maps Mods
FS22 Mods
FS22 Maps,
FS22 Harvesters,
FS22 Tractors
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija
Sims 4 Mods
Sims 4 CC Clothes,
Sims 4 Hair CC,
Sims 4 Skill Cheat
Optic sight
Binoculars for hunting elk,
Best compact binoculars,
Riflescope hunting
Reklama
‡ 1999– © Elektronika.lt | Autoriaus teisės | Privatumo politika | Atsakomybės ribojimas | Turinys | Reklama | Kontaktai LTV.LT - lietuviškų tinklalapių vitrina
Script hook v, Openiv, Menyoo
gta5mod.net
Farming Simulator 2019 Mods, FS22 Mods, FS22 Maps
farmingsimulator19mods.fr
Optical filters, UV optics, electro optical crystals
www.eksmaoptics.com
Reklamos paslaugos
SEO sprendimai

www.addad.lt
Elektroninių parduotuvių optimizavimas „Google“ paieškos sistemai
www.seospiders.lt
FS22 mods, Farming simulator 22 mods,
FS22 maps

fs22.com
Reklama


Reklama