Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

analogRead

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteWALTERmwp, Foto Utentexyz

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
313 3 9
Stabilizzato
Stabilizzato
 
Messaggi: 392
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!       Ausili per disabili e anziani su ƎlectroYou
Caratteri utili: À È É Ì Ò Ó Ù α β γ δ ε η θ λ μ π ρ σ τ φ ω Ω º ª ² ³ √ ∛ ∜ ₀ ₁ ₂ ₃ ₄ ₅ ₆ ∃ ∄ ∆ ∈ ∉ ± ∓ ∾ ≃ ≈ ≠ ≤ ≥
Avatar utente
Foto UtenteGuidoB
17,8k 7 12 13
G.Master EY
G.Master EY
 
Messaggi: 2809
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
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5421
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
313 3 9
Stabilizzato
Stabilizzato
 
Messaggi: 392
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
12,2k 5 9 13
Master EY
Master EY
 
Messaggi: 6696
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
121,2k 1 3 8
G.Master EY
G.Master EY
 
Messaggi: 21059
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
313 3 9
Stabilizzato
Stabilizzato
 
Messaggi: 392
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
313 3 9
Stabilizzato
Stabilizzato
 
Messaggi: 392
Iscritto il: 19 ott 2018, 10:31

0
voti

[9] Re: analogRead

Messaggioda Foto Utentegianc2020 » 24 ott 2020, 19:52

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?
Avatar utente
Foto Utentegianc2020
15 1 3
 
Messaggi: 25
Iscritto il: 3 giu 2020, 19:24

0
voti

[10] Re: analogRead

Messaggioda Foto UtenteTekonoris » 25 ott 2020, 23:59

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.
Avatar utente
Foto UtenteTekonoris
313 3 9
Stabilizzato
Stabilizzato
 
Messaggi: 392
Iscritto il: 19 ott 2018, 10:31

Prossimo

Torna a Arduino

Chi c’è in linea

Visitano il forum: Google [Bot] e 6 ospiti