Successive Approximation ADC
L'ADC utilizzato dagli AVR è del tipo SAR che sta per Successive Approximation Register, in italiano Registro ad Approsimazioni Successive, come fa intuire il nome questo tipo di ADC arriva al risultato tramite una serie di approsimazioni.
La figura allegata è lo schema a blocchi generico di un ADC di tipo SAR, come si vede è costituito da un comparatore analogico al quale viene applicata la tensione campionata dal sistema di sample and hold e una tensione di riferimento generata tramite un DAC (Digital Analog Converter) che a sua volta è controllato dal registro SAR.
Il funzionamento è abbastanza semplice, si parte settando il DAC per generare una tensione pari a 1/2 aRef, è a questa unità che fa capo il relativo pin, impostando il bit più significativo del registro SAR a 1, nel caso di un ADC a 10 bit è il decimo bit che ha peso 512, se la tensione del DAC risulta minore di quella in ingresso, proveniente dal sample/hold, questo bit viene lasciato a 1 in caso contrario si riporta a 0, dopo di che si porta a 1 il nono bit, peso 256, e si ripete il paragone con la stessa logica di prima, ovvero se la tensione totale in uscita dal DAC è minore di quella del S/H il bit rimane a 1 altrimenti si riporta a 0.
Si ripete il procedimento con la stessa logica per tutti i bit del ADC, nel nostro caso in totale sono 10, e alla fine il registro SAR contiene il valore digitale della nostra tensione analogica, facciamo un esempio pratico.
Ipotizziamo che la tensione su Aref è 5V esatti, questo vuol dire che ogni step del DAC vale 5/1024 = 4,883 mV, e che la tensione da misurare è 2.815V.
Primo step:
Setto il bit 10 del SAR a 1, al DAC arriva il valore binario 0b1000000000 che vale 512 pertanto la tensione in uscita dal DAC è 4.883512 = 2.500V, il comparatore mi dice che la tensione sul S/H è maggiore di quella del DAC pertanto lascio il bit 10 del SAR a 1 logico.
Secondo step:
Setto il bit 9 del SAR a 1, al DAC arriva il valore binario 0b1100000000 che vale 768, la tensione in uscita è 4.883768 = 3.750V, il comparatore mi dice che la tensione sul S/H è minore di quella del DAC pertanto riporto il bit 9 del SAR a 0 logico.
Terzo step:
Setto il bit 8 del SAR a 1, al DAC arriva il valore binario 0b1010000000 che vale 640, la tensione in uscita è 4.883640 = 3.125V, il comparatore mi dice che la tensione sul S/H è minore di quella del DAC pertanto riporto il bit 8 del SAR a 0 logico.
Quarto step:
Setto il bit 7 del SAR a 1, al DAC arriva il valore binario 0b1001000000 che vale 576, la tensione in uscita è 4.883576 = 2.812V, il comparatore mi dice che la tensione sul S/H è maggiore di quella del DAC pertanto lascio il bit 7 del SAR a 1 logico.
--- Si continua in questo modo fino all'ultimo bit del SAR ---
Una volta arrivati al bit 0, peso 1, mi ritroverò all'interno del SAR il valore 1001000000 che equivale alla tensione di 2.812V, si trova tra 2.816V e 2.807V che è il range entro il quale è contenuto il reale valore della tensione che stiamo misurando.
Il vantaggio di questa tipologia di ADC è che sono relativamente veloci e richiedono tanti cicli clock ADC quanti sono i bit più uno per completare la conversione, sono semplici da implementare all'interno di un micro e possono arrivare a sample rate di svariati megasamples.
La tecnica dell'oversampling per aumentare la risoluzione sfrutta sia l'errore di quantizzazione tra le misure, cioè quei mV in più o in meno che mancano rispetto al valore reale della tensione e lo step minimo del DAC, e il rumore presente sul segnale, per quanto possa sembrare assurdo in questo caso una tensione perfettamente pulita non permette l'uso dell'oversampling.
La teoria che c'è dietro questa tecnica è abbastanza complessa, ne puoi trovare una sintesi molto semplificata sulla application note AVR121 di Atmel, in compenso metterla in pratica è una cosa abbastanza semplice.
Per implementare l'oversampling è necessario acquisire 4^n sample, ove n è il numero di bit da guadagnare, sommarli e dividerli per 2^n.
Esempio pratico, vogliamo passare da 10 a 11 bit, si acquisiscono 4 letture (4^1=4) si sommano tra loro e si dividono per 2 (2^1=2), se vogliamo passare a 12 bit si acquisiscono 16 letture (4^2=16) e si dividono per 4 (2^2 = 4).
Il prezzo da pagare per l'aumento della risoluzione è la banda, se passo da 10 a 11 bit la banda si riduce a 1/4, se passo da 10 a 12 bit si riduce a 1/16, e così via, non è consigliabile superare un incremento di 2 bit.
Solitamente la tecnica dell'oversampling si usa quando la velocità di lettura non è prioritaria mentre serve la maggiore risoluzione possibile, p.e. con una ntc/ptc per la misura della temperatura.