Pagina 1 di 2

analogRead

MessaggioInviato: 8 giu 2020, 23:43
da Tekonoris
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.

Re: analogRead

MessaggioInviato: 9 giu 2020, 0:17
da GuidoB
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.

Re: analogRead

MessaggioInviato: 9 giu 2020, 7:27
da EcoTan
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

Re: analogRead

MessaggioInviato: 9 giu 2020, 8:31
da Tekonoris
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

Re: analogRead

MessaggioInviato: 9 giu 2020, 9:00
da MarcoD
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_/

Re: analogRead

MessaggioInviato: 9 giu 2020, 9:06
da IsidoroKZ
La risposta alla prima domanda dovrebbe essere si`: il convertitore con relative capacita` e` messo dopo il multiplexer.

Re: analogRead

MessaggioInviato: 9 giu 2020, 9:17
da Tekonoris
Ok, faccio delle prove e posto i risultati.

Grazie a tutti O_/

Re: analogRead

MessaggioInviato: 9 giu 2020, 10:04
da Tekonoris
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_/

Re: analogRead

MessaggioInviato: 24 ott 2020, 19:52
da gianc2020
Per curiosità: la domanda 1 è vera o comunque il condensatore del Sample è scaricato ogni volta ? o ogni cambio di porta ?


così, a cazzotto mi vien da dire che se non fosse scaricato tutte le volte se leggi prima un valore di 1000 e dopo al pin c'è un valore di 10, il secondo quanto lo leggi?

Re: analogRead

MessaggioInviato: 25 ott 2020, 23:59
da Tekonoris
Da quello che ho letto, mi pare di capire che il rendimento di un S&H dipende in parte dalla DeltaV tra i campioni successivi.
Quando l'S&H ha campionato, il condensatore viene isolato dall'ingresso (interruttore aperto) e (a parte le perdite molto piccole) il valore rimane stabile per la campionatura. Quando devo rileggere il valore, aprendo l'interruttore ho un livellamento ("scarico prima dell'interruttore" solo la parte di DeltaV più alta).
Quindi, sempre ammesso di aver compreso bene, la scarica c'è, ma il campionamento NON riparte sempre da 0.