Termometro con LM35

Sezione dedicata ai Microcontrollori e ai Sistemi Embedded

Termometro con LM35

Postby paride22 » 25 Sep 2012, 01:04

Ciao, a tutti sto cercando di aggiungere la funzione termometro al mio orologio digitale...vorrei che avesse una risoluzione di 0,1°C e che sia in grado di misurare da 0°C a 50°C

il sensore con precisione è LM35DZ

ecco come vorrei impostare l'ADC :

-Single ended mode
-10 bit resolution ( volevo farlo ad 8 bit per rendere più semplice creare l'algoritmo ma non sono riuscito ad ottenere tale risoluzione)
-Vref=internal reference (2.56V)
-Blocco di condizionamento del segnale, oamp(ua741) in configurazione non invertente con GAIN=5

Fino ad ora ho solo letto il datasheet sull'ADC ma non ho messo mano a nulla, ho già la routine per visualizzare un possibile risultato su 4 display 7-seg, quello che devo fare ora è determinare un algoritmo in ASSEMBLY che mi "converta" il valore convertito dall'ADC (ADCH, ADCL) in tre registri
"DecineTemp" "UnitaTemp" "PrimoDecimaleTemp", però ho un pò problemi a gestire il risultato dell'adc essendo su due registri...

L'idea di base, se avessi avuto un solo registro, sarebbe stata quella di creare dei loop

FindTens: , FindOnes: , FindDecimal:

sottraendo al valore letto dall'ADC, il valore corrispondente in esadecimale a 10°C, ogni volta incrementare una variabile, in questo caso decine e continuare il loop facendo un controllo sul carry, quando il carryflag è 1, saltare al loop TrovaUnità con il medesimo procedimento, ovviamente con tutte le accortezze da prendere...

Solo che il fatto di avere due registri mi impalla...
paride22
 
Posts: 27
Joined: 24 Sep 2012, 17:45

Re: Termometro con LM35

Postby flz47655 » 25 Sep 2012, 08:07

Attenzione che risoluzione ed accuratezza non sono la stessa cosa.
Puoi avere un accuratezza di 0.5°C a +25°C che cala variando la temperatura.
E' importantissimo poi come progetti il case, se lasci il termometro dentro avrai risultati falsati dal calore generato dall'elettronica del tuo progetto.
Per esperienza 0.1°C di accuratezza non sono uno scherzo, se ti accontenti solamente della risoluzione di 0.1°C prendi l'ultima cifra come abbastanza casuale
Purtroppo non so aiutarti con l'Assembly, hai provato a scrivere un prototipo in C e a vedere l'assembly generato?

Ciao
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16

Re: Termometro con LM35

Postby legacy » 25 Sep 2012, 10:48

paride22 wrote:Solo che il fatto di avere due registri mi impalla


detta cosi' si capisce poco
intuisco che hai il problema di avere un dato logico spezzato in 2 registri
una roba a 16bit da mettere in 2 registri ad 8 bit

ok, e che dire ?
che o l'hw (la alu) ha il modo di gestirsi il problema (ALU op.8, 16, 32 bit)
o va gestito a manina con una procedura specifica
che prende in carico 2 registri a 8bit, e ci fa sopra quello che deve fare a 16bit
lavorando sui registri singoli ad 8 bit tenendo conto del carry (propagandolo da LSB al MSB)

una roba tipo
- add16(src1_hi, src1_lo, src2_hi, src2_lo, dst_hi, dst_lo)
- sub16(src1_hi, src1_lo, src2_hi, src2_lo, dst_hi, dst_lo)
al limite anche
- shift_right16(src_hi, src_lo, dst_hi, dst_lo)

io farei proprio un paio di procedure, add16 e sub16 (al limite anche shift_right16)
ben documentate, e prima ancora farei un flowchart o butterei giu' del macro codice


p.s.
pero' non vedo alcuna ragione di farlo in asm, o hai motivi di spazio ram/flash limitato ?
perche' add16, sub16 &C se le smazza gia' il C
legacy
 
Posts: 862
Joined: 12 Mar 2012, 11:30

Re: Termometro con LM35

Postby paride22 » 25 Sep 2012, 11:32

Devo farlo in assembly perchè è un progetto....
Qualcuno potrebbe farmi capire meglio come viene rappresentato il valore convertito nell'ADC nei due registri, ho letto il datasheet, ma sto facendo un sacco di confusione...

Tipo se ho 25°C, GAIN=5, e il sensore mi da 10mV/°C, n=10bit e Vref=2,56V...
Quale dovrebbe essere il valore che ho in ADCH e ADCL

Dovrebbe essere 0x032 quindi ADCH=0x00 e ADCL=0x32 giusto?
paride22
 
Posts: 27
Joined: 24 Sep 2012, 17:45

Re: Termometro con LM35

Postby legacy » 25 Sep 2012, 12:33

paride22 wrote:Devo farlo in assembly perchè è un progetto....


questa non e' una motivazione, un progetto lo fai anche in C, in ADA, in C++, addirittura in pascal
le motivazioni sono altre, in asm solitamente si fanno cose per motivi particolari
tipo non hai abbastanza ram o non hai abbastanza flash
o in linguaggi ad alto livello non riesci ad accedere / gestire caratteristiche particolari dell'hw

rinnovo la domanda: tu che motivi hai ?

l'adc volendo si gestisce perfettamente in C
dove tutta la parte di condizionamento e' nettamente + facile, portabile e debuggubile
legacy
 
Posts: 862
Joined: 12 Mar 2012, 11:30

Re: Termometro con LM35

Postby paride22 » 25 Sep 2012, 12:55

è un progetto di un corso universitario ed il vincolo è il linguaggio di programmazione, e poi comunque per un progetto cosi semplice non vedo neanche il bisogno di utilizzare un linguaggio di alto livello, che dovrei comunque studiare (abbiamo studiato solo Java), a differenza dell'assembly visto che dispongo del set di istruzioni, ed è molto intuitivo...

Tornando alla routine,
se mi confermi che il valore nell'esempio precedente è corretto, avrei più o meno risolto...

Mi puoi dire se avessi 50°C con le impostazioni indicate sopra, quale sarebbe il valore in ADCH e ADCL (il micro comunque è l'8535)?
paride22
 
Posts: 27
Joined: 24 Sep 2012, 17:45

Re: Termometro con LM35

Postby deluca » 25 Sep 2012, 13:03

@paride22 .... mi hai preceduto nella risposta.
@legacy
di sicuro paride22 ha necessità di scriverlo in asm perchè il suo prof ha deciso di farglielo scrivere così.. giusto?
aiutamolo in questo senso senza sindacare sulla sua scelta...

di sicuro sarà lui stesso, magari in un secondo momento, a scegliere il linguaggio + consono e capirà quanto è + semplice utilizzare altri compilatori.

PS. Correggini se sbaglio, ma mi sembra ricordare che m8535 non abbia un gain settabile x5
quelli validi sono x1, x10, x200 e solo nella versione TQFP.
Inoltre se scegli i canali adc su cui è possibile effettuare la modifica del gain la risoluzione disponibile si abbassa a 8 bit (x1 e x10) e scende a 7 bit se vai a x200.

Quindi non riesco a capire da dove hai tirato fuori quei dati.
Controlla meglio
ciao
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Termometro con LM35

Postby deluca » 25 Sep 2012, 18:06

@paride...
ma il gain di cui parli è un fattore di amplificazione esterno magari usando un op esterno o stai parlando di quello dell'atmega8535.

in ogni caso il valore dell'adc è dato da:

ADC = (Vin * 2^nbit_risoluzione) / Vref


quindi nel caso di 10bit abbiamo
una V ingresso pari a 1.3Volt
con Vref pari a 2.56 Volt

ADC = (1.3 * 1024) / 2.56 = 1331,2 / 2.56 = 520 (valore ADC letto)


per conoscere invece il valore di tensione a partire dal valore dell'ADC 10bit:

Vin= (2.56 / 1024) * ADC = 0.0025 * 520 = 1.3 volt
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Termometro con LM35

Postby paride22 » 25 Sep 2012, 18:52

si avevo dimenticato di indicare che il Gain era di un circuito di condizionamento esterno (oamp in configurazione non invertente, ua7)

Io vorrei prendere il valore letto dall'ADC e moltiplicarlo per un fattore di scala

Vin=ADC*FattoreX FattoreX=(Vref*1000)/(Gain*1024)=0.5

In questo modo:

ADC*0.5=260, e con un algoritmo di conversione da "Hex su 4 digit" che ho su un testo "Avr an introductory course" posso direttamente attraverso i registri "Decine" "unità" "decimale" mostrare la temperatura sui display 7-seg...


Tuttavia non so come realizzare questa che alla fine è una divisione su due 2Registri in modo che ADCH=0x02 e ADCL=0x08 (520=0x0208) posso ottenere ADCH'=0x01 ADCL'=0x04

se fosse stato un solo registro avrei "shiftato" ma su due non so come fare...a prima vista direi di dividere per 2 ogni singolo registro...
paride22
 
Posts: 27
Joined: 24 Sep 2012, 17:45

Re: Termometro con LM35

Postby deluca » 25 Sep 2012, 19:03

puoi spiegarti meglio ?
hai necessità di visualizzare il valore contenuto sui 2 registri dell'adc ADCH e ADCL su 7 segmenti ?

per avere un fondo scala di questo tipo...

+99.9 °C giusto?

quindi
hai bisogno di convertire il valore da decimale 10bit a BCD 3 cifre con fondo scala 999 e poi creare una tabella di conversione BCD -> 7 seg. ed inserire il punto decimale 99.9 fisso.
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Termometro con LM35

Postby paride22 » 25 Sep 2012, 19:08

Ho bisogno di visualizzare la temperatura su 4 display 7-segmenti, come hai scritto tu es.99.9°C, quello che voglio fare non è convertire direttamente il valore letto dall'ADC da 10bit a BCD...

nel caso precedente ad esempio ADC=520 (26.0°C) dividendo questo valore per 2 ottengo ADC'=260 (26.0°C)

Quindi con una routine di conversione ottenere questo 260 "suddiviso" su 3 registri Decine=2 Unità=6 Decimali=0
che con la routine "display" di cui già dispongo ed è funzionante, e con la mia look-up table andro poi tramite indirizzamento indiretto a visualizzare.

Se fino a qua secondo te è corretto, allora devo dividere ADC per 2, quindi se non ricordo male dovrei fare un "lsl" su ADCH ed ADCL.

Pensi possa andare?
l'avrei provato io ma ho AVRStudio che non mi parte più... mi da "error51"

se fino qua è tutto corretto posterei la routine per passare da 260 (su due registri) ai 3 registri..
paride22
 
Posts: 27
Joined: 24 Sep 2012, 17:45

Re: Termometro con LM35

Postby deluca » 25 Sep 2012, 19:18

perfetto paride22,
ho capito ed è proprio la strada che devi seguire.
cosa ti serve allora per completare il codice?

certo che sto prof è proprio pignolo....
se vi dovevate cimentare a scrivere in assembly io vi avrei assegnato un bel prb da realizzare con lo Z80 :)
anzi lo avrei assegnato al vostro prof.

posso sapere quale è la materia e in quale uni magari se vuoi in pm?
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Termometro con LM35

Postby paride22 » 29 Sep 2012, 23:49

ho un problema di tipo elettronico, il termometro mi dava sempre 51.1 °C e non capivo il perchè dato che il codice mi sembrava giusto...
vado a misurare la tensione in uscita dal sensore e mi da circa 200mV, già mi sembra strano data la temperatura odierna, ma diciamo che ci può stare essendo il tester analagico e anche un pò vecchiotto...
allora vado a misurare la tensione in uscita all'oamp in configurazione noninvertente (RI=3K, RF=12K) ed ho 3.1V, che va ben oltre il fondoscala del mio ADC (2.56V)
c'è qualcosa che non va, allora controllo i collegamenti e sono tutti corretti, provo a sostituire RF portandola da 12K a 3.8K, e in uscita ho sempre 3.1V...

l'oamp è il ua741 non riesco a capire perchè fa in questo modo...
Lo sto alimentando con Vcc-=0V Vcc+=4.5V
paride22
 
Posts: 27
Joined: 24 Sep 2012, 17:45

Re: Termometro con LM35

Postby flz47655 » 30 Sep 2012, 10:14

Ciao, puoi postare uno schema elettrico del circuito?
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16

Re: Termometro con LM35

Postby paride22 » 01 Oct 2012, 12:13

xD come posso postarlo?
di solito uso fidocadj

comunque semplicemente, ho usato l'omap in configurazione non invertente, al verminale V+ ho collegato la tensione in uscita dall'LM35, e le resistenze sono da RF=12K RI=3K... per i collegamenti ho seguito il datasheet del componente...



Altra domanda veloce, che non centra con l'omap ma più con il termometro:

Praticamente l'LM35 ha un range di alimentazione che va da 4 a 30 volt, siccome sto utilizzando 4batt stilo per alimentare il circuito, vorrei determinare quando effettuare e quando no la lettura dalla tensione del sensore, che dovrebbe avvenire solamente quando la tensione di alimentazione del circuito è superiore a 4 volt, oltre che a segnalare quando la tensione scende al di sotto dei 3 volt per far uscire un messaggio tipo "batt" che indichi all'utente che è arrivato il momento di ricaricare le batterie;
atmega8535 ha un range di alimentazione, se non ho interpretato male il datasheet tra 2.7V e 5.5V, con una tensione massima di 6V, corregetemi se sbaglio.
quindi:

1)se dovessi usare 4stilo da 1.5Volt dovrei comunque essere nei limiti del micro, tuttavia scusate le domande se sembreranno stupide, posso collegare direttamente l'alimentazione al micro?

2)se utilizzo il rif interno di tensione, devo quindi condizionare il segnale in ingresso al pin dell'ADC attraverso un partitore di tensione, ma creando un cammino diretto verso massa non faccio scaricare la batteria?
paride22
 
Posts: 27
Joined: 24 Sep 2012, 17:45

Re: Termometro con LM35

Postby Fagos » 01 Oct 2012, 16:55

ciao paride22,
io non sono un esperto ma per il fatto di limitare la tensione da far leggere all'adc del micro potresti interporre tra il + delle batterie e l'ingresso adc un diodo o due in serie del tipo 1n4148 in modo da abbassare la tensione di 0.7 o 1.4 volt. potresti provare, non so se è una soluzione valida.
User avatar
Fagos
 
Posts: 100
Joined: 31 Aug 2011, 15:01


Return to Microcontrollori e microprocessori

Who is online

Users browsing this forum: No registered users and 4 guests

cron