Vizitator Postat Noiembrie 24, 2014 Partajează Postat Noiembrie 24, 2014 (editat) 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 Noiembrie 24, 2014 de Vizitator Link spre comentariu
nico_2010 Postat Noiembrie 24, 2014 Partajează Postat Noiembrie 24, 2014 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
Vizitator Postat Noiembrie 24, 2014 Partajează Postat Noiembrie 24, 2014 nu merge..imi returneaza -273.0C Link spre comentariu
Liviu M Postat Noiembrie 24, 2014 Partajează Postat Noiembrie 24, 2014 (editat) 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 Noiembrie 24, 2014 de Liviu M Link spre comentariu
Vizitator Postat Noiembrie 24, 2014 Partajează Postat Noiembrie 24, 2014 (editat) 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 Noiembrie 24, 2014 de Vizitator Link spre comentariu
Liviu M Postat Noiembrie 24, 2014 Partajează Postat Noiembrie 24, 2014 (editat) 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 Noiembrie 24, 2014 de Liviu M Link spre comentariu
Vizitator Postat Noiembrie 24, 2014 Partajează Postat Noiembrie 24, 2014 (editat) 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 Noiembrie 24, 2014 de Vizitator Link spre comentariu
Vizitator Postat Noiembrie 25, 2014 Partajează Postat Noiembrie 25, 2014 (editat) multumesc. Editat Noiembrie 25, 2014 de Vizitator Link spre comentariu
Liviu M Postat Noiembrie 25, 2014 Partajează Postat Noiembrie 25, 2014 Cu placere. Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum