Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

NTC - kalkulacija za voltage divider pred ADC

[es] :: Elektronika :: Mikrokontroleri :: NTC - kalkulacija za voltage divider pred ADC

[ Pregleda: 3046 | Odgovora: 16 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon NTC - kalkulacija za voltage divider pred ADC01.05.2010. u 00:12 - pre 170 meseci
ne znam sto se cimam ovoliko al .. mozda mi zatreba posle ..

sta je fora .. trosim neki NTC .. (abitno al 204GT, imam data sheet, tabelu temperatura .. bla bla bla) .. ima veliki raspon, prilicno je "tacan" blah blah ..

sta je fora, ocu da ga koristim za jedan projekat samo u specificnom range-u (20-200C) dakle ostali range (-50-300C) me ne tangira... mislio sam ovo da odradim sa digitalnim al ne vredi, na 200C krece vec kalaj da se razmeksava .. a onaj 200C je SMD sa 10 pinova .. tako da sam ovaj NTC lepo zacementirao usred ploce i daje super rezultate.

Elem, bond, laki .. sta je fora, ovaj NTC u rasponu koji mene zanima ide 250K do 0.7K meni je sad ideja da taj raspon nekako bacim na VSS-VDD (tj sto pribriznije istim).

Isti sam u "celom" spektru koristio do sada u kombinaciji sa 600R tj ... VDD--[600R]-----izlaz----[NTC]--VSS a izlaz je preko 300R isao na ADC u varijanti kada mi ne treba ceo range (139R - 9M, tj pozitivni 139R - 720K)

cemu ceo ovaj smor ... zanima me da li ima neki inteligentan nacin da se izracuna parnjak za delilac napona kako bi se maksimizovao raspon na ulazu u adc ...

za sada mi radi i ovako, sa 10-12bitnim ADC-om mi je i raspon od 1V dovoljan posebno sto mi je rezolucija od 0.5C dovoljna ... al reko, mozda ima neki inteligentan nacin za racunanje vrednosti tog otpora pa reko da priupitam :)
 
Odgovor na temu

Odin D.
Mlađi referent za automatizaciju
samoupravljanja

Član broj: 37292
Poruke: 2549



+8370 Profil

icon Re: NTC - kalkulacija za voltage divider pred ADC01.05.2010. u 09:49 - pre 170 meseci
Obicno se NTC/PTC koriste u nekoj bridge-konfiguraciji, rijetko kad u prostom razdjelniku napona.
Neki od razloga su linearizacija i drzanja struje kroz NTC dovoljno malom da bi se izbjegla povecana disipacija u samom elementu (zbog cega dolazi do samozagrijavanja, jer kad kroz otpornik tece struja on se grije).

Mislim da ne postoji neki bas jednostavan razdjelnik koji ce ti "razvuci" opseg od ~Vdd do ~Vcc, vjerovatno bi morao sklepati neku mrezu otpornika u pomenutoj bridge-konfiguraciji.
Manje-vise svaki proizvodjac tih elemenata ima neki "Application notes" za te stvari, pa vidi sta je najjednostavnije da se uradi.
Ja ovako napamet tesko da mogu da smislim nesto sto nece uzeti jos 5cm x 5cm stampane ploce i saku kojekakvih bubasvaba.
 
Odgovor na temu

Odin D.
Mlađi referent za automatizaciju
samoupravljanja

Član broj: 37292
Poruke: 2549



+8370 Profil

icon Re: NTC - kalkulacija za voltage divider pred ADC01.05.2010. u 10:26 - pre 170 meseci
Ako povezes ovako:

Vcc=5V
|
|
NTC
|
|____Vo
|
|
Rx=10.2K
|
|
GND=0V

Dobices Vo u granicama od ~0.1V do ~4.7V kad NTC seta od 0.7K do 250K.
Nije bas da se mnogo priblizava granicama opsega napajanja, ali mozda pomogne.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: NTC - kalkulacija za voltage divider pred ADC01.05.2010. u 16:47 - pre 170 meseci
10.2K je "super blizu" granicama opsega, hvala, ... radio sam ja cesto sa Wheatstone i slicno ali nekad je obican divider dovoljno dobro resenje .. ovaj 24GT je (kao i vecina) vrlo nelinearan, ali imam fabricke vrednosti od -50 do +300 na svakih 10C .. a izmedju te dve tacke ako uzmem linearnu vrednost greska je ispod 0.01 stepen sto je mnogo manje nego sto je setanje optpora u samom kolu u odnosu na sobnu temperaturu :)...

Ono sto ja pokusavam da skontam je - kako da odredim velicinu parnjaka koji ce da mi da "najblizi raspon krajevima". Ja to sada radim tako sto krenem od neke vrednosti koja mi "deluje" ok (ovde sam krenuo od 1K) pa probam ovu i onu vrednost i izracunam izlazni napon ..

Vo = Vdd * NTC / (NTC + Rref) //NTC je vezan sa Vss posto je N, PTC vezem na 5V - ne znam dal je to pravilo al .. meni tako lakse

sto znaci da ja imam

VoMin = Vdd * 0.7k / (0.7 + Rref)
i
VoMax = Vdd * 250k / (250k + Rref)

sad, uvaliti Rref da istovremeno voMin bude minimalan a voMax bude maximalan - matematika dalje odavde mi nesto ne ide :( (a siguran sam da je jednostavno :( )

ja izracunam koliki mi treba Rref da bi mi VoMin bilo 0.1V (34K3 u ovom slucaju)
izracunam koliki mi treba Rref da bi mi voMax bilo 4.9V (5K1 u ovom slucaju)
i onda uzmem nesto izmedju - 20K u ovom slucaju ((34.3 - 5.1)/2+5.1) i zadrzim se tu .. i u ovom slucaju dobijem 0.17-4.63 (4.46V raspon)

fora je sto si ti dosao (nekako) do 10.2K koji daje 0.32 - 4.80 (4.48V raspon)

nije velika razlika, ali je bolje, sad mene zanima - kako si ti dosao do toga da ce 10k dati bolje rezultate od 20k ? pig metoda ili neka pametna matematika (posebno sto 10K ne daje mnogo drugaciji rezultat, kako si izracunao bas 10.2 :D mora da ima neki matis :D )?

 
Odgovor na temu

Odin D.
Mlađi referent za automatizaciju
samoupravljanja

Član broj: 37292
Poruke: 2549



+8370 Profil

icon Re: NTC - kalkulacija za voltage divider pred ADC01.05.2010. u 17:53 - pre 170 meseci
Ma ~10K je onako odokativno, nesto oko 13K bi bila tacna vrednost za koju dobijes bas maksimum raspona, ali nije velika razlika u odnosu na 10K.

Elem, odokativna metoda ide ovako (na primjeru seme iz mog posta):
- izlazni napon je Rx / (Rx+Rt) * Vcc
- u slucaju gornje granicne temperature: Rx / (Rx + 0.7) * Vcc
- a u slucaju donje: Rx / (Rx + 250) * Vcc

Podrazumjevamo da su sve otpornosti u kiloomima, da ne bih vukao "K" kroz jednacine.
Dakle, iz jednacina vidis da Rx u zavisnosti od svoje velicine ucestvuje u nekoj mjeri u modifikovanju napona Vcc.
Mozda je logicno pretpostaviti da Rx izaberes tako da se priblizno odnosti prema donjoj vrednosti Rt-a jednako kao i prema gornjoj, tako da bi nekako uravnotezio ono odsjecanje koje razdjelnik napona pravi odozgo i odozdo. Znaci, pokusas npr. da ako je Rx 10 puta veci od 0.7K da je takodje onda 250K 10 puta vece od Rx.
To ce naravno biti moguce samo u slucaju kada je Rtmax 100 puta vece od Rtmin sto u opstem slucaju nije slucaj.

Znaci za opsti slucaj bice neki drugi faktor "A", a ne 10. Evo kako ces doci to tog faktora:

1) 0.7 * A = Rx
2) Rx * A = 250

Rjesis ove dvije jednacine tako sto zamjenis Rx iz gornje jednacine u donji i onda iz donje dobijes da je

A = SQRT(250/0.7) = 18.9

Onda znaci da je Rx = 0.7 *18.9 = 250 / 18.9 = 13.2 (kilooma).
Znaci, brza odokativna metoda je da nadjes korjen od gornje vrednosti podjeljene sa donjom i tvoj trazeni otpornik dobijes kad tim brojem pomnozis donju vrednost ili podijelis gornju vrednost.

E, sad tacno matematicki ide ovako:
Pogledaj opet one prve dvije formule za izlazni napon. Ti hoces da tu imas maksimalan raspon, tj. da razlika prvog i drugog slucaja bude maksimalna.
Sad cu da presaltam ovo u Mathematica jer mi je napor da pisem jednacine ovdje pomocu stapa i kanapa, a latex sintaksu ne znam. Znaci nastavak je u prilozenom fajlu.

Prikačeni fajlovi
 
Odgovor na temu

veselinovic
Jovan Veselinovic
Ist. Sarajevo

Moderator
Član broj: 7761
Poruke: 3875
91.191.34.69



+334 Profil

icon Re: NTC - kalkulacija za voltage divider pred ADC01.05.2010. u 19:55 - pre 170 meseci
Sve je tacno kako je Odin napisao, ali...
Pazi uvodis jos jednu nelinearnost u matematiku jer je izlazni napone nelinearna funkcija otpornosti
2. pitanje je najveca osjetljivost uredjaja.
Ako imas neku vrijednost temperature koja ce biti najcesca, ili oko koje treba da regulises nesto onda se pravi most da je najveca osjetljivost ( prvi izvod =0) bas tu, a opseg razvlacis sa OP. Naravno mozes ako treba uvesti i BIAS, opet sa OP.
Ovako je sigurno najbolja vrijednsot 13.22 kOma.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: NTC - kalkulacija za voltage divider pred ADC01.05.2010. u 20:26 - pre 170 meseci
nisam mathematica program koristio od 1992 ... moram se prisetiti :) ... ali da .. vidis, nije mi palo na pamet da napravim funkciju, prvi izvod ce dat maksimum ...

odokativne metode sljakaju uglavnom .. al bas me zanimalo kako a nije mi odma palo na pamet :D

veselinovic, da u slucaju da je potrebna preciznos velika ... meni sa obicnim razdelnikom napona tacnost ide ispod 0.1C a realno merim temperaturu 275x260x5mm alu ploce na kojoj je razlika u temperaturi pored jednog od 10 grejaca i na tacki "udaljenoj" od 10 grejaca vec veca od pola stepena... a za pocetak cu regulisati temperaturu sa "on/off" dakle bez ikakvog PWM-a posto mi za grejanje te ploce treba jedno 500-800W i mnogo mi je lakse da turim mali rele nego veliki tiristor sa hladnjakom iza lcd-a :D a sa termickom intercijom te plocke ako uspem da postignem +-5C stabilnost - EXTRA :D ..

dakle u ovom slucaju mi preciznost nije znacajna ...

napomenuo sam da koristim Wheatstone varijantu inace u kombinaciji sa "programable gate op amp" .. ali mi ovde to uopste ne treba
 
Odgovor na temu

veselinovic
Jovan Veselinovic
Ist. Sarajevo

Moderator
Član broj: 7761
Poruke: 3875
91.191.34.69



+334 Profil

icon Re: NTC - kalkulacija za voltage divider pred ADC02.05.2010. u 20:30 - pre 170 meseci
Eto, ta ploca se ubila da se isproba moj diplomski rad ( PROJEKTOVANjE NEKONVENCIONALNOG DIGITALNOG REGULATORA TERMIČKOG PROCESA SA OPSERVEROM I MINIMUMOM TRAJANjA PRELAZNOG PROCESA).
Ako budes zelio adaptivan regulator sa estimatorom stanja i autokorekcijom za par perioda semplovanja, tu sam.
A i volio bih to probati u praksi, jer teorija kaze radi. Simulacija kaze radi, ali praksa jos nije rekla dovoljno.
Poz.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: NTC - kalkulacija za voltage divider pred ADC02.05.2010. u 20:56 - pre 170 meseci
Citat:
veselinovic
A i volio bih to probati u praksi, jer teorija kaze radi. Simulacija kaze radi, ali praksa jos nije rekla dovoljno.
Poz.


Vako ... da ne tupim .. ploca je tacno 1.08kg (aluminijum 5mm debeo 275x265)
Greje se sa 8 2R2 50W otpornika u alu kucistu vezanih po dva paralelno dakle ukupan otpor 4R4 (u stvari je 4R2 izmeren, onih 0.2 je otisno na 5% tacnost malisana).

Trenutno se tuce sa nekih 35V (dakle ~300W) ali je planirano da ga tucem sa 41V cim stigne trafo, sto ce dati 400W.

Moja zeljena konacna temperatura na kojoj odrzavam temperaturu "print platforme" je 170C

Cpm za alu je 0.91kJ/kg.K sto znaci da bi sa pocetne temperature (40C) do zeljenih 170C teoretski (bez da grejem okolni vazduh) sa ovih 300W trebalo da postignem temperaturu za 7 minuta, sto na zalost nije tacno (8 minuta od 24C do 170C), posto alu ploca ima veliku povrsinu i nizak Rhs tako da dosta energije "izvetri" te (mereno) ploca od 40C do 170C dodje za 13min i 18sec.

Code:

 40C -  00:00 (pocetno stanje)
100C - 04:15
150C - 10:14
170C - 13:18


pocetno stanje je 40C zato sto tokom printanja nikad ploca ne ide ispod te temperature (nema potrebe da je pusta da se ohladi vise od toga - a i tu temperaturu postigne za minut tako da nije bitno za merenje)

sa 400W, teoretski bi trebalo da sa 40C dodjem do 170C za nekih 5 minuta i 20sec no videcemo kako ce se to pokazati u realnom svetu, posebno sto moram da odradim izolaciju na donjem delu ploce tako da bi trebalo da gubi temperaturu samo na gornjem delu ploce, a i otpornici nisu idealno zalepljeni sada za plocu vec su samo namazani pastom i pritisnuti kapton trakom.

ono sto sam ja za sada nabudzio je ovo:

mikroc mi je bio pri ruci, a 16F819 je najmanji pic sa AD-om koji imam u fiokama tako da je zato on odabran za posao ... lcd + NTC + tasteri + ledara (heater on) rade na breadboardu kako treba ... moram da nadjem neki 15-20A triak po fiokama pre nego to krenem da bacam na pcb. Sema je zakacena, sors:
Code:

sbit LCD_RS at RB3_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RA4_bit;
sbit LCD_D5 at RA1_bit;
sbit LCD_D6 at RA2_bit;
sbit LCD_D7 at RA3_bit;

sbit LCD_RS_Direction at TRISB3_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISA4_bit;
sbit LCD_D5_Direction at TRISA1_bit;
sbit LCD_D6_Direction at TRISA2_bit;
sbit LCD_D7_Direction at TRISA3_bit;

char init1[] = "HEAT BED CONTROL";
char init2[] = "     v1.0       ";
char gen1[]  = "Target:   00.00C";
char gen2[]  = "Current:  00.00C";

volatile unsigned int i;
volatile unsigned short j;
unsigned int adc_raw;
unsigned int adc_avg;
unsigned int target;
unsigned int current;

unsigned char nj;


//204-GT thermistor with 10K in voltage divider
unsigned int thermTable[18] = {
985, 963, 932, 889, 834, 768, 692, 610, //20-90
526, 446, 373, 308, 252, 206, 168, 137, 112, 91 //100-190
};

unsigned int getTemp(){
  // adc_avg -raw data from adc 10bit
  // thermTable -data from 20 - 190deg every 10 deg
  unsigned int tempVal;
  unsigned int lowValue;
  unsigned int highValue;
  unsigned int dataValue;
  unsigned int range;

  for(j=0; j<18; ++j){
    tempVal = thermTable[j];
    if (adc_avg > tempVal){
      asm CLRWDT;
      lowValue = tempVal;
      highValue = thermTable[j-1];
      range = highValue - lowValue;
      dataValue = adc_avg - LowValue;
      return (j+2) * 1000 - (dataValue * 1000 / range);
    }
  }
  return (0);
}

void print_temp(short line, unsigned long temp){  // temperature is *100
  unsigned short x;
/*
  nj++;
  if(nj < 42) nj = 42;
  if(nj > 47) nj = 42;
  Lcd_Chr(line, 9, nj);
*/

  //hundreds
  x = temp / 10000;
  if (x == 0) {
    Lcd_Chr(line, 10, ' ');
  } else {
    x = x + 48;
    Lcd_Chr(line, 10, x);
  }
  asm CLRWDT;
  //tens
  x = ((temp / 1000 ) % 10) + 48;
  Lcd_Chr(line, 11, x);
  asm CLRWDT;
  //ones
  x = ((temp / 100 ) % 10) + 48;
  Lcd_Chr(line, 12, x);
  asm CLRWDT;
  // 1/10
  x = ((temp / 10 ) % 10) + 48;
  Lcd_Chr(line, 14, x);
  asm CLRWDT;
  // 1/100
  x = (temp  % 10) + 48;
  Lcd_Chr(line, 15, x);
}

void pid(){ //for start - very basic pid controller
 if (current < target){
   RB2_bit = 0;
 } else {
   RB2_bit = 1;
 }
}

void menu(){
  if (!RA6_bit) if(target<19000) target += 50;
  if (!RA7_bit) if(target>49) target -= 50;
  print_temp(1, target);
}

void main() {
  OSCCON = 0x40;   //1MHZ
  TRISA =  0b11000001;
  TRISB =  0x00;
  PORTA =  0x00;
  PORTB =  0x04;
  ADCON0 = 0x01;
  ADCON1 = 0b10001110;
  asm CLRWDT;

  target = 7000; //70C
  current = 0;
  adc_raw = 0;
  adc_avg = 0;
  asm CLRWDT;
  
  Lcd_Init();                asm CLRWDT;
  Lcd_Cmd(_LCD_CLEAR);       asm CLRWDT;
  Lcd_Cmd(_LCD_CURSOR_OFF);  asm CLRWDT;
  Lcd_Out(1,1,init1);        asm CLRWDT;
  Lcd_Out(2,1,init2);        asm CLRWDT;

  for (i = 0; i<30000; i++)  asm CLRWDT;

  Lcd_Cmd(_LCD_CLEAR);       asm CLRWDT;
  Lcd_Out(1,1,gen1);         asm CLRWDT;
  Lcd_Out(2,1,gen2);         asm CLRWDT;
  print_temp(1, target);
  while(1){
    asm CLRWDT;
    adc_raw = ADC_Read(0);   asm CLRWDT;
    adc_avg = (adc_avg *2 + adc_raw) / 3; asm CLRWDT;
    current = getTemp();     asm CLRWDT;
    if (current == 0) current = 55555;
    pid();                   asm CLRWDT;
    print_temp(2,current);   asm CLRWDT;
    if (!RA6_bit || !RA7_bit) menu();

  }
}


[Ovu poruku je menjao bogdan.kecman dana 02.05.2010. u 22:14 GMT+1]
Prikačeni fajlovi
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: NTC - kalkulacija za voltage divider pred ADC02.05.2010. u 21:10 - pre 170 meseci
elem .. sto poslah onoliki post ...

dakle . imam ja ovde i vecih picova (posto je ovaj pred kraj sa rom-om :D ) ako hoces da odradis PID() funkciju tu :) ... ja licno nikad nisam tuko neki PWM na triak, pojma nemam dal to moze uopste, posebno u ovoj varanti sa opto triakom ... ako si vezan za ATMEL .. imam i atmega844p par komada .. nemam problem da probam bilo sta :D ...

