Go Down

Topic: precisione lettura analogica (Read 849 times) previous topic - next topic

lesto

Scusate se la domanda suona stupida, ma non son sicuro di quello che faccio :-)
Per trasformare la lettura analogica del giroscopio in gradi al secondo, uso questa formula (da datasheet):
(((5/1024.0)*1000.0)/0.67)
ciò vuol dire che ogni incremento analogico corrisponde a 7,28 gradi al secondo in più... troppa poca precisione!

quindi se io settassi il reference analogico sull'interno, avrei come riferimento 1,1v.. quindi la formula diventa:
(((1,1/1024.0)*1000.0)/0.67)
quindi la precisione per incremento sale a 1,6 gradi al secondo!

è giusto come ragionamento?

altro particolare, essendo i giroscopi alimentati a 5v, essi danno un'output a 5v, non c'è il riscio di bruciare il micro perchè supero la corrente di riferimento? l'unica soluzione è usare un ADC esterno? quale consigliate?

e di nuovo, essendoci collgato anche un nunckuck via i2c sempre alimentato a 5v, ci sono problemi?
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Michele Menniti

Ciao lesto,
forse qui posso dare una risposta io a te, solo perché ho affrontato la questione in un post di una paio di giorni fa, con astrobeed.
Se il tuo segnale analogico ha un range da 0 a 5V settare VRef a 1,1V significa leggere con precisione da 0 a 1,1, poi ti va in over range; non credo (ma non sono sicuro!!!) che si possa bruciare il micro, come potrebbe accadere invece con tensioni >5V, penso sia solo una questione di misurazione.
Nella risposta di astrobeed è spiegato come aumentare la risoluzione da 10 a 12 bit, per me è piuttosto problematica realizzarla ora, anche se mi metterò a studiare la reference perché è una cosa che mi serve, ma tu che sei esperto non dovresti avere problemi.
http://arduino.cc/forum/index.php/topic,55924.0.html
Spero di esserti stato utile, altrimenti scusami per l'inutilità del post.
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

lesto

l'over-range rende infattibile l'idea, mentre la discussione sembra interesante..
con 12 bit ottengo 1,82 di precisione, che mi basta (l'accelerometro dovrebbe compensare)

dato che i giro li sto usando in una libreria, poi ti posto il codice così con qualche modifica dovreti riuscire ad usarla!
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Michele Menniti

Mi saresti di un aiuto speciale!
Allora terrò d'ochio costantemente questo topic, in attesa del codice, poi magari ti chiederò qualche chiarimento (tanto l'hai capito dall'altro topic a che livello sono, vero?  :smiley-red:).
Ciao.
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

lesto

è più facile del previsto, sommi 16 letture analogiche e poi dividi per 4... nient'altro che un for, una somma e una divisione, per iniziare.

Poi ci si può complicare con array di rotazione ecc... in modo che dopo le prime 16 letture hai un risultato valido ogni lettura
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Michele Menniti

La parte relativa a ciclo for ed array non avrei problemi a realizzarla, il fatto è che non ho capito cosa devo usare come elementi, queste letture da dove le prendo? Se è dal pin analogico (p.es A0), intanto che sommo e divido quello continua a "sparare" valori :smiley-eek:
Ti chiedo non di darmi chiarimenti altrimenti perderai la giornata, se invece posti, anche un altro giorno, il codice, almeno posso studiarlo (in questo me la cavo) e, al limite, avere qualche chiarimento per applicarlo alla mia esigenza).
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

lesto


Se è dal pin analogico (p.es A0), intanto che sommo e divido quello continua a "sparare" valori :smiley-eek:

no, queio valori prima devono essere campionati, e intanto puoi fare qualche operazione senza perdere letture
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Michele Menniti

E' qui che non mi regolo più, il campionamento ( :smiley-eek:) ecco perché ti chiedo la gentilezza di postare il codice, appena lo realizzi, una volta compresa la tecnica poi posso andare avanti da solo.
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

lesto

Code: [Select]

sommaMedia=0;
  int i, r;
  for (i=0; i < 16;i++){
    sommaMedia += analogRead(gyroPin);
  }
  Serial.print("Media: ");
  Serial.println(sommaMedia/4);
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Michele Menniti

Grazie lesto!
Allora gyroPin è il pin analogico su cui applico i valori da leggere, leggo 16 valori, li sommo e poi divido per 4, in questo modo ottengo una risoluzione di 12 bit, sul monitor in pratica leggo 1 valore ogni 16 che arrivano. Mi sembra tutto chiaro (ma ho capito bene? :smiley-red:). Il mio dubbio è: quando ha caricato i primi 16 valori, durante la fase di calcolo non si perde qualche valore? forse è ininfluente?
L'altra possibilità di cui parlavi (gli array), basterebbe sostituire sommamedia nel for con una riga tipo
16pack[]=analogRead(gyroPin);
in questo modo potrei memorizzare "x" gruppi da 16 valori di lettura originale, ma come faccio a creare un nuovo array ad ogni nuovo ciclo for, dovrei riuscire ad ottenere qualcosa tipo 16pak001, 16pack002, ecc. come?
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

lesto

il ragionamento è giusto.
con array circolari:
Code: [Select]

int r=0;
int array[16];

setup(){
  int i;
  for (i=0; i < 16;i++){
    array[i] = analogRead(gyroPin);
  }
}

loop(){
  leggiNuovoValore();
  calcolaMedia();
}

calcolaMedia(){
  sommaMedia=0;
  for (i=0; i < 16;i++){
    sommaMedia+=array[i];
  }
  Serial.print("Media: ");
  Serial.println(sommaMedia/4);
}

leggiNuovoValore(){
   array[r++]=analogRead(gyroPin);
   if (r>=16)
     r=0;
}

facile no?
ah ovvio che è da sistemare, è giusto un abbozzo velocissimo :-)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Michele Menniti

Fantastic!
Appena posso sperimenterò subito questo codice con dati reali, i piccoli errori li scovo, ti farò sapere.
grazie!!
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

uwefed

Si puó aumentare la precisione anche aggiungendo un Convertitore A/D esterno. Ciao Uwe

Michele Menniti

che a questo punto andrebbe collegato con l'uscita su un pin digitale di Arduino?
Qualche tipo di convertitore, magari poco costoso...?
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

BrainBooster

di quanti canali adc in più hai bisogno?
con che precisione?
con che velocità?
quale tipo di comunicazione?
avendo la risposta a queste domande si potrebbe consigliarti un IC dedicato :)

Go Up