Arduino Forum

International => Italiano => Software => Topic started by: GianfrancoPa on Oct 26, 2012, 11:25 am

Title: Pt100 e Smartec UTI
Post by: GianfrancoPa on Oct 26, 2012, 11:25 am
Ogni tanto mi ripresento, dopo almeno un anno di pausa sto riprendendo qualche progetto passato, e come da oggetto, al momento ho per le mani un sensore PT100 classe B (http://it.rs-online.com/web/p/termoresistenza-al-platino/0465404/) che gestisco con uno Smartec UTI.

Il codice di riferimento l'ho pescato qua:

http://arduino.cc/forum/index.php/topic,17349.0.html

Per comodità riporto lo schema: http://bildr.no/view/618030

Seguendo il datasheet (http://www.smartec.nl/pdf/DSUTI.pdf) a pagina 14, ho sostituito la Rbias prevista nello schema da 6.2 con una da 2.2 poichè uso una PT100 e non una PT1000.

Poichè sono previste 3 sonde, ho sostituito due di esse con due resistenze da 120 ohm, e tutto funziona, quanto meno rilevo valori che hanno senso. Ho solo qualche dubbio:

Per verificare la corretta taratura ho inserito il sensore in un bicchiere con del ghiaccio ed ho aspettato che cominciasse a sciogliersi. Il sensore non misura 100ohm bensì un valore che varia tra 102.5 e 103.3. E' normale???

Ecco una foto: http://imageshack.us/photo/my-images/37/201210251333.jpg/

Questi 2.5/3 ohm possono essere dovuti al cavo?? Purtroppo è una sonda a due soli fili e non posso conoscere la sola resistenza del cavo.

Altra questione: il sensore varia velocemente ed in maniera scostante il dato, variando la temperatura anche di mezzo grado nel giro di 1/2 secondo. Da cosa è dovuto ciò??

Grazie mille a tutti per l'attenzione!!!
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Oct 26, 2012, 11:40 am
Per aggiungere altre informazioni:

Avendo usato al posto di due PT100 due resistenze da 120ohm, l'UTI rileva un valore che oscilla tra 119.x e 120.x, non dovrebbe essere un valore fisso???

Ho provato a montare il sensore come indicato nel datasheet a pagina 15 figura 10c, ma non ottengo miglioramenti sensibili, o meglio, i valori oscillano sempre
Title: Re: Pt100 e Smartec UTI
Post by: lestofante on Oct 26, 2012, 12:04 pm
queste sonde sono quasi istantanee a dare il valore, quindi l'unico rallentamento è il circuito di amplificazione e l'ADC

le resistenze variano il proprio OHM in base anche al calore e forse qualche altro fattore, devi usare una Rbias (e delle "finte sonde") con precisione almeno dell'1%
Se noti l'errore di oscillazione dell'amplificazione sonda "varia tra 102.5 e 103.3" è lo stesso errore delle finte sonde "oscilla tra 119.x e 120.x"... per caso le resistenze "finte sonde" e Rbias hanno la stessa precisione?  :D

avere 102.5ohm poterbbe essere normale, è dato dal fatto che 100 è il valore medio, poi tu devi fare una piccola calibrazione. (controlla comunque di essere nelle specifiche di precisione della sonda, tenendo da conto che l'amplificazione amplifica anche il rumore)

Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Oct 26, 2012, 12:26 pm
Non credo che la Rbias usata sia ad alta precisione, sono quelle con l'anello color oro, se non sbaglio con errore del 5%.

Secondo te l'errore quindi sta in questo quindi?? Io pensavo che la percentuale d'errore indicasse il valore massimo da cui può distaccarsi la resistenza rispetto al valore di costruzione dichiarato, ma supponendo che una resistenza abbia un errore in difetto del 4%, quello è e quello dev'essere sempre, non dovrebbe oscillare, ora -4%, fra un seconto +2%, poi -3%, ecc ecc... Almeno credo, vado per puro intuito!!
Title: Re: Pt100 e Smartec UTI
Post by: lestofante on Oct 26, 2012, 01:11 pm
no, la resistenza varia anche in base alla temperatura, infatti le resistenze di precisione a 6 anelli danno indicazione della variazione di R in base alla temperatura http://it.wikipedia.org/wiki/Resistore#Codifica
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Oct 26, 2012, 01:39 pm
Ah, ok!!

In ogni caso nel datasheet (pag 14) dice che vanno bene quelle al 5%:

RBIAS (Pt100, self-heating for
200K/W = 80 mK)
2.2 kW (5%),
I = 2 mA

RBIAS (Pt1000, self-heating for
200K/W = 80 mK)
6.2 kW (5%),
I = 600 mA

Vuol dire che vanno bene o no?
Title: Re: Pt100 e Smartec UTI
Post by: lestofante on Oct 26, 2012, 02:23 pm
mai detto che non vanno bene, ma che ti sballano un poco i valori.. sta a te decidere se ti va bene quella precisione
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Oct 26, 2012, 02:42 pm
Ovvio, più precisa è la rilevazione meglio è, soltanto che al momento non mi ritrovo delle resistenze così precise, ad anche se dovessi ordinarle passerebbero dei giorni. Ora che ne ho capito l'importanza nel progetto finale opterò per questo tipo di resistori!!

Nel datasheet parla di diverse cause che possono alterare la precisione:
-Un errore interno del chip fa si che la precisione del dato per una PT100 abbia una forchetta di +-40 mOhm, un fattore costruttivo dell'integrato;
-La lunghezza cavo del sensore;
-Aumento della temperatura interna dell'integrato. Con una Rbias di 2.2kOhm dovrei ridurre l'errore a 80mK (milli-Kelvin???);
-La rilevazione della terza PT100 ha un errore sistematico e stabile di 0.9 Ohm

In ogni caso il problema che al momento vorrei risolvere è quello delle rilevazioni ballerine, cambiano, mutano troppo velocemente con salti considerevoli! Vorrei sfruttare al massimo la precisione del sensore (Classe B, +-0.3°C), ma se ogni secondo il dato sballa di 0.5°C rendo tutto inutile, al posto suo uso un seplice ds18b20 :D
Title: Re: Pt100 e Smartec UTI
Post by: lestofante on Oct 26, 2012, 02:52 pm
uhmm prova a fare al cavo del sensore un'armatura collegata a GND, in pratica gli fai una gabbia di faraday che ne limita parecchio l'effetto antenna.

forse avvolgerla nella carta stagnola, e poi collegare la stagnola a terra può bastare.
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Oct 26, 2012, 03:39 pm
é un tentativo che sicuramente proverò, ma prima di stasera non potrò fare alcun tentativo.

Fino ad allora il cervello continuerà a frullare... :D

Curiosando le sito della smartec ho trovato altri documenti interessanti. In questo http://www.smartec-sensors.com/assets/files/pdf/manuals/DCPtN.PDF si legge letto altre cosette, come, ad esempio, che fino a mezzo metro di cavo il segnale è stabile. Oltre mezzo metro potrebbero nascere dei problemi. Ecco l'estratto:

In standard UTI applications, the Pt 100 excitation is a square wave voltage between E and F (AC signal), via the series connection of Rbias and Rref (see UTI Data sheet). This works fine as long as the cables are short (under 0,5 meter). When the connecting cables need to be longer, the parasitic capacitances between the connecting wires and /or the grounded cable shield will degrade the signal. Please refer to application note APPUTI08 for more information about this matter

Se questo potrebbe essere la causa dei problemi, potrei accorciare il cavo del sensore (a mali estremi...) che è lungo 1 metro. La restante metà potrei inoltre cortocircuitarla per simulare una pt100 a 4 cavi. Ho detto una fesseria? :D
Title: Re: Pt100 e Smartec UTI
Post by: menniti on Oct 26, 2012, 06:13 pm
solo per salutarti e dirti «e che zzzz, tra una pausa e la sparizione tempo ne passa!» Ciaaaaoo!!
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Oct 26, 2012, 06:14 pm

solo per salutarti e dirti «e che zzzz, tra una pausa e la sparizione tempo ne passa!» Ciaaaaoo!!


Ciao Michele, vedo che nel frattempo voi non vi siete fermati, la tua firma la dice lunga!!!  ;) ;)
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Oct 26, 2012, 08:07 pm
Ecco alcuni un esempio di ciò che ricevo:

Resistance 1: 110.28   Resistance 2: 120.44   Resistance 3: 121.00   
Resistance 1: 109.63   Resistance 2: 120.51   Resistance 3: 120.75   
Resistance 1: 110.05   Resistance 2: 120.37   Resistance 3: 120.76   
Resistance 1: 110.41   Resistance 2: 121.14   Resistance 3: 121.32   
Resistance 1: 109.47   Resistance 2: 119.99   Resistance 3: 120.61   
Resistance 1: 109.90   Resistance 2: 120.89   Resistance 3: 121.00   
Resistance 1: 109.90   Resistance 2: 120.65   Resistance 3: 120.73   
Resistance 1: 109.78   Resistance 2: 120.35   Resistance 3: 120.89   
Resistance 1: 109.65   Resistance 2: 120.49   Resistance 3: 120.98   


La PT100 è la prima resistenza, mentre le altre due sono le resistenze da 120 Ohm
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Oct 26, 2012, 11:22 pm
Allora, il cavo inizialmente era di 2 metri, l'ho accorciato a 50cm come consigliato nel datasheet ed ho ottenuto risultati migliori, ecco ad esempio:

Resistenza: 109.89   Base Zero: 9.89   Temperatura: 25.75   
Resistenza: 109.79   Base Zero: 9.79   Temperatura: 25.50   
Resistenza: 109.76   Base Zero: 9.76   Temperatura: 25.43   
Resistenza: 109.88   Base Zero: 9.88   Temperatura: 25.72   
Resistenza: 109.81   Base Zero: 9.81   Temperatura: 25.54   
Resistenza: 109.82   Base Zero: 9.82   Temperatura: 25.58   
Resistenza: 109.78   Base Zero: 9.78   Temperatura: 25.47   
Resistenza: 109.78   Base Zero: 9.78   Temperatura: 25.46   
Resistenza: 109.83   Base Zero: 9.83   Temperatura: 25.61   
Resistenza: 109.75   Base Zero: 9.75   Temperatura: 25.40   


Le rilevazioni avvengono ogni 3 secondi. Come vi sembrano?? Un comportamento corretto per una PT100?
Title: Re: Pt100 e Smartec UTI
Post by: menniti on Oct 26, 2012, 11:30 pm
variazioni di decimi di grado sono normali, non so se nei tre secondi fai la media delle letture oppure se fai una sola lettura ogni tre secondi; comunque sia sembra accettabile; dovresti provare a cambiare ambiente, p.es. nel frigo o fuori casa, per vedere la variazione, è importante.
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Oct 26, 2012, 11:35 pm
No no, nessuna media, sono solo i valori nudi e crudi. Con una media secondo te i valori si appiattirebbero??

Inoltre ho effettuato un altro tipo di collegamento, come indicato nella figura 9c di pagina 13 del datasheet. Ottengo rilevazioni più stabili:

Resistenza: 109.92   Base Zero: 9.92   Temperatura: 25.83   Norm: 25.83   
Resistenza: 109.90   Base Zero: 9.90   Temperatura: 25.79   Norm: 25.79   
Resistenza: 109.78   Base Zero: 9.78   Temperatura: 25.48   Norm: 25.48   
Resistenza: 109.83   Base Zero: 9.83   Temperatura: 25.61   Norm: 25.61   
Resistenza: 109.88   Base Zero: 9.88   Temperatura: 25.74   Norm: 25.74   
Resistenza: 109.84   Base Zero: 9.84   Temperatura: 25.64   Norm: 25.64   
Resistenza: 109.93   Base Zero: 9.93   Temperatura: 25.87   Norm: 25.87   
Resistenza: 109.92   Base Zero: 9.92   Temperatura: 25.84   Norm: 25.84   
Resistenza: 109.92   Base Zero: 9.92   Temperatura: 25.84   Norm: 25.84   
Resistenza: 109.96   Base Zero: 9.96   Temperatura: 25.95   Norm: 25.95   
Resistenza: 109.89   Base Zero: 9.89   Temperatura: 25.76   Norm: 25.76   
Resistenza: 109.92   Base Zero: 9.92   Temperatura: 25.83   Norm: 25.83   
Resistenza: 109.87   Base Zero: 9.87   Temperatura: 25.71   Norm: 25.71   
Resistenza: 109.92   Base Zero: 9.92   Temperatura: 25.85   Norm: 25.85


Così secondo me sono ottime rilevazioni!! Di sicuro non sono più "isteriche" come accadeva quando usavo il cavo lungo...

Ora resterebbe solo da fare prove in altri ambienti, come da te consigliato, e soprattutto tarare per benino il sensore. come consigliereste di fare???

Grazie mille ;)
Title: Re: Pt100 e Smartec UTI
Post by: PaoloP on Oct 27, 2012, 10:04 am

