|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
KlemenD Član
Pridružen-a: Sre 18 Maj 2011 15:08 Prispevkov: 188 Aktiv.: 1.19 Kraj: Maribor
|
Objavljeno: Ned Dec 15, 2013 5:58 am Naslov sporočila: Arduino interrupt funkcija; regulator za grelec |
|
|
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 |
|
|
int47 Član
Pridružen-a: Pon 15 Dec 2003 0:10 Prispevkov: 2066 Aktiv.: 9.27 Kraj: Ljubljana
|
Objavljeno: Ned Dec 15, 2013 1:45 pm Naslov sporočila: |
|
|
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 |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.91 Kraj: Grosuplje
|
Objavljeno: Ned Dec 15, 2013 4:23 pm Naslov sporočila: |
|
|
@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 |
|
|
KlemenD Član
Pridružen-a: Sre 18 Maj 2011 15:08 Prispevkov: 188 Aktiv.: 1.19 Kraj: Maribor
|
Objavljeno: Ned Dec 15, 2013 6:00 pm Naslov sporočila: |
|
|
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 = 50hz , potem velja da bo ena valovna dolžina 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 |
|
|
ljudsko Član
Pridružen-a: Pon 31 Mar 2008 8:19 Prispevkov: 1184 Aktiv.: 6.06 Kraj: Koroška-Mežica
|
Objavljeno: Pon Dec 16, 2013 12:04 pm Naslov sporočila: |
|
|
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 |
|
|
micabauc Član
Pridružen-a: Tor 03 Jun 2003 7:12 Prispevkov: 177 Aktiv.: 0.79 Kraj: Celje
|
Objavljeno: Tor Dec 17, 2013 9:41 pm Naslov sporočila: |
|
|
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 |
|
|
ljudsko Član
Pridružen-a: Pon 31 Mar 2008 8:19 Prispevkov: 1184 Aktiv.: 6.06 Kraj: Koroška-Mežica
|
Objavljeno: Tor Dec 17, 2013 9:55 pm Naslov sporočila: |
|
|
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 |
|
|
|
|
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: 70 dni
Powered by phpBB © 2001, 2005 phpBB Group
|