PDA

Επιστροφή στο Forum : LM35 σε όλο το εύρος λειτουργίας απο -55 έως 150 βαθμούς C



lelek
19-01-15, 21:06
Ψάχτηκα λίγο και το μόνο που βρήκα ήτανε ένα σχήμα με 2 διόδους και μια 18Κ αντίσταση εδώ στο φορουμ αλλά μόνο μια αναφορά είχε γίνει.

Η ερώτηση μου είναι πως χρησιμοποιούμε την αναλογική έξοδο του LM35. Αυτό που γνωρίζω είναι ότι για είσοδο στο Arduino από 0 έως 5 volt παίρνω 0 έως 1023 από τον ADC του Arduino (όταν η Vcc είναι 5 Volts που τόσο θα έχουμε ας πούμε). To LM35 όμως μπορεί να δώσει μέγιστη τάση (+10 mV/C) x 150 C = 1500 mV = 1,5 V. Πώς γίνεται να μη το λαμβάνουν αυτό υπόψη τα διάφορα sites στο ίντερνετ?

Εκτός κι αν κάνω λάθος εγώ. Και το λέω αυτό γιατί χρησιμοποιούν τη μετατροπή: temp_C = (5/1024) x Κ(mV που βγάζει ο αισθητήρας) x 100.

Ενώ ο αισθητήρας βγάζει από 0 έως 1,5 V (από 0 έως 150 C δηλαδή αν και για κάποιο παράξενο λόγο το datasheet λέει από +2 για 0 mV) και όχι από 0 έως 5 V. Δεν παίζει ρόλο αυτό??

Ακόμη πιο δύσκολα γίνονται τα πράγματα για θερμοκρασίες από -55 ως +150 όπου εκεί προφανώς ξεκινάμε από τα -550 mV. Τί γίνεται τότε?

Αν μπορεί κάποιος να με βοηθήσει και στις 2 περιπτώσεις εύρους θερμοκρασιών γιατί τα έχω μπερδέψει εντελώς....

lelek
19-01-15, 21:11
Για παράδειγμα όταν δίνει στη δεύτερη περίπτωση ο αισθητήρας σήμα/τιμή -400 mV σε ποιά τιμή από 0 ως 1023 την αντιστοιχίζει ο ADC? Ποιος θα είναι ο μαθηματικός τύπος?

SRF
19-01-15, 21:23
Ψάχτηκα λίγο και το μόνο που βρήκα ήτανε ένα σχήμα με 2 διόδους και μια 18Κ αντίσταση εδώ στο φορουμ αλλά μόνο μια αναφορά είχε γίνει.

Η ερώτηση μου είναι πως χρησιμοποιούμε την αναλογική έξοδο του LM35. Αυτό που γνωρίζω είναι ότι για είσοδο στο Arduino από 0 έως 5 volt παίρνω 0 έως 1023 από τον ADC του Arduino (όταν η Vcc είναι 5 Volts που τόσο θα έχουμε ας πούμε). To LM35 όμως μπορεί να δώσει μέγιστη τάση (+10 mV/C) x 150 C = 1500 mV = 1,5 V. Πώς γίνεται να μη το λαμβάνουν αυτό υπόψη τα διάφορα sites στο ίντερνετ?

Εκτός κι αν κάνω λάθος εγώ. Και το λέω αυτό γιατί χρησιμοποιούν τη μετατροπή: temp_C = (5/1024) x Κ(mV που βγάζει ο αισθητήρας) x 100.

Ενώ ο αισθητήρας βγάζει από 0 έως 1,5 V (από 0 έως 150 C δηλαδή αν και για κάποιο παράξενο λόγο το datasheet λέει από +2 για 0 mV) και όχι από 0 έως 5 V. Δεν παίζει ρόλο αυτό??

Ακόμη πιο δύσκολα γίνονται τα πράγματα για θερμοκρασίες από -55 ως +150 όπου εκεί προφανώς ξεκινάμε από τα -550 mV. Τί γίνεται τότε?

Αν μπορεί κάποιος να με βοηθήσει και στις 2 περιπτώσεις εύρους θερμοκρασιών γιατί τα έχω μπερδέψει εντελώς....


Για παράδειγμα όταν δίνει στη δεύτερη περίπτωση ο αισθητήρας σήμα/τιμή -400 mV σε ποιά τιμή από 0 ως 1023 την αντιστοιχίζει ο ADC? Ποιος θα είναι ο μαθηματικός τύπος?

Όλα όσα αναφέρεις για αρνητικές τιμές θερμοκρασίας είναι πάντα σε σχέση με την ακίδα αναφοράς (αναφερόμενη και ως GND) του LM35! Να στο θέσω πιό απλά? Η ΕΞΟΔΟΣ ΤΟΥ θα γίνει ΑΡΝΗΤΙΚΟΤΕΡΗ ΤΗΣ ΑΚΙΔΟΣ ΑΝΑΦΟΡΑΣ κατά 400mV! Αν η ακίδα αναφοράς του όμως είναι πολωμένη στα +0.7V έναντι της γενικής τάσεως αναφοράς στο κύκλωμά σου, πχ τα 0V του ADC & uCU... τότε η τελική εμφανιζόμενη τάση, στην αρνητικότερη δυνατή θερμοκρασία, που θα δίδεται στο πόδι AD ενός uCU που εργάζεται στα +5V θα είναι ~ +0.3V και θα πέφτει ΕΝΤΟΣ των όποιων δυνατών τιμών από το 0 εώς 1023 που θα σου διαβάζει ως ψηφιακή τιμή! :wiink:

manolena
19-01-15, 21:32
Απλά αλλάζεις το REF του analog converter απο 5V που είναι default σε INTERNAL REFERENCE που είναι 1.1V. Μέσα στη setup() γράφεις:

analogReference(INTERNAL);

... οπότε αν διαιρέσεις αντί 5, το 1.1/1024=0.001074 ή αλλιώς 1.074mV διακριτότητα, πολύ καλύτερη απο πριν.
Άρα, με βάση την έξοδο του LM35 10mV/βαθμό Κελσίου, τότε θα ισχύει:

10/1.074 = 9.31. Δηλαδή κάθε 9.31 μονάδες αύξησης του AD converter, θα έχεις αύξηση θερμοκρασίας 1 βαθμό Κελσίου.

lelek
19-01-15, 21:40
Όλα όσα αναφέρεις για αρνητικές τιμές θερμοκρασίας είναι πάντα σε σχέση με την ακίδα αναφοράς (αναφερόμενη και ως GND) του LM35! Να στο θέσω πιό απλά? Η ΕΞΟΔΟΣ ΤΟΥ θα γίνει ΑΡΝΗΤΙΚΟΤΕΡΗ ΤΗΣ ΑΚΙΔΟΣ ΑΝΑΦΟΡΑΣ κατά 400mV! Αν η ακίδα αναφοράς του όμως είναι πολωμένη στα +0.7V έναντι της γενικής τάσεως αναφοράς στο κύκλωμά σου, πχ τα 0V του ADC & uCU... τότε η τελική εμφανιζόμενη τάση, στην αρνητικότερη δυνατή θερμοκρασία, που θα δίδεται στο πόδι AD ενός uCU που εργάζεται στα +5V θα είναι ~ +0.3V και θα πέφτει ΕΝΤΟΣ των όποιων δυνατών τιμών από το 0 εώς 1023 που θα σου διαβάζει ως ψηφιακή τιμή! :wiink:

Δηλαδή αν δώσω δυναμικό στην ακίδα αναφοράς 0,7 V, τότε το -550 mV θα αντιστοιχίζεται στο 0 και το 1500 mV στο 1023? ο τύπος θα παραμείνει ο ίδιος?

lelek
19-01-15, 21:48
Απλά αλλάζεις το REF του analog converter απο 5V που είναι default σε INTERNAL REFERENCE που είναι 1.1V. Μέσα στη setup() γράφεις:

analogReference(INTERNAL);

... οπότε αν διαιρέσεις αντί 5, το 1.1/1024=0.001074 ή αλλιώς 1.074mV διακριτότητα, πολύ καλύτερη απο πριν.
Άρα, με βάση την έξοδο του LM35 10mV/βαθμό Κελσίου, τότε θα ισχύει:

10/1.074 = 9.31. Δηλαδή κάθε 9.31 μονάδες αύξησης του AD converter, θα έχεις αύξηση θερμοκρασίας 1 βαθμό Κελσίου.

Η αλλαγή αυτή σε 1.1 θα γίνει εσωτερικά μόνο? καμια αλλαγή στο hardware-συνδέσεις??
Αν είναι έτσι όπως το λες Μάνο τότε για αύξηση από -55 στους 155 θα έχω αύξηση 210 x 9.31 = 1955 μονάδων... δε βγαίνει

manolena
19-01-15, 22:02
Χωρίς παρεξήγηση: Γιατί δεν διαβάζετε πρώτα τα εγχειρίδια κάθε συσκευής/εξαρτήματος; Εκεί αναφέρονται τα πάντα. Ρίξε μια ματιά στο datasheet του LM35:

http://www.ti.com/lit/ds/symlink/lm35.pdf

Στις σελίδες 10,11, figures 17,18 είναι η λύση στο πρόβλημά σου, κάτι στο οποίο αναφέρθηκε και ο Γιώργος πιο πάνω.

EDIT: Υπάρχει πολλή πληροφορία στο δίκτυο αν ψάξεις με "arduino lm35 negative" για παράδειγμα:

http://blog.arduino.cc/2010/03/01/lm35-to-sense-negative-temperature/
http://electronics.stackexchange.com/questions/95911/lm35-negative-temperature-sensing-circuit
http://forum.arduino.cc/index.php?topic=225185.0
https://www.google.gr/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&cad=rja&uact=8&ved=0CAcQjRw&url=http%3A%2F%2Fwww.roroid.ro%2Fmasurare-temperatura-cu-lm35%2F&ei=R2i9VLDnGcTxatvZgcgK&bvm=bv.83829542,d.d2s&psig=AFQjCNG3fpFYKRVIfmzBJ71PEg_Nzm_QIw&ust=1421785537488628

Πάρε και ένα ιταλικό snippet για αρνητικές θερμοκρασίες:



/* ----------------LM35 per tutta la scala centigrada---------------

Questo codice consente di usare un LM35 per misurare anche
temperature negative.

La configurazione usata Γ¨ quella con due diodi tra il pin GND
del sensore e il GND dell'alimentazione.
Vengono prelevati due segnali che andranno a due ingressi
analogici di Arduino:
- il primo dal pin GND del LM35 chiamato "ref"
- il secondo dal pin OUT del LM35 chiamato "sensoreTemperatura"

La differenza tra "sensoreTemperatura" e "ref" contiene
l'informazione della temperatura che il sensore ha misurato

creato il 27 Febbraio 2010
da Federico Vanzati
*/


#define LM35_TEMP 0 // Pin analogico 0
#define LM35_REF 1 // Pin analogico 1


float temperatura; // variabile in cui viene salvata la temperatura in gradi centigradi
float prev_temperatura = 0; // temperatura precendente
int ref; // valore della tensione di riferimento dei due diodi
int ref_medio = 0; // valore della tensione di riferimento medio
int sensoreTemperatura; // valore di tensione letto dal pin OUT del sensore
int sensoreTemperatura_medio = 0; // valore sensoreTemperatura medio
int cont; //contatore usato per ottenere un valore medio


void setup()
{
Serial.begin(9600); //inizializzazione della comunicazione seriale
}


void loop()
{
// vengono sommati 10 valori di temperatura per poi farne la media
for( cont = 0; cont < 10; cont++)
{
sensoreTemperatura = analogRead(LM35_TEMP); // lettura della tensione del pin OUT LM35
sensoreTemperatura_medio += sensoreTemperatura; //sommatoria dei valori


ref = analogRead(LM35_REF); // lettura della tensione di riferimento
ref_medio += ref; // sommatoria dei valori


delay(500); // intervallo di campionamento
//la lettura durera' 10 (numero di camoioni) x 500ms (intervallo tra due campioni) = 5000ms
}


if(cont == 10) // quando ho sommato i dieci valori campionati si esegue:
{
cont = 0; // azzeramento contatore, per far ripartire il successivo campionamento


// media della sommatoria dei dieci valori campionati di ref e sensoreTemperatura
sensoreTemperatura_medio = sensoreTemperatura_medio / 10;
ref_medio = ref_medio / 10;

// conversione dei valori medi misurati in una temperatura in gradi centigradi
temperatura = (sensoreTemperatura_medio - ref_medio) * 100/2.56;
temperatura = temperatura * 5/1024;


// valore di temperatura che verra' mostrato quando si e' in fase di campionamento
//e non c'e' una temperatura disponibile
prev_temperatura = temperatura;


// stampa su seriale dei due valori medi
Serial.print(" ref_medio: ");
Serial.print(ref_medio);
Serial.print(" temp_medio: ");
Serial.print(sensoreTemperatura_medio);


// prima di un successiva acquisizione e media questi valori vanno azzerati
sensoreTemperatura_medio = 0;
ref_medio = 0;
}
else{
temperatura = prev_temperatura;
}
// stampa su seriale della temperatura ottenuta in gradi centigradi
Serial.print(" gradi: ");
Serial.println(temperatura);


}



/************************************************** *****
* Example how to use LM35 Temperature Sensor for Arduino
* in a full-range schema
* You can see the schema or datasheet or at link:
* http://www.ik0jre.net
* Author IK0JRE - Giuseppe Aquilani
* ik0jre AT ik0jre.net
* You can use and modify this software under GPL licence
* and I hope you write my name too in your software.
* We can measure celsius degree in full range scale
* from -500 mV to 1500 mV
* for these schema we need read a virtual ground or
* subtract a fixed value of 0.9 mV from analog read.
* For tollerance of electronic components I preferr
* read virtual ground value
* NOTE: from National datasheet in the full range schema
* the limits are
* LM35/LM35A -55 +150 C
* LM35C/LM35CA -40 +110 C
* LM35D 0 +100 C
* I tested schema and software with LM35DZ and it works
* under -10 and up +120
************************************************** *****/

//ATMEGA328 analog resolution is Vcc/1024
//#define FFACT ((float) 5 / 1024) //analog resolution at +5V

#define MAX_AV_READ 500 //n. read for average
const float SUPPLY_VOLTAGE = 500; // 5V * 100 (LM35 costant)

#define tA0 0 //Arduino analog input 0 connect to +out pin
#define tA1 1 //Arduino analog input 1 connect to -out pin
float tC0; //A0 read temp var
float tC1; //A1 read temp var
float tCalc; //var need for calc celsius degrees
#define FCORR 0.5 // only for test if we don't have precision read
//because supply voltage is not exactly +5v
/************************************************** *****
* Arduino needs a minimal Setup
************************************************** *****/
void setup()
{
analogReference(DEFAULT); // set voltage reference at default 5.0 V for Arduino 1
Serial.begin(9600); //open serial port at 9600 bps
}

/************************************************** *****
* Loop
************************************************** *****/
void loop()
{
int i;
// because at328 analog read is unstable
// we need an average from many read
// I found in 500 read a good solution between precision
// and speed
// in debug mode you can apply a multimeter at
// pin +out -out in schema for verify mV read from Arduino

for(i=0;i<MAX_AV_READ;i++){
tC0 += analogRead(tA0) ; //read +out sensor pin
delay(5); //atmega need 10uS delay but we preferr 5mS
tC1 += analogRead(tA1) ; //for full range scale -55 to + 155 C
} //must read -out pin (virtual Vss)

tC0 /=MAX_AV_READ; //average
tC1 /=MAX_AV_READ; //average

tCalc = tC0 - tC1 ; //subtract virtual ground value
// now we can calc celsius degrees
tCalc = ( tCalc * SUPPLY_VOLTAGE /1024) - FCORR;
//only for debug next three line show millVolt out from LM35
Serial.print(tC0); //show mV reads at A0 input
Serial.print(" "); //print space
Serial.print(tC1); //show mV reads at A1 input

//next show temperature in Celsius scale
Serial.print(" C ");
Serial.println(tCalc);

//delay(500); //with average don't need delay
}

lelek
19-01-15, 23:08
Σ'ευαριστώ ..αρκετά κατατοπιστικά.. Έριξα μια ματια θα τα κοιταξω καλυτερα στη συνεχεια.

lelek
20-01-15, 16:49
Όλα όσα αναφέρεις για αρνητικές τιμές θερμοκρασίας είναι πάντα σε σχέση με την ακίδα αναφοράς (αναφερόμενη και ως GND) του LM35! Να στο θέσω πιό απλά? Η ΕΞΟΔΟΣ ΤΟΥ θα γίνει ΑΡΝΗΤΙΚΟΤΕΡΗ ΤΗΣ ΑΚΙΔΟΣ ΑΝΑΦΟΡΑΣ κατά 400mV! Αν η ακίδα αναφοράς του όμως είναι πολωμένη στα +0.7V έναντι της γενικής τάσεως αναφοράς στο κύκλωμά σου, πχ τα 0V του ADC & uCU... τότε η τελική εμφανιζόμενη τάση, στην αρνητικότερη δυνατή θερμοκρασία, που θα δίδεται στο πόδι AD ενός uCU που εργάζεται στα +5V θα είναι ~ +0.3V και θα πέφτει ΕΝΤΟΣ των όποιων δυνατών τιμών από το 0 εώς 1023 που θα σου διαβάζει ως ψηφιακή τιμή! :wiink:

1) Δηλαδή εδώ που έχω -550 mV (- 55 C) ελάχιστη τιμή θα πρέπει να δώσω κατάλληλο δυναμικό στο GND π.χ εδώ +0,55 V έτσι ώστε να βγάζει 0 V η Vout του LM35... σωστά? το θέμα είναι πως αυτό δεν είναι κάπως δύσκολο με τη χρήση διόδων? να πετύχουμε δηλαδή ακριβώς τα +0,55 V??? Σε αυτή την περίπτωση κρατάμε την default Vref του Arduino που είναι 5 V προφανώς.

2)Και κάτι άλλο για να ξεκαθαρίσω μερικά πράγματα μέσα μου: Όταν έχω έναν αισθητήρα που βγάζει από 0,3 V μέχρι 4 V ενώ η Τάση αναφοράς στο Arduino είναι 5 V μπορώ να κάνω τη δουλειά μου απλά θα πάρω μικρότερο εύρος τιμών στον ADC πχ από 50 έως 950 αντί από 0 έως 1023??? ;έτσι ώστε μετά πάλι με αντίστροφο τρόπο να πάρω τα 0,3 V έως τα 4 Volt με χρήση του κατάλληλου τύπου στο sketch του Arduino?

lelek
20-01-15, 18:20
Παιδιά κανένας?

SRF
20-01-15, 18:43
Παιδιά κανένας?


1) Δηλαδή εδώ που έχω -550 mV (- 55 C) ελάχιστη τιμή θα πρέπει να δώσω κατάλληλο δυναμικό στο GND π.χ εδώ +0,55 V έτσι ώστε να βγάζει 0 V η Vout του LM35... σωστά? το θέμα είναι πως αυτό δεν είναι κάπως δύσκολο με τη χρήση διόδων? να πετύχουμε δηλαδή ακριβώς τα +0,55 V??? Σε αυτή την περίπτωση κρατάμε την default Vref του Arduino που είναι 5 V προφανώς.

2)Και κάτι άλλο για να ξεκαθαρίσω μερικά πράγματα μέσα μου: Όταν έχω έναν αισθητήρα που βγάζει από 0,3 V μέχρι 4 V ενώ η Τάση αναφοράς στο Arduino είναι 5 V μπορώ να κάνω τη δουλειά μου απλά θα πάρω μικρότερο εύρος τιμών στον ADC πχ από 50 έως 950 αντί από 0 έως 1023??? ;έτσι ώστε μετά πάλι με αντίστροφο τρόπο να πάρω τα 0,3 V έως τα 4 Volt με χρήση του κατάλληλου τύπου στο sketch του Arduino?


Τι ακριβώς δεν κατάλαβες και ρωτάς?

Στο 1.
Τα -550 είναι ανρητικότερα του ποδιού GND του αισθητήρα! Οπότε ΑΝ το πόδι αυτό δηλαδή το GND είναι "σηκωμένο" σε ε΄να δυναμικό θετικότερο κατα Χ>550mV εν σχέση με το 0 του υπόλοιπου κυκλώματος και σαφώς και του AD που θα συνδεθεί, τότε όλα θα ανταποκρίνονται σε θετικές τιμές τελικά! Τώρα το αν θα το "σηκώσεις" (πολώσεις δηλαδή) ακριβώς τόσο ώστε τα -550 να υπάρχουν στην έξοδο του ως ίσου δυναμικού με το 0 του υπόλοιπου κκυκλώματος αυτό είναι θέμα καθαρά επιλογής σου... αν και ΔΕΝ το συνιστώ!!!
επίσης ΟΧΙ ΔΕΝ ΕΙΝΑΙ ΚΑΘΟΛΟΥ ΔΥΣΚΟΛΟ ΜΕ ΤΗΝ ΧΡΗΣΗ ΔΙΟΔΩΝ! Στην ουσία ΜΕ ΤΗΝ ΧΡΗΣΗ ΔΙΟΔΟΥ (έστω μίας) είναι που γίνεται ΠΑΝΑΠΛΟ!

Στο 2.
Στο πρώτο σκέλος ναι ισχύει ακριβως ότι γράφεις! Αυτό άλλωστε σου είχα αναφέρει... με το "θα πέφτει εντός των υπαρκτών τιμών από 0 εώς 1023" !

lelek
20-01-15, 19:11
Σ'ευχαριστώ πολύ Γιώργο. Τώρα τα έβαλα σε μια τάξη... το είχες γράψει αυτό το είχα διαβάσει δε το κατάλαβα καλά και όταν διάβασα 5 πράγματα έκανα το λάθος και δε το ξαναδιάβασα.

Λάθη είμαστε ανθρώπους κάνουμε :) συγνώμη

Όσο για το απλό που λες απλά μου φαίνεται πως με διόδους ανεβαίνουμε σκαλί-σκαλί λόγω drop out 0,7 V για κάθε δίοδο που βάζουμε οπότε γιαυτό το βρίσκω δύσκολο εκτός κι αν δε το πιασα σωστά

lelek
20-01-15, 20:13
Προφανώς βάζω διόδους με το κατάλληλο drop out οπότε είμαι κοντά σε αυτό που θέλω.. οκ

savnik
20-01-15, 20:16
Τα -550 είναι ανρητικότερα του ποδιού GND του αισθητήρα!
Τελευταία το κάνω και εγώ. Μήπως είναι κάποιο σημάδι;

SRF
21-01-15, 01:51
Τελευταία το κάνω και εγώ. Μήπως είναι κάποιο σημάδι;

Ναι είναι! Δεν έχεις πιά τόσο χρόνο ώστε να μην βιάζεσαι υπερβολικά κατά την τυφλή πληκτρολόγηση!!! Ο νούς τρέχει πιό γρήγορα από την πληκτρολόγηση των δακτύλων! Ή αυτό, ή αρχίζει το... πάρκινσον και χτυπάμε δίπλα πλήκτρα λόγο τρέμουλου :biggrin:

picdev
21-01-15, 02:08
στα ad των μΕ, ρυθμίζεις το vRef, που είναι η μέγιστη τάση που θα μετρήσει ο A/d, υπάρχει και θετικό και αρνητικό και το ρυθμίζεις είτε σε pin είτε σε κάποιο εσωτερικό DAC.
οΛΑ ΑΥΤΆ ανάλογα με το μοντέλο του μΕ.

Αλλό να χωρίζεις τα 3volt σε 1024, δηλαδή 3/1024=0,002 και άλλο τα 5volt/1024=0,004.

Eπίσης τα datasheet έχουν κατανομές, το 10mv/C δεν είναι σίγουρο, θέλει ρύθμιση, είτε στη πράξη που θα κάνεις στο πρόγραμμα ,
είτε εξωτερικό με τριμερ