Arduino schéma - arduino.sk

PID trojstavová regulácia.

Vaše nápady a pomoc s Vašimi projektami
Príspevky: 37
Registrovaný: Pon 15. Sep 2014 13:29:24

PID trojstavová regulácia.

Poslaťod JK_Soft » Ned 25. Jan 2015 14:58:47

Veľmi pekne by som vás chcel poprosiť ako sa dá urobiť trojstavová PID regulácia pre ventil (otvor-stop-zatvor).Existuje na to nejaká knižnica? Hodiny strávené na google nepomohli. Chcel by som ovládať trojcestný ventil na podlahovke. Prof. regulátory johnson controls alebo siemens tam nie je problém je na to určený blok. Malo by to pracovať tak, že zadám celkový čas chodu ventila z jednej polohy do druhej a regulátor potom pomocou dvoch digitálnych výstupov spína na základe odchýlky od žiadanej hodnoty. V regulátoroch johson controls FX-06 sa ten blok nazýva damper PAT output. Na základe pid spína dve relé na výstupe.
Ak máte nejaké info budem moc vďačný.

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: PID trojstavová regulácia.

Poslaťod posjirka » Ned 25. Jan 2015 19:53:26

Ahoj, nějákou dobu jsem regulace projektoval, tak snad jsem to nezapomněl. V základu máš regulaci pomocí servopohonu (belimo, eseb, ..) s napájením 24 a nebo 230 V. Ty jsou rozděleny na :
2 bodové s pružinou na automatické zavření (přiveď napětí - otevři, vypni napětí - zavři)
3 bodové (pomocí 2 relé spínáš cívky, pomocí kterých se přidává nevo ubírá)
analogové - nastavuje se pomocí analogového napětí 0-10V (0V - zavřeno, 10V - naplno otevřeno a vše mezi tím)

Regulaci máš ve výsledku jedním ze 2 způsobů:
- pomocný potenciometr - dá se dokoupit k servpohonům a ukazuje nám jak moc je ventil otevřen.
- časovou konstantou - víš že se ventil otevře z max na min za 60 s. potřebuješ jeje otevřít na 10% tak zajedeš na minimum a pak na 6s spusítš směr přídání.
- u analogových to neřešíš, protože mu posíláš v napětí hodnotu, jakou požaduješ.

Doporučil bych ti spíš ten potenciometr. Stojí cca 200-300 kč (originální včetně úchytů) a máš jistotu, že víš kde se ventil nachází.
Když použiješ časovou konstantu tak se ti stane, že se resetuje mikročip a ty nevíš kde jsi skončil. U profi řešení se časová konstanta používá, ale je tam že se alespo'n 1x denně přejede na 0% čímž víš co a jak.

Na druhou stranu pokud chceš pouze fungovat pouze pulzně (přidávat/ubírat podle toho zda překračuješ nastavenou teplotu nebo jí nedosahuješ) tak ani polohu serva nepotřebuješ. Serva mají koncové spínače, které je při koncových polohách odepnou, takže je nespálíš.

V každém případě doporučuju 3 bodový sevopohon na 230V, protože se bude pomocí relel snadno ovládat a nemusíš řešit zdroj.

Pár věcí k návrhu:
- je třeba nastavit si dobře hysterze třeba aby +/- 2 stupně servo nereagovalo jinak bude neustále lítat vlevo vpravo a to mu nedělá dobře.
- dobře promysli i tepelnou setrvačnost. Pootoč server třeba o 10% a 1-2 minuty počkej jestle se něco nezmění.

Snad jsem trochu pomohl ...
Jirka

Príspevky: 37
Registrovaný: Pon 15. Sep 2014 13:29:24

Re: PID trojstavová regulácia.

Poslaťod JK_Soft » Ned 25. Jan 2015 20:37:25

Ahoj Posjirka. Ďakujem za reakciu.
Regulačné obvody poznám, aj servopohony pracujem v tom obore. V nemenovanom meste mám na starosti 70 vymeníkových staníc. Aj ja som navrhoval regulácie vykurovania ale v systéme Johnson Controls rady DX 9100 alebo novšie FX 06 a vyššie. Ale tieto regulátory sa programujú blokmi kde mám zadefinované základné funkcie. Veď to asi poznáš. pridáš bloky, prepojíš a zadefinuješ typ snímačov, potrebné výstupy, alarmy a komunikáciu a je hotovo.
Ja som sa chcel spýtať na reguláciu trojstavového pohomu pomocou arduina bez spätnej väzby. Aká je možnosť pid regulácie cez dva výstupy. Presne ako píšeš pulzne (otvor-stop-zatvor). Dĺžka impulzu v závistlosti na regulačnej odchýlke. Existuje na niečo takéto knižnica pre arduino? Ja som len začiatočník v arduine a v programovacom jazyku. Profi regulátory sú na moje domáce použitie drahé stovky €.

Príspevky: 89
Registrovaný: Uto 03. Jún 2014 21:48:35
Bydlisko: Košice Slovakia

Re: PID trojstavová regulácia.

Poslaťod kosice4 » Ned 25. Jan 2015 22:17:31

No nevyznám sa do regulácie kúrenia, ale keď sa bavíme o PID regulácii, tak nenastavujeme žiadnu hysterziu pokiaľ sa nemýlim. Nastavujeme P, I a D.
Na Arduino je spravená knižnica PID PID_v1.h, dá sa stiahnuť a trošku sa s tým pohrať.
http://playground.arduino.cc/Code/PIDLibrary
Niečo som už s tým skúšal ale fakt neviem či sa to hodí na ventily, ktoré spomínate.
Ďakujem za pomoc posjirka, Diego, Xeram a barado :)

Príspevky: 37
Registrovaný: Pon 15. Sep 2014 13:29:24

Re: PID trojstavová regulácia.

Poslaťod JK_Soft » Ned 25. Jan 2015 23:27:53

Ahoj kosice4.
Aby som to vysvetlil. Štandartne používané pohony na regulačné ventily sú ovládane nasledovne:
Priemyselné pohony - napätím 0 - 10v, alebo prúdom 4 - 20 mA alebo 0 - 20 mA. Tie sú ale drahé.
V domácej automatizácií sa väčšinou používajú pohony ktoré majú tri vývody. jeden spoločný, druhý zatváranie, tretí otváranie.
Pokiaľ som to dobre pochopil PID knižnica používa na výstupe len PWM moduláciu. Ja som sa chcel len spýtať či sa nedá výstup z PID regulátora previesť na dva dig. výstupy, otvor a zatvor v závislosti na odchýlke žiadanej a skutočnej teploty.
Napr. doba chodu ventila je 100 sek. Ak PID regulátor vypočíta otvorenie na 10% tak na digitálnom výstupe bude 10 sek. impulz.
Ak dostane požiadavku zatvor na 8% tak na druhom výstupe pre zatváranie dostane 2 sek. impulz.
Nikde som to nevidel riešiť, tak preto sa pýtam či je to vôbec možné. Veď je to bežné ovládanie pohonov v systémoch kúrenia a chladenia.

Obrázok užívateľa
Príspevky: 133
Registrovaný: Štv 06. Nov 2014 12:06:09

Re: PID trojstavová regulácia.

Poslaťod budvar10 » Pon 26. Jan 2015 9:20:41

Samozrejme, že je to možné. Vyrobiť impulz na digitálnom I/O nie je problém.

Príspevky: 37
Registrovaný: Pon 15. Sep 2014 13:29:24

Re: PID trojstavová regulácia.

Poslaťod JK_Soft » Pon 26. Jan 2015 9:52:41

A mohol by mi niekto uviesť príklad ako? Dĺžka impulzu závislá na reg. odchýlke?

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: PID trojstavová regulácia.

Poslaťod posjirka » Pon 26. Jan 2015 10:44:49

Jak se dostanu vecer na pc tak ti dam priklad. Bude staci na regulaci na nastavenou teplotu nebo chces vylozene na procenta natoceni?

Príspevky: 37
Registrovaný: Pon 15. Sep 2014 13:29:24

Re: PID trojstavová regulácia.

Poslaťod JK_Soft » Pon 26. Jan 2015 11:20:51

posjirka píše:Jak se dostanu vecer na pc tak ti dam priklad. Bude staci na regulaci na nastavenou teplotu nebo chces vylozene na procenta natoceni?

Posjirka veľmi si cením tvoju ochotu. Pokiaľ by som mohol zobraziť aj percenta, to by bolo výborné, ale to bude asi náročnejšie na programovanie. Nechám to na teba ako mi poradíš už sa teším že sa nájde riešenie. Ďakujem.

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: PID trojstavová regulácia.

Poslaťod posjirka » Uto 27. Jan 2015 22:49:37

mam trochu zpozdeni, ale tady je jednoduchy kod. udelal jsem to opravdu primitivne. Pouzivam funkce delay takže behem prejizdeni serva je procesor necinny. šlo by to udělat pomoci časove funkce millis, ale musel bych použít víc proměnných (smer chodu, prepinani kontroly chodu a kontroly uhlu dopocitavat odchylky a pod.) Četl jsem dobré přirovnání funkci delay a millis k realnemu životu. Představ si že jdeš na oběd
- delay - zastavíš se na ulici a koukáš na hodinky. Čekáš dokud nebude 12 hodin. Až je 12 hodin jdeš na oběd.
- millis - normalně jdeš dá děláš co potřebuješ a občas se podíváš na hodinky kolik je. Může se ti tedy stát že na oběd dorazíš později, nebo ti zavřou.
Právě pokud používáš čidla teploty ds18b20, tak v parazitním modu mají na změření teploti cca 750ms. Po tu dobu arduino stojí a čeká...

Trochu jsem odbočil. Kod je řešen tak, že potenciometrem na A0 si nastavíš uhel natočení.
Kód: Vybrať všetko
// Regulace 3-bodového servopohonu
// uhel natoceni bude v zavislosti na napěti na pinu A0
// To bude realizováno pomocí potencimetru pripojenemu na A0 proti zemi a +5V

// verze 1

// pripojeni potenciometru. hodnota neni kriticka staci 1-100 kOhm:
//           
//            /
//      *****/***
// +5V -*   /   *- GND
//      ***/*****
//         |
//         A0
//
// Rele na pinu plus i minus je treba pripojit pres tranzistor a logika je ze log.1 je sepnuto
// program je demonstracni a pouziva funkci delay, tudiz po dobu prejezdu serva nebude arduino reagovat.
// pro opravdove pouziti doporucuji pouzit funkci millis nebo knihovnu Timer1.

int prejezd = 60; // doba v sekundach za kterou prejede servopohon z 0 do 100%
int nastaveni = 0; // prepocet napeti 0-5V z A0 na 0-100%
int aktualni = 100; // aktualni natoceni serva

#define plus 4 // pin rele, ktere na servu pridava
#define minus 5 // pin rele, ktere na servu ubira
#define potenciometr A0 // pin potenciometru
int procento = (prejezd*10); // kolik milisekund bude trva prejezd o 1 procento

void setup() {
  pinMode(plus, OUTPUT); //  nastav pin na vystup
  pinMode(minus, OUTPUT); //  nastav pin na vystup
  pinMode(potenciometr, INPUT); //  nastav pin na vystup
  nulujServo();// prejed na zacatek - tim nulujes natoceni serva pri startu
}

void loop() {
  nastaveni = map(analogRead(potenciometr), 0, 1023, 0, 100); // prepocet vstupu napeti na procenta otevreni, precte hodnotu z A0 a prevede na 0-100
  if (aktualni == nastaveni) { // kdyz je nastaveny a pozadovany uhel stejny
    vypniServo(); //vypni servo
  } else { // jinak pohniservem
    if (aktualni < nastaveni) { // kdyz je aktualni uhel mensi nez nastaveny
      pridejServo(); // pridej na servu
    } else {
      uberServo(); // uber servo
    }
  }
}

// funkce nulovani servopohonu
void nulujServo() {
  digitalWrite(plus, 0); // blokuj rele pridavani
  digitalWrite(minus, 1); // sepni rele ubirani
  delay(prejezd*1000); // cekej dokud neprejedes na 0
  aktualni = 0; // aktualni uhel je 0 procent
}

// funkce vypni servo
void vypniServo() {
  digitalWrite(plus, 0); // blokuj rele pridavani
  digitalWrite(minus, 0); // blokuj rele ubirani
}

// funkce pridej servo
void pridejServo() {
  digitalWrite(plus, 1); // sepni rele pridavani
  digitalWrite(minus, 0); // blokuj rele ubirani
  delay(procento); // cekej dokud neprejedes o 1 procenoto
  aktualni ++; // zvys aktualni uhel o 1 procento
}

// funkce uber servo;
void uberServo() {
  digitalWrite(plus, 0); // blokuj rele pridavani
  digitalWrite(minus, 1); // sepni rele ubirani
  delay(procento); // cekej dokud neprejedes o 1 procento
  aktualni --; // sniz aktualni uhel o 1 procento
}


Myslím, že na pochopení principu je to dostatečné a šlo by to použít i v praxi.

Príspevky: 37
Registrovaný: Pon 15. Sep 2014 13:29:24

Re: PID trojstavová regulácia.

Poslaťod JK_Soft » Str 28. Jan 2015 17:36:12

posjirka píše:mam trochu zpozdeni, ale tady je jednoduchy kod. udelal jsem to opravdu primitivne. Pouzivam funkce delay takže behem prejizdeni serva je procesor necinny. šlo by to udělat pomoci časove funkce millis, ale musel bych použít víc proměnných (smer chodu, prepinani kontroly chodu a kontroly uhlu dopocitavat odchylky a pod.) Četl jsem dobré přirovnání funkci delay a millis k realnemu životu. Představ si že jdeš na oběd
- delay - zastavíš se na ulici a koukáš na hodinky. Čekáš dokud nebude 12 hodin. Až je 12 hodin jdeš na oběd.
- millis - normalně jdeš dá děláš co potřebuješ a občas se podíváš na hodinky kolik je. Může se ti tedy stát že na oběd dorazíš později, nebo ti zavřou.
Právě pokud používáš čidla teploty ds18b20, tak v parazitním modu mají na změření teploti cca 750ms. Po tu dobu arduino stojí a čeká...

Trochu jsem odbočil. Kod je řešen tak, že potenciometrem na A0 si nastavíš uhel natočení.
Kód: Vybrať všetko
// Regulace 3-bodového servopohonu
// uhel natoceni bude v zavislosti na napěti na pinu A0
// To bude realizováno pomocí potencimetru pripojenemu na A0 proti zemi a +5V

// verze 1

// pripojeni potenciometru. hodnota neni kriticka staci 1-100 kOhm:
//           
//            /
//      *****/***
// +5V -*   /   *- GND
//      ***/*****
//         |
//         A0
//
// Rele na pinu plus i minus je treba pripojit pres tranzistor a logika je ze log.1 je sepnuto
// program je demonstracni a pouziva funkci delay, tudiz po dobu prejezdu serva nebude arduino reagovat.
// pro opravdove pouziti doporucuji pouzit funkci millis nebo knihovnu Timer1.

int prejezd = 60; // doba v sekundach za kterou prejede servopohon z 0 do 100%
int nastaveni = 0; // prepocet napeti 0-5V z A0 na 0-100%
int aktualni = 100; // aktualni natoceni serva

#define plus 4 // pin rele, ktere na servu pridava
#define minus 5 // pin rele, ktere na servu ubira
#define potenciometr A0 // pin potenciometru
int procento = (prejezd*10); // kolik milisekund bude trva prejezd o 1 procento

void setup() {
  pinMode(plus, OUTPUT); //  nastav pin na vystup
  pinMode(minus, OUTPUT); //  nastav pin na vystup
  pinMode(potenciometr, INPUT); //  nastav pin na vystup
  nulujServo();// prejed na zacatek - tim nulujes natoceni serva pri startu
}

void loop() {
  nastaveni = map(analogRead(potenciometr), 0, 1023, 0, 100); // prepocet vstupu napeti na procenta otevreni, precte hodnotu z A0 a prevede na 0-100
  if (aktualni == nastaveni) { // kdyz je nastaveny a pozadovany uhel stejny
    vypniServo(); //vypni servo
  } else { // jinak pohniservem
    if (aktualni < nastaveni) { // kdyz je aktualni uhel mensi nez nastaveny
      pridejServo(); // pridej na servu
    } else {
      uberServo(); // uber servo
    }
  }
}

// funkce nulovani servopohonu
void nulujServo() {
  digitalWrite(plus, 0); // blokuj rele pridavani
  digitalWrite(minus, 1); // sepni rele ubirani
  delay(prejezd*1000); // cekej dokud neprejedes na 0
  aktualni = 0; // aktualni uhel je 0 procent
}

// funkce vypni servo
void vypniServo() {
  digitalWrite(plus, 0); // blokuj rele pridavani
  digitalWrite(minus, 0); // blokuj rele ubirani
}

// funkce pridej servo
void pridejServo() {
  digitalWrite(plus, 1); // sepni rele pridavani
  digitalWrite(minus, 0); // blokuj rele ubirani
  delay(procento); // cekej dokud neprejedes o 1 procenoto
  aktualni ++; // zvys aktualni uhel o 1 procento
}

// funkce uber servo;
void uberServo() {
  digitalWrite(plus, 0); // blokuj rele pridavani
  digitalWrite(minus, 1); // sepni rele ubirani
  delay(procento); // cekej dokud neprejedes o 1 procento
  aktualni --; // sniz aktualni uhel o 1 procento
}


Myslím, že na pochopení principu je to dostatečné a šlo by to použít i v praxi.

Posjirka veľmi ďakujem. Tak toto som nečakal že by si niekto dal toľko práce. V podstate celý kód a podrobný popis. Veľmi mi to pomohlo a naučil som sa niečo nové. Ovládanie relé som z toho už pochopil.
Ešte potrebujem doriešiť ako nahradiť potenciometer, PID regulátorom (myslím PID kniznicu)
Veľké dík posjirka.

Príspevky: 89
Registrovaný: Uto 03. Jún 2014 21:48:35
Bydlisko: Košice Slovakia

Re: PID trojstavová regulácia.

Poslaťod kosice4 » Str 28. Jan 2015 23:55:54

@ posjirka fakt pekná práca :D
Ďakujem za pomoc posjirka, Diego, Xeram a barado :)

Príspevky: 37
Registrovaný: Pon 15. Sep 2014 13:29:24

Re: PID trojstavová regulácia.

Poslaťod JK_Soft » Štv 29. Jan 2015 9:08:53

kosice4 píše:@ posjirka fakt pekná práca :D

Česť takým ľuďom v dnešnej dobe. Málo komu by sa chcelo písať kód len tak pre druhých a venovať tomu čas. Ešte raz posjirka ďakujem.

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: PID trojstavová regulácia.

Poslaťod posjirka » Štv 29. Jan 2015 21:31:11

Jen me neprechvalte. Tu mikrovlnku pro kosice4 mam rozdelanou pekne dlouho a nemuzu se dokopat k dokonceni. Tu knihovnu pid jsem nezkoumal ale jaky mas vystup z toho regulatoru...

Príspevky: 37
Registrovaný: Pon 15. Sep 2014 13:29:24

Re: PID trojstavová regulácia.

Poslaťod JK_Soft » Pia 30. Jan 2015 14:03:10

posjirka píše:Jen me neprechvalte. Tu mikrovlnku pro kosice4 mam rozdelanou pekne dlouho a nemuzu se dokopat k dokonceni. Tu knihovnu pid jsem nezkoumal ale jaky mas vystup z toho regulatoru...

Ahoj posjirka.
Ja nemám druhý regulátor. Všetko som chcel riešiť arduinom. To znamená použiť knižnicu PID.h, ale ak som to dobre pochopil, PID regulátor v arduine ma výstup PWM. Ja nepotrebuje výstup PWM lebo s takýp pohomom na ventiloch som sa ešte nestretol. Ja potrebujem ovládať bežné používané a dostupné ventily ktoré sú trojstavové cez dva D/O arduina samozrejme cez delé. Presne tak ako si mi to popísal ale ako setpoint nepožívať potenciometer, ale a to neviem ako, zakomponovať PID reguláciu.
Výkonovú časť mám vyriešenú. napr. ako tu. http://arduino.sk/viewtopic.php?f=3&t=166&sid=e9c766d3ff149d0f70f1b2badc68f7db

Ďalší

Späť na Projekty vo fáze vývoja