Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

analogRead

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteMassimoB, Foto Utentexyz, Foto UtenteWALTERmwp

0
voti

[1] analogRead

Messaggioda Foto UtenteTekonoris » 8 giu 2020, 23:43

Stò realizzando un circuito che legge una tensione tra 0V e 5V utilizzando la funzione analogRead.
Nelle specifiche dell'Atmega si dice che il Sample & Hold del ADC per leggere correttamente il valore di tensione non deve avere un'impedenza in ingresso maggiore di 10k, altrimenti il condensatore del convertitore non si carica correttamente falsando il valore.
Avendo io un'impedenza intorno ai 470k cosa devo fare ? NON vorrei utilizzare un'inseguitore di tensione per questioni di spazio (ne dovrei montare 4 "sparsi" sulla basetta).
Ho visto soluzioni che prevedono l'inserimento di più comandi analogRead, tipo:
Codice: Seleziona tutto
val = analogRead (A0);
delay (10);
val = analogRead (A0);

utilizzando solo il secondo valore.

Soluzioni a media (adottata attualmente):
Codice: Seleziona tutto
      RESVread = 0;
      for (int iAN = 0; iAN < SAMPLEVAL; iAN++) {
        RESVread += analogRead(RESanalog); // read the input on analogPin and accumulate
        delay(DELAYADC); // delay to define the sampling time
      }
      RESVread = (float)RESVread / SAMPLEVAL; // calculate the corresponding voltage

che attenuano le differenze di lettura.

Le domande sono:
1) se leggo sempre dallo stesso ingresso Analogico e la variazione di tensione non è troppo rapida (in questo caso è quasi fissa), il condensatore rimane parzialmente carico e si riesce a farlo caricare con passaggi/letture successivi ?
2) Qualche altro metodo ?
3) Abolendo la funzione analogRead e utilizzando il codice macchina, posso ottenere di meglio ?

Grazie per qualunque suggerimento.
Avatar utente
Foto UtenteTekonoris
68 1 6
Frequentatore
Frequentatore
 
Messaggi: 179
Iscritto il: 19 ott 2018, 10:31

0
voti

[2] Re: analogRead

Messaggioda Foto UtenteGuidoB » 9 giu 2020, 0:17

Un condensatore in parallelo all'ingresso analogico potrebbe aiutare, ma forma un filtro passa basso con l'impedenza d'uscita del tuo stadio di lettura.

Che vada bene o no, e il suo valore, dipendono dalla massima frequenza del tuo segnale e dall'errore che puoi accettare.
Big fan of ƎlectroYou!
Avatar utente
Foto UtenteGuidoB
15,5k 7 12 13
G.Master EY
G.Master EY
 
Messaggi: 2350
Iscritto il: 3 mar 2011, 16:48
Località: Madrid

1
voti

[3] Re: analogRead

Messaggioda Foto UtenteEcoTan » 9 giu 2020, 7:27

Tekonoris ha scritto:3) Abolendo la funzione analogRead e utilizzando il codice macchina, posso ottenere di meglio ?

Sì. Anche senza ricorrere all'assembler, scrivendo nei registri in generale si può impostare la frequenza del clock per lo ADC e il numero di cicli da dedicare al sampling. Non dico che tramite analogRead non si possa fare, ma così siamo sicuri.
EDIT bisogna consultare il datasheet per verificare quanto sopra, non saprei per gli Atmel
Avatar utente
Foto UtenteEcoTan
5.734 4 10 13
Expert EY
Expert EY
 
Messaggi: 3582
Iscritto il: 29 gen 2014, 8:54

0
voti

[4] Re: analogRead

Messaggioda Foto UtenteTekonoris » 9 giu 2020, 8:31

GuidoB ha scritto:Un condensatore in parallelo all'ingresso analogico potrebbe aiutare, ma forma un filtro passa basso con l'impedenza d'uscita del tuo stadio di lettura.

Purtroppo non posso farlo. Il circuito da cui leggo i dati è un filltro passa basso. (Ma in futuro non si sa mai).

