CONVERSIONE A/D

registri di controllo :

  1. ADCON0

  2. ADCON1

il primo gestisce la parte operativa, il secondo la gestione dei pin.

Il datasheet del PIC16F87xA illustra il modello interno del modulo ADC, secondo quanto esposto in figura 1. Con ANx si intende il generico pin in grado di interfacciarsi al modulo ADC. Obiettivo principale è quello di configurare il modulo ADC e di stabilire i valori da inserire nei registri al fine di eseguire una corretta conversione A/D. I valori dei registri sono influenzati da alcuni parametri, come ad esempio quelli di figura 1:

Figura 1

Figura 1

Rs: impedenza della sorgente analogica

Ric: resistenza di interconnessione

Rss: resistenza del dispositivo di commutazione

Calcolo del periodo di campionamento

Il periodo di campionamento è suddiviso in due parti, secondo quanto illustrato in fugura 2: Acquisition time: tempo di acquisizione A/D Conversion time: tempo di conversione

Figura 2

Figura 2

Il periodo di acquisizione Tacq, è ottenuto come somma dei contributi:

Tacq = Tamp + Tc + Tcoff

dove:

Tamp = Amplifier Settling time

Tc = Hold capacitor Charging time

Tcoff = Temperature coefficient


Il datasheet, illustra il metodo di calcolo:

Tamp = 2us (sembra un dato fisso)

Tc = CHOLD * (RIC + RSS + RS)In(1 / 2047)] (Eq. 1)

Tcoff = 0.05 * (T − 25) (Eq. 2)

Nell'espressione di Tc, compaiono i valori Ric, Rs, Rss menzionati in precedenza. I valori di queste resistenze sono così stabiliti: Rs: è il valore dell'impedenza di ingresso che non deve superare il valore indicato sul datasheet (a seconda del PIC, può variare da 2.5 kohm a 10kohm)

Ric: si assume il valore massimo, cioè 1k

Rss: la resistenza dell'interruttore di commutazione è calcolata a partire dalla curva di figura 3, che mostra, per il PIC16F87xA, l'andamento del valore della resistenza in funzione della tensione di alimentazione. Eseguendo un'interpolazione lineare tra due punti per ricavare l'equazione della retta, è possibile determinare qualsiasi valore di Rss, fornito Vdd come valore di input.

Figura 3

Figura 3

Attenzione: il valore di Tcoff è richiesto solamente per temperature superiori a 25°C.

Se consideriamo i punti del grafico di figura 3, e indicando con X i termini in ohm e in Y i termini in volt, si ha che l'equazione della retta passante per P = (11,3) Q = (7,5) diventa:

x = − 2y + 17

e sostituendo i termini dei parametri:

Rss = − 2Vdd + 17 (Eq. 3)



Il secondo termine, quello richiesto per la conversione A/D, per ogni singolo bit viene denominato Tad; per una conversione a 10bit, il periodo totale richiesto è pari a 11.5Tad. Per il PIC16F87xA, è possibile scegliere tra diversi valori per Tad:

  • 2 TOSC

  • 4 TOSC

  • 8 TOSC

  • 16 TOSC

  • 32 TOSC

  • 64 TOSC

  • Internal A/D module RC oscillator (2-6 µs)

Il tempo di conversione va stabilito ricordando che deve essere garantito un tempo minimo pari a 1.6μs In funzione del valore di Fosc (e quindi di Tosc) è possibile determinare il valore minimo.

Il minimo periodo di campionamento pertanto vale:

Tsamp = Tacq + 11.5 * Tad (Eq. 4)

Un esempio di calcolo

Supponiamo di avere i seguenti dati:

  • Fosc = 4MHz

  • Vdd = 5V

  • Rs = 2 kohm

  • Temperatura di esercizio: 40°C

Secondo quanto espresso dal datasheet, e secondo le formule riportate, il tempo di acquisizione vale:

Tacq = 10.984μs

Con Fosc pari a 4MHz, per garantire un Tad\geq1.6\mu s è necessario selezionare il divisore pari a 8Tosc.



registri che memorizzano la conversione (8/10 bit) :

  1. ADRESH

  2. ADRESL



E' possibile usare l'interrupt per essere informati del termine della conversione :

bit di enable : ADIE (reg. PIE1)

bit di flag : ADIF (reg. PIR1)

ovviamente non è un interrupt primario, quindi oltre al GIE va attivato anche il PEIE (entrambi del reg. INTCON)

Quindi dopo tutte le impostazioni precedenti, e necessarie al nostro progetto, si può fare la conversione settando il flag GO/DONE e attendere. Quando il GO/DONE viene riposto a “0” allora la conversione è terminata e si può leggere o memorizzare l'informazione (es. su eeprom). Oppure se avete usato l'interrupt, nella funzione dedicata dovete monitorare il flag ADIF.

In mikroC PRO è prevista una libreria



ADC_Read (unsigned short ADC_channel)





unsigned ADC_Read(unsigned short channel); // prototipo





Esempio 1

void main ()

unsigned int val;


ADCON0=0x8E;

ADCON1=0x80;

TRISA=0X3F;

TRISB=0;

TRISC=0XFC;


while (1)

{

//lettura

val=ADC_READ(0);


PORTB=val;

PORTC=val>>8;

}