Caratterizzazione metrologica secondo lo standard IEEE ... · Lo schema circuitale è stato ... Per...

50
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 Relatore: Professore Rosario Schiano Lo Moriello Candidato: Rosaria Silletti matr. N46/937

Transcript of Caratterizzazione metrologica secondo lo standard IEEE ... · Lo schema circuitale è stato ... Per...

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

Relatore: Professore Rosario Schiano Lo Moriello

Candidato: Rosaria Silletti matr. N46/937

III

Indice

Introduzione 4

Capitolo 1. Caratterizzazione dinamica di un convertitore A/D 6

1.1 Caratterizzazione secondo la norma IEEE 1240/2000

1.2 Conversione

1.2.1 Campionamento

1.2.2 Quantizzazione

1.3 MPLAB

1.4 Proteus

1.5 Elementi di progetto 1.6 PIC 18F4620 1.6.1 Memoria

1.6.2 Clock

1.6.3 Porte di ingresso e uscita

1.7 Convertitore Analogico/Digitale (ADC)

1.8 Liquid Crystal Display (LCD)

1.9 Button

Capitolo 2. Acquisizioni temporizzate 23

2.1 Interrupt

2.1.1 Interrupt Button

2.2 Timer

2.2.1 Timer0

2.2.2 Timer1

Capitolo 3. Step by Step 30

3.1 Misurazione di tensione

3.1.1 Scelta del numero di misurazioni

3.1.2 Visualizzazione del numero di misure su display

3.2 Valutazione delle soglie reali 3.2.1 Scelta della frequenza di campionamento 3.2.2 Scelta della frequenza del segnale 3.3 Valutazione delle soglia compensate 3.4 Calcolo degli errori 3.4.1 Errore di non linearità integrale (INL) 3.4.2 Errore di non linearità integrale (DNL)

IV

3.4.3 Visualizzazione dei parametri d’errore su display Capitolo 4. Interazione con l’utente 44 4.1 Casi d’uso 4.2 Simulazione

Conclusioni 49

Bibliografia

5

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.

6

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

7

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).

8

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.

Si definisce quanto il valore dell’intervallo a cui corrisponde un certo codice.

Figura 1. 1 a

Figura 1.1 b

9

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.

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.

1.3 MPLAB

MPLAB è un ambiente di sviluppo integrato. Permette di creare progetti per i PIC in

Figura 1.1 c

Figura 1.1 d

10

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:

Figura 1.5 a

11

- 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

12

- 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

13

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.

14

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.

15

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:

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

Figura 1.8

16

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.

17

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:

18

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.

19

- 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.

20

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:

21

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:

22

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.

23

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.

24

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:

25

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);

26

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.

27

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.

28

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:

29

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.

30

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):

31

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:

32

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

Figura 3.1

33

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.

34

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:

35

- 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:

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

0

10000

20000

30000

40000

50000

60000

1

39

77

11

5

15

3

19

1

22

9

26

7

30

5

34

3

38

1

41

9

45

7

49

5

53

3

57

1

60

9

64

7

68

5

72

3

76

1

79

9

83

7

87

5

91

3

95

1

98

9

Tk realiCodice

Tk

36

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 Tki

2 (fatt1)

- a12 = Σ1N Tki (fatt2)

37

- 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:

38

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.

39

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

40

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:

41

- 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:

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

DNL

Codici

42

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:

43

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’.

44

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.

45

- 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

46

- Titolo del progetto

- Dispositivo e autore

- Istruzioni

47

- Fine simulazione

48

- Messaggio di saluto

49

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.

50

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