Ovdje pročitajte kako se registrirati na forum.

Primjer upotrebe NTC-a

Tvoj projekt je upravo dovršen? Podijeli s nama što si napravio u ovom podforumu! Upute drugima kako napraviti isti projekt su uvijek dobrodošle!
Odgovorite
domagoj#6547
Ozbiljni hardveraš
Ozbiljni hardveraš
Postovi: 129
Pridružen/a: ned tra 15, 2018 2:59 pm
Lokacija: Zagreb

Primjer upotrebe NTC-a

Post Postao/la domagoj#6547 » ned sij 26, 2020 7:58 pm

Ovaj primjer sam napisao kao osvrt na temu iz bologa e-radionice Croduino voltmetar (https://e-radionica.com/hr/blog/2016/01 ... voltmetar/) s tom razlikom, ako se pozovemo na spomenutu temu, ovdje je Vin konstantan i iznosi 5V, a Vout se mijenja promjenom NTC otpora koji je na mjestu R1. NTC je 10k kao i R2. Kratki opis programa. Od proizvođača NTC-a sam uzeo tablicu otpora koji se kreće za vrijednosti temperatura od -25°C do +125°C u koraku po 1°C i te vrijednosti sam strpao u polje otpor[]. Napisao sam tri funkcije:
  • double getR_T(float temp) - vraća vrijednost otpora u odnosu na temperaturu. Konkretno ovu funkciju ne koristim u primjeru, ali je tu ako vam zatreba
  • double getR_U(double napon) - vraća vrijednost otpora u odnosu na napon
  • float getT_R(double R) - vraća vrijednost temperature u odnosu na otpor
Program radi ovako: NTC mijenja otpor kako mu se mijenja temperatura, konkreno, s porastom temperature mu pada otpor što znači da Vout raste. Koliki će biti Vout ovisi o djeljitelju napona, a o tome govori spomenuta Croduino lekcija. Ako vrijednost otpora izađe izvan upisanih vrijednosti, program će za temperaturu vratiti -50°C što se smatra greškom jer najmanja izmjerena temperatura može biti -25°C. Isto će biti i ako temperatura bude veća od +125°C. I to je to. Sklop je izuzetno jednostavan, komponente jeftine, a rezultat prilično dobar. Isprobao sam s kontrolnim termometrom u rasponu sobne temperature i odstupanje je unutar 1°C. Pri višim i nižim vrijednostima će odstupanje možda biti i veće, ali to tek moram provjeriti. Vrlo vjerojatno da neki drugi NTC neće imati baš istu tablicu otpora, ali ne očekujem neke velike razlike. U svakom slučaju vrijedi isprobati s obzirom na jednostavnost.
Evo i programa.

Kod: Označite sve

#define napon_ref 5 //referentni napon u V na djeljitelju napona
#define otpor_ref 10000 //otpornik u djeljitelju napona u ohmima

String tmp;
float broj;
int i;
// temperaturni raspon od -25°C do +125°C
// otpor[0] za -25°C, otpor[25] za 0°C, otpor[150] za +125°C
// forumla za indeks polja optor: i=25+temperatura, npr. za -25°C i=25+(-25)=0
//vrijednosti su za 10k NTC u ohmima
double otpor[]={133500.000, 125672.000, 118350.000, 111498.000, 105084.000, 99073.000, 93446.900, 88175.000, 83229.600, 78590.900, 74238.400, 70152.700, 66316.200, 62712.200, 59325.400, 56141.600, 53147.500, 50330.700, 47679.900, 45184.200, 42833.900, 40619.700, 38533.000, 36565.600, 34710.300, 32960.000, 31308.100, 29748.700, 28276.000, 26884.800, 25570.200, 24327.400, 23152.300, 22040.700, 20988.900, 19993.400, 19050.900, 18158.200, 17312.400, 16510.900, 15751.100, 15030.600, 14347.200, 13698.700, 13083.300, 12499.000, 11944.100, 11416.900, 10916.100, 10440.000, 10000.000, 9556.930, 9147.430, 8757.770, 8386.900, 8033.800, 7697.630, 7377.210, 7072.000, 6781.100, 6503.780, 6239.340, 5987.110, 5746.460, 5516.800, 5297.580, 5088.280, 4888.380, 4697.430, 4514.980, 4340.600, 4173.910, 4014.520, 3862.070, 3716.240, 3588.000, 3443.140, 3315.290, 3192.870, 3075.630, 2963.310, 2855.690, 2752.560, 2653.690, 2558.900, 2467.990, 2380.800, 2297.140, 2216.860, 2139.800, 2065.830, 1994.800, 1926.580, 1861.050, 1798.090, 1737.580, 1679.420, 1623.510, 1569.750, 1518.040, 1473.000, 1420.450, 1374.390, 1330.070, 1287.400, 1246.320, 1206.750, 1168.640, 1131.930, 1096.550, 1062.460, 1029.600, 997.924, 967.376, 937.916, 909.498, 882.083, 855.630, 830.101, 805.459, 781.670, 758.701, 736.519, 715.094, 694.397, 674.400, 655.075, 636.398, 618.345, 600.890, 584.013, 567.690, 551.902, 536.629, 521.852, 507.552, 493.712, 480.316, 467.346, 454.788, 442.627, 430.848, 419.438, 408.384, 397.674, 387.294, 377.233, 367.481, 358.026, 348.859, 339.968};

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  broj=lin_int(analogRead(A0),0,1023,0,5);
  Serial.print(broj); Serial.print("V R="); Serial.print(getR_U(broj)); Serial.print(" T=");  Serial.println(getT_R(getR_U(broj)));
  delay(1000);
}

//daje vrijednost otpora na temelju temperature kao ulaznog parametra ili 0 ako je izvan opsega
double getR_T(float temp)
{
  if(temp<-25 || temp>125) return 0; //0 vraća kao grešku
  int i=int(temp)+25; //izračunaj indeks
  double R1, R2, R;
  R1=otpor[i];
  if(i==150) return R1; //ako je slučajno pogođen zadnji element polja
  R2=otpor[i+1];
  //linerana interpolacija, razlika u zapisanim temperaturama je 1°C
  R=(R2-R1)/1*(temp-int(temp))+R1;
  return R;
}//end getR_T()

//daje vrijednost otpora na temelju napona
//vrijednosti su za 10k NTC i 10k otpornik kao djeljitelj napona
double getR_U(double napon)
{
  double R, R1_polje, R2_polje;
  double U1, U2, U;
  int i;
  R=(double)napon_ref*otpor_ref/napon-otpor_ref;
  return R;
}//end getR_U()

//daje vrijednost temperature na temelju otpora
float getT_R(double R)
{
  float T, T1, T2;
  int i;
  double R1, R2;
  if(R>otpor[0] || R<otpor[150]) return -50; //temperatura -50 označava grešku
  for(i=0;i<150;i++) //pronađi otpor u polju otpora
  {
    R1=otpor[i]; R2=otpor[i+1];
    if(R<=R1 && R>=R2) break;
  }
//  Serial.println(R1); Serial.println(R2);
  T1=i-25; T2=T1+1;
  //linearna interpoacija
  T=1/(R2-R1)*(R-R1)+T1;
  return T;
}//end getT_R()

//linearna interpolacija
float lin_int(float x, float in_min, float in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}//end lin_int()
Sad se pitate zašto bi koristili neke algoritme s interpolacijom kada npr. DS18B20 daje vrlo precizan rezultat i isto je prihvatljive cijene? Pa ja sam naletio na situaciju da na nekim mikrokontolerima ne mogu koristiti DS OneWire biblioteku jer se greška javlja već u compileu. Greška se odnosila na tipove varijabli koje su bile definirane u biblioteci a taj mikrokontroler ih nema definirane. Možda sam i mogao nešto petljati s DS bibliotekom ali ovo mi je bilo jednostavnije i brže, a dovoljno precizno.
Pozdrav, Domagoj
Avatar
david.zovko#9477
e-radionica.com team
e-radionica.com team
Postovi: 308
Pridružen/a: ned tra 15, 2018 2:59 pm
Lokacija: Osijek, Croatia
Kontakt:

Re: Primjer upotrebe NTC-a

Post Postao/la david.zovko#9477 » uto sij 28, 2020 9:00 am

Ovo je super, Domagoj, skoro pa KKM za sebe. Dapače, doslovno i je. Ako se slažeš, pretvorio bih to u KKM i stavio na blog da svi nađu jednostavnije.

Ima još jedna prednost korištenja NTC-a. Naime, budući da je spojen na ADC, a procesorska moć za računanje temp iz napona ADC-a mikrokontrolerima nije problem, puno je brži od DS18B20 senzora, ali i drugih. Tako da, ako imate nekakav projekt gdje je važno BRZO prepoznati PROMJENU temperature, ali ne i izmjeriti preciznu temperaturu, NTC je savršen. Recimo, baterijski paketi gdje se mora čim prije ugasiti napajanje ako se baterija krene naglo grijati. A također, višestruko su jeftiniji od digitalnih senzora.
domagoj#6547
Ozbiljni hardveraš
Ozbiljni hardveraš
Postovi: 129
Pridružen/a: ned tra 15, 2018 2:59 pm
Lokacija: Zagreb

Re: Primjer upotrebe NTC-a

Post Postao/la domagoj#6547 » uto sij 28, 2020 9:21 am

Naravno da ga možeš pretvoriti u KKM :D Zato i jesmu tu. Nego, što se tiče brzine. Rezlutat mjerenja sam provjeravao paralelno s PLC-om čija je svrha baš to i koristio sam PT1000. PLC je sam po sebi vrlo brz i prema specifikaciji ulaze osvježava svakih 50ms, ali promjena temperature je bila daleko sporija od NTC-a. Kada se sve stabilizira razlika je cca 0,6°C u području sobne temperature. Vidjet ću kako je pri niskim i visokim temperaturama pa javim.
Pozdrav, Domagoj
Avatar
dekip#5165
Hobist
Hobist
Postovi: 67
Pridružen/a: pon srp 30, 2018 10:04 pm
Lokacija: Beograd
Kontakt:

Re: Primjer upotrebe NTC-a

Post Postao/la dekip#5165 » čet vel 06, 2020 8:12 pm

Ova mi tema promakla.
Vrlo zanimljiv tekst, s tim što bih ja dodao da je u piranju termo otpornik koji se koristi svuda oko nas. Počevši od klima uređaja pa na dalje. Može s naći u formi komponente nalik na keramički kondenzator ili u formi sonde. Jedan u formi sonde ja koristim da merim temperaturu peći centralnog grejanja.

Jedan zanimljiv tekst imate ovde: https://www.sk.rs/2017/09/sklp04.html
;)
domagoj#6547
Ozbiljni hardveraš
Ozbiljni hardveraš
Postovi: 129
Pridružen/a: ned tra 15, 2018 2:59 pm
Lokacija: Zagreb

Re: Primjer upotrebe NTC-a

Post Postao/la domagoj#6547 » čet vel 06, 2020 9:44 pm

Dekip, hvala za link. Stvarno na jednostavan način opisuje rad s NTC-om (i PTC-om). Moji kompjuteraši bi rekli JAD (jednostavno a dobro) :D
U međuvremenu sam proveo ispitivanje na nešto nižim temperaturama. Test je išao ovako. Zamrznuo sam vodu u ledenici a prije toga sam u vodu stavio NTC i Pt1000 sonde, tako da kad se voda smrzne, da sonde ostanu u ledu. Nakon nekog vremena, cca 3 sata sam sve skupa izvadio i krenuo uspoređivati temperature. Led se lagano topio i pretvarao u vodu a ja sam bilježio obje temeprature dok voda nije došla na sobnu temperauturu. Uf, al je trajalo. Ukratko, rezultat je bio očekivani. Oko sobne temperature je odstupanje bilo najmanje, dok je na početku bilo najveće, cca 1,4°C. Trebam spomenuti i to da je početna temperatura bila 0,4°C jer očito nisam posudu držao dovoljno dugo. Drugi put ću ostaviti barem jedan dan, pretpostavljam da će biti manja od 0°C. Kasnije ću probati i s visokim temperaturama samo moram smisliti način polaganog podizanja temperature kako brzina ne bi utjecala na rezulatat. NTC ima brzi odziv ali Pt1000 je nešto sporiji pa mu moram dati vremena.
Odgovorite