Conversione A/D di un PIC

Materie:Appunti
Categoria:Sistemi

Voto:

2.5 (2)
Download:220
Data:15.02.2010
Numero di pagine:11
Formato di file:.doc (Microsoft Word)
Download   Anteprima
conversione-pic_1.zip (Dimensione: 59.86 Kb)
trucheck.it_conversione-a-d-di-un-pic.doc     195 Kb
readme.txt     59 Bytes


Testo

LABORATORIO DI SISTEMI
ALUNNO: Fratto Claudio
CLASSE: V B Informatico
ESERCITAZIONE N°: 2
OGGETTO: RILIEVO DELLA CARATTERISTICA DI CONVERSIONE A/D DI UN PIC
SCHEMA

FIGURA 1

DATI:
R= 10kΩ
Rd= 330Ω
C = 22pf
STRUMENTI UTILIZZATI COMPONENTI UTILIZZATI

1)
1) Alimentatore;
2) Alimentatore variabile; 1) PIC 16f876;
3) Programmatore per PIC;
4) PC;
1) Una resistenza da 10kΩ;
2) Otto resistenze da 330Ω;
3) Due condensatori da 22pF;
4) Un oscillatore al quarzo a 4MHz;
5) Otto diodi LED;
6) PIC16f876;
ALGORITMO
DATI RILEVATI
Segnale di ingresso [Volt]
Numero in binario
Numero in esadecimale
Numero in decimale

0000 0000
00

0,2
0000 0111
07
7
0,4
0001 0100
14
20
0,8
0010 1001
29
41
1
0011 0010
32
50
1,5
0100 0110
46
70
2
0110 0000
60
96
3
1001 0001
91
145
4
1100 0011
C3
195
5
1111 1111
FF
255
GRAFICO DEI DATI RILEVATI

SORGENTE PROGRAMMA
#include
; Parola di configurazione:
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_ON & _LVP_ON & _CPD_OFF & _WRT_ENABLE_OFF & _DEBUG_OFF & _CP_OFF
; Inizio programma
Start ; etichetta di riferimento: inizio del programma
; accedendo al banco 1
BCF STATUS,RP1 ; poni a 0 il bit RP1, contenuto nel registro di stato
BSF STATUS, RP0 ; poni a 1 il bit RP0, contenuto nel registro di stato

; imposto le caratteristiche della conversione attraverso il registro ADCON1
MOVLW 0X0E ; carica nel registro W il valore esadecimale 0E
MOVWF ADCON1 ; copia il valore contenuto in W nella locazione di memoria ; di indirizzo corrispondente all’etichetta “ADCON1”

; imposto il pin di peso 0 di PORTA in input
MOVLW 0X01 ; carica nel registro W il valore esadecimale 01
MOVWF PORTA ; copia il valore contenuto in W nella locazione di memoria ; di indirizzo corrispondente all’etichetta “PORTA”, cioè
; nel registro TRIS A
; imposto PORTB in output
MOVLW 0X00 ; carica nel registro W il valore esadecimale 00
MOVWF PORTB ; copia il valore contenuto in W nella locazione di memoria ; di indirizzo corrispondente all’etichetta “PORTB”, cioè
; nel registro TRIS B
; accedendo al banco 0
BCF STATUS, RP0 ; poni a 0 il bit RP0, contenuto nel registro di stato
; imposto le caratteristiche della conversione attraverso il registro ADCON0
MOVLW 0XC1 ; carica nel registro W il valore esadecimale C1
MOVWF ADCON0 ; copia il valore contenuto in W nella locazione di memoria
; di indirizzo corrispondente all’etichetta “ADCON1”
Inizio_conversione ; etichetta di riferimento
BSF ADCON0, 2 ; poni a 1 il bit di peso 2 del registro ADCON0 in modo
; da avviare la conversione
Attesa_fine_conversione ; etichetta di riferimento
BTFSC ADCON0, 2 ; verifica se il bit di peso 2 del registro ADCON0 è a
; livello basso, cioè se la conversione è terminata
; istruzione che deve essere eseguita se la condizione dell’istruzione precedente
; non è verificata
GOTO Attesa_fine_conversione ; ritorna all’etichetta di riferimento
; “Attesa_fine_conversione”
; istruzione che deve essere eseguita se la condizione dell’istruzione di test è verificata
MOVF ADRESH, W ; copia il contenuto del registro ADRESH nel registro W
MOVWF PORTB ; copia il contenuto del registro accumulatore nella locazione
; di memoria di indirizzo corrispondente all’etichetta “PORTB”:
; il dato viene posto in uscita sulla PORT B
GOTO Inizio_conversione ; ripeti le istruzioni presenti dopo l’etichetta di
; riferimento “Inizio_conversione”
END ; fine del programma
RELAZIONE
L’esperienza effettuata in laboratorio si è articolata in tre fasi:
1) la prima fase consisteva nel realizzare l’algoritmo ed il relativo codice, scritto nel linguaggio compreso dai PIC, di un software che convertisse una tensione analogica di ingresso in un dato digitale da rappresentare in uscita attraverso dei led;
2) la seconda fase consisteva nel programmare il PIC utilizzato attraverso il programmatore e nel progettare la parte hardware in modo tale da funzionare al meglio (scegliere componenti da utilizzare, ecc.), e realizzarlo in pratica;
3) la terza fase consisteva nel testare il circuito realizzato in precedenza, verificarne il corretto funzionamento e rilevare le coppie di valori composte dalla tensione di ingresso ed il dato digitale di uscita, rilevato attraverso i led, per poi rappresentarle su un grafico.
• CENNI TEORICI SUI CONVERTITORE ANALOGICO/DIGITALE
I convertitori analogici/digitali sono dei circuiti elettronici in grado di convertire una grandezza continua, ad esempio una tensione, in una serie di valori discreti.
Caratteristica fondamentale di un convertitore A/D è la risoluzione. Essa sta ad indicare il numero di valori discreti che il convertitore può produrre. È espressa generalmente in bit ma può essere espressa elettricamente in volt; in quest’ultimo caso è pari alla minima differenza di potenziale tra due segnali che vengono codificati con due valori discreti adiacenti.
Per calcolarla basta effettuare il rapporto tra il range di valori assunti dal segnale continuo ed il numero dei livelli di quantizzazione, cioè il numero massimo di valori discreti che si può avere a seconda del numero di bit che andranno a comporre il numero frutto della conversione.
Per convertire un segnale analogico continuo in una serie di valori discreti è necessario definire una frequenza alla quale si intende campionare i valori discreti del segnale analogico. Questa frequenza è chiamata sampling rate. Tuttavia, poiché nella pratica un convertitore A/D non è in grado di convertire il valore del segnale di ingresso in maniera istantanea, è necessario che il segnale che si intende convertire rimanga costante per il periodo di tempo in cui il convertitore esegue la conversione. La funzione di mantenere costante il segnale di ingresso è svolta da un circuito che è chiamato sample/hold, in particolare un condensatore si carica memorizzando la tensione del segnale di ingresso e, una volta caricato, viene disconnesso dall’ingresso per mezzo di un interruttore elettronico.
IL FENOMENO DELL’ALIASING
Il fenomeno dell’aliasing è quel fenomeno per il quale un segnale analogico può diventare non riconoscibile una volta campionato in quanto la campionatura avviene ad intervalli discreti di tempo facendo si che non si possano conoscere i valori assunti dall’ingresso tra due istanti di campionamento adiacenti. Tutto ciò costituisce un serio problema che si riflette direttamente sull'uscita del sistema in esame, alterandone la veridicità.
Per eliminare questo fenomeno è necessario filtrare l’ingresso del convertitore A/D in modo da eliminare le frequenze superiori alla frequenza di campionamento.

IL CONVERTITORE ANALOGICO/DIGITALE DEL PIC
Il PIC16f876 contiene un modulo convertitore Analogico/Digitale a 10 bit con 5 canali di ingresso ciascuno dei quali può essere selezionato attraverso un software. Ciò significa che il convertitore può ricevere un solo segnale di ingresso di tipo analogico alla volta, restituendo un numero digitale a 10 bit. I registri particolari usati nella conversione A/D nel PIC sono diversi:
a) il registro ADCON0, presente nel banco 0 all’indirizzo 1F(16);
b) il registro ADCON1, presente nel banco 1 all’indirizzo 9F(16).
Entrambi questi registri sono utilizzati per impostare le caratteristiche della conversione, quindi, prima di avviare una conversione, è necessario impostare tutti i parametri della conversione attraverso questi registri.
Il risultato della conversione, cioè il dato analogico espresso in digitale, essendo composto da 10 bit, viene memorizzato in due registri da 8 bit: il registro ADRESH ed il registro ADRESL. Utilizzando due registri ad 8 bit, o i 6 bit più significativi del registro ADRESH o i 6 bit meno significativi del registro ADRESL non vengono utilizzati; vengono per questo posti a 0.
• Il Registro di ADCON0
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
ADCS1
ADCS0
CHS2
CHS1
CHS0
GO/DONE
A/D ON
FUNZIONE DI OGNI SINGOLO BIT
➢ I bit ADSC1 e ADSC0
I bit di peso sette e di peso sei del registro ADCON0 sono utilizzati per determinare la frequenza di clock utilizzata dal convertitore.
ADCS1
ADCS0

Frequenza_oscillazione/2

1
Frequenza_oscillazione/8
1

