PID regulace

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
silas15
Příspěvky: 90
Registrován: 09 úno 2013, 00:00

PID regulace

#1 Příspěvek od silas15 »

Ahoj,
navrhuji PID regulátor teploty vody. Buď přidá teplou nebo chladnou a tak nastaví správnou hodnotu na výstupu s čidlem. Program pro řízení je takovýto:

Kód: Vybrat vše

Ek = zadana - skutecna;               //výpočet chyby
sum = sum + Ek;
Pk = Kp * Ek;                              //např 8 * chyba
Ik = (Ki) * (sum);                        //vypocet integracni slozky
Dk = Kd * ((Ek) - (Ekp));             //vypocet derivacni slozky
Uk = (Pk + Ik + Dk);  //vysledna regulace

Ekp = Ek;                                    //ulozeni
Ek = 0;


pohon pro regulaci má konstatntní rychlost přetáčení. Zatím si to zkouším s potenciometrem místo senzoru. K konstanty se snažím nějak vhodně nastavit, ale steně výsledná hodnota (Uk) regulace má určité překmity. Když se totiž hodnota skutečná blíží reálné, při změně i o pouhý stupeň okamžitě na chvilku vyskočí složka derivační a změní smysl otáčení. Hned potom se zase hodnota vrátí k původní a otáčí správně. Jde mi o to, jestli je to normální chování, či něco nastavuji špatně. Do oscilace se to podle mě nedostane. Regulátor zasahuje po 1sec. Jde mi o to, jestli ty překmity mám řešit v konstanách PID, anebo dalším kódem. Je takové zvláštní, že by to chtělo otáčet jako že přidávat studenou a pak na vteřinu zase přidalo teplou a hned zase přidávalo studenou atd. do požadované teploty.

Je mi jasné, že v zapojení s vodou se konstanty změní, jde mi spíš o ty překmity.
Uživatelský avatar
Zmije
Příspěvky: 1691
Registrován: 30 čer 2005, 00:00
Bydliště: Pardubický kraj

#2 Příspěvek od Zmije »

Neměla by se ta derivace filtrovat?
Uživatelský avatar
silas15
Příspěvky: 90
Registrován: 09 úno 2013, 00:00

#3 Příspěvek od silas15 »

filtrovat jak? ale pomohlo by to, to ano.
Uživatelský avatar
Cust
Příspěvky: 7239
Registrován: 17 led 2007, 00:00
Bydliště: Milotice u Kyjova

#4 Příspěvek od Cust »

No, ono by to chtělo udělat model toho co chceš regulovat a pak spočítat konstanty regulátoru.
Každopádně sniž Kd klidně na nulu.
Uživatelský avatar
silas15
Příspěvky: 90
Registrován: 09 úno 2013, 00:00

#5 Příspěvek od silas15 »

V tom případě už je to jen P kontroler :-) I složka je mi zde k ničemu, protože rychlost otáčení neovlivním. Derivační jsem tam chtěl mít z toho důvodu, protože při otáčení ventil přestřelí teplotu, je zde určité dopravní zpoždění.
Uživatelský avatar
Cust
Příspěvky: 7239
Registrován: 17 led 2007, 00:00
Bydliště: Milotice u Kyjova

#6 Příspěvek od Cust »

I složku potřebuješ, ta ti dělá nenulovou reg. odchylku!
Uživatelský avatar
Cust
Příspěvky: 7239
Registrován: 17 led 2007, 00:00
Bydliště: Milotice u Kyjova

#7 Příspěvek od Cust »

Tak jsem si to pořádně přečetl ještě jednou. Rychlost otvírání a zavírání teplé/studené vody nemůžeš změnit. Zavírání a otvírání provádíš jednou za vteřinu. Je to tak? Pokud ano, nechápu, proč tam navrhuješ PID. Každopádně bych udělal třístavový regulátor, který bude dávat signál otáčení doleva, do prava, nebo off. Nic lepšího v takovém uspořádání stejně nezmůžeš.

Ani nechápu jak to, že ti mění derivační složka směr při změně žádané hodnoty. To není vlastnost regulátoru. Je to tím, že tam máš něco špatně a není to v kódu, který jsi zveřejnil.
Uživatelský avatar
silas15
Příspěvky: 90
Registrován: 09 úno 2013, 00:00

#8 Příspěvek od silas15 »

Derivační složku tam chci použít pro to, že chci, aby to kousek před žádanou hodnotou už zastavovalo. protože jakmile to bude řídit absolutně, tak zase ta teplá voda ohřeje víc tu studenou a je to naprd teplota stoupne a zase to bude regulovat. tak že se to neustálí. jinak propočet je po jedné sekundě, řízení funguje v závislosti na odchylce. možná, kdyby byl krok třeba 2 sekundy a pak čekal, co se stane a přidal, a zase a zase, ale tím se ta regulace dost zpomalí.

zadana = 40 skutecna = 41 Ekp (předchozí teplota 42) = -1
derivační složka mění směr, když je Kp = 1 a rozdíl -1 st. tak Pk = -1 ale v případě Kd = 20 * ((-1)-(-1)) = 20 výsledné Uk = 19. jakmile teplota zůstane na těch 41 st. výsledek bude -1. Takže v mé případě se přepíná směr otáčení.
Uživatelský avatar
Cust
Příspěvky: 7239
Registrován: 17 led 2007, 00:00
Bydliště: Milotice u Kyjova

#9 Příspěvek od Cust »

Derivační složka ti zrychluje odezvu a ne zpomaluje. To co chceš ti dělá integrační složka. Zmenši zesílení derivační složka na minimum. Nejlépe na nulu. Máš tam dopravní zpoždění jako blázen a derivační složku to samé -> cesta do pekel. Kd dej rovno nule a zkus funkci.
Nejlépe ale uděláš, když si nejdříve sestavíš model a pak navrhneš optimální regulátor - pak si s ním už laboruj.
Uživatelský avatar
mtajovsky
Příspěvky: 3728
Registrován: 19 zář 2007, 00:00
Bydliště: Praha

#10 Příspěvek od mtajovsky »

Ještě si uvědomte, že integrační i derivační složka je závislá na periodě, s jakou se to vzorkuje. Integrační konstanta se zvyšováním vzorkovacího kmitočtu zvyšuje a derivační snižuje. Pokud se akce opakuje 1x/s, tak je derivační složka značná, protože za 1 s se stane velká změna, kterou pak vynásobíte ještě Kd.

Jinak souhlas s Cust, derivační složka obvykle přináší do systému víc neklidu než užitku. Abyste derivační složku slušně uplatnil musíte vzorkovat řádově rychleji, než jsou časové konstanty. Nulovou odchylku vám zajistí astatismus - integrační složka, protože pořád sčítá (sebemenší) odchylku a použije ji na doregulování.

Pokud trváte na dané periodě vzorkování, tak nedělejte PID, ale skutečný číslicový regulační algoritmus. Viz například klasická publikace:

Vavřín, Zelina: Automatické řízení počítačem. SNTL, 1982
Uživatelský avatar
silas15
Příspěvky: 90
Registrován: 09 úno 2013, 00:00

#11 Příspěvek od silas15 »

děkuji za odpovědi, přemýšlel jsem o tom, zkusím tedy použít proporcionální jen složku a prodloužit vzorkovací frekvenci. pohraji si s tím a pak napíšu, jak jsem dopadl.
Uživatelský avatar
Cust
Příspěvky: 7239
Registrován: 17 led 2007, 00:00
Bydliště: Milotice u Kyjova

#12 Příspěvek od Cust »

Nejsem si zcela jist co to je prodloužit frekvenci, ale obecně se dá říct, že čím vyšší vzorkovací frekvence vzorkování, tím líp. Taktéž dynamika regulátoru by měla být výš než dynamika řízeného systému. Nikdy ne vyšší než vzorkovací frekvence!!!
Pokud tam máš dopravní zpoždění, musíš s tím počítat!
Uživatelský avatar
silas15
Příspěvky: 90
Registrován: 09 úno 2013, 00:00

#13 Příspěvek od silas15 »

zkoušel jsem regulátor a zjistil, že dopravní zpoždění je kolem 7 sekund. Regulátor se je rozkmitaný jak s D složkou tak bez. Tak mě napadlo. Vzorkovací frekvenci nechám na 1 sec. Bude tam asi regulační zásah 5 sec (otáčení ventilem), potom čekání 10 sec na ustálení, pak další. Když bude hodnota blízko požadované cca +- 3 stupně. Bude regulační zásah asi 1 sec a zase 10 sec čekání na ustálení. Nic lepšího mě k tomu nenapadá.

Hledal jsem nějakou literaturu ohledně číslicové regulace. Princip jsem pochopil, ale s realizací by to bylo težké, protože mi derivace a integrace moc nejdou. Navíc mám pocit, že to musí jít jednodušeji.
Uživatelský avatar
Cust
Příspěvky: 7239
Registrován: 17 led 2007, 00:00
Bydliště: Milotice u Kyjova

#14 Příspěvek od Cust »

S dopravním zpožděním to jednoduše povětšinou nejde. :-)
Uživatelský avatar
silas15
Příspěvky: 90
Registrován: 09 úno 2013, 00:00

#15 Příspěvek od silas15 »

Vždycky jde počkat. Tady to bude zhruba 10 sec. I když bych rád, nic lepšího nevymyslím. Na to bych potřeboval znát polohu ventilu a možná i teplotu teplé a studené vody. S tím že, znám jen teplotu na výstupu, teplo buď přidám anebo uberu a to konstantní rychlostí, tak si nedovedu představit něco lepšího než čekat na to zpoždění. Kdyby tam bylo servo, dovedl bych si představit, že by se při velké odchylce pořádně otočilo a relativně rychle vracelo a tím teplotu dostavilo mnohem rychleji. Ale pořád si to představuji jako hurvínek válku, protože o regulacích nic moc nevím.
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“