Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Problema configurazione sensore AVR

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[11] Re: Problema configurazione sensore AVR

Messaggioda Foto UtenteDirtyDeeds » 27 nov 2012, 22:45

xyz ha scritto:I Componenti al 1% con una calibrazione precisa successiva possono essere evitati.


Meglio non evitarli, anzi se si riesce ad evitare qualunque operazione di taratura, meglio ancora ;-)

Oggi come oggi usare componenti con tolleranza maggiore dell'1%-2%, p.es. 5%, non ha praticamente senso: il costo è paragonabile, ma il coefficiente di temperatura dei resistori al 5% è decisamente peggiore.

Usando un amplificatore con guadagno A per amplificare la tensione di uscita dell'LM35, la tensione di uscita dell'amplificatore, quella misurata dall'ADC, sarebbe

v_\text{O} = ASt

dove S è la sensibilità dell'LM35 e t è la temperatura Celsius. Misurata v_\text{O}, uno determina t come

t = \frac{v_\text{O}}{AS}

Ora, se la temperatura ambiente varia, A varia a causa della deriva termica dei resistori che compongono l'amplificatore: per una variazione relativa del guadagno \Delta A/A, l'errore di misura della temperatura t vale

\Delta t = \frac{\Delta A}{A} t

Un resistore al 5% può avere un coefficiente di temperatura anche dell'ordine dei +/- 500 ppm/°C (\pm 5\times 10^{-4}/^\circ\text{C}). Se supponessimo di aver tarato l'amplificatore a 20 °C e che la temperatura ambiente possa variare tra, per esempio, 0 °C e 40 °C, tenendo conto che nell'amplificatore ci sono due resistori, si avrebbe

\left|\frac{\Delta A}{A}\right|_\text{max} \approx 2\times 5\times 10^{-4}/{}^\circ\text{C}\times 20\,{}^\circ\text{C}\approx 2\times 10^{-2}

A 100 °C si avrebbe quindi un errore di 2 °C, da aggiungere a quelli dovuti all'LM35, all'ADC ecc.

I resistori all'1% hanno un coefficiente di temperatura che è tipicamente 5-10 volte inferiore a quello dei resistori al 5% e l'errore indotto dalla deriva termica sarebbe molto minore.

PS:

xyz ha scritto:Se usi le frazioni continue trovi la seguente rappresentazione esatta:


Perché usare le frazioni continue? :-M

\frac{5}{256\times 0{,}01} = \frac{500}{256} = \frac{500/4}{256/4} = \frac{125}{64}
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[12] Re: Problema configurazione sensore AVR

Messaggioda Foto UtenteLesStrato » 27 nov 2012, 23:55

Grazie per le ulteriori risposte...io però non riesco a capire perché lavorare a 10 bit se non mi serve alcuna precisione particolare , vorrei giusto visualizzare 15°C , 17°C , 20°C ecc ecc...
Avevo pensato ad un'ulteriore soluzione ma non so se possa andar bene, ora la propongo poi sono pronto a ricevere commenti e critiche in caso di eresie sparate :-P
Come già detto , da datasheet , a fine conversione avrò il risultato :

ADC=\frac{Vin\cdot 1024}{Vref}

1024 poiché è un ADC a 10bit , il risultato della conversione è contenuto nei 2 registri ADCL e ADCH , ma se decidessi di avere un risultato left adjusted (adlar = 0) mi basterebbe leggere solo adc , avrei una precisione ad 8 bit , quindi la formula precedente diventerebbe:

ADC=\frac{Vin\cdot 256}{Vref}

Giusto no?
finora ho detto di aver utilizzato Vref = 5V ma ho letto sul ds che è possibile utilizzare anche un riferimento interno da 2.56V. Considerando sempre che l'lm35 associa a 0.01V 1°C avrei:

ADC=\frac{0.01\cdot 256}{2.56}=1

Dico bene?
Questa sarebbe una semplificazione bella e buona in quanto avrei : Temperatura = ADC
cioè , se la temperatura esterna è ad esempio 15°C avrei in adch il valore 15 , se 20°C avrei 20 ecc ecc...
Non dovrei far altro che prendere tale valore e convertirlo in ascii e inviarlo all'lcd...
Non so se ho detto qualcosa di strano :shock: a me pare che fili...
Avatar utente
Foto UtenteLesStrato
-13 3
 
Messaggi: 35
Iscritto il: 20 mar 2012, 23:48

0
voti

[13] Re: Problema configurazione sensore AVR

Messaggioda Foto UtenteDirtyDeeds » 28 nov 2012, 0:35

LesStrato ha scritto:Questa sarebbe una semplificazione bella e buona in quanto avrei : Temperatura = ADC


Sì, è così: sprechi un po' di dinamica, ma se non hai necessità di una risoluzione migliore, va bene. Tieni conto che tenendo conto dell'incertezza dell'LM35 e dell'incertezza di quantizzazione, finirai per avere un'incertezza intorno a un paio di gradi, anche a temperatura ambiente.
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[14] Re: Problema configurazione sensore AVR

Messaggioda Foto UtenteLesStrato » 28 nov 2012, 1:04

Grazie DirtyDeeds :ok:

DirtyDeeds ha scritto:finirai per avere un'incertezza intorno a un paio di gradi


Mazza :shock: un bel po' direi...dici che in questo caso potrebbe tornarmi utile un circuitino esterno di amplificazione tra lm35 e porta dell'adc per recuperare qualche bit? :?
Avatar utente
Foto UtenteLesStrato
-13 3
 
Messaggi: 35
Iscritto il: 20 mar 2012, 23:48

0
voti

[15] Re: Problema configurazione sensore AVR

Messaggioda Foto UtenteDirtyDeeds » 28 nov 2012, 15:30

LesStrato ha scritto:Mazza :shock: un bel po' direi...


Un paio di gradi di incertezza non sono così tanti in una misura di temperatura: è l'incertezza che si ha in moltissimi termometri, ma chi li usa non lo sa :-P

Se il termometro lo usi solo per sapere se fa caldo o freddo, un paio di gradi di incertezza sono accettabili ;-)

LesStrato ha scritto:che in questo caso potrebbe tornarmi utile un circuitino esterno


1) Tu che incertezza vuoi ottenere? Specifica il valore di incertezza che vuoi a temperatura ambiente e agli estremi dell'intervallo di misura.
2) Vuoi fare una taratura oppure no?
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[16] Re: Problema configurazione sensore AVR

Messaggioda Foto UtenteLesStrato » 28 nov 2012, 23:56

DirtyDeeds ha scritto:1) Tu che incertezza vuoi ottenere? Specifica il valore di incertezza che vuoi a temperatura ambiente e agli estremi dell'intervallo di misura.
2) Vuoi fare una taratura oppure no?


:shock: ehm non capisco cosa intendi, scusami ma forse ho la testa mirata maggiormente a modificare il codice e mi sto dimenticando di qualcosa di importante a livello circuitale...

Comunque xyz e DirtyDeeds , mi sa che ho trovato una soluzione migliore di quella di prima: ho deciso di lavorare a 10 bit (adlar = 0 , risultato right adjusted) ma in realtà ne prenderò in considerazione solo gli 8 meno significativi...mi spiego meglio: come già detto più volte sul datasheet del mcu vien riportata la relazione che esprime il risultato di fine conversione:

ADC=\frac{Vin\cdot 1024}{Vref}

L'lm35 mi da 1°C ogni 0.01V , se uso il riferimento interno avrò Vref=2.56V, la relazione precedente diventa:

ADC=\frac{0.01\cdot 1024}{2.56}=4

cioè se la temperatura è 10°C avrò come risultato 40 , se 15°C avrò 60 ecc ecc...per ottenere il valore desiderato mi basterà dividere il risultato di conversione per 4 , che equivale a dire 2 shift a destra ;-)

Quando dico che lavoro a 10bit ma in realtà ne utilizzo 8 intendo questo : ad ogni ciclo di conversione vado a leggere rispettivamente adcl e adch ; siccome voglio misurare la temperatura ambiente ho deciso di non andare oltre i 50°C (nel caso limite avrei quindi come risultato 200)...il punto è che se non supero il valore 255 , il registro adch sarà sempre vuoto quindi è vero ke leggo sia adcl che adch in tale ordine , ma il dato sarà presente solo in adcl per cui lavorerò ad 8 bit ma avrò una maggiore precisione dico bene? :-)

Una volta preso il dato in adcl ed effettuati i 2 shift a destra rimarrà comunque il problema della conversione in ascii, in assembly non sarà di certo una passeggiata :(
Avatar utente
Foto UtenteLesStrato
-13 3
 
Messaggi: 35
Iscritto il: 20 mar 2012, 23:48

0
voti

[17] Re: Problema configurazione sensore AVR

Messaggioda Foto Utentexyz » 29 nov 2012, 2:31

LesStrato ha scritto: lavorerò ad 8 bit ma avrò una maggiore precisione dico bene?

La migliore risoluzione di quantizzazione la ottieni se riesci a mappare il fondo scala di lettura della temperatura con il massimo valore del ADC e poi usi tecniche come la media mobile sui valori misurati con una sovra-campionatura per filtrare gli errori di lettura e di quantizzazione. Arrotondare invece di troncare il valore finale (in assembler è possibile farlo in un modo furbo). Lavorare a 16 bit con un micro a 8 non è la fine del mondo.

LesStrato ha scritto:rimarrà comunque il problema della conversione in ascii, in assembly non sarà di certo una passeggiata :(

Oltre al fatto che non è una cosa difficile, ti ho dato un link in un post precedente dove c'è il codice già pronto (forse ti è sfuggito o non lo hai letto con attenzione).
Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
 
Messaggi: 1778
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[18] Re: Problema configurazione sensore AVR

Messaggioda Foto UtenteLesStrato » 29 nov 2012, 17:59

xyz ha scritto:Oltre al fatto che non è una cosa difficile, ti ho dato un link in un post precedente dove c'è il codice già pronto (forse ti è sfuggito o non lo hai letto con attenzione).


xyz l'ho letto il link dello scorso post dove c'era quel codice di conversione , figurati , ma ci ho capito poco , fare un copia e incolla senza capire la logica non ha senso :?
Avatar utente
Foto UtenteLesStrato
-13 3
 
Messaggi: 35
Iscritto il: 20 mar 2012, 23:48

0
voti

[19] Re: Problema configurazione sensore AVR

Messaggioda Foto UtenteLesStrato » 29 nov 2012, 19:02

Dalla tabella dei codici ascii ho potuto notare che per convertire i numeri da 0 a 9 (in decimale o binario) basta sommare il valore esadecimale 0x30 (con il comando: adiw registro , 0x30).
Il problema è questo:
per come ho settalo l'adc se a fine conversione ho in ADCL il valore 80 , effettuando 2 shift a destra (dopo aver copiato il valore di ADCL in un registro temporaneo) avrò 20.
Ora non posso aggiungere direttamente 0x30 a 20 e inviare il risultato all'lcd , perché ho due caratteri , dovrei scindere il valore 20 in decine (2) e unità ( 0 ) , aggiungere 0x30 a 2 e inviare il risultato , aggiungere 0x30 a 0 e inviare il risultato...
E' questo che non so come fare in assembly, per quanto ci stia pensando non mi viene in mente una soluzione che mi permetta di scindere un numero in cifre separate...
Avatar utente
Foto UtenteLesStrato
-13 3
 
Messaggi: 35
Iscritto il: 20 mar 2012, 23:48

2
voti

[20] Re: Problema configurazione sensore AVR

Messaggioda Foto Utentexyz » 29 nov 2012, 21:16

Dalla domanda vedo che conosci poco l'assembler e questo non è bene visto che stai programmando in assembler. Dici anche che il link precedente non lo hai capito, questo implica che forse non hai letto bene la spiegazione su come convertire un numero in una sequenza ASCII, consiglio di leggerla anche se poi non vuoi vedere il codice.

Il tuo problema è come fare le divisioni di un numero intero in assembler con un numero non potenza di 2 (sono le divisioni più facili con i numeri binari). Qui trovi una trattazione completa sui vari algoritmi:

http://en.wikipedia.org/wiki/Division_%28digital%29

ti prego non usare quella a sottrazioni successive, troppo lenta e brutta. La documentazione del Atmel spiega come fare le divisioni in assembler con gli AVR in questo documento (puoi scaricare i sorgenti a parte):

http://www.atmel.com/Images/doc0936.pdf

Per convertire un numero binario senza segno in una sequenza di caratteri ASCII devi eseguire una serie di divisioni per 10 (il divisore), prendere il resto di ogni divisione, convertire il resto in un carattere ASCII, salvare il carattere in un buffer, il quoziente diventa il nuovo dividendo fino all'azzeramento.
Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
 
Messaggi: 1778
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti