Arduino schéma - arduino.sk

PID trojstavová regulácia.

Vaše nápady a pomoc s Vašimi projektami
Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: PID trojstavová regulácia.

Poslaťod posjirka » Pia 30. Jan 2015 21:20:07

Tak to udelame jinak. Co presne potrebujes ridit a cim. Tzn kolik budes sledovat teplot v jakych rozmezich a jak na to maji reagovat ventily. Kolik ventilu budes ovladat. Jak si predstavujes hmi rozhrani a chces to resit skladackou z desek arduina nebo budes mit vlastni reseni. Jedu ted na tyden na hory a nevim jak s internetem takze se ozvu mozna az ta tydem.

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

Re: PID trojstavová regulácia.

Poslaťod kosice4 » Sob 31. Jan 2015 11:28:21

posjirka píše:Tu mikrovlnku pro kosice4 mam rozdelanou pekne dlouho a nemuzu se dokopat k dokonceni.

@ posjirka mne to nehorí, v pohode, má to čas a dík že na to myslíš :)
Ďakujem za pomoc posjirka, Diego, Xeram a barado :)

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

Re: PID trojstavová regulácia.

Poslaťod posjirka » Sob 31. Jan 2015 21:58:34

Jen pro info ta PID knihovna má za ukol pouze dolaďovat nastavenou / aktualni hodnotu. Nemá nic společného s regulaci jako s principem ...

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

Re: PID trojstavová regulácia.

Poslaťod JK_Soft » Pon 02. Feb 2015 9:22:23

posjirka píše:Jen pro info ta PID knihovna má za ukol pouze dolaďovat nastavenou / aktualni hodnotu. Nemá nic společného s regulaci jako s principem ...

Ahoj posjirka. Presne to potrebujem. Klasický PID regulátor ktorý ovláda trojbodový ventil tak ako si napísal v kóde. Nastavím si žiadanú teplotu a PID na základe odchýlky bude otvárať alebo zatvárať ventil. Mne sa hlavne jednalo o to, ako prepojiť PID knižnicu s výstupom ako si napísal v kóde. Potrebujem ovládať jeden ventil na podlahové kúrenie a udržiavať teplotu okolo 40°C. To sa v praxi bežne robí pomocou PID regulátora. Môžem tu priložiť ako funguje na inom regulátore napr. siemens ak sa k tomu dostanem. Cez víkend som nemal prístup k internetu. Hlavne chcem zistiť či sa niečo také dá urobiť pomocou arduina.

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

Re: PID trojstavová regulácia.

Poslaťod JK_Soft » Sob 07. Feb 2015 23:12:17

Asi to nebude jednoduché. Na EN fórach sa tiež informujú o takej možnosti PID regulácie ale tiež nikto nemá odpoveď.

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

Re: PID trojstavová regulácia.

Poslaťod posjirka » Ned 08. Feb 2015 11:22:29

ahoj, takže potřebuješ ovládat 1 ventil s 3-bodovým zapojením na teplotu cca 40 st.C.
Jak chceš zobrazit aktuální/nastavenou teplotu a jak jí chceš nastavit, případně v jakém roszahu a krocích.
jako nejjednodušší variantu vidím ovládání pomocí 2 potenciometru (teplota od 30 do 50 st.C / odchylka 0-5 st.C), výstup 2 rele (+/-) k tomu třeba LED dioda jako Heart (že regulátor funguje) a LED porucha.
Můžeme to třeba doplnit o LCD display 2x16 nebo 2x8 zn. pro zobrazení měřených/nastavených hodnot.
Co ty na to?
Hlavně jaké budeš mít čidlo teploty? od toho se musíme odpíchnout.

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

Re: PID trojstavová regulácia.

Poslaťod JK_Soft » Ned 08. Feb 2015 12:38:31

Posjirka už som myslel že si rezignoval. Veľmi si vážim že sa venuješ môjmu problému ale v podstate by to bol veľmi užitočný kód.
Jediné čo by som potreboval je previesť signál PWM z PID výstupu na 3-bod/ 2 dig. výstupy. Najlepšie bude ak ti pošlem ako sa to rieši v profesionálnom regulátore Johnson Controls alebo siemens. Akýsi druh prevodníka v ktorom sa zadefinuje celkový čas prechodu ventila z jednej krajnej polohy do druhej. Snímač teploty by bol DS18B20 a setpoint by bola premenná. Hneď ako sa dostanem k druhému PC kde mám programátor na Johnson tak sem hodím print screen. Alebo v SS ti pošlem moje číslo ak mi prezvoníš ja ti zavolám a vysvetlím ako si to predstavujem.

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

Re: PID trojstavová regulácia.

Poslaťod posjirka » Ned 08. Feb 2015 14:52:34

volání do čech by tě vyšlo pěkně draho ... :)
Zhruba vím jak fungují PID regulátory a ve výsledku je uplně jedno jestli otáčíš ventilem po 0,5 st.nebo po 3. st. vše ti spíš závisí na definované teplotě a na maximálné odchylce. Ve výsledku jde o velmi jednoduchý kod. Zkusím ti něco navrhnout a uvidiš zda je to co potřebuješ. Udělám ten základ na 2 potenciometry + 2 relé + 1 chybová a 1 provozní led. Pak to zkusím rozšířit o LCD.

čím víc to pak člověk komplikuje a vymýšlí tím méně si bohužel uvědomoje co má všechno ošetřit za vyjímky, kterých najednou přibývá a začne se v kodu rychle ztrácet. Tohle bude v podstatě školní příklad, který jde dále rozšiřovat a modifikovat.

Zkusím se na to podívat během večera max. zítřka.

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

Re: PID trojstavová regulácia.

Poslaťod JK_Soft » Ned 08. Feb 2015 16:04:42

Posjirka prikladám sľubovaný objektový projekt Johnos Controls. Takto by som si to predstavoval, previesť PWM výstup PID na časovo závislé ovládanie dvoch výstupov.
Príklad. Výstup PID 0 - 100 % čas otvorenia ventila aby sa lepšie počítalo 100 sekund. Ak regulátor požaduje otvoriť na 10%, tak relé otvor, zopne na 10 sek. Ak bude regulátor požadovať zatvorenie na 5 %, relé zatvárania zopne na 5 sek.
Prílohy
J.C.Projekt.jpg
Projekt

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

Re: PID trojstavová regulácia.

Poslaťod posjirka » Uto 10. Feb 2015 23:14:43

Ahoj, tak jsem konecne upravil puvodni priklad tak aby fungoval na regulaci teploty.
Kod je doplnen o watchdog jako ochrane proti zaseknuti procesoru.
Při poruše čidla bude zavirat ventil.
Jak sis určitě všiml nemám tam už meření v kolika procentech je ventil otevren.
To udělame kdyžtak v dalši verzi třeba s LCD displayem.
Teď mužeš pro odladění použít seriove rozhrani, kde se ti bude dokola zapisovat status.
Potřebne knihovny jsou na staženi v přiložených odkazech.
Jen pro správnou funkci je potřeba mít tam ten PULL UP odpor proti +5V.
co ty na to?

Kód: Vybrať všetko
// Regulace 3-bodového servopohonu
// otevreni ventilu bude zavisle na namerene a nastavene teplote + nastavene max.odchylce
// pin A0 - vstup pro cidlo teploty. Je treba dat na nej pull up odpor 4k7 proti pinu a +5V
// pin 4 - rele otevreni ventilu
// pin 5 - rele zavreni ventilu
//
// verze 2
//
// rele na pinu plus i minus je treba pripojit pres tranzistor a logika je ze log.1 je sepnuto
// led dioda na pinu 6 je zapojena proti zemi
// pri chybe cidla bude zavirat ventil
//-----------------------------------------------------------------


// knihovny
#include <OneWire.h> // http://www.pjrc.com/teensy/td_libs_OneWire.html
#include <DallasTemperature.h> // https://github.com/milesburton/Arduino-Temperature-Control-Library
#include <avr/wdt.h> // watchdog ta je už v arduino od instalace. Slouzi k autoresetu v pripade zaseknuti procesoru

// promenne
int teplotaMin = 38; // min.teplota
int teplotaMax = 42; // max.teplota
int teplotaMerena = 0; // pro mereni teploty
boolean heart = 1; // funkce blikani

// konstanty
#define plus 4 // pin rele, ktere na servu pridava
#define minus 5 // pin rele, ktere na servu ubira
#define LED 6 // stavova LED dioda v rezimech blika (vse v poradku), sviti (chyba cidla nebo zaseknuty procesor), nesviti (zaseknuty procesor)
#define cidlo 7 // kde je pripojeno cidlo DS18b20

OneWire oneWire(cidlo); // instatnce 1-wire komunikace
DallasTemperature sensors(&oneWire); // pripojeni na knihovnu Dallas pro prepocet dat na teplotu

