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