Go Down

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

lestofante

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?
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

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.
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

lestofante

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!
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

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.
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

lestofante

è 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
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

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).
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

lestofante


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
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

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.
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

lestofante

Code: [Select]

sommaMedia=0;
  int i, r;
  for (i=0; i < 16;i++){
    sommaMedia += analogRead(gyroPin);
  }
  Serial.print("Media: ");
  Serial.println(sommaMedia/4);
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

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?
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

lestofante

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 :-)
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

menniti

Fantastic!
Appena posso sperimenterò subito questo codice con dati reali, i piccoli errori li scovo, ti farò sapere.
grazie!!
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

uwefed

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

menniti

che a questo punto andrebbe collegato con l'uscita su un pin digitale di Arduino?
Qualche tipo di convertitore, magari poco costoso...?
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
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