termisistore NTC e adc, come ricavare la temperatura?

Ho questo circuito di prova:

Devo ricavare la temperatura in gradi celsius.

Io faccio così: per ricavare la resistenza del termisistore:

float resolution = 5.10 / 1024;                          // 5.10 volts diviso 1024 valori
int RawADC = analogRead(ThermistorPIN);      // leggo il pin 0
float v2 = RawADC * resolution;                       // ricavo tensione ai capi del termisistore
float I = (5.10 - v2) / 453000;                                // ricavo la corrente IR = ITermisistore
Resistance = v2 / I;                                           // ricavo la resistenza

Però confrontando il valore di Resistance con quello misurato con il tester o una bella differenza e guardando la tabbella del termisistore
ha ragione il tester. Dove sbaglio?

Poi come faccio a ricavarmi la temperatura avendo la resistenza del termisistore?

Ciao.

therm_adcSchermata.png

Un NTC è una resistenza ad alto valore che diminuisce all'aumentare della temperatura; quindi se hai 100K a 25°C, a 35°C avrai una resistenza inferiore e a 10°C una resistenza superiore. Se l'NTC è di buona qualità e con andamento abbastanza lineare puoi cominciare a realizzare una formula inversamente proporzionale; penso comunque che il datasheet del componente sia importante per capire il range dei valori misurabili e la sua precisione.

Perchè Ti fai il lavoro di calcolare la resistenza per poi calcolare la temperatura?
Perchè non Ti fai una formuletta che partendo dalla tensione misurata calcola la temperatura?
Sappi che la resistenza del NTC non è lineare rispetto la temperatura.
La misura può essere precisa se la retta di conversione la calcoli nel punto di lavoro. per esempio vuoi fare un termostato che ti deve tenere 25 gradi. Allora ti crei una retta di conversione che è giusta per i 25 gradi. Se poi sbaglia a tempertura più alta e più bassa non interessa perchè non devi misurare la temperatura esatta in quel range.
Ciao Uwe

Perchè Ti fai il lavoro di calcolare la resistenza per poi calcolare la temperatura?
Perchè non Ti fai una formuletta che partendo dalla tensione misurata calcola la temperatura?

Ma ci trovi qualcosa di sbagliato?
No perchè a me non combacia la R calcolata con quella letta dal tester ed il tester ha raggione.
La formuletta si, in effetti sto usando le formule standard

L' equazione di Steinhart-Hart non posso usarla perchè non ho i paramentri a, b, c.

Mentre ho la costante B è so come ricavarla in base al delta t.
Quindi sto usando l'equazione con il parametro B.

Il codice:

float Thermistor(int RawADC) {
//    long Resistance;  
    static float Temp = 0;  // Dual-Purpose variable to save space.
    
    float v2 = RawADC * resolution;
    float I = (5.10 - v2) / 453000;
    Resistance = (v2 / I);
    // B = (log R/R0) / (1/T - 1/T0)
    // R/R0 è il delta es 25C° - 0 C° B vale 4129.2451;
    //B = log(1137312.0/355224.0) / ((1/253.15) - (1/273.15));

    if (Temp < 0)
        B = 4023.2861;
    else
        B = 4129.2451;
    
    Temp = NTC25 * exp(-B/298.15);
    Temp = B / log(Resistance / Temp);
    Temp = Temp - 273.15;                // Convert Kelvin to Celsius                      
    return Temp;                                // Return the Temperature
}

Funziona ma ho un'errore nel calcolo della R.
Es:
Tamb 24.3 C°
R_calcolata = 116168 ohm
R_misura = 102K
Temp = 21.8082.

Nota se nelle formule uso R_misura Temp = 24.5743 che ritengo abbastanza corretto.

Ora sto pensando che l'impedenza di ingresso del convertitore non è così alta come quella del tester
e questo può essere il motivo.

Ciao.

alla misura fatta col tester aggiungi la tolleranza dell'ntc e l'errore del tester e vedi che forse rientri :slight_smile:

alla misura fatta col tester aggiungi la tolleranza dell'ntc e l'errore del tester e vedi che forse rientri

Praticamente risolvo cambiando la formula per ricavare la corrente.
Era così:

float I = (5.10 - v2) / 453000;

ora è così:

float I = (vcc - v2) / (453000 - 53000.0);

Solo che volevo capire il perchè di questa differenza

Ciao.

Mi dai un chiarimento software? cosa cambia a scrivere direttamente 400000 invece di 453000 - 53000,0 ?

anche se scrivi float I = (5.10 - v2) / 453000.000 ; ?

Mi dai un chiarimento software? cosa cambia a scrivere direttamente 400000 invece di 453000 - 53000,0 ?

Nessuna, in realtà 453000 (453K 1%), sarebbe il valore della resistenza serie all'NTC, quindi nella formula dovrebbe comparire rs al posto di della costante numerica.
Mentre 53000.0 (dovrebbe essere sostituito con una variabile rError) è un valore trovato empiricamente per corregere il tiro, ed in teoria non dovrebbe neanche esserci, il problema è proprio questo, perchè questo errore da cosa dipende?

Il risultato non cambia ma cambia alla lettura: float Irs = (vcc - v2) / (rs - rError); in questo modo è più leggibile.

Si Brain anche se scrivo quello, provato due minuti fà. Ora vado a vedere il datasheet del 328 nella sezione adc e cerco anche le AN di atmel sull'ADC.

Ciao.

Trovato il problema:

The ADC is optimized for analog signals with an output impedance of approximately 10 k? or
less. If such a source is used, the sampling time will be negligible. If a source with higher imped-
ance is used, the sampling time will depend on how long time the source needs to charge the
S/H capacitor, with can vary widely. The user is recommended to only use low impedance
sources with slowly varying signals, since this minimizes the required charge transfer to the S/H
capacitor.

L'impedenza del circuito che fornisce la dp deve avere una impedenza di 10k o minore, quindi se dovete acquistare dei NTC da usare come sensori di temperatura sceglieteli con un valore non superiore a 10K a 25C°
L'errore introdotto sarà minimo.

Mentre con quelli che ho io http://datasheet.octopart.com/NTSD1WF104FPB30-Murata-datasheet-121240.pdf Pag.26, 100 Kohm a 25C°, con la R serie da 453K sono costretto ad usare un buffer per abbassare l'impedenza, dovrei usare un operazionale ma se fosse possibile risolvere con un Fet sarebbe più semplice. Comunque alla fine se sottraendo 53000 risolvo potrei lasciare così.

Ciao.

Ma questo tipo di correzione non peggiora la percentuale d'errore andando verso gli estremi della scala di lettura? Altrimenti significherebbe che l'NTC ha un buon andamento lineare, a mia memoria non è facile trovarne. Curiosità: col tuo schema che range di temperatura riesci a misurare?

Ma questo tipo di correzione non peggiora la percentuale d'errore andando verso gli estremi della scala di lettura?

Questo errore non c'èntra con l'errore che si viene a creare se si calcola la T pensando che il rapporto R/T sia una costante. L'errore qui è derivato proprio dalle resistenze in gioco troppo elevate per l'adc del 328, per questo il tester legge correttamente. Se ti ricordi i primi tester analogici tipo Scuola radio elettra, avevano una impedenza molto più bassa di quelle attuali, in pratica è come se leggesi la tensione con uno strumento di quel tipo.

Quindi è il 328 usato a mo di tester (che non ha una impedenza dell'ordine del megaohm) ha falsare il risultato, mentre il calcolo con l'equazione B risolve in parte le non linearità di T/R.

Il range che mi serve va da 25 C° a -20C° questa è la temperatura di lavoro dei congelatori delle celle per la frutta o fiori 4-5C°, -18 per il cibo congelato da conservare a lungo. Anche se ci sono celle che riescono a portare il cibo a -25, non so a cosa servono.

Ciao.

-25°C, fino anche a -27°C sono usati per la conservazione di cibi a base zuccherina (dolci e semifreddi pronti e sostanze per produrli) ma non so perché. Non molto tempo fa ho messo un piccolo sistema di telecontrollo gsm per segnalare agli addetti se c'è un'anomalia di temperatura o se si spengono i generatori di una megacella di un centinaio di mq; per il primo però mi sono interfacciato al loro termostato, il secondo era facile. Mi hanno detto che assolutamente la temperatura non doveva salire oltre i 16-17°C.