Convertitore Analogico Digitale

ADC

In fase di sviluppo Stesura preliminare In fase di sviluppo

In questa pagina è descritto come usare il Convertitore Analogico Digitale (Analog to Digital Converter, ADC) interno al PIC18 per misurare una tensione continua compresa tra massa ed alimentazione. Se non sapete cosa è un ADC potete andare a questa pagina: il convertitore analogico digitale.

La struttura interna dell'ADC del PIC18

Il convertitore AD del PIC18 è caratterizzato da:

Di seguito lo schema interno, tratto dai fogli tecnici:

La struttura interna dell'ADC

Ciascuno dei registri e dei bit indicati nello schema (CHS, ADON, GO/DONE, ADFM, ADRESH, ADRESL...), corrisponde ad un SFR o ad una sua parte o ad un singolo flag.

Il circuito di riferimento

Il circuito utilizzato negli esempi può essere realizzato su breadboard oppure è possibile utilizzare PICdemo oppure PICdemo R2.

L'unico elemento strettamente necessario per il completamento dell'esempio è il potenziometro indicato nello schema come RV1: ha il compito di fornire una tensione compresa tra 0 e 3,3 V all'ingresso RA0/AN0 (nota 2 e nota 4). Le parti rimanenti dello schema (il secondo ingresso analogico collegato a RV2 e i dieci LED) verranno utilizzate per alcuni esercizi o per illustrare aspetti secondari.

Il circuito di riferimento

Conversione analogico-digitale

Tutte le varie fasi della conversione sono effettuate sequenzialmente dal software (polling) e descritte accuratamente nel paragrafo 19.2.9 A/D CONVERSION PROCEDURE dei fogli tecnici. Qui il codice completo che mostra la conversione della tensione analogica collegata a RA0/AN0. Il risultato è memorizzato in una variabile di due byte, da visualizzare inserendo un apposito brakpoint.

Impostare i canali analogici

La prima operazione da effettuare è quella di selezionare quale è il pin che verrà utilizzato come ingresso analogico; occorre disattivare i buffer digitali corrispondenti, sia in ingresso che in uscita, impostando un bit ciascuno nei due registri TRISA e ANSEL:

 bsf TRISA, RA0  ; Imposta RA0/AN0 come ingresso
 bsf ANSEL, ANS0 ; Imposta RA0/AN0 come ingresso analogico (disattiva l'ingresso digitale)

I dettagli sono ovviamente descritti nei fogli tecnici. Le due figure seguenti mettono in evidenza queste informazioni per il pin RA0/AN0:

Impostazione del registro TRIS

 

Impostare l'ADC

Occorre quindi configurare l'ADC, attraverso ben tre registri: ADCON0, ADCON1, e ADCON2. Esamiliamoli:

ADCON2

Questo registro è diviso in tre campi evidenziati nella figura seguente da colori diversi, ognuno dei quali ha un diverso significato:

Il registro ADCON2

 

Scelta della frequenza di clock dell'ADC

ADCON1

Questo registro permette di scegliere le due tensioni di riferimento alta e bassa, nell'esempio sono impostate a VDD e VSS (alimentazione e massa), la situazione più semplice:

VERF

ADCON0

Anche questo registro è diviso in tre campi evidenziati nella figura seguente da colori diversi, ognuno dei quali ha un diverso significato:

Selezione del canale, avvio della conversione e alimentazione

Le istruzioni corrispondenti possono essere lette direttamente nel codice.

Tutte queste operazioni di configurazioni vengono spesso fatte una sola volta, all'inizio del programma. Ovviamente è possibile una loro modifica durante l'esecuzione del programma, per esempio per leggere la tensione da un altro canale, oppure per spegnere l'ADC quando non serve e risparmiare quindi energia.

Leggere una tensione

La prima operazione è avviare la conversione, settando il flag GO:

  bsf ADCON0, GO

... e attendere la sua conclusione, verificando il valore del flag DONE ed attendendo il suo azzeramento  (nota 6)

attendi
  btfsc ADCON0, DONE ; Conversione terminata?
  bra attendi        ; No, attendi ancora

Entrambe queste operazioni utilizzano un unico flag di ADCON0, con doppio nome e già evidenziato in azzurro nella precedente figura.

A questo punto occorre leggere il risultato dai due registri ADRESH e ADRESL (due byte) e salvarlo nella variabile appositamente allocata. Per visualizzare il risultato all'interno di MPLABX è necessario usare un breakpoint, per esempio in corrispondenza dell'istruzione sleep (nota 3).

Visualizzazione

A volte vogliamo visualizzare il risultato della conversione da analogico a digitale anche al di fuori di MPLABX; possiamo per esempio utilizzare i dieci LED presenti nello schema all'inizio della pagina e collegati a PORTC e ai due bit più significativi di PORTA (nota 7 e nota 8). Di seguito il codice corrispondente, a cui occorre aggiungere la configurazione dei 10 pin usati come uscite digitali, qui non mostrata.

Visualizazione con 10 LED

Questa modalità è tutt'altro che leggibile da un umano, soprattutto se non è abituato a contane in binario...

La seguente è una soluzione che utilizza una modalità tipo VU-Meter digitale, accendendo da un minimo di 0 ad un massimo di 8 LED, a seconda della tensione di ingresso:

L'analisi dettagliata è lasciata come esercizio, insieme all'esercizio 3

Esercizi e approfondimenti

  1. Modificare il codice dell'esempio per leggere la tensione applicata a AN1
  2. Collegare ad AN2 una fotoresistenza oppure un termistore. É necessario prevedere un partitore di tensione opportuno in modo tale che la tensione in ingresso vari in modo significativo (almeno 1 V di differenza tra il valore massimo e quello minimo)
  3. (Approfondimento) Modificare il codice che visualizza la tensione come VU-Meter per accendere tutti i 10 LED presenti nello schema

Codice

Note

  1. Si osservi che GO e DONE coincidono, pur avendo significati quasi in antitesi
  2. Nei fogli tecnici ed anche in questo testo i nomi utilizzati per indicare lo stesso pin fisico variano e vanno considerati sinonimo; RA0, AN0, ANS0 sono lo stesso pin
  3. L'uso dell'esecuzione passo-passo è sconsigliata in quanto l'ADC si comporta molto male a bassa velocità
  4. Se usate PICdemo per il corretto funzionamento i tre jumper P5, P7 e P8 devono essere inseriti. Inoltre le due resistenze R1 ed R2 sono irrilevanti dal punto di vista funzionale, ma utili per evitare problemi hardware nel caso di errate configurazioni
  5. In questa applicazione il valore di TACQ è irrilevante in quanto è usato un solo ingresso a cui la tensione è praticamente costante e sempre applicata
  6. Il tempo necessario per completare la conversione corrisponde all'esecuzione di molte decine di istruzioni
  7. L'uso della porta B è in questo caso complesso in quanto alcuni dei pin sono utilizzato dal PICKIT per il debug
  8. Se si utilizza PICdemo oppure PICdemo R2 è necessario collegare i due LED individuati da X e Y con due cavetti femmina-femmina

 

Data di creazione di questa pagina: 28 marzo 2017
Ultima modifica: 25 aprile 2018


Licenza Creative Commons Attribuzione 4.0 Internazionale


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima