Fórum témák
» Több friss téma |
Fórum » PIC PID library
Helló,
Kicsit tesztelgettem az önhangoló PID szabályzó algoritmusomat. Ez meg mindig az indentifikacios alapokon nyugvo megoldas PC-n implementalva. C# lett irva, gyakorlatilag ez egy GUI ami kepes identifikalni. A PID szabalyzo pedig PIC-en fut tovabbra is, a PC es PIC egymassal soros porton kommunikal. A kepeken egy probameres lathato. Az identifikacio zart hurokban tortenik. A szakasz egy szendvicssuto kb 600W-os. Latszik a mert erteken, hogy az egysegugrasra adott valasza HPT2-es szakszra enged kovetkeztetni (Ap=1 zart hurokban). Sajnos meg csak HPT1-re van kesz az indentifikalo algoritmusom. Ennek ellenere szerintem jol eltalalta HPT1-es kozelitessel a jelet. Az ebbol kapott parameterek alapjan szamolt PID parameterrel elfogadhato eredmenyt adott a szabalyzokor. A zart hurku identifikalast azert valasztottam mert a szendvicssuto nyilt hurokban HIT1 kent viselkedne, amire kevesebb ajanlast talaltam illetve nincs ra kesz identifikalo algoritmusom. Ha szobahomersekletol elkeztem jaratni a sutot akkor a karakterisztika alja erosen emlekeztet egy HIT1-re. De ha elerem a vegso homersekletet amit tud a minisuto akkor ennek kornyezeteben mar a teljes karakterisztikat nezve HPT2. Jelenleg a HPT2 szakaszidentifikacion dolgozom.
Sziasztok!
Lehet, h nagyon amatőr a kérdés, de egyenlőre egy egyszerű P szabályozót próbálok dsPIC-be leprogramozni C-ben C30 compilerrel. Egyenlőre ott elakadok, h int-ként kezelem az SP-t és PV-t, de a hibajel (SP-PV) kijöhet negatívra is. Ezért az signed int. De úgy látom, h nem megfelelő csak annyit kódolnom, hogy Pout=Kp*hibajel, mert a negatívot nem értelmezi automatikusan. Ezt hogy szokták megoldani? if-fel megvizsgálni az eshetőségeket? Köszi előre is.
Igen,
if (Pout<0) Pout=0; Yout=Pout; P szabályzó esetén a Pout és az Yout azonos, ezért nem értelmezhető a negatív érték a kimeneten, kivéve, ha hűtés is van.
Ez nem hőmérsékletet szabályoz, hanem motor pozíciót. Van balra-jobbra irány is. Szóval itt értelmezni kéne a hiba negatív tartományát is.
Akkor nem kell semmit csinálni, csak felhasználni a negatív értéket is. A sima integer az negatív értékeket is kezel.
Tehát elvileg a kettes komplemenses negatívot teljesen automatikusan kezeli, és nem kell semmi extra dolgot megadni neki, csak annyit, hogy előjeles integer?
Tudomásom szerint ha nem írsz elé semmit, akkor automatikusan előjeles lesz. Ha nem akarod, akkor unsigned-et kell eléírni. De miért nem próbálod ki szimulátorban, hogy beleírsz negatív számot és mi lesz benne?
Megpróbálom majd szimulálni, csak azóta nem volt időm foglalkozni vele.
A motor pozicioszabalyzasnal van valami kulonleges kovetelmeny? Pl gyorsulas es lassulas megoldasa poziciovaltasok kozott. Mekkora tapadasa van indulaskor? Pontossag?
Szeretnék minél pontosabb szabályozást és finom, de gyors beállást a körülményekhez képest. DVD romból buherált motor és áttétel, a szenzor egy poti. Csak ki akarom próbálni, h építek egy P szabályozót, majd kiterjesztem PI-re és PID-re. Csak kísérletezgetés hobbiból. Szeretnék egyszer egy két keréken egyensúlyozó robotot építeni. De egyenlőre csak szép lassan a hozzávalókat próbálgatom megérteni, és beállítgatni. Tapadást nem tudom, de kis pwm-változásnál nem, vagy csak akadozva indul. De azt tudom, hogy a paraméterek beállítása nem egyszerű játék. Végülis most is azon csúsztam el, hogy túl nagy értéktartományt hagytam a szabályozás számítására a kimenethez képest.
És a programozási ismereteket is most fejlesztgetem csak, mert eddig assembly-t használtam, csak gondoltam ezt azért sokkal-sokkal egyszerűbb lesz C-ben megvalósítani.
A motor pozicioszabalyzas jo tanfeladat mert sokat lehet tanulni belole. Es van hova fejleszteni a dolgot, mert a sima P, PI ileltve PID utan a rajon az ember, hogy nem csak ezen mulik hanem azon, hogy mi van kore epiteve. Pl ugye a rampa alapjan sebesseg noveles tartas majd csokkentes. Kotyogas kikuszobolese. Indulaskor meg kell lokni a motort mert nagy a tapadas meg ilyesmi.
Ami szivatni fog az a poti. Elobb utobb elkopik es akkor az zajt visz be a szabalyzokorbe es attol romlik a szabalyzas. De majd ugyis kitapasztalod. Tanulasra elso korben tokeletes lesz.
Igen, vannak benne lehetőségek. Ezt a nehézkes indulást most is érzem. Pedig direkt ezért akartam áttételt, hogy ne csak kicsiket kelljen a motornak mozognia. Ezt a potis dolgot nem akarom sokáig erőltetni, csak ez volt a legegyszerűbb így az elején. Majd egy nyomtató sínpályás mechanikájával akarok inkább próbálkozni, meg UH adó-vevővel, csak még kell donor. De az még messze van. A PID-ben is van még bőven kérdőjel, pedig már jó sokat olvastam utána. Pláne, ha az ember ilyen hülyeségekkel szúrja el a kódot, mint előjelhiba, egyéb elszámolás... Vagy másnak is hibakereséssel telik a fél élete?
A PID az tök egyszerű, három alapműveletes képlet... Vigyázz, mert a net tele van diplomamunkákkal, amikben a D tagot rosszul írják le és van aki még saját költeményt is ír a működéséről! Persze az nincs a munka mellett, hogy elfogadták-e!
A hozzászólás módosítva: Okt 1, 2013
Világos, a PID maga tényleg nem bonyolult, de azért a hangolása nem tűnik annyira egyszerűnek.
Alapvetően nem diplomamunkákat olvasgatok, sokkal inkább egyetemi jegyzeteket. Bár ott meg van mindenféle mély-matekos levezetés, de abba nem akarok belemenni... Persze, tudom, az lenne a tökéletes, ha meg lenne profin tervezve, minden kiszámolva, modellezve, szimulálva, de ez most nem az a játék
Egyetemi jegyzet, még gázosabb...
A PID-et be lehet hangolni, ha tudod, mi mit csinál(és az tényleg azt is csinálja, ahogy kell). Ami nehézséget okozhat, ha egy gyors változást kell szabályozni, akkor oda nagyon gyors szabályzókör kell, de ez inkább hardver kérdése.
Tényleg? Húha! Kezdek félni. Esetleg tudsz ajánlani valami olyan leírást, ami megbízható, és könnyen értelmezhető?
Amúgy úgy álltam neki, hogy Kp-t elkezdeni növelni, amíg picit túl nem lendül, aztán hozzáadni az I tagot növelgetve, amíg szépen hozzásimul a parancsolt értékhez - most ezzel kezdek épp szórakozni. Aztán a D-t. Amiben még annyira nem mélyültem el.
Kp novelese jo, de amikor I tagot adsz vedd vissza a Kp-t 80% ra.
PID egyszeru, de van par dolog amire erdemes odafigyelni. Integralo tag: Tulcsordulasra ugyelni, tehat az integralt ertek limitalasa mindket iranyba. Illetve lehet a hibajelet integralni majd az osszeget szorozni, vagy forditva, a hibajelet szorozni majd osszegezni. Az utobbi nem jo, mert ha tul kicsi a hibajel elveszhet par bit es soha nem integralja ossze. D tag: Na ezzel en is szivtam sokat. Ide viszont erdemes koriteni picit. A sima D tag ket mint akozotti differenciat erositi. Ezt nyilvan konnyu megoldani, de felmerul rogton par kerdes. Erdemes-e pl a kimenetet alulateresztovel szurni, hogy simabb legyen? Illetve hova kossuk a D tag bemenetet? Alapjelre, ellenorzojelre vagy hibajelre? Pl ha a alapjere kotjuk akkor a D tag segiti kovetni az alapjelben levo ugrasokat. Egyetemi jegyzetek egyetemistaknak van. Ha eleget nyustoli az ember azokat meg vegcsinalja az egyetemet az ember akkor rajon arra amire egyebkent jozan paraszti eeszel is rajon, hogy hogyan kell hasznalni egy PID szabalyzot. Na a jozan paraszti esz dolgot nem irjak le. Lehet PID-et csinalni egyik, masik illetve mindket tudassal (egyetemi vs. jozan paraszti esz). En meg nem lattam senkit papiron egyenleteket szamolni egy szakasz elott kuksolva. Biztos lehet, de gyanitom, hogy a gyakorlati eletben inkabb a jozan paraszti eszre van szukseg, es nem art tudni azt is amit egyetemen oktattak, hogy ha valami igazan gaz problema jon akkor azzal tudjon mit kezdeni az ember.
Aha, értem. Szóval azért kell visszavenni 80%-ra, mert I is túllendíti, legalább P ne tegye, igaz?
Én a limitálást úgy oldottam meg, hogy a szabályzó kimenetét limitálom mindkét irányba. Mert kis számokkal dolgozom, elvileg bele kell férnem az értéktartományba. D-vel az alapjelet simítgatnám, a többi lehetőségről nem is tudtam. De még egyenlőre inkább Pi-zgetek. Amúgy emlékszem, amikor fősulin matlabbal, simulinkkel pid-eztünk, próbálgatással határoztuk meg a paramétereket. Köszi a tippeket!
Az Y_I tag korlátozása nem azonos hatású az Y(kimenet) korlátozásával (ha Y=Y_P+Y_I+Y_D). Ha a PV sokáig nem éri el az SP-t, de gyors korrigálásra van szükség a folyamat beállása után, akkor az Y_I nagyon hamar elszáll és mikor a PV túllfut az SP-n, soha nem ér vissza, ami kezelhetetlen lengéseket okozhat az elején. Az Y_I-t úgy érdemes korlátozni, hogy kiadja az Y maximális értékét. pl. Ha egy motort +-100%-ig vezérelsz, akkor I_Ymax=100...200, I_Ymin=-100..200. Nekem bevállt, hogy ha az Ymax, Ymin értékeire korlátozom az Y_I-t is, akkor kevesebb értéket kell bevinni, tárolni, kezelni. De a megfelelő értékeket a folyamat is befolyásolja. Mindenesetre egy 0..100%-os vezérlésnél, vagy kaszkádnál, ahol az Y kimenet az alapjele a következő PID-nek és 30..90°C az SP tartománya, az Y_I-t nem szabad engedni több tízezerre elszállni! Ez igaz a Y_P-re is, ha nagy erősítés szükséges, mert akkor a Y_D nem tud ellenszabályozni, nagy távolságnál, meghaladva a kívánt emelkedési sebességet, amit szeretnénk.
Aha, ennek megfelelően módosítom a limitálást. Tehát akár azt is megtehetem, hogy az akkumulált hibát limitálom, és akkor nem tud elszállni az I rész. Csak ezeket a -100...200 és 100...200 határértékeket nem értem.
Ja, és még valami, hogy az indegrálási és deriválási időket hogy választjátok meg? Mert én most játszásiból azt írtam bele, hogy minden 10. periódusban számoljon I-t. De ennek semmi tudományos alapja...
A mintavételezési idő attól függ, milyen gyors a folyamat. Ha nem probléma, akkor aránytalanul gyorsan is lehet mintavételezni, pl. egy szoba hőfok szabályozásához túlzásnak tűnik az 1sec, de miért is ne, ha nem probléma, viszont egy motornál 100, vagy 1000 minta is kellhet másodpercenként, ha nem akarod, hogy fejre álljon az egykerekű. Ezt érzéssel is ki lehet találni, de persze számolni is lehet (csak aki nem érzi, számolni se tudja).
A -100, +100 határoló értékeket az Y -100% +100% hoz arányítottam(motor PWM arány, előre, hátra pl.), ha ilyen terjedelmű a beavatkozójel. Ha nem ilyen terjedelmű, akkor ahhoz kell arányítani, amilyen tartományban szabályoz az Y kimenet.
Ja, értem. Tehát ha a P-t 10 ms-onként számolgatom, az nem rossz, az I-t pedig 10 periódusonként, tehát 100 ms-onként? Most már értem a határolásos dolgot is. Gyakorlatilag ezt csináltam, de egyenlőre a szabályozó kimenetével. De majd átírom, h a tagokat külön is határolja, és a szabályozó kimenetét is.
Idézet: „Gyakorlatilag ezt csináltam, de egyenlőre a szabályozó kimenetével.” Azaz nem ezt csináltad. Korlátoztál valamit, ami nem ez volt. Miért kéne az I-t más ütemben vizsgálni? Erre milyen megfontolás vezetett?
Ezt olvastam. Hogy P-t minden ütemben számoljuk, mintavételezési időnként, I-t csak Ti ütemenként, és D-t Td ütemenként.
Ez is egy módszer, de akkor nem kapsz beavatkozó jelet olyan sűrűn, mint Y_P-t. Ha gyors kezelés a cél, akkor ez elég luxus.
Értem. És a D? Azt is minden körben kiszámoltatod?
Miért ne? A D tag kiszámításakor az eltelt idő is benne van a képletben, így teljesen mindegy milyen a mintavételezési idő, a kapott érték fordítottan arányos lessz a változás sebességével, csak sokkal több alkalommal van vizsgálva, több beavatkozást megengedve ezzel.
Ha a szabályozandó kör lassú, lehet hosszabb mintavételi időkkel is operálni, de Y_tagonként különbözőekkel nem látom értelmét, főleg akkor nem, ha egy gyors folyamatot szabályozunk, mert az információ pazarlás. Lassú folyamatnál meg a Y_P-t és Y_I-t se kell gyorsan kiszámolni...
Értem. Csak így nem látom azt, hogy a Ti-nek és a Td-nek mi a szerepe, illetve hogy hol realizálódik a digitális pid-nél. De legalább a képlet jó, amivel számolnék?
Y_pid=Yp+Yi+Yd, ahol Yp=Kp*(SP-PV) Yi=Ki*(Akkumulált hiba+aktuális hiba) Yd=Kd*(aktuális hiba-előző hiba)
Itt az idő egységnyi, ezért nem szerepel a képletekben. Így is működik.
Viszont az Yd nem jó. Nem a hibákat kell kivonogatni, hanem a mért értékeket(kd*(előző PV-jelenlegi PV)). Ez azért jobb, mint a hibák összevetése, mert nincs benne az SP, amit ha megváltoztatsz, indokolatlan Yd összetevőt adna(igaz csak rövid ideig). A képletedben egyébként is rossz előjel jönne ki (Mint ahogy számtalan tudományos PID leírásban látható. Van ahol meg is magyarázzák a hibás képlet működését, a képlet szerint jól, de a működés szempontjából rosszul!)
Szeretnék segítséget kérni extrém folyamathoz használható PID beállításokhoz.
Pl. A fogyasztók rapszodikusan és drasztikusan terhelik a hőtermelő egységet. Az öntanuló szoftver elfogathatóan beállítja a kimenő jelet, de a beavatkozó egység a két véglet között folyamatosan jár, köztes állás szinte nincs. Lehet ezen javítani, vagy ez már PLC-s feladat? |
Bejelentkezés
Hirdetés |