Jump to content
PLC Forum


Sign in to follow this  
slavin89

Interfacciare Pic 16F877 A Pt100Ohm

Recommended Posts

Livio Orsini

Cosa significa sballati?

Fai le prove che ti ho suggerito: sostituisci la PT100 con resistori di valore noto corrispondenti a valori di temperatura precisi (basta scaricare un delle tante tabelle che si trovano in rete).

In questo modo sai esattamente come si comporta il circuito, sai se deriva nel tempo o se sente disturbi.

Share this post


Link to post
Share on other sites

slavin89

eccomi di nuovo qui ..ho rifatto il circuito dell'an687 e ho fatto queste prove..ho messo una resistenza da 98.9 ohm e leggevo in uscita al circuito 0.776 V poi ne ho messe due in parallelo dello stesso valore (risultato 49,4 ohm) e avevo in uscita al circuito 1.41 V.

analizzando questi primi dati direi che il circuito funziona in quanto a linearità..se poi vado a collegarlo al pic è un disastro..all'inizio mi mostra dei valori che cambiano in continuazione..137,3....40.138....12.655....poi una volta che si stabilizza diciamo su un valore che comunque non è coerente con la misura basta toccare la sonda che il valore dapprima scende ossia va da 157 a 10 per poi risalire a valori di nuovo incoerenti..non so se sono riuscito a spiegare bene

Share this post


Link to post
Share on other sites
Livio Orsini

Continui a far prove senza metodo.

Dalla prima prova che hai fatto si evince che hai una funzione inversa rispetto a quella che ti servirebbe. Infatti con 98.9 ohm, corrispondenti ad un temperaura di -3oC, misuri 0.776 V, che con un riferimento di 2.5 V all'A/D, corripsondono a circa 318 counts di A/D del PIC. Poi dimezzi ilvalore del resistore, quindi simuli una temperatura di circa -117oC, ed ottieni 1.41V, corrispondenti a 577 counts.

Oltre all coerente non linearità si evidenzia il fatto che al crescere della temperatura diminuisce il valore di tensione. Gia a 25oC sei prossimo allo zero volt, quindi il convertitore è praticamente saturo al limite inferiore.

Invece di fare il parellelo dei 2 resistori prova a fare serie così da avere 197,6 ohm, corrispndenti a 260oC e misura la tensione che ti esce dall'ìinterfaccia.

Poi le verifiche di conversione non farle con la sonda inserita, ma usa dei resistori di valore noto o, al limite un potenziometro usato come reostato in serie ad un resistore fisso.

Sol quando tutto è sarà conforme alle specifiche potrai mettere la sonda e procedere con le tarature finali.

Share this post


Link to post
Share on other sites
slavin89

con2 resistenze in serie (197.7 ohm) ho 2.2 mV... a questo punto mi par di capire che il circuito dell'an 687 è di nuovo sbagliato?

Share this post


Link to post
Share on other sites
Livio Orsini
con2 resistenze in serie (197.7 ohm) ho 2.2 mV...

Probabilmente no, dovresti misurare una tensione negativa. Mettere in sere un potenziometr per vedere i limiti no ?

a questo punto mi par di capire che il circuito dell'an 687 è di nuovo sbagliato?

Non credo, credo piuttosto che tu non lo abbia riprodotto fedelmente.

Share this post


Link to post
Share on other sites
slavin89

si chiaramente intendevo che l'ho assemblato male io..ci riproverò a questo punto

Share this post


Link to post
Share on other sites
slavin89

mi è venuto un dubbio sulla mia esecuzione dell'an687.. è sbagliato alimentare gli operazionali a 0 ÷ 5 volt?

Share this post


Link to post
Share on other sites
Livio Orsini

Il convertitore A/D del 16F877 accetta segnali compresi tra 0 +5V, eventuali tensioni negative possono danneggiare la porta; è quindi ovvio che non sarebbe necessaria un'alimentazione bipolare dell'interfaccia analogica tre sonda e micro.

Ho usato il condizionale perchè non sempre è possibile. Personalmente con le interfaccie che ho usato io ho sempre usato l'alimentazione bipolare per semplificare la topologia; poi ho sempre usato un diodo in polarizzazione inversa per proteggere la porta del micro.

Le verifiche che dovresti fare te lo ha già elencate; se tu hai realizzato i circuiti descritti dall'AN Microchip esattamente come li hanno disegnati, non ci sono problemi e devi leggere tensioni comprese tra 0 e 2.5V.

PS Se inteni realizzare un'applicazione professionale ti consiglio vivamente di usare un'integrato specifico della TI. Costa un pochino (circa 10€ se ben ricordo), ma fa tutto e, soprattutto, è estremamente affidabile e ripetibile.

Share this post


Link to post
Share on other sites
slavin89

oggi ho riprodotto esattamente com'è in circuito dell'an687 e ho per l'ennesima volta rifatto le verifiche..il risultato è stato che in uscita ho 2,488 volt per valori di resistenza di 300 ohm e 200 ohm poi 1,399 volt per valori di resistenza pari a 100 ohm e 0,708 volt con 50 ohm...davvero non so che altro fare il circuito non ho dubbi è corretto

dove loro scrivono v.ref io alimento con 2,5 volt derivati da un circuito con lm336 e gli op li alimento a 5 volt sul più e gnd =0 volt sul meno eppure quello è il risultato..

cosa può esserci ancora che non va..l'unica cosa potrebbe essere le tolleranze delle resistenze ma non penso che quest possa portare ad un tale disastro ...

ps..qual'è questo componente che hai citato?

puoi darmi un link? :)

Edited by slavin89

Share this post


Link to post
Share on other sites
Livio Orsini

Io non tempo per analizzare a fon do l'AN della microchip, però i casi sono 2: o hanno effettivamente previsto questa gamma di temperature o tu hai invertito qualche collegamento o dimenticato qualche cosa.

Se hai riscontrato quei valori di tensione sembra che l'amplificazione sia corretta.

A questo punto verifica cosa legge il micro.

Se usi correttamente le porte analogiche, dando i medesimi 2,488 V di tensione di riferimento dovresti avere una conversione che varia tra 291 counts per 50 ohm e 1023 per 300 ohm.

Se questi sono i valori di conversione e le indicazioni di temperatura non sono corrette significa che commetti degli errori di calcolo.

Per il componente: fai una ricerca nel sito TI utilizzando i loro filtri arrivi con pochi passaggi al riepilogo dei componenti specialistici per RTD.

PS Questa mattina, probabilemtne ancora un po' addormentato, ho scritto cose non esatte che ho corretto con questa modifica al messaggio. ;)

Edited by Livio Orsini

Share this post


Link to post
Share on other sites
slavin89

sarà che sono scemo io o cos'altro non so ma su sito della texas mi perdo abbastanza..avrei trovato il componente pga309 ma non so se fa al caso mio in effetti..da quel che mi pare di capire va programmato e necessita del ponte per la compensazione e la lettura della pt100 mi sbaglio?

nessuno ha un circuito che possa aiutarmi in questa lettura della pt100?..non che voglia la pappa pronta per carità solo che al momento non ho ne l'hardwre ne il software che funzionano e per capire dove sbaglio dovrei avere almeno uno dei due che sicuramente funziona per poi concentrarmi sull'altro

Share this post


Link to post
Share on other sites
Livio Orsini

Se hai effettuato quelle misure che hai riportato l'interfaccia Hw funziona.

Tempo addietro avevo messo sul forum un circuitino, molto banale, per interfacciare la PT100. Il circuito non ha elevate pretese di stabilità e precisione, ma funziona sicuramente.

Se fai una ricerca nelle discussioni relative all'argomento PT100 dovresti reperirlo, altrimenti se hai un poco di pazienza te lo rimetto sul forum.

Poi se vuoi un programmino che legga questi valori con un 877 te lo pubblico, son pochissime righe di "C".

Share this post


Link to post
Share on other sites
Livio Orsini

Questo è il circuito che ti dicevo.

Se sostituisci gli LM324 con equivalenti pin to pin ad alte prestazioni, otterrai una maggior precisione nel lungo perido. Devi anche usare componentistica passiva, resistori e trimmer, ad alta stabilità

Io l'ho realizzato così come è, per uso domestico, funziona da nni con buone prestazioni. la gamma di temperatura è prevista tra 0oC e 100oC; per estenderla è sufficiente modificare i guadagni.

l'uscita è tra 0V e +5V (la gamma dello A/D del Pic)

PS Fra pochi giorni dovrebbero arrivarmi i campioni di questo integrato: MAX31865 RTD-to-Digital Converter. Sulla carta promette bene, dopo che l'avrò provato metterò i risultati sul forum.

Edited by Livio Orsini

Share this post


Link to post
Share on other sites
slavin89

le righe di codice per la conversione riesci a pubblicarle gentilmente? cosi vediamo se ci capisco qualcosa..io programmo in c..

riguardo l'uso che devo farne vorrei inizialmente capire come funziona e prendere dimestichezza con il sistema poi magari vorrei arrivare ad avere precisioni sempre maggiori..insomma voglio capire come fare un buon sistema..cultura e passione personale direi che mi spinge a farlo

Share this post


Link to post
Share on other sites
Nikiki

una curiosità, di quale range di temperatura hai bisogno?

Share this post


Link to post
Share on other sites
Livio Orsini

Questo è il codice semplificato di lettura degli A/D. Leggo 2 canali di A/D corrispondenti a 2 PT100 interfacciate da un circuito simile a quello che ho reso disponibile. Con la costante impostata (19) la lettura nel mio caso corrisponde esattamente alla temperatura in centesimi di grado (fondo scala: 5 V ==> 97.28 o C ).


#include <16F877A.H>

#DEVICE ADC=10

#fuses HS,NOPROTECT,PUT,BROWNOUT,NOWDT,DEBUG

#use Delay(oscillator=20M)

#use fast_io(

#use fast_io(c)

//

#define CLK 20000000		 // Frequenza dell'oscillatore

#zero_ram

//

#byte PORT_A = 5	  // Assign at port_a the phisical PORTA address

#byte PORT_B = 6	  // Assign at port_b the phisical PORTB address

#byte PORT_C = 7	  // Assign at port_c the phisical PORTC address

#byte PORT_D = 8

#byte INTCON = 0x0B

/*******************************************************************************

*																			  *

*					 Dichiarazioni variabili globali						  *

*																			  *

*******************************************************************************/

short flg_ADC0 = 0;

/******************************************************************************/

int tic_cnt = 0;

/******************************************************************************/

/******************************************************************************/

int16 temperatura = 0;

int16 por_d = 0;

//

int16 itemp_buffer[2];  //buffer per dati

int16 arr[6];

/*-----------------16-05-2009 16.05--------------------------------------------*

*																			 *

*								 MAIN									    *

*																			 *

*----------------------------------------------------------------------------*/

void main ()

{

   int i, row =0;

   setup_adc(ADC_CLOCK_INTERNAL);

   setup_adc_ports(ALL_ANALOG);

   set_adc_channel(0);

   disable_interrupts(global);

   port_b_pullups(FALSE);		    //Inizializzazioni Porte

   setup_timer_1(T1_INTERNAL);

   set_timer1(0x3caf);   //Caricato 65.535 - 50.000 = 15.535(0x3CAF)

						  //==> 50.000 * 4 * 50nsec = 10msec

   set_tris_b(0xC0);	  //I primi 6 bit sono uscite!!

   set_tris_c(0x00);

   set_tris_d(0x00);

   set_tris_e(0x00);

   setup_timer_2(T2_DIV_BY_4, 255, 1);

   enable_interrupts(GLOBAL);

   enable_interrupts(int_timer1);

while (i=!0)

{

    //row = 0;

    temperatura = itemp_buffer[0]*19;  //itemp_buffer[0]*19;

//

    //row = 0x10;

    temperatura = itemp_buffer[1]*19;

}

}

#int_timer1

void Timer10ms()

/* Timer presettato a 10ms; conteggio = 10 tics ==> 100ms */

    {

	    set_timer1(0x3caf);   // Caricato 15535 ==>

				  // 50.000 * 4 * 50nsec = 10msec

				  // 65535 - 50000 = 15535(0x3caf)

		 ++tic_cnt;

		 if (tic_cnt > 19)

		    {

			   tic_cnt = 0;

			   if (flg_ADC0 == 0)

				 {

					 flg_ADC0 = 1;

					 itemp_buffer[0] =  read_adc();

					 set_adc_channel(1);

				 }

			    else

				 {

					 flg_ADC0 = 0;

					 itemp_buffer[1] =  read_adc();

					 set_adc_channel(0);

				 }

		    }

   }

[/code]

Share this post


Link to post
Share on other sites
slavin89

ok mi sono completamente perso..la mia scrittura C è molto meno avanzata a quanto pare..riesco a leggere che imposti le porte i registri e l'interrupt ma in quanto a capire che calcolo devo eseguire sono completamente fuori..me lo puoi spiegare più semplicemente?..aldilà dei registri che poi andrò a settare una volta che leggo il valore in bit dal convertitore come lo trasformo in temperatura?..

che tipo di dato utilizzo? un int mi pare di vedere giusto?..

per quanto riguarda il range di temperatura vorrei sciegliere per ora quello più esteso che posso in base al mio circuito e mi pare sia da -200÷600°C poi se riesco vorrei capire come ridimensionarlo in base alle mie esigenze

Edited by slavin89

Share this post


Link to post
Share on other sites
slavin89

scusate se aggiungo altro..

io nel mio caso ho come valore -200° a 0.134 V e 600° a 2.205 V

consideriamo di voler avere al massimo 2 decimali, un convertitore 10 bit

il mio primo problema è in che dato immagazzinare i valori che leggo dal convertitore..pensavo un int inizialmente ma aspetto consigli..

secondo problema devo ricavarmi un fattore di conversione tra bit e gradi.. io pensavo fosse corretto fare cosi..

risoluzione conv = 2.205/ 1024 che sono i bit in decimale del mio conv

volt in uscita dal conv = risoluzione conv * bit letti dal conv

gradi = ((2.205/campo scala temp)* volt in uscita dal conv)/100 // unità

gradi dec = ((2.205/campo scala temp)* volt in uscita dal conv)%100 // centesimi

dove il campo scala temp è nel mio caso 800°C ossia da -200 a 600

sbaglio?

nel caso in cui il mio ragionamento sia corretto..che dato posso utilizziare per volt e gradi?

come faccio a gestire il calcolo visualizzando anche i decimali?

spero di essermi spiegato meglio

Share this post


Link to post
Share on other sites
Livio Orsini

Ma tu che compilatore usi? Io uso CCS.


itemp_buffer[0] =  read_adc();

Questa è l'istruzione che legge il convertitore. La variabile è un intero. Io ho usato un elemento di un vettore perchè il programma vero è più complesso di quello che ho riportato e leggo varie temperature. L'unico calcolo che faccio è una moltiplicazione. Moltiplico i counts di A/D letti per una costante.

temperatura = itemp_buffer[0]*19;  //itemp_buffer[0]*19;

Share this post


Link to post
Share on other sites
slavin89

io leggo che hai impostato una costante..e poi leggo 5v corrisponde a 97,...°C

la costante è fondo scala temp/ tensione max?

Share this post


Link to post
Share on other sites
Livio Orsini

Scusa avovo riportato il valore dimezzato di temperatura.

194.37oC = 5v = 1023 counts; 1023*19=194.37.

Share this post


Link to post
Share on other sites
Livio Orsini

Caz2o! Un po' di spirito di osservazione, che diamine194.37 * 100 = 19437 che guarda caso è il prodotto 1023*19!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...