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.
Il convertitore AD del PIC18 è caratterizzato da:
Di seguito lo schema interno, tratto dai fogli tecnici:
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 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.
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.
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:
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:
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:
ADCON0
Anche questo registro è diviso in tre campi evidenziati nella figura seguente da colori diversi, ognuno dei quali ha un diverso significato:
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.
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).
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.
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
Data di creazione di questa pagina: 28 marzo 2017
Ultima modifica: 25 aprile 2018
Assembly PIC18 - Versione 0.5 - aprile 2018
Copyright 2016-2018, Vincenzo Villa (https://www.vincenzov.net)
Assembly PIC18 di Vincenzo Villa è distribuito con Licenza Creative Commons Attribuzione 4.0 Internazionale