Citat:
legolas89: Linearizaciju nije ni spomenuo,i kako da ja isprojektujem ?
NTC nije linearan. Mozes da ga linearizujes sa mostom ali to je gadna aproksimacija. U zadatku ti stoji da ga radis sa tabelom 1024*10 sto znaci da podelis nelinearnu krivu na odsecke po 10 stepeni a onda ocekujes da je na podrucju tih 10 stepeni promena linearna.
Citat:
Imam problem da sklopim semu,znam sta treba sistem da sadrzi ali ne znam da sklopim.
stavis NTC prema GND, sa gornje strane NTC ti je izlaz prema ADC, spustis jedan 10uF tantal odatle ka zemlji i jedan push up otpornik ka Vdd. Velicinu push up otpornika dimenzionises prema tome koji raspon temperature meris (da ti taj push up sa NTC-om cini razdelnik napona kome je izlaz na adc-u sto blizi Vss-Vdd)
evo ti primer za tu tabelu za linearizaciju o kojoj zadatak govori. Ovo je za neki GT-204 NTC koji je 200K (to znaci da mu je otpor 200K na sobnoj 25C temperaturi) koji ima 10K push up prema Vdd i za 100K honeywell NTC sa isto 10K prema Vdd:
Code:
//cuvam tabelu u EEPROMU posto je svejedno read only
#rom 0x2100={
0x40, 0x1F, //OVO TE NE ZANIMA
//2
//204-GT thermistor with 10K in voltage divider
//DAKLE OVO JE TABELA VREDNOSTI ZA 200K NTC
0x7F,0xFF, 0x03,0xE7, 0x03,0xD8, 0x03,0xC2, 0x03,0xA3, 0x03,0x78, 0x03,0x42, 0x02,0xFF, 0x02,0xB3, 0x02,0x61, //0-90 //0==1009
0x02,0x0E, 0x01,0xBE, 0x01,0x74, 0x01,0x33, 0,252, 0,206, 0,168, 0,136, 0,111, 0,91, //100-190
0,75, 0,62, 0,51, 0,43, 0,36, 0,30, 0,26, 0,22, // 200-270
//135-104LAG-J01 thermistor with 10K in voltage divider
//0x3A
//A OVO JE TABELA VREDNOSTI ZA 100K NTC
0xFF,0, 0x03,0xCE, 0x03,0xB3, 0x03,0x8E, 0x03,0x5D, 0x03,0x21, 0x02,0xDA, 0x02,0x8B, 0x02,0x3A, 0x01,0xEA, //0-90 //0==1009
0x01,0x9E, 0x01,0x5A, 0x01,0x1F, 0,237, 0,195, 0,160, 0,132, 0,111, 0,90, 0,77, //100-190
0,63, 0,54, 0,45, 0,39, 0,33, 0,28, 0,24, 0,21, 0,18, 0,16, // 200-290
}
dakle ako pogledas tabelu, za vrednos 0C ADC ce vratiti 0x7FFF, za 190C ce vratiti 0x0091 (za 200K NTC) ...
a evo ti primer kako sada da vrednost koju procitas sa ADC-a uz pomoc tabele pretvoris u temperaturu:
Code:
//funkcija podrazumeva da se vrednost (10bitna) procitana iz ADC-a nalazi u varijabli adc_avg
//TEMPS_start cuva poziciju prvog clana u tabeli (tako biras dal gadjas tabelu za 200K ili 100K termistor)
unsigned int16 getTemp(){
unsigned int16 tempVal;
unsigned int16 lowValue;
unsigned int16 highValue;
unsigned int16 dataValue;
unsigned int16 range;
for(j=1; j<TEMPS; ++j){
tempVal = read_eeprom(TEMPS_start+ (j*2) );
tempVal = tempVal << 8;
tempVal = tempVal + read_eeprom(TEMPS_start+ (j*2) +1);
if (adc_avg > tempVal){
lowValue = tempVal;
highValue = read_eeprom(TEMPS_start+(j-1)*2 );
highValue = highValue << 8;
highValue = highValue + read_eeprom(TEMPS_start+(j-1)*2+1);
range = highValue - lowValue;
dataValue = adc_avg - lowValue;
// VRACA VRENOST TEMPERATURE * 100, tako da ako je temperatura 50.12C vratice 5012 kao rezultat da bi izbegli dalje u kodu rad sa pokretnim zarezom
return (unsigned int16) (j * 1000 - (unsigned int16)((float)dataValue * 1000.0 / (float)range));
}
}
return (55555); //GRESKA
}
eto, nadam se da ti je ovo bar malo pomoglo ..
inace sto se tice tabele, tabelu pravis uz pomoc data sheet-a za termistor koji koristis. ili je vec u data sheet-u napravljena slicna tabela ili imas tabelu otpornosti (pa je preracunas u vrednost adc-a posto znas koliki ti je pull up) ili je data BETA pa u odnosu na BETA tog termistora pravis ostatak tabele.