www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Arduino interrupt funkcija; regulator za grelec

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Programiranje embedded sistemov
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
KlemenD
Član
Član



Pridružen-a: Sre 18 Maj 2011 15:08
Prispevkov: 188
Aktiv.: 1.20
Kraj: Maribor

PrispevekObjavljeno: Ned Dec 15, 2013 5:58 am    Naslov sporočila:  Arduino interrupt funkcija; regulator za grelec Odgovori s citatom

Pozdravljeni

Za poskuse pri kemiji si izdelujem električni grelec, kjer mi je najbolj pomembno to, da lahko grelec vzdrzuje konstantno temperaturo. Samo grelno ploščo sem vzel iz kuhalnika za kavo, reguliram pa jo z tem preprostim vezjem LINK, termistorjem in z arduinom. Na grelno plosco bo vedno postavljena posoda z oljem, v katero bom potem potopil kemijsko steklovino zato z termistorjem merim samo temperaturo olja. Princip delovanja je približno takšen:
- Dolocim vrednost T (temperatura do katere hocem, da se zagreje olje)
- Prvi del vezja pošlje na ardunov PIN 2 signal, vsakic ko pride omrezna napetost na 0V
- Vklopi se interrupt funkcija ki najprej preveri koliksen je upor termistorja, potem pa to vrednost po enacbah pretvori v stopinje celzija
- Izracuna razliko med izmerjeno temperaturo ter zeljeno temperaturo (g)
- Ce se izmerjena temperatura in zeljena temperatura razlikujeta za vec kot 30 stopinj potem naj bo triak vklopljen cel cas, ce se pa razlikujeta za 0 ali manj, naj bo popolnoma izkopljen.
- za razlike izmerjene in zeljene temperature med 30 in 0, potem priredi neko stevilo (b) ki doloca, koliko casa, po detekciji da je omrezna napetost prisla na 0V naj vklopi triak (nizji je b dalj casa traja da se triak vklopi, vecji del sinusoide se poreze)
Koda:

#include <math.h>

int AC_pin = 3;
int T = 30;
int a;
int g;
int b;


double Thermister(int RawADC) { // iz vrednosti upora izracuna temperaturo
 double Temp;
 Temp = log(((10240000/RawADC) - 10000));
 Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp );
 Temp = Temp - 273.15;           
 return Temp;

}


void setup() {
  Serial.begin(9600);
  pinMode(AC_pin, OUTPUT);
  attachInterrupt(0, light, FALLING);// sprozi funkcijo light ko se pin 2 premakne iz HIGH na LOW (zazna kdaj je omrezna napetost na 0V)

}

void light() {
 a = (int(Thermister(analogRead(0)))); //izmeri vrednost upora ter izracuna temperaturo
 g =(T - a); // razlika med zeljeno temperaturo T in trenutno izmerjeno a
 b = (8.5 * g); // faktor ki na podlagi razlike temperatur g doloci cas vklopa triaka
    if (g <= 0) { // ko bo razlika temperatur 0 naj se triak izklopi
     
      digitalWrite(AC_pin, LOW);
    }

    if (g > 30) { // ko bo razlika med temperaturama vecja od 30 stopinj naj bo triak vklopljen ves cas
      digitalWrite(AC_pin, HIGH);
    }
 

  if (g > 0 && g <= 30) { // ko bo razlika vecja od 0 in manjsa od 30 stopinj naj triak reze napetost glede na faktor b, ce je b nic potem AC sinusoida ostane cela, ce je pa b 255 popolnoma poreze sinusoido
    delayMicroseconds(34*(255-b));
    digitalWrite(AC_pin, HIGH);
    delayMicroseconds(500);
    digitalWrite(AC_pin, LOW);
  }

void loop(){
}

No, ampak tukaj se je nekje pojavil problem, saj se moc plosce ni manjsala med tem ko je temperatura olja narascala. Del kode ki doloca temperaturo sem prej ze posamicno zagnal in rezultate primerjal z pravim digitalnim termometrom, ter ugotovil da se rezultati ujemajo. No po dolgem eksperimentiranju, pa sem ugotovil da problem tici nekje v kombinaciji med analogRead in interrupt fukcijama in sicer tako da sem vezje odklopil iz omrezja (se pravi PIN 2 ni dobival nobenih signalov) ter pognal to kodo :
Koda:

int a;

void setup() {
  Serial.begin(9600);
  attachInterrupt(0, light, FALLING);// sprozi funkcijo light ko se pin 2 premakne iz HIGH na LOW (zazna kdaj je omrezna napetost na 0V)

}

void light() {
}


void loop(){
a = analogRead(0);
Serial.println(a);
delay(1000);
}

Termistor je bil tukaj se vedno priklopljen in za Serial.println(a) sem dobil okoli 515 kar je po enacbah pretvorjeno okoli 30 stopin, toliko je kazal tudi digitalni termometer. Ko pa sem enkrat vezje priklopil nazaj v omrezje, torej PIN2 je zacel dobivat signale in vklapljati interrupt, pa mi je Serial.println(a) naenkrat zacel kazati okoli 230 ko sem omrezno napetost spet izklopil so se meritve vrnile na 515. Kaj bi lahko bilo tukaj narobe ? ali analogRead in interrupt ne gresta skupaj ? kako se naj temu izognem ?

Hvala za vse odgovore !
Klemen
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
int47
Član
Član



Pridružen-a: Pon 15 Dec 2003 0:10
Prispevkov: 2066
Aktiv.: 9.30
Kraj: Ljubljana

PrispevekObjavljeno: Ned Dec 15, 2013 1:45 pm    Naslov sporočila:   Odgovori s citatom

Arduina ne poznam.

Tako na hitro ne vidim inicializacije A/D. Kako sta definirana referenca in preskaler za A/D ?
Ali analogRead(0) upošteva napotke proizvajalca za povečanje točnosti A/D pretvorbe ?

Thermister(analogRead(0)) kličeš v prekinitvi. Si preveril, koliko časa porabi uC, da izvede kodo? Ppredvidevam, da analogRead sproži A/D pretvorbo in počaka na rezultat. Ta čas ti omejuje max. moč. Če je predlog, je namesto min. moči lahko moč blizu max.

Povezava med močjo in faznim kotom ni linearna.
Samo s proporcionalno regulacijo ne moreš popolnoma izničiti napake. Pri prevelikem P sistem zaniha.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5766
Aktiv.: 25.97
Kraj: Grosuplje

PrispevekObjavljeno: Ned Dec 15, 2013 4:23 pm    Naslov sporočila:   Odgovori s citatom

@KlemenD:tako na hitro, ni mi jasno, zakaj je pomemben prehod skozi 0 in posledično uporaba prekinitve?
Kar se regulacije tiče, preberi zadnja dva stavka, ki jih je napisal @int47.

@int47:pri Arduinu, s stališča uporabnika, inicializacija A/D pretvornika ni potrebna, referenca je običajno notranja, prescaler je 128.
Vse to je določeno v Arduino knjižnjici (Arduino IDE).

_________________
Lp, Jaka
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
KlemenD
Član
Član



Pridružen-a: Sre 18 Maj 2011 15:08
Prispevkov: 188
Aktiv.: 1.20
Kraj: Maribor

PrispevekObjavljeno: Ned Dec 15, 2013 6:00 pm    Naslov sporočila:   Odgovori s citatom

int47 je napisal/a:
Povezava med močjo in faznim kotom ni linearna.
Samo s proporcionalno regulacijo ne moreš popolnoma izničiti napake. Pri prevelikem P sistem zaniha.


Jaka57 je napisal/a:
@KlemenD:tako na hitro, ni mi jasno, zakaj je pomemben prehod skozi 0 in posledično uporaba prekinitve?

Pozdravljena !
Detekcija prehoda skozi ničlo mi je pomembna, saj mi v sinusoidi daje konstantno referenčno točko. Torej če vzameva omrežno napetost ki niha z ypsilon = 50hz , potem velja da bo ena valovna dolžina Lambda enaka 1000ms/50 = 20 ms v tem času dobmo hrib ter dolino kar pomeni, da bo časovni razmik med dvema ničlama 10ms. No, ker vem kdaj sta se hrib ali dolina v sinusoidi začela in kako dolgo trajata, si lahko sedaj tukaj vmes vzamem poljubno vrednost b, ki bo odločala o tem, kolišen del sinusoide naj porežem. Vem, da tukaj potem med močjo in časom v eni valovni doilžini ni linearne odvistnosti, ampak meni je glavno le to, da bližja ko bo temperatura olja željeni temperaturi, manj moči moči naj gre na ploščo, ko bo pa tista temperatura enkrat dosežena, pa naj se plošča vgasne. Grem sedaj še malo eksperimentirati z tem vezjem, ker res dvomim da mi signal na PIN 2 moti analogRead(), saj sem šel preverit na arduno spletno stran, kjer navajajo, da se analogRead() lahko izvede 10000 krat v sekundi, torej 0.1 ms kar je vec kot dovolj casa !
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
ljudsko
Član
Član



Pridružen-a: Pon 31 Mar 2008 8:19
Prispevkov: 1184
Aktiv.: 6.08
Kraj: Koroška-Mežica

PrispevekObjavljeno: Pon Dec 16, 2013 12:04 pm    Naslov sporočila:   Odgovori s citatom

20ms za periodo, 10ms za polperiodo in 50 Hz so teoretične vrednosti. Raje si vzami pri poleriodi vsaj 2ms rezerve, torej maksimum 8ms. Konec koncev, na teh robovih je pogrešek pri moči na grelcu minimalen. Lahko si narišeš integral toka na grelcu v kakšnem programu in boš videl, kje je vpliv največji. Na robovih cca 1ms ga praktično ni, sploh če gre za kak močnejši grelec.
_________________
return;
brake;
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
micabauc
Član
Član



Pridružen-a: Tor 03 Jun 2003 7:12
Prispevkov: 177
Aktiv.: 0.80
Kraj: Celje

PrispevekObjavljeno: Tor Dec 17, 2013 9:41 pm    Naslov sporočila:   Odgovori s citatom

sploh pa grelce ne rabiš krmilit tako na fino. Temperaturna zakasnitev grelca je takšna, da ga komot vklapljaš v sekundnih intervalih.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
ljudsko
Član
Član



Pridružen-a: Pon 31 Mar 2008 8:19
Prispevkov: 1184
Aktiv.: 6.08
Kraj: Koroška-Mežica

PrispevekObjavljeno: Tor Dec 17, 2013 9:55 pm    Naslov sporočila:   Odgovori s citatom

Odvisno kaj delaš. Obstajajo takoimenovani ON-OFF regulatorji, ki si ga pravkar omenil in pa PID regulatorji. Lahko tudi samo PI ali P.
Pri ON-OFF regulatorjih imaš konstantno nihanje temperature, ki pa v nekaterih primerih ni zaželjena.

PS.: delovanje, ki ga je opisal KlemenD, je dejansko nek konceptoalni P regulator.

_________________
return;
brake;
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Programiranje embedded sistemov Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group