Sari la conținut
ELFORUM - Forumul electronistilor

Termistor ajustare cod


Vizitator

Postări Recomandate

Salut. Incerc sa citesc un NTC de 2k2, cu urmatorul cod:

// which analog pin to connect#define THERMISTORPIN A0	     // resistance at 25 degrees C#define THERMISTORNOMINAL 2200// temp. for nominal resistance (almost always 25 C)#define TEMPERATURENOMINAL 25   // how many samples to take and average, more takes longer// but is more 'smooth'#define NUMSAMPLES 5// The beta coefficient of the thermistor (usually 3000-4000)#define BCOEFFICIENT 3900// the value of the 'other' resistor#define SERIESRESISTOR 2186 int samples[NUMSAMPLES]; void setup(void) {  Serial.begin(9600);  analogReference(EXTERNAL);} void loop(void) {  uint8_t i;  float average;   // take N samples in a row, with a slight delay  for (i=0; i< NUMSAMPLES; i++) {   samples[i] = analogRead(THERMISTORPIN);   delay(10);  }   // average all the samples out  average = 0;  for (i=0; i< NUMSAMPLES; i++) {	 average += samples[i];  }  average /= NUMSAMPLES;   Serial.print("Average analog reading ");  Serial.println(average);   // convert the value to resistance  average = 1023 / average - 1;  average = SERIESRESISTOR / average;  Serial.print("Thermistor resistance ");  Serial.println(average);   float steinhart;  steinhart = average / THERMISTORNOMINAL;	 // (R/Ro)  steinhart = log(steinhart);				  // ln(R/Ro)  steinhart /= BCOEFFICIENT;				   // 1/B * ln(R/Ro)  steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)  steinhart = 1.0 / steinhart;				 // Invert  steinhart -= 273.15;						 // convert to C   Serial.print("Temperature ");  Serial.print(steinhart);  Serial.println(" *C");   delay(1000);}

Sursa codului.

 

..dar codul este conceput pentru o configuratie de genul: GND---NTC---ADC---2k2---5V

iar eu am in configuratie : GND---2k2----ADC----NTC----5V

 

cum ar trebui modificat codul in asa situatie ?...

 

de moment folosesc inversie pe ADC cu map(); dar nu mi se pare prea eleganta solutia.

 

PS: sper sa fiu inteles.., stiu ca ma exprim mai ...cumva :)

Editat de Vizitator
Link spre comentariu
  • Răspunsuri 8
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Liviu M

    3

  • nico_2010

    1

Top autori în acest subiect

Linia de mai jos

average = SERIESRESISTOR / average;

cred ca ar trebui rescrisa astfel:

average =  average/SERIESRESISTOR;

si asta deoarece tensiunea pe pinul ADC creste la cresterea temperaturii.

Te rog verifica. 

Link spre comentariu

Cand ai gnd - ntc - adc..., tensiunea pe ntc e tensiunea masurata de adc.Cand ai adc - ntc - 5V, tensiunea pe ntc e (5V - adc).Asa ca la tine in loc de

average /= NUMSAMPLES;

probabil ar trebui:

average = 1023 - average/NUMSAMPLES;

unde am presupus ca referinta ta e 5V (=> adc(5V) = 1023).

Editat de Liviu M
Link spre comentariu

pai...in cod exista asta:

// convert the value to resistance  average = 1023 / average - 1;

nu are nici o treaba cu ideea la care te gandesti ?

eu oricum nu folosesc chestia cu average, il citesc o singura data, fac in alta parte filtru, dar tot nu inteleg.

oricum o sa verific si spun ce se intampla.

 

 

L.E: nu e bine, acelasi rezultat "-273.0C".

  Am incercat si in combinatie cu ce spunea nico_2010 si doar cum spuneai. Nu merge...

Editat de Vizitator
Link spre comentariu

Dupa cum scrie si in comentariu, bucata pe care ai postat-o se ocupa de calculul rezistentei (de masurat tu masori o tensiune). Ce masori tu acum este tensiune pe rezistenta de 2k2. Cu ce am scris eu, masori tensiunea pe termistor.

Probabil ce ai citat tu se poate combina cu ce am scris a.i. sa iasa ceva mai scurt *), da' asa cum sunt acum nu sunt echivalente.

 

*) Inainte de optimizari poate ar trebui sa vezi daca e ce trebuie.

 

eu oricum nu folosesc chestia cu average, il citesc o singura data, fac in alta parte filtru, dar tot nu inteleg.

Poate ca ar fi bine sa discutam pe codul real, nu pe ceva asemanator. Nu?

Editat de Liviu M
Link spre comentariu

Tocmai intrasem sa spun situatia.

Optimizand codul, am comentat o linie si-am uitat sa intru cu variabila ADC.

Am revizuit tot, si ultima ideea functioneaza:

 

codul ar fi asa:

// which analog pin to connect#define THERMISTORPIN A0	     // resistance at 25 degrees C#define THERMISTORNOMINAL 2200// temp. for nominal resistance (almost always 25 C)#define TEMPERATURENOMINAL 25   // how many samples to take and average, more takes longer// but is more 'smooth'#define NUMSAMPLES 5// The beta coefficient of the thermistor (usually 3000-4000)#define BCOEFFICIENT 3900// the value of the 'other' resistor#define SERIESRESISTOR 2186 int samples[NUMSAMPLES]; void setup(void) {  Serial.begin(9600);  analogReference(EXTERNAL);} void loop(void) {  uint8_t i;  float average;   // take N samples in a row, with a slight delay  for (i=0; i< NUMSAMPLES; i++) {   samples[i] = analogRead(THERMISTORPIN);   delay(10);  }   // average all the samples out  average = 0;  for (i=0; i< NUMSAMPLES; i++) {	 average += samples[i];  }   average = 1023 - average/NUMSAMPLES; // by Liviu   Serial.print("Average analog reading ");  Serial.println(average);   // convert the value to resistance  average = 1023 / average - 1;  average = SERIESRESISTOR / average;  Serial.print("Thermistor resistance ");  Serial.println(average);   float steinhart;  steinhart = average / THERMISTORNOMINAL;	 // (R/Ro)  steinhart = log(steinhart);				  // ln(R/Ro)  steinhart /= BCOEFFICIENT;				   // 1/B * ln(R/Ro)  steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)  steinhart = 1.0 / steinhart;				 // Invert  steinhart -= 273.15;						 // convert to C   Serial.print("Temperature ");  Serial.print(steinhart);  Serial.println(" *C");   delay(1000);}

cer scuze pentru neatentia atentiei. :)

 

 

eu foloseam asa:

double GetTemperature(int RawADC) {    double average;    average  = 1023 - RawADC; // --> linia asta era comentata.    average = 1023 / average - 1;    average = 2186 / average;   	 double steinhart;    steinhart = average / 2200;    steinhart = log(steinhart);    steinhart /= 3900;    steinhart += 1.0 / (25 + 273.15);    steinhart = 1.0 / steinhart;    steinhart -= 273.15;    return steinhart;}
Editat de Vizitator
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări