Go Down

Topic: Pt100 e Smartec UTI (Read 5 times) previous topic - next topic

PaoloP

#20
Oct 28, 2012, 04:01 pm Last Edit: Oct 28, 2012, 04:07 pm by PaoloP Reason: 1
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
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

GianfrancoPa

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/, che ne pensate? Una Pt100 classe A dal costo relativamente basso.
Gianfranco

GianfrancoPa

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.
Gianfranco

GianfrancoPa

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:



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:



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



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!!!
Gianfranco

PaoloP

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.  ;)
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Go Up