void setup() {
  wdt_enable(WDTO_8S); // nastaveni watchdogu na 8s (jinak muze zkolabovat uz pri nahravani programu
  pinMode(LED, OUTPUT); //  nastav pin na vystup
  digitalWrite(LED, 1); // rozsvit LED pro pripad chyby komunikace 1-wire
  pinMode(plus, OUTPUT); //  nastav pin na vystup
  pinMode(minus, OUTPUT); //  nastav pin na vystup
  sensors.begin(); // spusteni komuniakce 1-wire
  Serial.begin(9600); // start serioveho portu
  Serial.println("Regulace 3 cestneho ventilu verze 2");
}

void loop() {
  wdt_reset(); // vse v poradku resetuj watchdog
  // mereni teploty
  Serial.print("Hledam cidla... ");
  sensors.requestTemperatures(); // najdi cidla
  teplotaMerena = sensors.getTempCByIndex(0); // napis mi teplotu cidla 0 = prvni cidlo
  // regulace
  if (teplotaMerena = -127 ) { // -127 st C znamena chyba cidla
    Serial.print("chyba cidla.... zaviram servo");
    heart = 1; // mame chybu
    uberServo(); // uber servo
  } else { // zadna chyba jde se regulovat
    Serial.print("ok... "); // zadna chyba
    Serial.print(teplotaMerena); // namerena teplota
    Serial.print("°C ..."); // zadna chyba
    heart = !heart; // neguj hodnotu heart at nam blika led
    if (teplotaMerena <= teplotaMax &&  teplotaMerena >= teplotaMin){ // pokud je namerena teplota v pozadovanem rozmezi
      Serial.print("teplota je ok... vypinam servo"); // vse v poradku
      vypniServo(); //vypni servo
    } else { // jinak
      if (teplotaMerena > teplotaMax){ // pokud je namerena teplota vetsi
        Serial.print("teplota je vysoka... zaviram servo"); // vysoka teplota
        uberServo(); // uber servo
      }
      if (teplotaMerena < teplotaMin) { // no a posledni pripad je ze je merena teplota nizska
        Serial.print("teplota je nizska... oteviram servo"); // nizska teplota
        pridejServo(); // pridej na servu
      }
    }
  }
  digitalWrite(LED, heart); // indikace stavu
  Serial.println(""); // uzaviram radek
}

// 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
}

// funkce uber servo;
void uberServo() {
  digitalWrite(plus, 0); // blokuj rele pridavani
  digitalWrite(minus, 1); // sepni rele ubirani
}

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

Re: PID trojstavová regulácia.

Poslaťod JK_Soft » Štv 12. Feb 2015 10:51:23

Posjirka ja nemám slov. To si koľko pri tom sedel? Kompletný kód aj alarm a výstup na serial port. Profi prácička. Podľa toho kódu ale ventil otvorí alebo zatvorí. Ja som našiel niečo, ako by som si to predstavoval.
Nie je to síce založené na pid výpočtoch ale malo by to pracovať.
Kód: Vybrať všetko


/* ******************************************************************************* */
void Four_way_valve_control()
  {

/* ********* OPEN VALVE ***************** */
    if (Input_t <= SetPoint_t -1.5 && Valve_stop == true && Valve_closing == false && millis() > Valve_opening_time){
valve_error = SetPoint_t -1.5 -Input_t;
if (valve_error <= 2){ // if the difference is small
        Valve_stop = false; // valve moving
        Valve_opening = true;
        Valve_pause = millis() + 6000 - 2000 + (valve_error * 1000);
        digitalWrite(RelayPinClose, HIGH);
        digitalWrite(RelayPinOpen, LOW);
}else{
        Valve_stop = false;
        Valve_opening = true;
        Valve_pause = millis() + 6000;
        digitalWrite(RelayPinClose, HIGH);
        digitalWrite(RelayPinOpen, LOW);
}
   }
   /* ********* P A U S E 20 second after each valve switching ***************** */

   if (Valve_stop == false && millis() > Valve_pause) {
   //If the difference is greater than 10 degrees,
if (Input_t > SetPoint_t + 10) { //there is no pause
      Valve_closing_time = millis();
      Valve_opening_time = millis();
      Valve_stop = true;
} else {
      Valve_pause = millis() + 20000;
      Valve_closing_time = Valve_pause;
      Valve_opening_time = Valve_pause;
      Valve_stop = true;
        digitalWrite(RelayPinClose, HIGH);
        digitalWrite(RelayPinOpen, HIGH);
}
   }
/* ********* CLOSE VALVE ***************** */

    if (Input_t >= SetPoint_t + 1.5 && Valve_stop == true && Valve_opening == false  && millis() > Valve_closing_time){
      valve_error = Input_t - SetPoint_t + 1.5;
      if (valve_error > 2){// if the difference is small
        Valve_stop = false;
        Valve_closing = true;
        Valve_pause = millis() + 6000 - 2000 + (valve_error * 1000);
      digitalWrite(RelayPinOpen, HIGH);
      digitalWrite(RelayPinClose, LOW);
      }else{
        Valve_stop = false;
        Valve_closing = true;
        Valve_pause = millis() + 6000;
      digitalWrite(RelayPinOpen, HIGH);
      digitalWrite(RelayPinClose, LOW);
      }
    }
   
  }

Čo na to povieš? Takéto niečo zapracovať do tvojho kódu. Môj problém je v tom že s funkciou millis som ešte nepracoval. Ale zistil som že moje znalosti sú mizerné na takéto projekty. Ale chcel by som to dotiahnuť do funkčného konca. Ten kód som našiel na http://forum.arduino.cc/index.php?topic=210740.15

Príspevky: 10
Registrovaný: Pon 19. Jan 2015 0:16:45

Re: PID trojstavová regulácia.

Poslaťod Finkis » Štv 12. Feb 2015 20:51:00

Tu som nasiel komplet riesenie a s logovanim na net riesi to celu kotolnu .
https://github.com/biuklija/Central_Hea ... lation.ino

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

Re: PID trojstavová regulácia.

Poslaťod posjirka » Štv 12. Feb 2015 22:21:40

Funkce millis je vcelku jednoducha ale v to poslednim kodu velmi nepresna. Moje reseni je v podstate auto tune. Kdy priviranim nebo oteviranim doladuji teplotu do prednastavenych limitu. Vedli me k tomuto reseni 2 veci.
1. Kdyz meris teplotu pomoci cidel dallas trva mereni 200-750ms. Po tu dobu jen procesor ceka a nic nedela. Max. muze reagovat vektor preruseni.
2. Nechtel jsem aby ventil porad prejizdel sem a tam. Servu to moc jedno neni ale predstav si kolik sepnuti v tom kodu 4 cestneho ventilu cos nasel , bude. Sice pri vykonech 00 nic ale civka dostane na pr.el. mam uz vymyslenou verzi s relativne presnym merenim polohy ventilu ale mam pred ssebou jeste k dopsani 2 recenze pro frontman.cz takze trochu nestiham. V tom poslednim kodu je nestastne prave pouziti millis v kombinaci s dallasem. Mam strach ze stejne nebude vedet kde je ventil aktualne a bude zbytecne oscilovat vlevo vpravo aby dorovnal teplotu. Navic netapome

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

Re: PID trojstavová regulácia.

Poslaťod posjirka » Štv 12. Feb 2015 22:25:28

Navic nezapomen ze ta teplota se nezmeni hned bude to trvat treba 2-5 sekund nez se teplota z 37 zvedne na 39. Pid regulace je vcelku rychla a bude treba 15 sekund tocit ventilem nez se stabilizuje teplota. Funkci millis jsem ti uz popisoval resp jeji porovnani s delay...

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

Re: PID trojstavová regulácia.

Poslaťod posjirka » Štv 12. Feb 2015 22:39:20

Kdyz jsem ted porovnaval muj kod i ten druhy cos nasel tak funguji podobne. Ten odkaz od finkis je uz celkem mazec. Ovladani cerpadla a ventilu. Navic je tam rtc a ethernet rozhrani. Fakt hezky. V tomto pripade je to ale kladivo na komara. Navic mam koprivku kdyz vidim napevno adresy 1-wire cidel. Musim ale uznat ze to vypada super i kdyz vetsina funkci tam poradne neni popsana. Me uz se ptal kolega v praci na ovladani 3 cestneho ventilu idealne s ekvitermni regulaci. Takze zvazuju ze bych navrhnul i klon arduina v boxu od abb ktery by se dal vyuzit. Myslenku v hlave mam ale casu malo a to uz skoro 3 mesice vyvijim regulaci vytapeni kostela. Jo nenudim se. :-)

PredchádzajúciĎalší

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