Home

LO HAI MAI REALIZZATO CON UN PIC?

I PIC e i segnali analogici: la conversione A/D

Dall'analogico al digitale

Anche con i PICMicro, così come la maggior parte dei microcontrollori, è possibile acquisire segnali analogici e gestirli come valori digitali. Non voglio dilungarmi sull'importanza di poter trattare segnali analogici in ambito digitale, ma al lettore si richiede un minimo di dimestichezza con questi argomenti di base. In questo articolo si mostra come deve essere configurato il modulo ADC dei PICMicro, andando ad approfondire argomenti spesso consederati ostici. Dopo questa breve premessa, si va ad incominciare!

 

 

Il modulo ADC dei PICMicro

Molti PICMicro sono dotati di convertitore analogico/digitale (ADC, Analog-to-Digital Converter) tanto gli 8bit quanto i 16bit e i 32bit. Fornire uno schema univoco per capire come funziona il modulo ADC dei PIC è impresa assurda. Tuttavia ritengo che per i neofiti sia interessante approcciarsi ai PICMicro a 8 bit, dai 12F ai 18F, passando attraverso i 16F. Nonostante ci si concentri sulla sola famiglia a 8bit, il ventaglio di possibilità è ancora molto ampio ma è possibile comunque un approccio di tipo sistematico. Sebbene gli esempi e le considerazioni che seguiranno sono specifiche per PIC16F87Xa ed (alcuni) PIC12F, senza troppe difficoltà il lettore dovrebbe essere in grado di applicare quanto esposto a tutti i PICMicro a 8 bit dotati di modulo ADC

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.

Una possibile routine che configura AN0 per la conversione A/D è il seguente:

ADC_INIT
banksel ADCON1
clrf ADCON1
bsf ADCON1,PCFG0 ;solo AN0 configurato come ingresso analogico

banksel ADCON0
clrf ADCON0
bsf ADCON0, ADCS0 ;Conversion clock pari a 8Tosc
bsf ADCON0, ADON  ;avvio del modulo ADC

 

Foglio di calcolo dei parametri A/D dei PIC

Ho realizzato un semplice foglio di calcolo per aiutarmi nella determinazione dei parametri principali da considerare per il calcolo del periodo di campionamento. Il foglio di calcolo è scaricabile a questo link. Un esempio di come vengono inseriti i dati e proposti i risultati è mostrato in figura 4.

Figura 4

Figura 4

Interrupt su conversione A/D

Il modulo ADC permette di acquisire i segnali in polling oppure su risposta all'interrupt al termine della conversione. In questo caso, una volta abilitato l'interrupt, il PIC setta il bit ADIF del registro PIR1 quando è possibile prelevare il dato dai registri di conversione. Nell'esempio che segue, si mostra la rotune di abilitazione dell'interrupt per la gestione della conversione A/D

; Abilitazione interrupt
INTR_INIT
banksel PIR1
bcf PIR1,ADIF
banksel PIE1
bsf PIE1,ADIE

banksel INTCON
bsf INTCON,PEIE
bsf INTCON,GIE

return

Il risultato della conversione

L'ADC del PIC16F87xA è a 10 bit, il che significa che un registro a 8 bit è ovviamente insufficiente per contenere il risultato della conversione. Per risolvere il problema, Microchip ha predisposto due registri ADRESL e ADRESH, rispettivamente per contenere la parte bassa e la parte alta del risultato della conversione. M c'è qualcosa in più. Benché possa sembrare poco pratico, è possibile scegliere se allineare i 10 bit della conversione a partire dal bit 0 oppure dal bit 15, come illustrato in figura 5.

Figura 5

Figura 5

Per operare l'allineamento a destra o a sinistra è necessario agire sul bit ADFM del registro ADCON1.

 

Esempio di funzionamento

Per la configurazione del modulo ADC, l'avvio della conversione e la lettura dei risultati, è consigliabile seguire la guida che il datasheet mostra e che riporto qui nel seguito:


1. Configurazione del modulo ADC:

a) Configurare i pin deputati alla conversione A/D e gli I/O digitali;

b) Selezionare il canale A/D dal quale acquisire (registro ADCON0);

c) Selezionare il valore opportuno per il conversion clock (registro ADCON0);

d) Avviare il modulo ADC (regostro ADCON0).

2. Configurazione dell'interrupt per l'ADC (se desiderato):

a) pulire il bit ADIF;

b) settare il bit ADIE;

c) settare il bit PEIE;

d) settare il bit GIE.

3. Attendere il tempo di acquisizione necessario.

4. Avviare la conversione:

a) settare il bit GO/DONE (registro ADCON0)

5. Attendere il termine della conversione A/D, utilizzando:

a1) il polling sul bit GO/DONE (a fine conversione, si riporta al valore zero)

oppure

a2) attendere il termine della conversione A/D come risposta all'interrupt. a3) gestire la conversione come ISR e pulire il bit ADIF.

6. Leggere la coppia dei registri (ADRESH:ADRESL), pulire il bit ADIF se usato interrupt.

7. Avviare la conversione successiva partendo dal punto 1-a per selezionare un nuovo canale di acquisizione ed eventualmente eseguire anche il passo 1-b qualora l'impedenza della sorgente applicata al nuovo canale A/D sia diversa dalla precedente e richieda un valore diverso per il tempo di coversione.


Il progetto TestADC, realizzato in ambiente MPLAB, è scaricabile al seguente link: Progetto TestADC

 

Sorgenti analogiche con impedenze alte

Il datahseet del PIC16F87xA indica chiaramente che non è opportuno collegare al PICMicro sorgenti analogiche con impedenze di uscita superiori a 2.5 kohm. Ma nella realtà potrebbe capitare di non poterne fare a meno. Come fare, in questo caso? Due sono le soluzioni di compromesso:

1. impiegare un buffer (ad esempio un OpAmp in configurazione inseguitore di tensione) interposto tra sorgente analogica e PIC;

2. utilizzare un tempo di acquisizione molto lungo, per dare modo al condensatore del modulo ADC di caricarsi.

 

Riferimenti

Pillole di Microcontrollori PIC

Licenza Creative Commons
Questa opera viene distribuita con licenza Creative Commons Attribuzione - Non commerciale - Non opere derivate 3.0 Unported.
ShoppingASEhandelASErhvervIndexDKServiceIndexDK