Frequenza_oscillazione/32
1
1
Frequenza di clock derivata da un oscillatore RC interno al convertitore
➢ I bit CHS2, CHS1 e CHS0
I bit di peso cinque, di peso quattro e di peso tre del registro ADCON0 sono utilizzati per scegliere il canale analogico al quale è applicato il segnale da convertire in digitale.
CHS2
CHS1
CHS0
CANALE CORRISPONDENTE

RA0

1
RA1

1

RA2

1
1
RA3
1

RA5
➢ Il bit GO/DONE
I bit di peso due è utilizzato per determinare lo stato della conversione:
a) è uguale a 1 quando si avvia la conversione e per tutta la sua durata;
b) è uguale a 0 quando non si sta effettuando alcuna conversione. Il bit è posto a 0 automaticamente quando la conversione termina.
➢ Il bit A/D ON
I bit di peso zero è utilizzato per determinare lo stato del convertitore:
a) è uguale a 1 quando il convertitore è attivo;
b) è uguale a 0 quando il convertitore non è attivo.
• Il Registro di ADCON1
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
ADFM
PCFG3
PCFG2
PCFG1
PCFG0
FUN
FUNZIONE DI OGNI SINGOLO BIT
➢ Il bit ADFM
Il bit di peso sette del registro ADCON1 è utilizzato per definire la giustifica a destra o a sinistra del dato digitale ricavato dalla conversione. È necessario definire la giustifica in quanto, come già detto in precedenza, il valore digitale ricavato (10 bit) viene memorizzato in due locazioni di memoria da 8 bit.
ADFM
TIPO DI GIUSTIFICA

Giustifica a sinistra: i 6 bit meno significativi del registro ADRESL vengono posti a 0
1
Giustifica a destra: i 6 bit più significativi del registro ADRESH
vengono posti a 0
➢ I bit PCFG3, PCFG2, PCFG1 e PCFG0
I bit di peso tre, di peso due, di peso uno e di peso zero del registro ADCON1 sono utilizzati per definire se le linee della PORTA sono impiegate come ingressi digitali o analogici e per definire la sorgente della tensione di riferimento.
IMPIEGO DEGLI INGRESSI DELLA PORTA
PGF3
PGF2
PGF1
PGF0
RA5
RA3
RA2
RA1
RA0
Vref+
Vref-

analogico
analogico
analogico
analogico
analogico
Vdd
Vss

1
analogico
analogico
analogico
Vref+
analogico
RA1
Vss

1

digitale
analogico
digitale
analogico
analogico
Vdd
Vss

1

1
digitale
Vref+
digitale
analogico
analogico
RA3
Vss

1
1
X
digitale
digitale
digitale
digitale
digitale
Vdd
Vss

analogico
Vref+
Vref-
analogico
analogico
RA3
RA2
1
1

1
digitale
Vref+
Vref-
analogico
analogico
RA3
RA2
1
1
1

digitale
digitale
digitale
digitale
analogico
Vdd
Vss
1
1
1
1
digitale
Vref+
Vref-
digitale
analogico
RA3
RA2

FASE 1:
Per realizzare il codice sorgente di un programma che convertisse una tensione analogica di ingresso in un dato digitale da rappresentare in uscita attraverso dei led da caricare su un PIC16F876, si è prima passati alla progettazione su carta di un algoritmo (vedi ‘ALGORITMO’ foglio2).
Una volta progettato l’algoritmo si è passati alla stesura del codice scritto utilizzando il set di istruzioni messe a disposizione dal PIC (vedi ‘PROGRAMMA’ foglio3-foglio4)..
ANALISI DELLE ISTRUZIONI UTILIZZATE
Il PIC16F876 è dotato di un set di 35 istruzioni di base che si dividono in tre gruppi:
a) Byte – oriented: cioè quelle istruzioni che agiscono su un registro di 8 bit e tutte le operazioni effettuate vanno a modificare il contenuto del registro stesso;
b) Bit – oriented: cioè quelle istruzioni che agiscono su un singolo bit di un registro;
c) Literal and control: cioè quel gruppo di istruzioni che agiscono su una costante ad 8 bit la quale va a modificare un registro in base all’operazione che si effettua.
Questi gruppi di istruzioni possono avere una serie di parametri che, nella loro sintassi, devono essere utilizzati; i parametri sono identificati da:
a) f: sta a rappresentare una locazione di memoria;
b) d: sta a rappresentare la destinazione dell’istruzione;
c) b: sta a rappresentare il peso del bit su cui deve essere eseguita l’operazione;
d) k: sta a rappresentare una costante ad 8 bit o un’etichetta; questo parametro può essere utilizzato solo con istruzioni del gruppo Literal and control;
• ISTRUZIONE “BCF” : “Bit Clear F”
Sintassi: BCF f, b
Descrizione: Questa istruzione azzera il bit b del registro presente all’indirizzo f senza modificare nessun bit del registro di stato.

• ISTRUZIONE “BSF” : “Bit Set F”
Sintassi: BSF f, b
Descrizione: Questa istruzione pone a livello logico alto il bit b del registro presente all’indirizzo f senza modificare nessun bit del registro di stato.
• ISTRUZIONE “MOVLW” : “MOVe Literal to W”
Sintassi: MOVLW k
Descrizione: Questa istruzione carica nel registro accumulatore il valore costante k senza modificare nessun bit del registro di stato.
• ISTRUZIONE “MOVF” : “MOVe F”
Sintassi: MOVF f, d
Descrizione: Questa istruzione copia il contenuto della locazione di memoria corrispondente all’etichetta f nella locazione di memoria corrispondente all’etichetta d, che può essere anche il registro w o la stessa locazione di memoria del dato da copiare. Questa istruzione va a modificare il bit dello Zero del registro di stato.
• ISTRUZIONE “MOVWF” : “MOVe W to F”
Sintassi: MOVWF f
Descrizione: Questa istruzione copia il contenuto del registro accumulatore nella locazione di memoria corrispondente all’etichetta f, senza modificare nessun bit del registro di stato.

• ISTRUZIONE “GOTO”: “GO TO address”
Sintassi: goto k
Descrizione: Questa è un’istruzione di salto assoluto. Essa determina un salto del programma in esecuzione all'indirizzo k che può essere specificato utilizzando direttamente il valore numerico dell'indirizzo oppure la relativa etichetta.
L’istruzione non modifica nessun bit del registro di stato.
• ISTRUZIONE “BTFSC”: “Bit Test F, Skip if Creal”
Sintassi: BTFSC f, b
; istruzione no
; istruzione si
Descrizione: Questa è un’istruzione utilizzata per implementare le scelte binarie. Va a controllare se il bit di peso b del registro f è zero: in tal caso verrà eseguita l’istruzione si, saltando l’istruzione no; in caso contrario verrà eseguita l’istruzione no e tutte le istruzioni poste di seguito (l’istruzione si compresa).
L’istruzione non va a modificare nessun bit del registro di stato
Finita la fase di stesura del codice si è passati alla sua compilazione per ottenere il file “.hex” da poter caricare, attraverso il programmatore, sul PIC. La compilazione è avvenuta tramite il software linux Piklab, attraverso il quale, con un tool integrato, è stato possibile definire la “parola di configurazione” del PIC, impostando di fatto tutte le caratteristiche del dispositivo utilizzato: tipo di oscillatore, attivazione del WDT, ecc.;
• FASE 2:
Una volta ottenuto il file “.hex”, sempre con l’ausilio di Piklab, si è stati in grado di programmare il PIC. Per fare ciò si è utilizzato il programmatore del PIC collegato al PC attraverso la porta seriale.
Ultimata la progettazione e la realizzazione del software si è passati alla progettazione della parte hardware. Effettuando l’analisi del problema è risultato necessario utilizzare:
1) un cristallo al quarzo che svolgesse nel migliore dei modi la funzione di clock per il PIC;
2) due condensatori da porre in parallelo al cristallo secondo lo schema elettrico fornito dai produttori del dispositivo stesso;
3) una resistenza da 10kΩ da inserire in serie tra la tensione di alimentazione ed il pin 1 del PIC;
4) otto resistenze da 330Ω da inserire prima di ciascun led in modo da limitare la corrente nei dispositivi stessi che altrimenti potrebbero bruciarsi e comportarsi come un corto circuito.
Terminata la fase di analisi si è quindi stati in grado di passare alla fase di realizzazione pratica del circuito di FIGURA1 (vedi foglio1) su una breadboard.
• FASE 3:
Terminate le fasi di progettazione e realizzazione, sia software che hardware, si è passati a verificare la corretta funzionalità del circuito e del software realizzati. Per fare ciò si è alimentato il PIC con una tensione pari a 5V. In seguito si è collegato un alimentatore variabile al pin impostato come ingresso analogico (Ra0) in modo da fornire un segnale analogico che variasse nel tempo. Finite le operazioni di collegamento si è fornito al pin impostato come ingresso analogico dieci valori di tensione analogica, riportati in una tabella insieme al corrispondente valore digitale, frutto della conversione, rappresentato in forma binaria attraverso i led (vedi “DATI RILEVATI” in foglio3). Riportati le coppie di valori tensione-dato_digitale su una tabella si è stati in grado di riportare le stesse su di un grafico (vedi “GRAFICO DEI DATI RILEVATI” in foglio3). Congiungendo i punti ottenuti si è ricavata una curva; da un’analisi di quest’ultima emerge che la curva è una retta dimostrando la proporzionalità tra la tensione analogica ed il rispettivo dato digitale
Claudio Fratto Esercitazione N°2 Laboratorio di Sistemi 10-01-2009
1

Esempio