mislim da spomenuh .. ploca je podloga za 3d stampanje ... (ja sam kao deo core team-a za www.reprap.org imam par masina ovde gotovih, pravim sad razna neka unapredjenja i radim na reprap v3 masini .. gubljenje vremena na kvadrat al mnoooooogo zanimljivije od onih stvari koje radim za leba a koje nista ne mogu bre da pipnem :D :D ) posto pri stampi na vrucoj platformi sile koje izazivaju "warping" su mnogostruko manje te je moguce praviti kompleksnije i vece objekte ... da ne smaram koga zanima neka pita ..

elem .. meni je tu za temperaturu ploce +-1 ili cak +-2C ok .. tako da meni ova PID funkcija kakva je radi 1/1 :) ali mi nije nikakav problem da zakacim nesto drugo kao kontroler ... ako hoces mozes i da ti napravis elektroniku i samo mi sibnes pcb ... fora je samo da se "grejac" napaja sa 41V AC i 10A.

Radio sam istu ovu stvar sa to220 47R 50W otpornicima, ali %$#_(^&#^#&%)%$) su em mnogo skuplji od ovih velikih (a veliki su oko 500din komad kad stignu preko technodisa) em su mi napravili haos .. sta je fora, posto su veceg otpora, ja sam 10komada vezao na 110V preko auto trafo-a ( oko 4.2A sam tuko kroz njih) i %$@_#&%# negde na 175C PROBIJU .. iako pise da im je radna temperatura 200C, iako pise da im je napon probijanja 1200V %$%#$&^# probiju i naravno naprave haos .. i to probiju 4 komada odjednom ... onda sam pravio test sa jednim koji nije probio ... na 180V ladno probija na heat pad vec negde preko 80V .. tako da sam presao na ove "velike" :) aluminijumske punjene peskom :)
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: NTC - kalkulacija za voltage divider pred ADC02.05.2010. u 21:25 - pre 170 meseci
da, ako nekog zanima, ja sam u medjuvremenu napravio http://elco.crsndoo.com/reprap/heatcalc.html posto elektroniku radim na windozi a ooffice mi je na linuxu a imam samo jedan monitor pa mi je ovo lakse za racunanje :) .. mozda jos nekome pomogne :) .. ja cu tu dodavati razna druga racunanja vezana za toplotu kako mi budu trebala (ako mi budu trebala)
 
Odgovor na temu

veselinovic
Jovan Veselinovic
Ist. Sarajevo

Moderator
Član broj: 7761
Poruke: 3875
91.191.34.69



+334 Profil

icon Re: NTC - kalkulacija za voltage divider pred ADC04.05.2010. u 17:30 - pre 170 meseci
Bogdane, ako smijem.
Prvo, vrlo tesko je regulisati nesto sto je na ivici snage. Elem, osnov svake regulacije je sto vise snage da imas. A koliko ces zaista koristiti o tom po tom.
PWM sa trijakom je lak, samo sto je frekvencija copovanja recimo 50 perioda ( iliti 100 poluperioda iliti 1 sec) pa mozes lineanro da stavis 1% = 1 poluperioda.
Ja program, doduse sa greskama- jbg zurilo mi se da zavrsim, strpao u 1684, znaci moze.
Ovo sto ti predlazem nije klasicni PID, to je digitalni PID sa samopodesavanjem parametara.
Da ne teoretisem mnogo.
Nego, jel ta ploca grije jos nesto, osim sebe same?
Jel se to nesto stavi na 40 stepeni pa se polako krcka do 200, ili se odmah stavi na 200?
Pretpostavio sam da ti treba linearnost u nekom uzem podrucju, pa bih ja prilagodio to recimo od 140 do 220 stepeni.
Ostalo me ne bi zanimalo.
Izvini ako sam ti pobrkao misli.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: NTC - kalkulacija za voltage divider pred ADC04.05.2010. u 18:42 - pre 170 meseci
:D

ta ploca greje sebe i objekat koji stoji na njoj ... dakle to je platforma za stampanje kao sto napisah vec ...

osnovni problem kod 3d stampe plastikom su sile koje nastaju neravnomernim hladjenjem objekta tako da kako se gornji slojevi kasnije hlade prilikom skupljanja (plastika se skuplja kada se hladi) prave sile koje izviju krajeve objekta na gore. Primeri:





e sad sta je fora, kada se ploca na koju se stampa greje, ta ploca odrzava temperaturu "donjih" slojeva tako da se ceo objekat (ako nije preterano visok) ravnomerno hladi. U slucaju visokih / vecih objekata stampa mora da se radi u komori koja se greje na 70-100C