Ora resterebbe solo da fare prove in altri ambienti, come da te consigliato, e soprattutto tarare per benino il sensore. come consigliereste di fare???


Per tararla, considerando un rapporto lineare tra resistenza e temperatura, ti servono 2 punti noti. Due coppie resistenza e temperatura.
I più semplici da ottenere sono 0 °C e 100 °C .
Con lo zero ho visto che hai già sperimentato. Adesso, all'ora di pranzo... quando la pasta bolle... misuri la resistenza del sensore. (occhio all'eventuale moglie/compagna/fidanzata)
Con le due coppie di dati ti calcoli le constanti da inserire nella formula.
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Oct 27, 2012, 10:09 am
Perfetto, grazie per la conferma. Solo un piccolo chiarimento:

per l'esperimento del ghiaccio devo aspettare che questo si sciolga e misurare la temperatura dell'acqua con il ghiaccio ancora in parte non dissolto? Come descritto qua in pratica : http://www.fisica.uniud.it/URDF/secif/termo/stati/es19.htm
Title: Re: Pt100 e Smartec UTI
Post by: lestofante on Oct 27, 2012, 03:22 pm
sì, il ghiaccio che non si scioglie ha una tempoeratura più bassa degli 0°. onvcee il ghiaaccio che si cioglie, può essere anche in forno, ma fichè è sotto forma di ghiaggio non va sopra gli 0°. il calore in più fa solo aumentare la velocità di fusione. la stessa cosa vale per l'acqua che evapora: non supera mai i 100°, per questo alcune cose si fanno  a bagno maria, come il cioccolato, perchè a temperature poco oltre i 100° brucierebbero, e con questo trucco invece si fa un cuscinetto s'acqua della giusta temperatura.
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Oct 28, 2012, 02:35 pm
Allora, ho effettuato le prove di calibrazione, ecco come ho condotto gli esperimenti (si vede che sono in cucina :D):


(http://img840.imageshack.us/img840/6863/201210281339.jpg) (http://imageshack.us/photo/my-images/840/201210281339.jpg/)

(http://img819.imageshack.us/img819/9528/201210281340.jpg) (http://imageshack.us/photo/my-images/819/201210281340.jpg/)

Il sensore immerso nel ghiaccio + acqua segna mediamente una resistenza di 101.82 ohm, mentre nel punto di ebollizione mediamente registra 138,69 ohm. La pressione atmosferica non normalizzata è 985 hPa, di conseguenza il punto di ebollizione dovrebbe essere di 99,3°C, il che porterebbe l'ipotetico valore dei 100°C a 138,96 ohm

Considerando che il sensore è una PT100 classe B dovrebbe in teoria segnare 100 ohm a 0°C e 138,4°C a 100°C. Ovviamente che il mio a 0°C segni qualche ohm in più ci sta, ma per il punto di ebollizione ottenere uno scostamento uguale a quello ottenuto per il punto di fusione? Come dovrei regolarmi nella taratura? dovrei fare 138,96 - 101.82 e dividere per 100?

Grazie mille a tutti!!!
Title: Re: Pt100 e Smartec UTI
Post by: PaoloP on Oct 28, 2012, 04:01 pm
Considerando un andamento lineare la formula per calcolare la temperatura dovrebbe essere di questo tipo:
Temperatura = A*Resistenza+B

Per calcolare le costanti A e B hai bisogno due coppie.
Ora tu hai:
0° e 101.82
99.3° e 138,69

Bene adesso risolvi il sistema lineare di due equazioni e troverai i coefficienti A e B.

Con dei calcoli veloci ho ottenuto:
A = 2,69324654
B = -274,226363

Quindi la tua formula dovrebbe essere:
Temperatura = 2,69324654*Resistenza-274,226363
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Oct 29, 2012, 09:38 am
Ottimo, grazie!!!

In settimana attendo le resistenze con tolleranza dell'1%, dopodichè metto su il tutto su una millefori o su basetta autocostruita e vediamo se aumento ancora la precisione!

A che ci sono avrei qualche domandina da porvi:

1) Per ottenere la massima precisione nel risultato, a parità di classe, meglio una PT100 o una PT1000? Ovviamente per le prossime applicazioni acquisterò sonde a 4 fili.
2) Ho visto delle resistenze al platino in film, come questa qua http://it.rs-online.com/web/p/termoresistenza-al-platino/6667362/ (http://it.rs-online.com/web/p/termoresistenza-al-platino/6667362/), che ne pensate? Una Pt100 classe A dal costo relativamente basso.
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Nov 07, 2012, 12:08 am
Allora, usando delle resistenze con precisione 1% non so per quale ragione, ma ottengo risultati abbastanza disomogenei... ritorno ad utilizzare le resistenze con precisione 5% come indicato nel datasheet.

Inoltre ho adattato il codice per un utilizzo con una PT100 a 4 vie:

Code: [Select]
int ReadUTI(uint8_t pin, float * res1,float * res2,float * res3,int refRes)
{
    int state = HIGH;
    int i,startindex=-1;
    uint8_t bit = digitalPinToBitMask(pin);
    uint8_t port = digitalPinToPort(pin);
    uint8_t stateMask = (state ? bit : 0);
    unsigned long width[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
    float nOff=0,nAB=0,nCD=0,nBC=0,nDF=0;
       
    while ( (*portInputRegister(port) & bit) != stateMask)
        ;
   
    for(i=0;i<10;i++) {
      while ( (*portInputRegister(port) & bit) == stateMask)
          width[i]++;
      while ( (*portInputRegister(port) & bit) != stateMask)
          width[i]++;
    }
    for(i=1;i<10;i++) {
      if(i<6) {
        if(width[i]<width[i+2]&&width[i]<width[i+3]&&width[i]<width[i+4]&&width[i+1]<width[i+2]&&width[i+1]<width[i+3]&&width[i+1]<width[i+4]) {
          startindex=i;
          i=10;
        }
      }
    }
    if(startindex!=-1) {
      nOff=width[startindex]+width[startindex+1];
      nAB=width[startindex+2];
      nCD=width[startindex+3];
      nBC=width[startindex+4];
      nDF=width[startindex+5];
     
      *res1=((nBC-nOff)/(nAB-nOff))*refRes;
      *res2=((nCD-nOff)/(nAB-nOff))*refRes;
      *res3=((nDF-nOff)/(nAB-nOff))*refRes;
     
      return 1;
    }
    else {
      return 0;
    }
}


Il valore della resistenza è dato da res2, tutte le altre variabili sono superflue in questo caso.
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Nov 16, 2012, 10:56 am
Allora, ho fatto altre prove. Il sensore a 4 fili mostra essere decisamente più stabile nelle letture della temperatura, inoltre ho anche trasferito il tutto da breadboard a basetta millefori. Ho implementato il codice affinchè effettui una media di venti valori, uno ogni mezzo secondo. La media tiene conto delle ultime venti rilevazioni e di volta in volta scarta il valore più vecchio.

Utilizzando questa configurazione, mettendo il termometro nel ghiaccio, ottenevo valori che andavano da 99.7 Ohm a 100.2 ohm. Decisamente meglio rispetto a prima, ma la forchetta di oscillazione era ancora ampia!!

Allora ho seguito, anche se in ritardo, uno dei consigli iniziali, ovvero ho ricoperto tutto il cavo con della pellicola di alluminio e poi l'ho collegata a gnd. Non so per quale ragione, ma nel momento in cui effettuavo il collegamento, la rilevazione schizzava immediatamente di circa 2 ohm. Con stupore però ho notato che sotto schermatura ho raggiunto una stabilità che mi lascia davvero soddisfatto, con oscillazioni che vanno nell'ordine di +- 0.1 ohm.

Con la schermatura ho eseguito le calibrature a 0°C e 100°C, e successivamente ho trovato (sempre come mi avete consigliato di fare), la formula corrispondente.

Questo è il grafico delle rilevazioni ottenute immergendo la sonda in acqua e ghiaccio per oltre 10 minuti:

(http://img641.imageshack.us/img641/8313/98226119y.jpg) (http://imageshack.us/photo/my-images/641/98226119y.jpg/)

Valori che hanno oscillato tra 102,09 e 102. Molto stabile!!!

Poi ho messo il sensore in un pentolino a fuoco costante, partendo da acqua a temperatura ambiente:

(http://img845.imageshack.us/img845/6539/201211151353.jpg) (http://imageshack.us/photo/my-images/845/201211151353.jpg/)

Ecco il grafico ottenuto risultato dopo un campionamento di circa 40 minuti:

(http://img10.imageshack.us/img10/8168/100ox.jpg) (http://imageshack.us/photo/my-images/10/100ox.jpg/)

In fase di ebollizione ho ottenuto un valore medio di 140,39 ohm.

Considerando che la schermatura ha aggiunto un offset di circa 2 ohm, i valori rientrano nelle specifiche del sensore. Ma qualcuno saprebbe spiegarmi il motivo di questo slittamento e conseguente guadagno in stabilità???

Grazie mille!!!
Title: Re: Pt100 e Smartec UTI
Post by: PaoloP on Nov 16, 2012, 11:27 am
Sono felice che tu abbia risolto.
Riguardo alla stabilità credo che la calza riduca le interferenze esterne, per lo slittamento non so.

Se vuoi condividere il tuo lavoro con gli altri potresti postare gli schemi dei collegamenti, le foto della board e lo sketch utilizzato.
Altri utenti sicuramente apprezzerebbero.  :D
Grazie.  ;)
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Nov 16, 2012, 11:35 am
Aggiungo solo questo:

Poichè la pressione ambientale non normalizzata al momento dei test era di circa 996,8 hPa, posso desumere che la temperatura di ebollizione era di circa 99,56°C. Utilizzando i dati a disposizione trovo la formula:

T = 2,596415876 * Ohm - 264,95648

Facendo la formula inversa trovo che per 100°C la resistenza dovrebbe essere di 140,56 ohm. Levando l'offset di 2 ohm che ottengo dalla schermatura mi ritrovo 138,56°C, che dovrebbe essere il valore di costruzione per 100°C.

In ogni caso certo che voglio condividere, scrivo tutto proprio per questa ragione!! Appena ho novità metto tutto qui :D
Title: Re: Pt100 e Smartec UTI
Post by: astrobeed on Nov 16, 2012, 11:41 am

In ogni caso certo che voglio condividere, scrivo tutto proprio per questa ragione!! Appena ho novità metto tutto qui :D


Giusto per curiosità, dove hai acquistato lo Smartec UTI ?
Sia Digikey che Mouser e RS non trattano questo produttore.

Title: Re: Pt100 e Smartec UTI
Post by: lestofante on Nov 16, 2012, 11:43 am
GRANDE! felice che sia riuscito a risolvere, ora che hai capito che il gosso problema era l'effetto antenna, vedi miglioramenti tra l'uso di resistenze di precisione e normali resistenze?
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Nov 16, 2012, 11:55 am
Allora, la differenza tra pt100 a 2 fili e 4 fili c'è, si vede, e non è poco. Su internet ho cercato molte informazioni sulle PT100 e su come realizzare la strumentazione adatta per limitare il più possibile l'errore nelle rilevazioni. Ad un certo punto mi son messo le mani nei capelli per quante cose possono incidere nella validità dei risultati! La soluzione a 4 fili risolve una moltitudine di problemi, come la resistenza del cavo, delle saldature, ecc ecc!

Alla fine all'errore di costruzione che per una PT100 classe A è di 0,15°C bisogna aggiungere quello della strumentazione che può valere tantissimo. Così tanto che forse è conveniente utilizzare un semplice ds18b20 che per costruzione ha un errore di mezzo grado C. Considerate che il solo smartec uti ha di suo un errore di costruzione di circa +- 0,1°C (80 mK).
Poi è un casino per quel che riguarda l'auto riscaldamento del sensore. Non nascondo che ancora non sono in grado di affrontare e gestire appieno questo inconveniente, infatti sarà questo l'oggetto dei miei prossimi studi...

Altra cosa che sto studiando per bene è la conversione del valore da ohm a gradi C. Il semplice dividere il valore della resistenza per 0,384 è davvero una pessima soluzione quando si vuole realizzare uno strumento di precisione!!!

Lo smartec uti l'ho preso da distrelect, quasi 9 euro di integrato più spese postali...

Ecco il link https://www.distrelec.it/sensor-interface-dil-16/smartec/uti-dil16/647495
Title: Re: Pt100 e Smartec UTI
Post by: PaoloP on Nov 16, 2012, 02:48 pm
Per la trasformazione da resistenza a temperatura potresti passare all'interpolazione polinomiale, ma non è così semplice.
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Nov 16, 2012, 02:55 pm
vorrei fare qualche cosa del genere partendo dalla formula base RT = R0(1 + AT + BT² + C(T-100)T³), vediamo cosa riesco a combinare :D
Title: Re: Pt100 e Smartec UTI
Post by: lestofante on Nov 16, 2012, 03:03 pm
uhmm se vuoi una tale precisione io partirei da un termometro con già tale precisione, lo userei come riferimento per un range di misure molto più puntuali, e poi disegnerei il grafico della resistenza in funzione della temperatura. Poi dal grafico ricaverei (con non poca fatica) una funzione.

In generale, una volta che hai il grafico, testare formule come RT = R0(1 + AT + BT² + C(T-100)T³) è poco più difficile che inserire la formula in un foglio excel e vedere i valori ricavati al variare di R quanto sballano rispetto ai valori reali.
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Nov 16, 2012, 03:06 pm
Avessi avuto lo strumento richiesto per fare il tuo esperimento lo avrei già usato, mi sarei segnato i valori grado per grado :D
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Nov 16, 2012, 10:22 pm
Ecco un pò di codice:

Code: [Select]
#include <stdio.h>
#include "pins_arduino.h"
#include <LiquidCrystal.h>

#define UTI_PIN 5
#define UTI_RESISTANCE_REF 1000

float TempStorage[20] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};  //Contiene le ultime 20 rilevazioni
float Media = 0.0; //Contiene il valore della temperatura media
int MediaCount = 0; //Contatore che permette il calcolo della media solo dopo aver riempito completamente l'array
int ArrayMax = 19; // Dimensione massima array
int CurPos = 0; //Contiene la posizione corrente nell'array

LiquidCrystal lcd(12, 11, 6, 4, 3, 2);
unsigned long samplingMillis, printMillis;
int samplingTime = 500; //In ms, frequenza di campionamento
int printTime = 1000; //in ms, frequenza di stampa dei dati

void setup()
{
  Serial.begin(9600);
  pinMode(UTI_PIN, INPUT);
  Serial.print("Avvio PT100");
  Serial.print("\n");
  lcd.begin(16, 2);
  lcd.print("PT100");
  CurPos=-1; //Inizializzo la posizione nell'array
  delay(3000);
}

int ReadUTI(uint8_t pin, float * temp,int refRes) //Ottimizzato per PT100 4 fili - Modalità 5 (4 fasi)
{
    int state = HIGH;
    int i,startindex=-1;
    uint8_t bit = digitalPinToBitMask(pin);
    uint8_t port = digitalPinToPort(pin);
    uint8_t stateMask = (state ? bit : 0);
    unsigned long width[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
    float nOff=0,nAB=0,nCD=0,nBC=0,nDF=0;
       
    while ( (*portInputRegister(port) & bit) != stateMask)
        ;
   
    for(i=0;i<10;i++) {
      while ( (*portInputRegister(port) & bit) == stateMask)
          width[i]++;
      while ( (*portInputRegister(port) & bit) != stateMask)
          width[i]++;
    }
    for(i=1;i<10;i++) {
      if(i<6) {
        if(width[i]<width[i+2]&&width[i]<width[i+3]&&width[i]<width[i+4]&&width[i+1]<width[i+2]&&width[i+1]<width[i+3]&&width[i+1]<width[i+4]) {
          startindex=i;
          i=10;
        }
      }
    }
    if(startindex!=-1) {
      nOff=width[startindex]+width[startindex+1];
      nAB=width[startindex+2];
      nCD=width[startindex+3];
      nBC=width[startindex+4];

      *temp=((nCD-nOff)/(nAB-nOff))*refRes;
     
      return 1;
    }
    else {
      return 0;
    }
}

void readTemp()
{
  float temp;
  if(ReadUTI(UTI_PIN,&temp,UTI_RESISTANCE_REF)) {
      float TempNorm = 2.596415876*temp-264.95648; //Formula ricavata dalla calibrazione a 0 e 100 °C
     
      if (CurPos<ArrayMax){CurPos++;} else { CurPos=0; } //Gestisce la posizione del cursore all'interno dell'array
      TempStorage[CurPos]=TempNorm; //Registra la temperatura all'interno dell'array
     
      if (MediaCount<23) {MediaCount++;} //Calcola la media solo se l'array è stato riempito completamente
      else {
        Media =0.0;
        for (int i=0;i<=ArrayMax;i++) { Media = Media + TempStorage[i];}
        Media = Media / (ArrayMax+1);
      }
  }
    else {
      printTempError(); //Se l'UTI non riceve alcuna temperatura, restituisce errore
    }
}

void printTempError()
{
  Serial.print("Not Found");
  Serial.print("\n");
  lcd.setCursor(0, 1);
  lcd.print("NotFound");
}

void printTempMedia()
{
  if (MediaCount < 23) { //Stampa la media solo se l'array è completamente pieno
    Serial.print("Inizializzazione Sensore (");
    Serial.print(CurPos);
    Serial.print(")");
    Serial.print("\n");
    lcd.setCursor(0, 1);
    lcd.print("Init");
  } else {
    Serial.print(Media);
    Serial.print("\n");
    lcd.setCursor(0, 1);
    lcd.print(Media);
  }
}

void loop()

  if ((millis()- samplingMillis) > samplingTime) {
    samplingMillis = millis();
    readTemp();
  }
  if ((millis()- printMillis) > printTime) {
    printMillis = millis();
    printTempMedia();
  }
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Nov 17, 2012, 12:48 pm
Al fine di poter trovare questa famosa formula magica, perfetta, di conversione, mi son messo un pochettino a giocare con Excel. Prego tutti voi di verificare che i miei ragionamenti sono esatti!!!

La formula base, per una PT100, che restituisce il valore della resistenza è la seguente:

1) Rt = R0*(1 + A*t + B*t^2 + C*(t-100)*t^3)

Supponendo di avere una PT100 ed un circuito che rispondano perfettamente a questa formula, andiamo avanti. Ho realizzato con excel una lista di valori derivati dalla suddetta formula, ed ho ricavato il seguente grafico:

(http://img23.imageshack.us/img23/9076/93236271.jpg) (http://imageshack.us/photo/my-images/23/93236271.jpg/)

Poi ho invertito x e y ed ho ottenuto il seguente grafico:

(http://img27.imageshack.us/img27/4274/65396760.jpg) (http://imageshack.us/photo/my-images/27/65396760.jpg/)

Al che ho fatto sviluppare a Excel la relativa formula:

2) t = 4E-13*Rt^6 - 2E-10*Rt^5 + 7E-08*Rt^4 - 2E-05*Rt^3 + 0,0038*Rt^2 + 2,1705*Rt - 241,09

Ho ridato quindi in pasto ad excel i dati ottenuti dalla formula 1) ed ho ottenuto un valore simile a quello iniziale. Ho quindi creato una lista degli scarti di cui ho fatto il grafico:

(http://img705.imageshack.us/img705/3983/34773341.jpg) (http://imageshack.us/photo/my-images/705/34773341.jpg/)

Ancora una volta il buon Excel ha fatto il lavoraccio:

3) y = -8E-05x2 - 0,0086x - 0,6422

Questa nuova formula corregge l'errore della 2)

In pratica, dopo tutto questo trambusto ottengo che la somma delle formule 2) e 3) danno un risultato compatibile con la formula generale 1) che è si lineare, con le dovute approssimazioni! Come vi sembra? Ho sprecato tempo??