EcoTan ha scritto:Sì. Anche senza ricorrere all'assembler, scrivendo nei registri in generale si può impostare la frequenza del clock per lo ADC e il numero di cicli da dedicare al sampling.

Ho cercato un pochetto e posso modificare il tempo di campionamento con queste righe:
Codice: Seleziona tutto
  #define PS_32 ((1 << ADPS2) | (1 << ADPS0))
  #define PS_64 ((1 << ADPS2) | (1 << ADPS1))
  #define PS_128 ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0))

  ADCSRA &= ~PS_128;  //Set up the ADC: remove bits set by Arduino library
  ADCSRA |= PS_128;    // set our own prescaler to XX

Se imposto a 128 ho il massimo tempo di campionamento.

Per curiosità: la domanda 1 è vera o comunque il condensatore del Sample è scaricato ogni volta ? o ogni cambio di porta ?

Ciao e grazie
Avatar utente
Foto UtenteTekonoris
68 1 6
Frequentatore
Frequentatore
 
Messaggi: 179
Iscritto il: 19 ott 2018, 10:31

0
voti

[5] Re: analogRead

Messaggioda Foto UtenteMarcoD » 9 giu 2020, 9:00

Per curiosità: la domanda 1 è vera o comunque il condensatore del Sample è scaricato ogni volta ? o ogni cambio di porta ?

Bella domanda !
Chi lo sa ? E anche sapendolo, può cambiare con le versioni delle CPU di arduino e con l'aggiornamento software? Solo se è descritto nelle prestazioni del funzionamento del SW arduino ci si può forse fidare.
Io proverei mettendo un resistore da 10 kohm (oppure per evidenziare 100 k) in serie all'ingresso ana di arduino e verificherei se e di quanto la lettura cambia.
E se cambia combiando canale e facendo delle medie.
O_/
Avatar utente
Foto UtenteMarcoD
7.257 4 8 13
Master EY
Master EY
 
Messaggi: 3218
Iscritto il: 9 lug 2015, 16:58
Località: Torino

0
voti

[6] Re: analogRead

Messaggioda Foto UtenteIsidoroKZ » 9 giu 2020, 9:06

La risposta alla prima domanda dovrebbe essere si`: il convertitore con relative capacita` e` messo dopo il multiplexer.
Per usare proficuamente un simulatore, bisogna sapere molta più elettronica di lui
Plug it in - it works better!
Il 555 sta all'elettronica come Arduino all'informatica! (entrambi loro malgrado)
Se volete risposte rispondete a tutte le mie domande
Avatar utente
Foto UtenteIsidoroKZ
106,5k 1 3 8
G.Master EY
G.Master EY
 
Messaggi: 18817
Iscritto il: 17 ott 2009, 0:00

0
voti

[7] Re: analogRead

Messaggioda Foto UtenteTekonoris » 9 giu 2020, 9:17

Ok, faccio delle prove e posto i risultati.

Grazie a tutti O_/
Avatar utente
Foto UtenteTekonoris
68 1 6
Frequentatore
Frequentatore
 
Messaggi: 179
Iscritto il: 19 ott 2018, 10:31

1
voti

[8] Re: analogRead

Messaggioda Foto UtenteTekonoris » 9 giu 2020, 10:04

Ero troppo curioso ... ho provato subito con il circuito seguente:



I cicli sono sempre per 20 valori. Se leggo A1 e poi A2 ottengo:
A1 stabile valore corretto (oscillazione di 1 punto).
A2 stabile valore corretto (oscillazione di 1 punto), ma all'inizio perde 3 punti.
Con la R da 100k non ci sono variazioni di comportamento tra A1 & A2.

Se ciclo le letture con questa sequenza : A1, A0, A2, A0 (A0 lettura su V=0V), ottengo:
817 < A1 < 833
776 < A2 (100k) < 812
555 < A2 (1000k) < 602

Valore corretto 832/833.

Quindi se leggo e faccio la media dallo stesso pin, dovrei essere abbastanza sicuro del valore.
Ciao O_/
Avatar utente
Foto UtenteTekonoris
68 1 6
Frequentatore
Frequentatore
 
Messaggi: 179
Iscritto il: 19 ott 2018, 10:31


Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite