ELEMANIA
PIC16F690 - ADC: sequenza di conversioni
Periodo di campionamento fisso o conversione "libera"?

In generale una sequenza di conversione è costituita da una serie di conversioni successive intervallate da un periodo di campionamento. In alcuni casi (in particolare quando i dati acquisiti devono poi essere elaborati e riconvertiti) è importante mantenere un periodo di campionamento costante e rispettoso del teorema del campionamento. Per ottenere questo è possibile inserire dei cicli di ritardo fra una conversione e l'altra pari al periodo di campionamento desiderato o, preferibilmente, si può utilizzare un timer, magari programmato in modo da generare un interrupt ogni volta che si vuole acquisire un nuovo campione.

In altri casi è sufficiente avviare una conversione subito dopo che la precedente è terminata (o meglio, dopo aver atteso il tempo minimo fra due successive conversioni). Questa seconda modalità è meno precisa della precedente, ma permette di sfruttare il convertitore alla massima velocità e nel modo più semplice. Se per esempio il nostro scopo è semplicemente quello di acquisire una serie di valori da visualizzare immediatamente su un display, quest'ultimo è probabilmente il modo migliore di gestire la conversione.

Per maggiori dettagli generali sulle differenze fra le diverse tecniche di gestione di un convertitore AD, rimandiamo il lettore all'apposita lezione. Qui ci dedicheremo a sviluppare un semplice esempio di gestione di una sequenza di conversioni usando la modalità "libera", cioè quella che non utilizza nessuna tecnica per temporizzare il periodo di campionamento.

Gestione del segnale di fine conversione

Un altro problema riguarda l'attesa e la gestione del segnale di fine conversione (End Of Conversion, nel nostro caso GO/DONE=0). Tale segnale può essere gestito in generale in tre modi diversi:

  1. Mediante un ciclo di ritardo: in questo caso il programma non testa il bit di fine conversione ma si limita ad attendere per un tempo sufficiente dopo l'avvio di ogni conversione.
  2. Per mezzo di polling o interrogazione ciclica: con questa tecnica il programma interroga ripetutamente il bit di fine conversione, finché la conversione non è terminata.
  3. Ad interrupt: con questa tecnica è il convertitore che genera un interrupt per segnalare la fine della conversione.

Nel seguito approfondiremo un esempio di gestione della fine conversione con la tecnica a polling (rimandando il lettore alla già citata lezione per approfondimenti sulle altre modalità).

Sequenza di conversione

Fatte le precedenti premesse, una sequenza di conversione per un singolo canale è costituita in generale dalle seguenti fasi:

  1. programmazione dei pin di ingresso e del convertitore AD;
  2. attesa del tempo minimo per il corretto funzionamento del convertitore;
  3. avvio della conversione (GO/DONE=1);
  4. interrogazione ciclica sul bit di fine conversione (GO/DONE=0)
  5. lettura e salvataggio/elaborazione del dato convertito;
  6. ritorno al passo 2.

Naturalmente se fosse necessario acquisire da più canali diversi (attraverso il multiplexer), occorrerebbe ripetere i passi precedenti per ogni canale.

Qui di seguito riportiamo un semplice codice in assembly per gestire la conversione di un segnale analogico sul pin RA0:

BANKSEL TRISA
BSF TRISA,0 ;RA0 viene programmato come input

BSF ANSEL,0 ; RA0 viene settato come ingresso analogico

MOVLW B’01100000’ ; fattore di prescaling 1:64
MOVWF ADCON1 ;

BANKSEL ADCON0
MOVLW B’10000001’ ;Right justified, Vdd, canale AN0 e ADON
MOVWF ADCON0 ;

inizio:

CALL attesa ; subroutine di attesa del tempo minimo
BSF ADCON0,GO ; Start of conversion

BTFSC ADCON0,GO ; test End of conversion
GOTO $-1 ; se la conversione non è terminata, ripete il test

MOVF ADRESH,W ; legge i due bit più significativi del dato
MOVWF ... ; li sposta da qualche parte
BANKSEL ADRESL
MOVF ADRESL,W ; legge gli 8 bit meno significativi del dato
MOVWF ...; li sposta da qualche parte

BANKSEL ADCON0
GOTO inizio

Si noti che preliminarmente è necessario programmare il pin usato per acquisire la tensione analogica come input (BSF TRISA,0) e come ingresso analogico (BSF ANSEL,0).

Si osservi che l'istruzione che avvia la conversione (BSF ADCON0,GO) è separata dall'altra istruzione che programma il contenuto di ADCON0. In generale il bit GO/DONE non deve essere settato nella medesima istruzione che accende il convertitore AD (settando il bit ADON di ADCON0).

Per quanto riguarda la subroutine "attesa", questa è comunque necessaria all'inizio del ciclo poiché, dopo l'accensione del convertitore e la selezione del canale occorre dare il tempo al condensatore CHOLD di caricarsi.

precedente  - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it