Tutto questo mi è utile perchè, dando per scontata la correttezza di quanto fatto, ho notato che la mia configurazione pt100 + circuito, risponde alla legge generale delle PT100 (formula 1)) con un offset di 2,047 Ohm. Sapendo ciò posso facilmente adattare le formule 2) e 3) al mio caso... che ne pensate?
Title: Re: Pt100 e Smartec UTI
Post by: menniti on Nov 17, 2012, 01:14 pm
penso con terrore a cosa potrai essere capace di fare quando realizzerai il primo circuito con due sonde PT100 per rilevare il range di variazione :smiley-yell:
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Nov 17, 2012, 01:27 pm
Non sapevo di incutere tanto timore :D
Title: Re: Pt100 e Smartec UTI
Post by: lestofante on Nov 17, 2012, 05:07 pm
ah, quindi hai preso la fomrula che usi - la formula vera = formula dell'errore, ma non vedo come ti possa aiutare la cosa, puoi usare direttamente la formula vera e bon. il problema quì è capire se la formula vera è abbastanza veritiera per la precisione che vuoi ottenere, no?
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Nov 17, 2012, 05:42 pm
La formula vera (1) è quella che ho trovato in rete, tra le specifiche della resistenze al platino. Non posso usarla direttamente perchè restituisce la Resistenza in funzione della temperatura, mentre io ho bisogno di conoscere la temperatura in funzione della resistenza. Per tale ragione ho utilizzato Excel per trovarmi la formula inversa (2), soltanto che, vuoi per le approssimazioni, vuoi per la (forse) poca affidabilità di excel, produce un errore che in ogni caso ho calcolato e quindi eliminato aggiungendo un secondo passaggio (funzione 3).

In ogni caso ancora non posso utilizzare questa funzione perchè è ideale, ovvero non tiene conto delle imprecisioni che produce il mio hardware, che, se non ho fatto troppi errori, aggiunge 2ohm rispetto ai valori "ideali", per cui non ho 100 ohm a 0°C bensì 102 ohm; non ho 138,5 ohm a 100°C bensì 140,5ohm.

Perchè sto insistendo con la formula ideale? Mi è stato già consigliato di realizzare una semplice funzione partendo dai due punti di riferimento, cosa che ho fatto. Purtroppo questa funzione approssima il dato finale. Perchè? Leggendo in rete si trova che per ogni °C la resistenza subisce una variazione di 0,385 ohm. Purtroppo si tratta di un valore medio, perchè a 0°C la variazione è di 0,3909 ohm, mentre a 100°C è di 0,3793 ohm.

Qui trovi una tabella dei valori ricavati partendo dalla formula base: http://www.sevimpianti.it/tabella_pt100.htm

L'ideale sarebbe, come consigliato da tutti quanti, avere uno strumento già tarato su cui tarare il mio. Purtroppo non dispongo uno strumento simile, per cui devo accontentarmi dei punti di fusione ed ebollizione!
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Nov 18, 2012, 01:49 pm
In ogni caso, paranoie a parte, ecco lo schema:

(http://img233.imageshack.us/img233/3793/circuitoy.png) (http://imageshack.us/photo/my-images/233/circuitoy.png/)

Uploaded with ImageShack.us (http://imageshack.us)

PS: ho apportato una correzione allo schema


Rispetto allo schema presente nel topic http://arduino.cc/forum/index.php/topic,17349.0.html, ho modificato la RBias che ho portato a 2.2K e il pin 6 (SEL 3) che da GND ho portato a +5V in modo da poter usare la Modalità 5 dell'integrato, come specificato nel datasheet per l'utilizzo di una PT100 a 4 vie. Ovviamente il codice che ho riportato qualche post fa è stato modificato adeguatamente.
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Nov 28, 2012, 10:49 am
Ecco il board:

(http://img443.imageshack.us/img443/6794/boardq.th.png) (http://imageshack.us/photo/my-images/443/boardq.png/)

Allego pure i file di Eagle


Ricordo che questo è lo schema per utilizzare una PT100 a quattro fili, nella modalità 5 indicata nel datasheet.
Title: Re: Pt100 e Smartec UTI
Post by: sollazzo on Dec 02, 2012, 10:51 am

In ogni caso, paranoie a parte, ecco lo schema:

(http://img233.imageshack.us/img233/3793/circuitoy.png) (http://imageshack.us/photo/my-images/233/circuitoy.png/)

Uploaded with ImageShack.us (http://imageshack.us)

PS: ho apportato una correzione allo schema


Rispetto allo schema presente nel topic http://arduino.cc/forum/index.php/topic,17349.0.html, ho modificato la RBias che ho portato a 2.2K e il pin 6 (SEL 3) che da GND ho portato a +5V in modo da poter usare la Modalità 5 dell'integrato, come specificato nel datasheet per l'utilizzo di una PT100 a 4 vie. Ovviamente il codice che ho riportato qualche post fa è stato modificato adeguatamente.


rref non dovrebbe essere 100ohm per le pt100?

edit: ah no, come non detto :D . Comunque sto provando il tuo codice e il tuo schema (ho uno uti smartec anche io), ma mi stampa valori di resistenza intorno a 8500..C'è qualcosa che non mi torna :) cosa potrebbe essere?

ri-edit: come non detto. penso che sto usando il vecchio codice con il nuovo schema :D potresti postare anche il nuovo codice?
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Dec 02, 2012, 12:05 pm
Ottimo!! Qualcuno con cui confrontarmi è splendido!!

Allora, il tuo risultato è molto strano! La tua pt1000 è a 4 fili?? come li hai collegati i fili nel pinheader JP1? supponendo che i tuoi 4 fili siano in due coppie di colori, rosso e bianco come nel mio caso, devi mettere quelli bianchi nei pin 1-2, e quelli rossi nei pin 3-4. Ovviamente va bene anche il contrario ;)
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Dec 02, 2012, 12:31 pm
In ogni caso prova questo codice se puoi, ho portato il campionamento a 20 secondi ed immagazzino ogni volta il valore della resistenza e non della temperatura:

Code: [Select]
#include <stdio.h>
#include "pins_arduino.h"
#include <LiquidCrystal.h>

#define UTI_PIN 5
#define UTI_RESISTANCE_REF 1000

double TempStorage[40];  //Contiene le rilevazioni
int ArrayMax = 39; // Dimensione massima array: dimensione TempStorage - 1
double Media = 0.0; //Contiene il valore della temperatura media
int MediaCount = 0; //Contatore che permette il calcolo della media solo dopo aver riempito completamente l'array
int CurPos = 0; //Contiene la posizione corrente nell'array

LiquidCrystal lcd(12, 11, 6, 4, 3, 2);
unsigned long samplingMillis, printMillis;
int samplingTime = 500; //In ms, frequenza di campionamento
int printTime = 1000; //in ms, frequenza di stampa dei dati

void setup()
{
  Serial.begin(9600);
  pinMode(UTI_PIN, INPUT);
  Serial.print("Avvio PT100");
  Serial.print("\n");
  lcd.begin(16, 2);
  lcd.print("PT100");
  CurPos=-1; //Inizializzo la posizione nell'array
  for (int i=0;i<= ArrayMax;i++) { //Inizializzo array a zero
    TempStorage[i] = 0.0;
  }
  delay(3000);
}

int ReadUTI(uint8_t pin, double * temp,int refRes) //Ottimizzato per PT100 4 fili - Modalità 5 (4 fasi)
{
    int state = HIGH;
    int i,startindex=-1;
    uint8_t bit = digitalPinToBitMask(pin);
    uint8_t port = digitalPinToPort(pin);
    uint8_t stateMask = (state ? bit : 0);
    unsigned long width[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
    double nOff=0,nAB=0,nCD=0,nBC=0,nDF=0;
       
    while ( (*portInputRegister(port) & bit) != stateMask)
        ;
   
    for(i=0;i<10;i++) {
      while ( (*portInputRegister(port) & bit) == stateMask)
          width[i]++;
      while ( (*portInputRegister(port) & bit) != stateMask)
          width[i]++;
    }
    for(i=1;i<10;i++) {
      if(i<6) {
        if(width[i]<width[i+2]&&width[i]<width[i+3]&&width[i]<width[i+4]&&width[i+1]<width[i+2]&&width[i+1]<width[i+3]&&width[i+1]<width[i+4]) {
          startindex=i;
          i=10;
        }
      }
    }
    if(startindex!=-1) {
      nOff=width[startindex]+width[startindex+1];
      nAB=width[startindex+2];
      nCD=width[startindex+3];
      nBC=width[startindex+4];

      *temp=((nCD-nOff)/(nAB-nOff))*refRes;
     
      return 1;
    }
    else {
      return 0;
    }
}

void readTemp()
{
  double temp;
  if(ReadUTI(UTI_PIN,&temp,UTI_RESISTANCE_REF)) {
      if (CurPos<ArrayMax){CurPos++;} else { CurPos=0; } //Gestisce la posizione del cursore all'interno dell'array
      TempStorage[CurPos]=temp; //Registra la temperatura all'interno dell'array
     
      if (MediaCount<(ArrayMax+4)) {MediaCount++;} //Calcola la media solo se l'array è stato riempito completamente
      else {
        Media =0.0;
        for (int i=0;i<=ArrayMax;i++) { Media = Media + TempStorage[i];}
        Media = Media / (ArrayMax+1);
      }
  }
    else {
      printTempError(); //Se l'UTI non riceve alcuna temperatura, restituisce errore
    }
}

void printTempError()
{
  Serial.print("Not Found");
  Serial.print("\n");
  lcd.setCursor(0, 1);
  lcd.print("NotFound");
}

void printTempMedia()
{
  if (MediaCount < (ArrayMax+4)) { //Stampa la media solo se l'array è completamente pieno
    Serial.print("Inizializzazione Sensore: ");
    Serial.print(CurPos);
    Serial.print("\n");
    lcd.setCursor(0, 1);
    lcd.print("Init");
  } else {
    //double TempNorm = 2.596415876*Media-264.95648; //Formula ricavata dalla calibrazione a 0 e 100 °C
    double TempNorm = 2.624704336*Media-266.3919005;
    //double TempNorm = (0.0000000000004 * pow(Media,6)) - (0.0000000002 * pow(Media,5)) + (0.00000007 * pow(Media,4)) - (0.00002 * pow(Media,3)) + (0.0038 * pow(Media,2)) + (2.1705 * Media) - 241.09;
    //TempNorm = TempNorm - ((-0.00008 * pow(TempNorm,2)) + (-0.0086 * TempNorm) - 0.6422);
    Serial.print(TempNorm);
    Serial.print(" - ");
    Serial.print(Media);
    Serial.print("\n");
    lcd.begin(16, 2);
    lcd.print(Media);
    lcd.setCursor(0, 1);
    lcd.print(TempNorm);
  }
}

void loop()

  if ((millis()- samplingMillis) > samplingTime) {
    samplingMillis = millis();
    readTemp();
  }
  if ((millis()- printMillis) > printTime) {
    printMillis = millis();
    printTempMedia();
  }
}
Title: Re: Pt100 e Smartec UTI
Post by: sollazzo on Dec 02, 2012, 02:26 pm
esatto ho pt100 a 4 fili(colori diversi, bianco-blu-maroone-nero).

il bianco blu dovrebbe essere il rosso e marrone nero il bianco.


ho collegato come hai detto te e ricaricato il codice. adesso come resistenza mi rileva sempre 0  =(

Il circuito l'ho appena controllato e dovrebbe essere giusto

edit: temo che ho sbagliato i colori: il bianco dovrebbe andare col nero e il marrone con il blu. ora riprovo a vedere se cambia
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Dec 02, 2012, 02:39 pm
Aiutati con un tester per individuare con certezza le coppie dei cavi, magari il problema e' questo!!
Title: Re: Pt100 e Smartec UTI
Post by: sollazzo on Dec 02, 2012, 03:04 pm
ed infatti era proprio quello il problema: avevo seguito il foglio che c'era dentro con le pt100 ma segnava sbagliati i colori. ho verificato col tester e sistemato correttamente i valori. ora funziona alla grande :) (almeno, da valori sensati). ora provo un po' a vedere calibrazioni varie etc

edit: sto calibrando con acqua e ghiaccio, ma mi sa che non bisogno molto di calibrazione.la media dei risultati, dopo circa 5min dall'inserimento del ghiaccio in un pinta di acqua, varia tra 100.02 ohm e 100.06 ohm. direi come da manuale (Pt100 Classe A ±0,15 °C [0 °C] ±0,06 ? [0 °C]) :D
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Dec 02, 2012, 03:49 pm
beato te, io invece non ho dati da "manuale" e Onestamente non capisco il motivo...one dovrebbe dare questo problema usando i 4 fili!
Title: Re: Pt100 e Smartec UTI
Post by: sollazzo on Dec 02, 2012, 03:54 pm
ho provato con acqua tiepida a 37.5 misurati col termometro da febbre. mi da una resistenza di 114.64, che a detta della famosa formula "universale" (calcolabile qui http://www.thermibel.be/documents/pt100/conv-rtd.xml?lang=en) corrisponde a circa 37.67gradi. anche questa volta direi proprio come da manuale, senza nessuna calibrazione.

tutto ciò mi rende molto contento dal momento che avevo uno smartec uti da mesi che non ero mai riuscito a farlo andare decentemente (penso colpa delle pt100 a 2 fili che avevo e di un errore nel codice che mi portavo dietro). ti devo veramente ringraziare!!! se ti può interessare. le pt100 a 4 fili le ho comprate qui  http://www.ebay.it/itm/190760784643?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649

sono arrivate dopo 3gg  :)  
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Dec 02, 2012, 06:20 pm
c'era da adattare il codice alla modalità differente che richiede una pt100 a 4 fili!

Mi conforta che tu ottenga ottimi risultati, almeno adesso so che il problema non sta nel codice... hai modificato i collegamenti rispetto al mio?? come hai collegato i fili al circuito? li hai saldati??

grazie mille!!
Title: Re: Pt100 e Smartec UTI
Post by: GianfrancoPa on Dec 06, 2012, 08:26 pm
E' strano, perchè se provo a leggere la temperatura del sensore con un tester e sottraggo quella del cavo ottengo un valore compatibile con la formula generale. Così com'è invece l'uti restituisce il valore del sensore non compensato!