Ja kada stampam - PIG metodom, pokazalo se najbolje da za prvi sloj namestim plocu na 170C. Tada dobijem odlican izgled prvog sloja, dobro prione za plocu.... a cim se prvi sloj zavrsi prebacim termostat na 120C i pustim plocu da se lagano ohladi na 120C ne prekidajuci stampu (traje to jedno 5-6mm u visinu dok se proca ohladi) i ostatak objekta pravim tako da ploca odrzava 120C.

Sto se tice "sta ploca greje" - sa donje strane ne greje nista - tu ide izolacija, sa gornje strane greje vazduh + nesto malo plastike.

Sto se tice "snage" ... ne postoji tu "ivica" snage. Sa razlicito snage proizvodim razlicitu energiju ... toj ploci treba X dzula da se zagreje za dT stepeni, proporcionalno kolicini snage ulozenoj u proizvodnju tih dzula trebace X sekundi da ploca promeni temperaturu ....

ja sam izracunao da sa 400W dobijam za ~7 minuta tih 170C .. u praksi je to blize 12minuta sto je i dalje ok, extruderu treba taman negde oko 15tak minuta da dodje na 240-260C (na toliko se extrudira ABS) tako da mi je to vreme sasvim dovoljno, a preciznost (kao sto rekoh, par C gore dole ne predstavlja problem) mi je dovoljna i ovako kako sada stoji (upali ugasi) :).

Citat:
PWM sa trijakom je lak, samo sto je frekvencija copovanja recimo 50 perioda ( iliti 100 poluperioda iliti 1 sec) pa mozes lineanro da stavis 1% = 1 poluperioda.

ne kontam sta si ovde napisao ...
ja sam radio ranije dimere na 220 i oni rade tako sto "svaku" periodu iseku tako da pocne "kasnije" ... ne kontam sad "freq chopovanja 1sec" ??? oces da kazes da radim PWM sa 1Hz baznom frekvencijom? To mi i nije neki pwm ...
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: NTC - kalkulacija za voltage divider pred ADC04.05.2010. u 18:46 - pre 170 meseci
btw, ja reko - imam plocu, ima grejace ... mogu da probam tebi nesto ako treba .. to da vidis u praksi kako ide ... inace, meni ovo "ima preko X, ugasi grejac / ima manje od X upali grejac" radi extra :D cak i bez histerezisa
 
Odgovor na temu

veselinovic
Jovan Veselinovic
Ist. Sarajevo

Moderator
Član broj: 7761
Poruke: 3875
91.191.34.69



+334 Profil

icon Re: NTC - kalkulacija za voltage divider pred ADC04.05.2010. u 21:06 - pre 170 meseci
OK,
za takve primjene i nije ovaj moj regulator.
Pazi PWM za tvoj slucaj moze da bude recimo zelis 25% snage na grijacu - pustis 25 poluperioda a onda cutis 75 poluperioda.
Zbog tromosti ( ploca =integrator) neces da vidis sjeckanja, tj dovoljna je frekvencija 1 Hz za tvoj PWM.
I to JESTE po definiciji PWM. Cak bi se moglo reci da je i bimetalni termostat neka vrsta PWM.
Pazi tebi se, kad regulises PWM-om, stvar namjesti na srednju vrijednost. Recimo da je temperatura majke planete regulisana PWM-om sunca. Na dovoljnoj dubini u zemlji ti neces sojetiti razlike nego ces mjeriti konstantnu temperaturu.
Samo sto period PWM-a mora biti mnogo manji od vremenske konstante.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: NTC - kalkulacija za voltage divider pred ADC04.05.2010. u 21:30 - pre 170 meseci
ja sam navikao da PWM-ujem (kakav termin, a :D ) DC .. tako da imam drugu predstavu kada razmisljam o ostim (30-80KHz .. etc) ... a sto se plocke tice, da, on off na sekund tamo vamo radi posao 1/1 ...

elem, znam da tvoj regulator nije za ovaj slucaj (za ovaj slucaj je i obican regulator sa TA pecke dovoljan) - ovde ima elektronike samo zato da bi MB uredjaja mogao da posalje preko i2c "postavi se na ovoliko" i "postavi se na oniliko" i to je cela prica .. nego rekoh, ako oces da ti napravim neki test da okacim tvoj program .. imam ja ovde sigurno po fiokama neki 84A koji rece da si koristio, pa ti javim rezultate .. ono ako tebi znaci da probas u "realnom svetu" .. ja za mene ovo isprobao i radi 1/1 :D (ugasi se kad dodje na zeljenu temperaturu :D ) ... i2c deo cu da radim kad zavrsim MB .. trenutno kontrolisem platformu rucno
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: NTC - kalkulacija za voltage divider pred ADC12.05.2010. u 11:32 - pre 169 meseci
evo ga finalni kod ako nekog zanima ...

Code:

#include <16F819.h>

#device adc=10    

#FUSES INTRC_IO    
#FUSES WDT         
#FUSES NOPROTECT  
#FUSES NOBROWNOUT 
#FUSES MCLR 
#FUSES NOCPD  
#FUSES NOPUT  
#FUSES NOLVP


#use delay(clock=4000000)
#use i2c(Slave,Fast,sda=PIN_B1,scl=PIN_B4,restart_wdt,force_hw,address=0xAB)



char init1[] = "HEAT BED CONTROL";
char init2[] = "     v2.1       ";
char gen1[]  = "Target:   00.00C";
char gen2[]  = "Current:  00.00C";

volatile unsigned int16 i;
volatile unsigned int8 j;
unsigned int16 adc_raw;
unsigned int16 adc_avg;
unsigned int16 target;
unsigned int16 current;




//204-GT thermistor with 10K in voltage divider
#define TEMPS 28
unsigned int16 thermTable[TEMPS] = {
1010, 1000, 985, 963, 932, 889, 834, 768, 692, 610, //0-90
526, 446, 373, 308, 252, 206, 168, 137, 112, 91, //100-190
75, 62, 51, 43, 36, 30, 26, 22 //  200-270
};


BYTE incoming, state;
BYTE address;
BYTE buffer[4]; //[0] + [1]<<8 = TARGET TEMP; [2] + [3]<<8 = CURRENT TEMP
BYTE changed;


#int_SSP
void  SSP_isr(void) {
  state = i2c_isr_state();

  if(state == 1){  
    incoming = i2c_read();
    address = incoming;
    if (address > 3) address = 0;
  }

  if(state == 2){  
    incoming = i2c_read();
    if (address > 1) address = 0; //only 0 and 1 are writable
    buffer[address] = incoming;
    if (address ==  1) changed = 1; //set changed only when second byte is written
  }

  if(state == 0x80){
    i2c_write (buffer[address]);
  }
}


//RB3 - RS
struct lcd_pin_map {                 
  BOOLEAN unused;       
  int     data : 4;   
  BOOLEAN mclr;
  BOOLEAN rw;             
  BOOLEAN enable;          
} lcd;

#locate lcd = getenv("sfr:PORTA") 
#define set_tris_lcd(x) set_tris_a(x)

#define lcd_type 2
#define lcd_line_two 0x40

BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};

struct lcd_pin_map const LCD_WRITE = {1, 0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ  = {1,15,0,0,0}; // For read mode data pins are in

BYTE lcd_read_byte() {
      BYTE low,high;
      set_tris_lcd(LCD_READ);
      lcd.rw = 1;
      delay_cycles(1);
      lcd.enable = 1;
      delay_cycles(1);
      high = lcd.data;
      lcd.enable = 0;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(1);
      low = lcd.data;
      lcd.enable = 0;
      set_tris_lcd(LCD_WRITE);
      return( (high<<4) | low);
}

void lcd_send_nibble( BYTE n ) {
      lcd.data = n;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(2);
      lcd.enable = 0;
}

void lcd_send_byte( BYTE address, BYTE n ) {
      //lcd.rs = 0;
      output_low(PIN_B3);
      while ( bit_test(lcd_read_byte(),7) ) ;
      //lcd.rs = address;
      if (address){
        output_high(PIN_B3);
      }else{
        output_low(PIN_B3);
      }
      delay_cycles(1);
      lcd.rw = 0;
      delay_cycles(1);
      lcd.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
}

void lcd_init() {
    BYTE i;
    set_tris_lcd(LCD_WRITE);
    //lcd.rs = 0;
    output_low(PIN_B3);
    lcd.rw = 0;
    lcd.enable = 0;
    delay_ms(15);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(5);
    }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
       lcd_send_byte(0,LCD_INIT_STRING[i]);
}

unsigned int16 getTemp(){
  // adc_avg -raw data from adc 10bit
  // thermTable -data from 0 - 270deg every 10 deg
  unsigned int16 tempVal;
  unsigned int16 lowValue;
  unsigned int16 highValue;
  unsigned int16 dataValue;
  unsigned int16 range;

  for(j=0; j<TEMPS; ++j){
    tempVal = thermTable[j];
    if (adc_avg > tempVal){
      #asm
      clrwdt 
      #endasm
      lowValue = tempVal;
      highValue = thermTable[j-1];
      range = highValue - lowValue;
      dataValue = adc_avg - LowValue;
      return j * 1000 - (dataValue * 1000 / range);
    }
  }
  return (55555);
}

void print_temp(int8 line, unsigned int16 temp){  // temperature is *100
  unsigned int8 x;

  //hundreds
  x = temp / 10000;
  if (x == 0) {
    //Lcd_Chr(line, 10, ' ');
    lcd_send_byte(0,0x80|(10+lcd_line_two*line)); 
    lcd_send_byte(1,' ');
  } else {
    x = x + 48;
    //Lcd_Chr(line, 10, x);
    lcd_send_byte(0,0x80|(10+lcd_line_two*line)); 
    lcd_send_byte(1, x);
  }
  #asm
  clrwdt 
  #endasm
  
  //tens
  x = ((temp / 1000 ) % 10) + 48;
  //Lcd_Chr(line, 11, x);
  lcd_send_byte(0,0x80|(11+lcd_line_two*line)); 
  lcd_send_byte(1, x);
  #asm
  clrwdt 
  #endasm

  //ones
  x = ((temp / 100 ) % 10) + 48;
  //Lcd_Chr(line, 12, x);
  lcd_send_byte(0,0x80|(12+lcd_line_two*line)); 
  lcd_send_byte(1, x);
  #asm
  clrwdt 
  #endasm

  // 1/10
  x = ((temp / 10 ) % 10) + 48;
  //Lcd_Chr(line, 14, x);
  lcd_send_byte(0,0x80|(14+lcd_line_two*line)); 
  lcd_send_byte(1, x);
  #asm
  clrwdt 
  #endasm

  // 1/100
  x = (temp  % 10) + 48;
  //Lcd_Chr(line, 15, x);
  lcd_send_byte(0,0x80|(15+lcd_line_two*line)); 
  lcd_send_byte(1, x);
  #asm
  clrwdt 
  #endasm

}

void pid(){ //for start - very basic pid controller
 if (current < target){
   output_low(PIN_B2);
 } else {
   output_high(PIN_B2);
 }
}

//RB0, RB5
void menu(){
  #asm
  clrwdt 
  #endasm
  if (!input(PIN_B0)) if(target<27000) target += 50;
  if (!input(PIN_B5)) if(target>49) target -= 50;
  
  if (!input(PIN_B0) && !input(PIN_B5)){
    write_eeprom(0, target & 0x00ff);
    write_eeprom(1, target >> 8 );
  }
  print_temp(0, target);
}


void main(){
   
   //OSCCON = 0x40;   //1MHZ
   setup_oscillator(OSC_4MHZ); 

   // ADCON0 = 0x01;
   // ADCON1 = 0b10001110;
   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_INTERNAL);

   //setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_wdt(WDT_2304MS);
   //setup_timer_1(T1_DISABLED);
   
   set_tris_b(0x33);
   lcd_init();
   output_high(PIN_B2);

   for (j=0;j<16;j++){
     lcd_send_byte(0,0x80|j); 
     lcd_send_byte(1,init1[j]); 

     lcd_send_byte(0,0x80|(j+lcd_line_two)); 
     lcd_send_byte(1,init2[j]); 
   }
   #asm
   clrwdt 
   #endasm


   changed = 0;
   address = 0;

   target = read_eeprom(1);
   target = target << 8;
   target |= read_eeprom(0);
   if (target > 30000) target = 7000; //70C
   
   current = 0;
   adc_raw = 0;
   adc_avg = 0;
   #asm
   clrwdt 
   #endasm

   buffer[0]=buffer[1]=buffer[2]=buffer[3]=0;
   delay_ms(1000);

   for (j=0;j<16;j++){
     lcd_send_byte(0,0x80|j);
     lcd_send_byte(1,gen1[j]); 

     lcd_send_byte(0,0x80|(j+lcd_line_two)); 
     lcd_send_byte(1,gen2[j]); 
   }


   set_adc_channel(0);

   enable_interrupts(INT_SSP);
   enable_interrupts(GLOBAL);
   while (TRUE){
     #asm
     clrwdt
     #endasm
     adc_raw = read_adc();
     adc_avg = (adc_avg *2 + adc_raw) / 3;
     current = getTemp(); 

     pid();                   
     print_temp(1, current);  
     if (!input(PIN_B0) || !input(PIN_B5)) menu();
     if (changed){ //something came via I2C
        target = buffer[1];
        target = target << 8;
        target |= buffer[0];
        print_temp(0, target);
        changed = 0;        
     } 
     //write data into buffer for I2C read
     buffer[2] = current & 0x00ff;
     buffer[3] = current >> 8;
   }
}



slobodno ga koristite kako god zelite :D ... napisan u PICC C kompajleru za 16F819. Prebacio sam ga za PICC posto pravi malo optimalniji kod (jedno 10%) od mikroC-a a i ima podrsku za I2C slave. Imam ja napisanu i software biblioteku za i2c slave ali zahteva da teras pic na mnogo mhz da bi radilo ok .. a i sto bi se cimao sa tim kad ima hw i2c na 819 :)

koga zanima sta radi ...

1. procita iz lokalnog eeproma zadnju snimljenu vrednost za target temperaturu
2. menja target temperaturu na 2 gumba (+ i -)
3. ako se stisnu + i - u isto vreme zapamti trenutnu target temperaturu u eprom
4. ako je target temp nizi od trenutne temperature upali grejac
5. ako je target temp visi od trenutne temperature ugasi grejac
6. slusa kao i2c slave
6.1 na i2c slave adresi 0 i 1 je dvobajtna vrednost target temperature (read/write)
6.2 na i2c slave adresi 2 i 3 je dvobajtna vrednost trenutne temperature (read only) tako da master moze da pita za trenutnu temperaturu ako ga zanima
7. prijazuje na 2x16 display-u obe temperature


to je sve :) ...
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: NTC - kalkulacija za voltage divider pred ADC

[ Pregleda: 3046 | Odgovora: 16 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.