Elaborato silletti rosaria n46937

Transcript

Elaborato silletti rosaria n46937
Facoltà di Ingegneria
Corso di Studi in Ingegneria Informatica
Elaborato finale in Misure per l’Automazione e la Produzione Industriale
Caratterizzazione metrologica secondo lo
standard IEEE 1241 dell’ADC del
PIC18F4620
Anno Accademico 2012/2013
Candidato:
Rosaria Silletti
matr. N46/937
Relatore:
Professore Rosario Schiano Lo Moriello
Indice
Introduzione
4
Capitolo 1. Caratterizzazione dinamica di un convertitore A/D
6
1.1
Caratterizzazione secondo la norma IEEE 1240/2000
1.2
1.2.1
1.2.2
Conversione
Campionamento
Quantizzazione
1.3
1.4
1.5
1.6
1.6.1
1.6.2
1.6.3
1.7
1.8
1.9
MPLAB
Proteus
Elementi di progetto
PIC 18F4620
Memoria
Clock
Porte di ingresso e uscita
Convertitore Analogico/Digitale (ADC)
Liquid Crystal Display (LCD)
Button
Capitolo 2. Acquisizioni temporizzate
2.1
2.1.1
2.2
2.2.1
2.2.2
23
Interrupt
Interrupt Button
Timer
Timer0
Timer1
Capitolo 3. Step by Step
3.1
3.1.1
3.1.2
3.2
3.2.1
3.2.2
3.3
3.4
3.4.1
3.4.2
30
Misurazione di tensione
Scelta del numero di misurazioni
Visualizzazione del numero di misure su display
Valutazione delle soglie reali
Scelta della frequenza di campionamento
Scelta della frequenza del segnale
Valutazione delle soglia compensate
Calcolo degli errori
Errore di non linearità integrale (INL)
Errore di non linearità integrale (DNL)
III
3.4.3
Visualizzazione dei parametri d’errore su display
Capitolo 4. Interazione con l’utente
4.1
4.2
44
Casi d’uso
Simulazione
Conclusioni
Bibliografia
49
IV
Introduzione
Nel seguente lavoro di tesi è stato creato un progetto che realizzi in maniera automatica la
caratterizzazione di un convertitore A/D secondo lo standard IEEE 1241.
Lo schema circuitale è stato realizzato con Proteus, software per la simulazione di
microprocessori.
Le componenti sono state programmate in linguaggio C utilizzando l’ambiente di sviluppo
MPLAB.
Durante la realizzazione del progetto sono stati valutati i parametri propri della
caratterizzazione:
-
Soglie reali
-
Soglie compensate
-
Errori di non linearità integrale e differenziale.
Durante le varie fasi di lavoro, il progetto è stato simulato ed è stato possibile osservare i
parametri calcolati attraverso un display.
5
Capitolo 1
Caratterizzazione metrologica con PIC18F4620
1.1 Caratterizzazione secondo la norma IEEE 1241/2000
Caratterizzare metrologicamente un sistema vuol dire valutare tutte le caratteristiche
proprie di un sistema di misura:
-
definire i limiti entro i quali è possibile effettuare la misura
-
definire gli errori di misurazione
Si vuole trovare la caratteristica del convertitore considerando che in ingresso si ha un
segnale con una certa dinamica. Lo scopo quindi è quello di capire quali sono i limiti da
imporre alle variazioni. Tale studio porta alla valutazione degli errori di non linearità
integrale e differenziale (INL e DNL).
Per una corretta caratterizzazione si deve far riferimento alla norma IEEE 1241/2000.
Questa norma stabilisce per ogni parametro la metodologia di misura, la strumentazione e le
impostazioni da utilizzare per pervenire alla valutazione del parametro stesso. La norma
prevede quindi la caratterizzazione del solo hardware, sul restante processo di misurazione
la norma resta vaga a causa di diverse difficoltà.
La norma prevede che lo scopo finale della caratterizzazione è la valutazione dei parametri
d’ errore per stimare quanto il convertitore reale sia lontano dalle caratteristiche di quello
ideale.
Definito il quanto come il valore associato ad un intervallo di tensione a cui corrisponde un
certo codice, l’obiettivo del progetto è quello di studiare la caratteristica del convertitore
6
A/D, e cioè quantificare di quanto si discosta l’ampiezza di ogni pedata dal suo valore
nominale.
Si impone in ingresso al convertitore una sinusoide pura. Questa scelta è stata maturata dal
fatto che dato un segnale di questo tipo, è facile conoscere la sua pendenza in relazione alla
sua ampiezza.
Campionando il segnale con una frequenza fc è stata ottenuta una caratteristica a gradino,
quindi per un certo numero di volte si è ottenuto un codice, per un altro numero di volte un
altro codice e così via. Per ogni codice dunque si è rilevato un numero diverso di
occorrenze. Questo era prevedibile poiché la sinusoide ha pendenza variabile, dunque:
-
intorno al minimo e al massimo la pendenza varierà di meno e quindi si avrà un
numero di occorrenze maggiore perché in ogni quanto cadranno più campioni.
-
intorno al passaggio per lo zero avrà invece una pendenza massima e quindi avrà un
numero di occorrenze minori in quanto cadranno meno campioni.
Si sfrutta il vantaggio che la pendenza della sinusoide è nota punto per punto quindi
effettuando un confronto tra il numero di occorrenze ideale e quello realmente ottenuto, è
stata fatta una stima sull’errore commesso nel calcolo della pedata.
Sono state effettuate un numero di misurazioni pari a 8192 in modo da garantire che ognuno
dei 1024 codici avesse almeno un occorrenza. Sono stati dunque calcolati gli errori di non
linearità integrale e differenziale (INL e DNL).
1.2 Conversione
Si faccia dapprima una breve panoramica sui concetti base da acquisire per affrontare il
problema della caratterizzazione.
Un segnale analogico è la rappresentazione di una grandezza fisica ed è caratterizzato da
valori continui ed infiniti. I dispositivi che trattano i segnali necessitano però di lavorare su
un numero finito di bit. Nascono dunque elaboratori digitali che convertono il segnale e lo
rendono finito. I sistemi che effettuano questa trasformazione sono detti ADC (Analog to
Digital Converter).
7
Figura 1. 1 a
L’operazione di conversione non è istantanea ma necessita di un tempo di conversione.
Inoltre, affinché le informazioni acquisite siano valide, si necessita che durante il periodo di
conversione, il segnale rimanga costante.
Durante la fase di campionamento si rilevano un certo numero di valori del segnale, i
campioni. Si definisce tempo di campionamento l’intervallo che intercorre tra il
prelevamento di un campione e il successivo; esso è generalmente costante. Il reciproco del
tempo di campionamento è la frequenza di campionamento. Essa deve essere individuata
rispettando la Diseguaglianza di Nyquist:
fc >= 2fs
dove:
-
fc: frequenza di campionamento.
-
fs: frequenza del segnale di ingresso.
Per convertire un segnale da analogico a digitale bisogna discretizzare l’asse delle tensioni e
dei tempi.
Si divide l’asse delle tensioni in N intervalli
(con N il numero dei bit del convertitore) e
ad ognuno di essi si associa un codice. In
questo modo si genera una funzione
biunivoca tra codice e quanto.
Figura 1.1 b
Si definisce quanto il valore dell’intervallo a cui corrisponde un certo codice.
8
La caratteristica ideale prevede che i quanti abbiano tutti la stessa ampiezza.
La conversione prevede due fasi fondamentali: campionamento e quantizzazione.
1.2.1 Campionamento
Campionare un segnale vuol dire renderlo discreto nel dominio del tempo, prendere cioè
solo alcuni dei suoi campioni ad intervalli regolari.
Durante la fase di campionamento può accadere che due segnali analogici diversi possano
diventare indistinguibili una volta campionati, tale fenomeno è detto aliasing. E’ necessario
dunque rispettare il Teorema del Campionamento: un segnale di banda limitata B Hz sarà
perfettamente ricostruito se i suoi campioni sono presi con una frequenza di almeno 2B Hz.
Figura 1.1 c
1.2.2 Quantizzazione
La quantizzazione garantisce che il segnale, un insieme di infiniti punti, sia rappresentato
attraverso un numero finito di valori di codominio discreti. Questa operazione determina un
errore irreversibile detto errore di quantizzazione che non permette di ricostruire il segnale
originale.
Figura 1.1 d
1.3 MPLAB
MPLAB è un ambiente di sviluppo integrato. Permette di creare progetti per i PIC in
9
linguaggio C o assembler. L’ambiente comprende i diversi strumenti di sviluppo quali
programmatore, emulatore e debug sia hardware che software. Questo porta il grosso
vantaggio che i tempi di sviluppo sono notevolmente ridotti.
1.4 Proteus Professional 7
Per realizzare lo schema del progetto ho utilizzato Proteus ISIS 7 Professional.
E’ un software considerato una soluzione completa per la progettazione elettronica in
quanto permette di realizzare schemi circuitali perfetti.
1.5 Elementi di progetto
Per realizzare il progetto ho utilizzato diverse componenti che mi hanno permesso di
osservare e debuggare dinamicamente il lavoro in tutte le sue fasi:
Lo schema realizzato:
Vediamo nel dettaglio ciascuna componente:
10
Figura 1.5 a
-
Il microcontrollore PIC18F4620. Scelta motivata dal fatto che questo dispositivo è
conforme con il progetto da realizzare.
-
Un generatore di segnale attraverso il quale ho generato una sinusoide pura che ha
ampiezza di 5V regolata da un potenziometro, tensione di offset di 2,5V e frequenza
fs = 2,498779 KHz.
-
Il convertitore A/D che ha generato un segnale di banda limitata. Collegato al pic
tramite il registro RA.
-
L’lcd per la visualizzazione dei risultati. Collegato al pic attraverso due registri: RC
per lo scambio di comandi e RD per lo scambio di dati.
-
Un oscilloscopio per osservare dinamicamente l’andamento del segnale.
-
Tre bottoni:
o START, per dare inizio alla conversione
o SU/GIU’, per scorrere i parametri valutati
1.6 PIC18F4620
Un microcontrollore è un dispositivo elettronico che opportunamente programmato è in
grado di svolgere diverse funzioni in maniera autonoma. In particolar modo gestisce delle
linee di input e output legate al programma implementato in un’apposita area di memoria ed
eseguito ciclicamente.
Al suo interno ci sono diverse migliaia di componenti elettronici elementari. Le tecnologie
odierne utilizzano generalmente transistori CMOS. I PIC hanno una propria ROM, una
RAM e memoria di massa. Tali dispositivi dunque potrebbero essere paragonati alle CPU,
tuttavia presentano capacità di calcolo limitate rispetto ad esse.
I vantaggi dell’utilizzo di tali dispositivi sono il basso costo, la facile programmazione e il
ridotto assorbimento di energia. Si tratta in effetti di sistemi ‘embedded’, sistemi integrati
costruiti ad hoc per una determinata applicazione, in cui l’hardware è ridotto al minimo.
1.6.1 Memoria
Il PIC 18F4620 dispone di due memorie:
-
Program Memory
11
-
Data Memory
La prima è una memoria di tipo flash, molto veloce, dedicata alla memorizzazione dei
programmi. I programmi restano memorizzati anche quando il PIC non è alimentato.
Ogni cella di questa memoria ha capacità di 1 byte. In totale la memoria di programma è di
65536 byte, dunque in media possono essere scritte 25000 istruzioni.
La seconda invece è una memoria RAM (Random Access Memory) statica e volatile,
dedicata alla memorizzazione di variabili e dati. E’ possibile indirizzare fino a 4096
locazioni di memoria.
1.6.2 Clock
Il PIC per funzionare necessita di un clock interno generato da un oscillatore. Tuttavia vi è
anche la possibilità di realizzare un clock esterno. La circuiteria che permette di realizzarli
può essere più o meno complessa.
Per eseguire un’istruzione, il PIC necessita di quattro colpi di clock. Questa operazione
viene fatta dividendo per quattro il clock ricevuto dall’oscillatore esterno.
1.6.3 Porte di ingresso e uscita
Il PIC presenta diversi pin che possono essere settati come ingresso o uscita. Essi sono
divisi in gruppi da otto. Osserviamo i seguenti gruppi: PORTA, PORTB, PORTC, PORTD
e PORTE (il quale è l’unico ad avere soli quattro pin). I rispettivi pin sono indicati con RA,
RB, RC, RD ed RE, seguiti da un numero seriale che va da 0 a 7.
Ad ogni porta sono associati due registri da otto bit: TRIS, PORT.
Il primo serve ad impostare la direzione del pin: vale 1 se è di ingresso, 0 se è d’uscita.
Il secondo serve a scrivere un valore in uscita.
1.7 Convertitore Analogico/Digitale (ADC)
Per convertire un segnale da analogico a digitale ho utilizzato l’ADC programmabile
attraverso i registri del PIC. Il PIC preso in considerazione presenta un convertitore SAR a
12
10 bit. La tensione che si può leggere oscilla da 0V a 5V, dunque questo modulo converte la
tensione in un numero che va da 0 a 1023.
Per configurare il dispositivo di conversione è stata realizzata la funzione di sotto. In
particolar modo sono stati settati tre registri:
-
ADCON0, per controllare l’operazione dell’ADC. Permette inoltre di scegliere il
canale da utilizzare per la conversione.
-
ADCON1, per configurare la tensione dei pin dedicati al modulo.
-
ADCON2, per configurare la sorgente di clock e il tempo di acquisizione
dove:
-
reg1 = 0x01;
-
reg2 = 0x0E;
-
reg3 = 0x8D;
In particolare ho settato:

bit 7-6: indeterminati.

bit 5-2: CHS3-CHS0 = 0000, indicano il numero del canale ovvero il piedino
del pic nel registro RA a cui l’lcd è collegato. In questo caso AN0.

bit 1: GO/DONE = 0, indica che l’adc si trova nello stato idle.

bit 0: ADON = 1, indica che il modulo di conversione A/D è abilitato.
13
In particolare ho settato:

bit 7-6: indeterminati.

bit 5: VCFG1 = 0, per impostare la tensione di riferimento positiva VSS = 5V

bit 4: VCFG0 = 0, per impostare la tensione di riferimento negativa
VDD = -5V.

bit 3-0: PCFG3-PCFG0 = 1110, per impostare i piedini del pic AN12-AN1
digitali e il piedino AN0 analogico. Quest’ultimo infatti deve essere collegato
all’ADC.
In particolare ho settato:

bit 7: ADFM = 1, per shiftare il risultato a destra.

bit 6: indeterminato.

bit 5-3: ACQT2-ACQT0 = 001, per selezionare un’acquisizione temporizzata
a 6 TAD.

bit 2-0: ADCS2- ADCS0 = 101, per selezionare un clock di conversione pari a
Fosc/16.
14
1.8 Liquid Crystal Display (LCD)
Per verificare dinamicamente i risultati di misurazione ottenuti, è stato utilizzato un
lcd sotto il controllo di un microprocessore a 4 bit. Per un corretto funzionamento è
stato configurato il dispositivo passo dopo passo secondo il seguente diagramma:
Per facilitare il lavoro di scrittura del codice sono stati
rinominati alcuni pin del pic e dell’lcd:
Figura 1.8
Per configurare l’lcd è stata implementata la funzione inizializzaLCD() che segue il
diagramma cui sopra.
-
Si imposta alto il valore di RC0 in quanto ad esso è legata l’alimentazione del
15
display.
-
Si attendono i millisecondi necessari.
-
Si definisce l’istruzione successiva come un comando settando il pin RC1 a 0.
-
Si scrive sull’lcd secondo la procedura.
16
La procedura di inizializzazione consta di due fasi in cui bisogna settare i registri RC e RD
del pic. In particolare è stata usata la configurazione a 4 bit. Siccome il dato è caratterizzato
da una lunghezza di 8 bit, per scrivere nel registro RD è stato necessario inviare l’istruzione
scindendo la parte alta dalla parte bassa. Dopo ogni invio è stata necessaria l’abilitazione.
Infatti in ogni istruzione in cui si voglia scrivere un dato di 8 bit in DATA, è stato scritta la
prima parte (alta), si è abilitato il pin RC3 e poi si è scritta la seconda parte (bassa).
Si osservino nel dettaglio le due fasi:
-
La fase di attivazione in cui:
o Si imposta RC0 = 1, per accendere il display.
o Si setta RC1 = 0, per indicare che le azioni successive saranno comandi.
o Si scrive nel registro PORTD secondo la procedura e si abilita il pin RC3.
-
La fase di impostazione in cui si eseguono particolari funzioni. Le si osservino nel
dettaglio:
- Function set:
DATA = 00101000, in particolare:
-

bit 4: DL = 0, per impostare il display a 4 bit.

bit 3: N = 1, per attivare entrambe le linee dell’lcd.

bit 2: F = 0, per impostare la modalità 5*8 dots.
Display Off:
17
DATA = 00001000, in particolare:

bit 2: D = 1, per spegnere il display.

bit 1: C = 0, per spegnere il cursore.

bit 0: B = 0, per disattivare il lampeggio del cursore.
- Clear Display:
Questa funzione pulisce l’intero display e imposta l’indirizzo0 DDRAM
nell’indirizzo del contatore.
- Entry Mode Set: operazione eseguita durante la scrittura dei dati
DATA = 00000110, in particolare:

bit 1: I/D = 1, per impostare lo shift del cursore ad incremento.

bit 0: S = 0, per seguire lo shift del display.
18
- Display On:
DATA = 00001111, in particolare:

bit 2: D = 1, per accendere il display.

bit 1: C = 0, per accendere il cursore.

bit 0: B = 0, per accendere il lampeggio del cursore.
Per scrivere sul display invece sono state implementate due funzioni che permettono di
scrivere nel registro del pic PORTD ( rinominato DATA nel file del progetto ‘define.h’):
Dunque per scrivere sul display:
-
Si specifica che l’ istruzione successiva è un dato impostando a 1 RC1 di PORTC.
-
Si da la direttiva di scrittura impostando RC2 di PORTC a 0.
-
Si scrive il carattere in due tempi data la natura del display a 4 bit.
19
1.9 Button
Per un’esecuzione facilitata del progetto da parte di un eventuale utente, si è ritenuto
necessario l’utilizzo di tre bottoni:
-
Un bottone per dare la possibilità all’utente di iniziare la caratterizzazione.
-
Due bottoni da utilizzare a fine caratterizzazione per permettere di scorrere sul display
i parametri di progetto e i risultati ottenuti.
I pin a cui ho collegato i bottoni sono stati definiti come input:
Il primo bottone è stato collegato al PIC tramite il pin RB2. Il suo funzionamento è
scandito dalla seguente istruzione della funzione main:
Il while garantisce che fino a quando non venga premuto il bottone, si rimanga in una
condizione d’attesa e solo quando avviene la pressione, si dà inizio alla caratterizzazione.
Gli altri due bottoni sono stati gestiti tramite le interrupt (la cui spiegazione è rimandata ai
capitoli successivi).
Il loro funzionamento è scandito dalla seguente istruzione della funzione main:
20
Il primo while garantisce che dopo la fine di una caratterizzazione si può dare avvio ad
un’altra. Le istruzioni successive controllano la pressione e il rilascio dei due bottoni.
Per realizzare lo scorrimento su display di quattro righe di interesse, è stata opportunamente
inizializzata una matrice di 4 righe e 16 colonne (massimo numero di colonne dell’lcd) con i
valori da far apparire sul display.
Per permettere una corretta visualizzazione su display sono state implementate le seguenti
istruzioni per il riempimento della matrice:
Sono dunque state implementate due funzioni di scorrimento:
21
E’ stato dichiarato un
puntatore per lo
scorrimento della matrice.
Tale funzione effettua un controllo sul puntatore, in seguito decrementandolo, permette di
scorrere le righe della matrice.
Tale funzione effettua dapprima un controllo su un altro puntatore, ptr1. Se esso risulta
uguale a zero, ovvero punta alla prima riga della colonna, allora viene visualizzata la prima
riga. Se non fosse stata implementato questo controllo non ci sarebbe stata la possibilità di
far comparire la prima riga, ma sarebbe apparsa direttamente la seconda.
22
Capitolo 2
Acquisizioni temporizzate
Una conversione A/D può essere avviata da un evento speciale detto trigger. In particolare
le acquisizioni temporizzate fanno uso della periferica Capture/Compare/PWM. Grazie a
questa periferica il timer interno può essere utilizzato per:
o Misurare la durata di un evento (Capture).
o Confrontare la durata di un evento con un valore di un intervallo temporale
specificato (Compare).
o Generare un segnale con PMW (Pulse Width-Modulation) ovvero una
modulazione digitale che permette di ottenere una tensione media variabile
dipendente dal rapporto tra la durata dell’impulso positivo e quello negativo.
In modalità Compare si può utilizzare lo Special Event Trigger, un trigger generato in
hardware nel momento in cui il confronto ha successo e può essere utilizzato per avviare
un’operazione.
In particolare è stato configurato lo Special Event Trigger di CCP2 che funziona nel
seguente modo: quando il timer interno al dispositivo raggiunge il valore presente nel
registro CCPR2, viene avviata in maniera automatica la conversione con il modulo ADC, a
patto ovviamente che questi sia acceso, settando a 1 il bit GO/DONE di tale periferica.
Inoltre il timer viene resettato a 0 sempre per via automatica, eliminando l'overhead
software necessario per resettare il timer al valore massimo meno il numero di colpi di
clock da aspettare. La fine della conversione viene attesa tramite interrupt.
23
2.1 Interrupt
Il PIC è dotato di due aree di memoria dedicate alle interrupt:
-
Interrupt ad alta priorità, memorizzate a partire dalla locazione di memoria 0x08.
-
Interrupt a bassa priorità, memorizzate a partire dalla locazione di memoria 0x18.
Per effettuare una misurazione di tensione tramite acquisizioni temporizzate ci si è serviti
delle interrupt ad alta priorità e di alcuni particolari timer forniti dal PIC 18F4620.
Nella funzione main() sono state abilitate alcune periferiche di interrupt:
Sono stati settati i seguenti registri:
-
CCP2CON per attivare la modalità Compare Mode ed Event Trigger sopra spiegate;
-
CCPR2H impostato al valore tCampus = 2000, microsecondi che si vogliono
attendere, e shiftato a destra nei bit alti del registro.
-
CCPR2L impostato allo stesso valore tCampus ma shiftato a sinistra nei bit bassi del
registro.
In un ciclo while sono stati impostati i valori di alcuni registri:
24
Nel registro:
E’ stato necessario settare soltanto il bit 6: ADIE = 1, per abilitare le interrupt della
conversione A/D.
E’ stata realizzata la gestione delle interrupt con le seguenti funzioni:
-
Sono state dunque dichiarate le variabili esterne result e misuraReady in modo che
fossero visibili anche nella funzione main.
-
#pragma è una direttiva al compilatore, dice cioè al compilatore di fare qualcosa. Nel
primo caso specifica che il codice sottostante sarà riportato all’indirizzo 0x08 dell’area
di memoria delle interrupt (alta priorità). Nel secondo caso definisce che la funzione
ad essa soggiacente è un’interrupt.
-
Nella funzione High_Int_ADC() :
o È stato disabilito per default il bit ADIF;
o E’ stato acquisito il risultato di tensione dal registro ADRESH(registro alto)
shiftato a destra e dal registro ADRESL(registro basso);
25
o E’ stata settata ad uno la variabile esterna misuraReady che indica che la
misurazione è pronta.
Il valore alto di misuraReady viene utilizzato nella funzione main per memorizzare il valore
in un vettore. In caso contrario, il programma rimane in uno stato di idle tramite un ciclo
while.
2.1.1 Interrupt Button
Per gestire lo scorrimento dei parametri su display sono stati configurati due bottoni gestiti
tramite una funzione di interrupt a bassa priorità.
Sono stati dunque settati i bit dei registri INTCON e INTCON3 relativi alla gestione delle
interrupt rispettivamente sul pin RB0 e RB1.
2.2 Timer
Il funzionamento del timer avviene tramite un contatore che conta un certo numero di colpi
di clock. In particolare il PIC incrementa un registro per ogni colpo di clock
indipendentemente dal programma in esecuzione. Quando il registro va in overflow il
dispositivo lo azzera e setta alto il valore di un flag presente in un altro registro.
Il PIC preso in considerazione si avvale di quattro timer TIMER0, TIMER1, TIMER2,
TIMER3. Per l’elaborato corrente sono stati utilizzati due:
-
La configurazione dell’lcd è stata gestita tramite Timer0.
-
Le interrupt sono state gestite tramite Timer1.
26
2.2.1 Timer0
Timer0 è stato impiegato per scandire il funzionamento dell’lcd. Questo dispositivo infatti
necessita di una particolare procedura in cui sono specificati i tempi di attesa tra
un’operazione e l’altra. Si tratta di un timer ad overflow cioè l’operazione scatterà quando il
contatore raggiungerà il valore massimo.
E’ stato innanzitutto configurato il timer con la seguente funzione:
E’ stato dunque settato il registro:
In particolare:

bit 7: TMR0ON = 0, bit di controllo per avviare o stoppare il timer. Settato a 0
per default.

bit 6: T08BIT = 0, per configurare il timer a 16 bit.

bit 5: T0CS = 0, per impostare un clock interno al sistema che funge da
sorgente.

bit 4: T0SE = 0, per specificare che il clock deve incrementarsi alle transizioni
basso-alto.

bit 3: PSA = 1, si specifica che non si fa uso di prescaler (un contatore
elettronico utilizzato per ridurre segnali in alta frequenza in segnali a frequenza
minore tramite una divisione tra interi).

bit 2-0: T0PS2-T0PS0 = 000, per settare il valore del prescaler.
27
Sono inoltre state necessarie due funzioni che garantissero un’attesa di alcuni millisecondi o
microsecondi, in base ai tempi specificati nel diagramma mostrato nel capitolo precedente
(Figura 1.8):
-
E’ stata inizializzata la variabile appoggio ad un valore 0xFFFF meno il tempo di cui
si necessita per fare in modo che il timer vada in overflow. In questo modo si ottiene
che il timer va in overflow giusto allo scadere del conteggio.
-
E’ stato quindi scritto il valore della variabile nei registri del timer, TMR0H e TMR0L,
registri di conteggio a 8 bit.
-
E’ stato abilitato il timer attraverso il bit TMR0ON.
-
C’è un controllo sul bit TMR0IF: quando sarà alto il registro delle interrupt sarà
andato in overflow, allora il timer sarà abilitato.
2.2.2 Timer1
Timer1 è stato utilizzato per acquisire le misurazioni di tensione.
Il timer è stato configurato con la seguente funzione:
con la variabile conf = 0x80;
dunque è stato settato il registro:
28
In particolare:

bit 7: RD16 = 1, per impostare il timer a 16 bit.

bit 6: T1RUN = 0, per indicare che il clock deriva da un’altra sorgente e non
dall’oscillatore del Timer1.

bit 5-4: T1CKPS1- T1CKPS0 = 00, si specifica che non si usa il prescaler.

bit 3: T1OSCEN = 0, per spegnere l’oscillatore del timer.

bit 2: T1SYNC = 0, bit ignorato.

bit 1: TMR1CS = 0, per impostare l’utilizzo di un clock interno.

bit 0: TMR1ON = 0, di default, disabilita Timer1.
Nella funzione main:
-
Sono stati inizializzati i registri di Timer1: TMR1H e TMR1L.
-
Sono stati abilitati i timer.
-
Sono state acquisite le tensioni.
-
Dopo l’acquisizione sono state disabilitate le interruzioni del convertitore A/D.
-
E’ stato disabilitato Timer1.
29
Capitolo 3
Step by Step
Obiettivo del lavoro è la caratterizzazione dinamica del convertitore A/D reale e verificare
quanto i risultati sono lontani dall’idealità. Durante il corso del progetto, attraverso
l’implementazione di diverse funzioni, sono stati valutati diversi parametri, in particolare:
-
Sono state effettuate misurazioni di tensione della sinusoide in ingresso.
-
Sono state individuate le soglie reali.
-
Sono state valutate le soglie compensate.
-
Sono stati calcolati gli errori.
E’ stata innanzitutto creata la funzione main in cui sono state inizializzate le porte del PIC e
gli stati dei pin (ingresso/uscita):
30
Sono state impostate di default le porte a 0 e i pin in stato di uscita a meno dei pin RB0 e
RB1, destinati alla gestione dei bottoni e dunque utilizzati come ingresso.
3.1 Misurazione di tensione
Si parte da due ipotesi:
-
Un numero di periodi di osservazione intero.
-
Frequenza del segnale e frequenza di campionamento coprimi.
Imposta una sinusoide pura in ingresso, è stata misurata la tensione per un numero di volte
pari ad nMisure:
Il vettore OccorTk[] ha dimensione nCodici = 1024. In questo passo del programma, con
esso si rappresenta il numero delle occorrenze di ogni codice, più avanti si rappresenterà
invece il valore delle soglie, di qui la scelta del nome (non è stato possibile creare due o più
vettori a causa della memoria limitata dell’ambiente di sviluppo, è stato quindi necessario,
nel corso del progetto, sovrascrivere nel medesimo vettore).
OccorTk[] è stato costruito in modo tale che l’indice che permette di scorrerlo rappresenti
proprio il valore in tensione misurato, quindi tutti i risultati vanno ad incrementare l’indice
corrispondente. Alla fine del ciclo, il risultato che si ottiene in ogni cella del vettore è
proprio il numero di occorrenze relativo a quel dato codice.
Esportando il vettore in Excel si è ottenuto l’Istogramma delle Occorrenze:
31
Figura 3.1
Come ci si poteva aspettare, si è avuto un maggior numero di occorrenze agli estremi, dove
cioè la pendenza della sinusoide è minima e un numero minore di occorrenze laddove la
pendenza è notevole.
3.1.1 Scelta del numero di misure
Il numero di misurazioni da effettuare deve essere tale da garantire che ogni codice abbia
almeno un’occorrenza. Sono dunque stati definiti:
Considerando che è stato utilizzato un convertitore a Nb bit (con Nb = 10), è stato calcolato
il numero di campioni da acquisire:
Np = π*2Nb = π*210 = 3216
In generale si ha:
fs/fc = Np/N = Npp
dove:
o Np: numero di campioni per periodo
o N: numero di periodi
o Npp: numero di punti per periodo
32
Ricordando le ipotesi precedenti, a partire da Np, si deve scegliere un N tale che i due valori
siano coprimi tra loro, ovvero non devono avere fattori in comune. Un valore opportuno
può essere dunque N = 4096.
Per essere sicuri che ogni codice abbia almeno un occorrenza si è scelto:
nMisure = N*2 = 8192
3.1.2 Visualizzazione dei parametri d’errore sul display
Per visualizzare sul display i parametri valutati è necessario richiamare la funzione
scriviStringa() illustrata nei capitoli precedenti. Si ricorda però che tale funzione riceve in
ingresso un parametro di tipo char. E’ stato dunque necessario implementare una funzione
che trasformasse i valori interi in stringhe:
-
Come parametri di ingresso si osservano: codice, il valore da trasformare e stringa,
la variabile d’appoggio.
-
Si dichiara una variabile divisore = 1000 perché il numero che si vuole convertire è
composto da 4 cifre.
-
Con la prima interazione del ciclo si valuta la prima cifra di codice, la si converte e la
si memorizza nella variabile stringa, con la seconda interazione si memorizza la
seconda cifra e così via.
33
3.2 Valutazione delle soglie reali
Per caratterizzare il segnale è stato diviso l’asse delle tensioni in intervalli e ad ogni valore è
stato assegnato un codice (Figura 1.1). Ogni intervallo è definito quanto (soglia o pedata).
Nella pratica questa operazione porta una serie di problematiche e motivi di incertezza.
Idealmente infatti la soglia dovrebbe essere costante per ogni codice. Nella realtà non è
così.
Per tracciare la caratteristica del convertitore è stato dunque necessario individuare le
soglie. Per identificarle si ricorda che idealmente la soglia è definita come quel valore di
tensione che separa due codici e cioè una V’ tale che a V’-Δ è associato il codice i e a V’+Δ
è associato il codice i+1. Dunque per un valore di tensione V=V’ si ha un’indeterminazione.
Per calcolare il valore delle soglie reali è stato individuato un algoritmo che implementi la
seguente formula:
Tk-1 = FS - ( FS*cos( (π/Nc) * Hc(k-1) ) )
dove:
-
Tk-1: soglia calcolata tra il codice k e k-1.
-
FS: valore di fondo scala (2500).
-
Nc: numero di campioni acquisiti tra l’istante 0 e T/2 (nCampioni = 8192).
-
Hc(k-1): istogramma cumulativo, dato dalla sommatoria di tutti i precedenti H(k).
E stata dunque implementata la seguente funzione:
34
-
La variabile sommaIst rappresenta il valore dell’istogramma cumulativo e ad ogni
ciclo sarà data dalla somma dei precedenti.
-
Si moltiplica per 10 per avere una risoluzione più fine.
Riportando su un grafico i valori ottenuti:
Tk reali
Codice
60000
50000
40000
30000
20000
10000
1
39
77
115
153
191
229
267
305
343
381
419
457
495
533
571
609
647
685
723
761
799
837
875
913
951
989
0
Tk
3.2.1 Scelta della frequenza di campionamento
Per una realizzazione ottimale del progetto preso in esame sono stati scelti i seguenti
parametri:
-
frequenza di campionamento:
fc = 100 Khz
-
frequenza di clock:
fck = 20 Mhz
istruzione ottenuta tramite la direttiva:
3.2.2 Scelta della frequenza del segnale
E’ stata scelta una frequenza del segnale tale da garantire che i campioni acquisiti siano
35
diversi tra loro. Dunque:
fs = (Np/N)fc = (2047/4096)*5000 = 2498,779 KHz
3.3 Valutazione delle soglie compensate
Se si ipotizza di valutare la caratteristica di un convertitore ideale, l’unione dei centri di
tutte le pedate genererà una retta con una pendenza di 45° e passante per l’origine.
L’interpolazione delle soglie reali invece genererà una retta non passante per l’origine e con
una certa pendenza diversa da quella ideale.
Per valutare le soglie reali è stato dunque implementato un algoritmo basato sulla formula
dello Scarto quadratico medio:
Ε = Σ1N ( Tkr – ( a*Tki + b ) )2
(3.3)
L’obiettivo è quello di trovare i coefficienti ‘a’ e ‘b’ in modo da calcolare le soglie ideali a
partire da quelle reali. Si consideri l’equazione di una generica retta:
y = ax + b
‘a’ e ‘b’ sono i valori per cui lo scarto quadratico medio tra i punti di Tkr e Tki è minimo.
Ovvero la retta interpolante che si considera è quella che minimizza lo scarto tra i valori
reali e quelli ideali. Trovata la retta, la pendenza ‘a’ sarà l’errore di guadagno, ‘b’ sarà
l’errore di offset. Noti dunque ‘a’ e ‘b’ si trasla la retta interpolante facendo in modo da
farla passare per l’origine e farla avere pendenza unitaria. Bisogna quindi sottrarre il valore
‘b’ ad ogni Tk e dividere per ‘a’. In questo modo si trovano i Tk reali compensati: Tkc.
I Tkc sono dunque le soglie reali prive di errore di offset e di errore di guadagno.
Per risolvere la formula 3.3 bisogna fare le derivate rispetto ad ‘a’ e rispetto a ‘b’ e porle
rispettivamente a zero. Per risolvere l’equazione bisogna mettere a sistema le due equazioni
individuando quattro fattori principali:
-
a11 = Σ1N Tki2
(fatt1)
-
a12 = Σ1N Tki
(fatt2)
36
-
c1 = Σ1N (Tki* Tkr)
(fatt3)
-
c2 = Σ1N Tkr
(fatt4)
considerando che la soglia ideale è Tki = 48.828 mV, si valuta la soglia compensata con il
seguente algoritmo:
Il determinante della funzione precedente è stato valutato con il seguente algoritmo :
37
3.4 Calcolo degli errori
Una volta valutate le soglie reali bisogna stimare di quanto queste si discostino da quelle
ideali, bisogna dunque calcolare gli errori.
Si possono avere tre generi di errori:
-
Errore di guadagno
-
Errore di offset
-
Errore di non linearità
L’errore di guadagno si verifica quando le pedate sono tutte uguali tra loro ma si discostano
dal valore delle pedate nominali.
L’errore di offset invece si ha quando la caratteristica ideale è traslata a destra o a sinistra.
Entrambi gli errori non generano errori di non linearità quindi le pedate saranno in ogni
caso tutte uguali tra loro.
L’errore di non linearità comporta che le larghezze delle pedate saranno tra loro differenti.
In particolare si possono avere due tipi di errori dovuti alla non linearità: errore di non
linearità integrale INL ed errore di non linearità differenziale DNL.
3.4.1 Errore di non linearità integrale (INL)
L’INL si calcola quando si è interessati a caratterizzare il convertitore in tutto il suo range
di funzionamento. La non linearità integrale è data dal fatto che una certa soglia si discosta
da quella reale a causa del fatto che le altre soglie compensate precedenti differiscono da
quella ideale.
Il calcolo dell’INL è stato effettuato con un algoritmo che implementa la seguente formula:
INL(k) = ( ( Tkc – Tki ) / FS) * 100
dove:
-
FS è il valore di fondo scala.
-
Tki è la soglia del convertitore ideale tra il codice k e il codice k+1.
-
Tkc è la soglia di transizione compensata del convertitore in prova tra il codice k e k+1.
38
In realtà quello che deve essere valutato è il worst case:
INL = max( INL(k) )
Dunque l’algoritmo implementato:
-
Nel calcolo di erroreInt si è diviso per 48.828 ovvero il valore del quanto ideale.
Questo per avere una misurazione in LSB (Leatest Significant Bit).
-
La funzione memorizza il massimo INL e ritorna il valore dell’indice della posizione
ad esso corrispondente.
E’ stato ottenuto il seguente grafico:
INL
Codice
39
3.4.2 Errore di non linearità differenziale (DNL)
Il DNL si valuta quando si è interessati a caratterizzare il convertitore nell’intorno di una
tensione di funzionamento differenziale.
La non linearità differenziale è una misura di quanto la larghezza effettiva di ogni gradino
dell’ADC si discosta da suo valore ideale. Questo è uno dei parametri più interessanti che
può essere valutato con il test degli istogrammi. In particolare abbiamo che se una certa
pedata è più grande di quella ideale allora il codice corrispondente avrà un numero
maggiore di occorrenze rispetto a quello stimato. Viceversa se il valore della pedata è più
piccolo di quello ideale, allora il numero di occorrenze sarà minore rispetto a quello atteso.
Per calcolare l’errore di non linearità differenziale è necessario conoscere precisamente
l’ampiezza della sinusoide in ingresso, infatti se il segnale in ingresso al convertitore
dovesse risultare attenuato, l’errore considerato sarà calcolato per eccesso.
Il calcolo del DNL è stato fatto con un algoritmo che implementa la seguente formula:
DNL(k) = ( ( Tk+1 – Tk ) – Q) / Q
dove:
-
Q è il valore nominale del quanto.
-
Tk+1 è la soglia di transizione tra il codice k e il codice k+1.
-
Tk è la soglia di transizione tra il codice K-1 e il codice K.
In realtà quello che deve essere valutato è il worst case:
DNL = max( DNL(k) )
Dunque l’algoritmo implementato:
40
-
Nel calcolo di erroreDiff si è diviso per 48.828 ovvero il valore del quanto ideale.
Questo per avere una misurazione in LSB (Leatest Significant Bit).
-
La funzione memorizza il massimo DNL e ritorna il valore dell’indice della posizione
ad esso corrispondente.
E’ stato ottenuto il seguente grafico:
DNL
Codici
E’ stato dunque ottenuto il classico andamento del DNL caratterizzato da due picchi agli
estremi. In questo caso quindi il massimo è stato raggiunto all’inizio e alla fine della
41
misurazione.
3.4.3 Visualizzazione dei parametri d’errore sul display
Per visualizzare sul display i parametri valutati e necessario richiamare la funzione
scriviStringa() illustrata nei capitoli precedenti. Si ricorda però che tale funzione riceve in
ingresso un parametro di tipo char. E’ stato dunque necessario implementare una funzione
che trasformasse i valori decimali in stringhe:
42
I parametri di ingresso sono: un valore d’appoggio in cui sarà memorizzato il risultato, il
numero di cifre intere, il numero di cifre decimali, il valore che voglio convertire.
-
Il primo ciclo for serve ad impostare il numero di cifre del parametro divisore che sarà
utilizzato nella conversione della parte decimale.
-
Ci si salva nella variabile decimale le sole cifre decimali.
-
Il secondo ciclo for serve ad impostare il numero di cifre del parametro divisore che
sarà utilizzato nella conversione della parte intera.
-
Si convertono parte intera e parte decimale distanziate opportunamente dal carattere
‘,’.
-
Si termina il riempimento della stringa con il carattere tappo ‘0’.
43
Capitolo 4
Interazione con l’utente
L’utente ha la possibilità di avviare la simulazione e di osservare i risultati ottenuti tramite
tre pulsanti.
4.1 Casi d’uso
Si riporta in seguito un esempio di caso d’uso che descrive l’interazione tra utente e
sistema.
44
-
L’utente da avvio alla caratterizzazione attraverso il pulsante START:
-
A fine misurazione può invece rivedere i parametri valutati attraverso i bottoni
SU/GIU’:
4.2 Simulazione
Viene riportato di sotto un esempio di simulazione del progetto da parte di un utente.
Inizialmente compariranno sul display:
-
Messaggio di benvenuto
45
-
Titolo del progetto
-
Dispositivo e autore
-
Istruzioni
46
-
Fine simulazione
47
-
Messaggio di saluto
48
Conclusioni
La caratterizzazione metrologica secondo lo standard IEEE 1241 dell’adc del PIC 18F4620
è stata condotta nel dominio della frequenza mediante analisi dinamica.
E’ stato dapprima valutato il numero delle occorrenze per ogni codice. Esportando i
risultati ottenuti in excel, si è ricavato l’istogramma cumulativo delle occorrenze dal quale è
evidente osservare che laddove la pendenza della sinusoide è maggiore, si è ottenuto un
numero di occorrenze minori.
Sono stati implementati alcuni algoritmi attraverso cui si è valutato il valore delle soglie
reali Tkr del convertitore. Successivamente, attraverso la formula dello scarto quadratico
medio si sono valutati i valori delle soglie compensate Tkc, cioè i valori delle soglie reali
privi di errori di offset e di guadagno. Dunque tutto ciò che ora distingue i Tki dai Tkr è dato
dagli errori di non linearità, ovvero l’interpolazione non genererà rette coincidenti.
Ho valutato dunque gli errori di non linearità integrale e differenziale (INL e DNL).
Esportando in excel i valori ottenuti è evidente che, come ci si aspettava, il massimo viene
raggiunto agli estremi dell’intervallo di misurazione.
Sviluppi futuri
In futuro si prospetta di realizzare il progetto attraverso dispositivi fisici.
49
Bibliografia
•
MPLAB® IDE User’s Guide
MICROCHIP@, http://www.microchip.com
•
MPLAB® C18 Compiler User’s Guide MICROCHIP@, http://www.microchip.com
•
C18 Step by step
Mauro Laurenti ©2009, http://www.laurtec.it
•
PIC18F2525/2620/4525/4620 Data Sheet
MICROCHIP@, http://www.microchip.com
•
PICDEM2 Plus Demostration Board User’s Guide
MICROCHIP@, http://www.microchip.com
•
HITACHI HD44780U Dot Matrix Liquid Crystal Display Controller/Driver Data
Sheet http://hitachi.com
50