UNIVERSITA’ DEGLI STUDI DI CAGLIARI Facoltà di Scienze Matematiche, Fisiche e Naturali Corso di Laurea in Fisica PROGETTAZIONE E REALIZZAZIONE DI UN SISTEMA DI ACQUISIZIONE PER SPETTROSCOPIA γ Relatore: Prof. Paolo Randaccio Tesi di Laurea di: Alessio Atzori Anno Accademico 2009/2010 1 INDICE CAPITOLO 1 Introduzione 1.1 Introduzione........….............................................................................pag.5 1.2 Spettroscopia γ......................................................................................pag.5 -Rivelatori a scintillazione.......................................................................pag.5 -Il drogaggio negli scintillatori inorganici...................................................pag.10 -Il fotomoltiplicatore...........................................................................................pag.12 1.3 parametri di misura nella spettroscopia γ.........................pag.14 -Forma dell'impulso.............................................................................................pag.14 -Canali e conteggi............................................................................................pag.16 -Tempo vivo e tempo morto..............................................................................pag.16 CAPITOLO 2 Il dispositivo 2.1 Descrizione del dispositivo …...............................................................pag.17 -Criteri di progettazione del dispositivo..........................................................................pag.17 -Caratteristiche Generali..................................................................................................pag17 -Schema a blocchi...........................................................................................................pag.18 2.1.1 Sezione di preamplificazione -Circuito di attenuazione del segnale...................................................................pag19 -Circuito di amplificazione del segnale..............................................................pag.20 -Convertitore single ended – differenziale...........................................................pag21 2.1.2 Circuito di trigger...............................................................................pag.22 2 2.1.3 Circuito digitale -L'ADC e il buffer...............................................................................................pag.23 -La RAM, i contatori e e le latch.........................................................................pag.25 -Il PIC32...............................................................................................................pag28 2.1.4 Sezione di alimentazione..................................................................pag30 2.2 Il processo di misura -Diagramma di flusso: lato dispositivo …....................................................................pag. 31 -Diagramma di flusso: lato interfaccia grafica................................................................pag.32 2.3 Il firmware del PIC32 …..........................................................................pag.33 2.4 L'interfaccia grafica..................................................................................pag.46 2.5 Il prototipo e il circuito stampato.....................................................pag.48 CAPITOLO 3 Taratura del dispositivo 3.1 Taratura dei fondoscala..........................................................................pag.51 1. -Taratura dell'offset del buffer----------------------------------..--------------------------------pag51 -Taratura dell'offset dell'amplificatore di guadagno........................................................pag.52 -Taratura dei fondoscala..................................................................................................pag.53 3.2 Taratura della banda passante...........................................................pag. 54 3.3 Taratura del circuito di trigger...........................................................pag.58 -Taratura dell'intervallo di variazione della tensione di soglia........................................pag.58 -taratura dell'isteresi........................................................................................................pag.59 3.4 Taratura dei fondoscala personalizzati..........................................pag.59 3 CAPITOLO 4 Un'applicazione : Misura di spettri di sorgenti monocromatiche e taratura in energia di un rivelatore con scintillatore NaI(Tl) 4.1 Introduzione...................................................................................................pag.60 4.2 Apparato sperimentale.............................................................................pag.62 4.3 Procedimento ….............................................................................................pag.63 4.4 Elaborazione dei dati................................................................................pag.67 CONCLUSIONI 4 CAPITOLO 1 1.1 Introduzione Lo scopo di questo lavoro di tesi è analizzare le procedure che portano alla progettazione e alla realizzazione di un dispositivo di acquisizione dati per spettroscopia γ . Verranno analizzati i principali dispositivi di rivelazione dei raggi γ prestando particolare attenzione ai rivelatori a scintillazione inorganici usati in questo lavoro di tesi per ottenere una stima delle prestazioni del dispositivo realizzato. Sarà descritto dettagliatamente il circuito elettronico, il firmware del microcontrollore che gestisce l'intero processo di misura, l'interfaccia grafica che ci consente la taratura dello strumento e l'analisi dei dati provenienti dal dispositivo. Inoltre sarà illustrato il procedimento con cui è stato progettato e realizzato il prototipo e il circuito stampato. 1.2 Spettroscopia γ La spettroscopia γ si occupa di analizzare la distribuzione energetica relativa al decadimento γ di un insieme di nuclei esaminati. Da tale distribuzione si ricava la probabilità che un nucleo in seguito ad un decadimento γ emetta un fotone di una determinata energia . Il metodo di rivelazione cambia a seconda del tipo di rivelatore . I rivelatori più comunemente utilizzati nella spettroscopia γ si dividono in due categorie: • • Rivelatori a scintillazione Rivelatori a semiconduttore In questo lavoro di tesi mi occuperò solamente dei rivelatori a scintillazione, usati per ottenere una stima delle caratteristiche del sistema di acquisizione. 1.2.1 Rivelatori a scintillazione Il funzionamento di un rivelatore a scintillazione si basa su una serie di processi che coinvolgono gli atomi di cui è composto lo stesso scintillatore. In linea generale il processo che unisce l'incidenza del fotone che vogliamo rivelare e l'effettiva captazione di tale fotone è scandito da 4 passaggi 1 il fotone γ incide sullo scintillatore 2 lo scintillatore reagisce producendo un certo numero di fotoni luminosi 3 tali fotoni vengono convertiti in elettroni da un fotocatodo 4 il flusso di elettroni viene “amplificato” da un fotomoltiplicatore Le modalità di rivelazione di raggi γ dipendono dal tipo di interazione che tali raggi hanno con il rivelatore stesso. Principalmente i meccanismi di interazione dei γ con la materia sono di tre tipi: 5 • • • • Effetto fotoelettrico Effetto Compton produzione di coppie Ciascun effetto prevale sugli altri a seconda dell'energia del fotone incidente e del numero atomico del materiale assorbitore. Illustrazione 1: Grafico della dominanza degli effetti : Fotoelettrico, Compton, produzione di coppie Questi meccanismi portano al trasferimento dell'energia della radiazione ad uno o più elettroni che compongono il rivelatore. - Effetto fotoelettrico: L'effetto fotoelettrico è generato dall'interazione di un fotone con un nucleo appartenente allo scintillatore. Come si può vedere dal grafico l'effetto fotoelettrico è predominante alle basse energie (per lo Iodio tipicamente al di sotto di 400 keV ). Il fotone viene completamente assorbito, ciò vuol dire che tutta l'energia del fotone viene utilizzata per eccitare l'atomo interessato alla collisione. L'energia viene ceduta ad un elettrone da parte del fotone che assume un energia cinetica pari a E e =ℏ −E s Dove Es è l'energia di legame relativa ad una generica shell s . Se l'energia del fotone è maggiore dell'energia di legame l'elettrone che viene accelerato può passare in banda di conduzione . Successivamente questo si diseccita, tornando in banda di valenza 6 ed emettendo radiazione X di energia pari al gap che separa la banda di conduzione dalla banda di valenza. In queste condizioni il fotone X che viene emesso viene riassorbito subito in quanto possiede l'energia necessaria per compiere un'altra ionizzazione per effetto fotoelettrico. Tale fenomeno viene chiamato “autoassorbimento” La probabilità di interazione per effetto fotoelettrico dipende dall'energia del fotone incidente e dal materiale di cui è composto l'assorbitore. Ecco un esempio dell'andamento della sezione d'urto in funzione dell'energia del fotone incidente per uno scintillatore . Illustrazione 2: Sezione d'urto per l'effetto fotoelettrico Si può notare il picco di probabilità per le shell K e L. - Effetto Compton L'effetto Compton è predominante nell'intervallo di energie che vanno (per lo Iodio) dalle centinaia di keV fino a circa una decina di MeV . Il processo si può descrivere in questo modo: Un fotone con energia molto maggiore dell'energia tipica di legame, incidendo su un atomo causa l'espulsione di un elettrone che assume un'energia cinetica che dipende dall'energia del fotone e dall'angolo di scattering. L'energia addizionale viene utilizzata per la creazione di un nuovo fotone. Illustrazione 3: Schema di interazione per l'effetto Compton Energia cinetica dell'elettrone espulso: T =h −h ' 7 h Energia del fotone dopo la collisione: h ' = h 1−cos m0 c 2 è l'energia dell'elettrone a riposo pari a 511 keV 1 Dome m0 c 2 La Sezione d'urto per singolo elettrone decresce al crescere dell'energia del fotone incidente. Illustrazione 4: Sezione d'urto per l'effetto Compton -Produzione di coppie Nella produzione di coppie si ha la conversione dell'energia del fotone in massa dovuta all' interazione del fotone con il campo elettrico generato dal nucleo. Tale processo ha una soglia di energia minima, ovvero energia del fotone deve essere superiore a 1,022 MeV . In queste condizioni, l'energia del fotone viene convertita nella massa a riposo di una coppia elettrone positrone. L'energia del fotone eccedente si sviluppa sotto forma di energia cinetica associata alla coppia prodotta: E e E e =h −2m 0 c 2 - + Illustrazione 5: Sezione d'urto della produzione di coppie 8 Sezione d'urto totale La sezione d'urto totale per l'interazione di un fotone con il materiale del rivelatore è data dalla somma delle sezioni d'urto relative ai tre effetti sopraelencati: = fotoZ C coppie La sezione d'urto Compton σC è la sezione d'urto per singolo elettrone, per cui viene moltiplicata per il numero atomico Z. La sezione d'urto totale è rappresentata dal grafico seguente: Illustrazione 6: Sezione d'urto totale Per poter rilevare efficientemente raggi γ, abbiamo bisogno di uno scintillatore in cui sono predominanti l'effetto fotoelettrico e la produzione di coppie rispetto all'effetto Compton. Difatti nell'effetto fotoelettrico e nella produzione di coppie il fotone γ viene completamente assorbito mentre nel Compton solamente una parte dell'energia viene utilizzata. Se il fotone scatterato non subisce altre interazioni può uscire dallo scintillatore senza venir rivelato . Come si può vedere dal grafico (Illustrazione 1 ) la sezione d'urto per ognuno dei tre processi dipende dal numero atomico. Precisamente : Effetto fotoelettrico ~ Z4 Produzione di coppie ~ Z2 Effetto Compton ~ Z La dipendenza dal numero atomico è molto più marcata nell'effetto fotoelettrico e nella produzione di coppie. Per aumentare l'efficienza di rivelazione dei fotoni γ possiamo quindi utilizzare materiali composti da atomi con elevato numero atomico, in maniera tale da minimizzare l'effetto Compton. 9 Il drogaggio negli scintillatori inorganici. L'aggiunta di impurità in scintillatori inorganici comporta l' aggiunta di livelli energetici nella banda proibita chiamati “centri attivatori” . Illustrazione 7: Schema a bande di un cristallo inorganico drogato L'incidenza di un fotone nel cristallo può causare la creazione di una coppia elettrone lacuna libera oppure può causare la formazione di un eccitone, ovvero uno stato legato formato da elettrone e lacuna, la cui energia si trova appena sotto la banda di conduzione. Una volta che è stata creata la coppia elettrone - lacuna, questi sono liberi di migrare rispettivamente in banda di conduzione e banda di valenza. Se una lacuna incontra un centro attivatore, strappa un elettrone da quest'ultimo, di conseguenza viene emesso un fotone . Se invece un elettrone in banda di valenza incontra un centro attivatore, viene catturato e viene emesso un fotone. In entrambi i casi l' energia dei fotoni emessi è minore del gap fra banda di conduzione e banda di valenza, quindi questi hanno minore probabilità di essere riassorbiti dal materiale. Nei cristalli drogati si avrà quindi un alta efficienza luminosa grazie all'attenuazione del fenomeno dell'autoassorbimento . In secondo luogo si avrà uno spostamento della spettro del fotone incidente comunemente chiamato “stokes shift” Esistono diversi tipi di scintillatore, fra cui possiamo elencare : • Scintillatori organici : Hanno un ottima risposta temporale (qualche ns) ma bassa risoluzione energetica . Hanno un alta sensibilità al tipo di particella incidente, possono essere usati per analisi con discriminazione di forma dell'impulso. Sono composti a base di carbonio (Z=6), quindi non sono adatti alla rivelazione di γ a causa della predominanza dell'effetto Compton 10 • Scintillatori inorganici Hanno una risposta temporale lenta (circa 10-7s) Hanno una buona risoluzione energetica Ha un emissione di luce che dipende dal tipo di particella incidente, possono essere usati per analisi con discriminazione di forma dell'impulso. Possono essere composti da atomi ad alto Z, quindi sono adatti alla rivelazione dei γ. • Scintillatori Plastici Hanno un ottima risposta temporale (qualche ns) e buona risoluzione energetica 11 Il Fotomoltiplicatore Per poter avere una misura dell'energia del fotone rivelato abbiamo bisogno di convertire i fotoni prodotti nello scintillatore in una grandezza facilmente trattabile. Per questo motivo vengono utilizzati i fotomoltiplicatori Illustrazione 8: Schema di un tipico fotomoltiplicatore I fotoni provenienti dallo scintillatore incidono sul fotocatodo, qui per effetto fotoelettrico vengono prodotti elettroni . L'energia dell' elettrone prodotto è data dalla formula E e =h − , dove è la frequenza del fotone incidente mentre è la energia di prima ionizzazione dei materiali (tipicamente Rubidio e Cesio) di cui è costituito il fotocatodo. L'efficienza di conversione del fotocatodo dipende quindi dalla energia del fotone incidente e dal tipo di materiale utilizzato per la realizzazione dello stesso. Un altro importante parametro che indica la risoluzione spettrale del fotocatodo è l'efficienza quantica definita come : = numero di fotoelettroni prodotti numero di fotoni incidenti Gli elettroni prodotti dal fotocatodo vengono emessi in direzioni casuali. Occorre quindi focalizzare il flusso di elettroni sul primo dinodo attraverso l'elettrodo di focalizzazione. Tali elettrodi hanno una forma che consente di creare una distribuzione spaziale di potenziale che permette di indirizzare al meglio gli elettroni verso il primo dinodo: 12 Illustrazione 9: Schema del fotocatodo e del focalizzatore Gli elettroni urtando il primo dinodo producono elettroni secondari. Il processo di emissione di tali elettroni è molto simile al processo di fotoemissione, l'unica differenza sta nel fatto che il fotone è sostituito dall'elettrone. Per ogni dinodo il guadagno del numero di elettroni dipende dal coefficiente di emissione secondario. Tale coefficiente dipende dalla tensione applicata fra due dinodi V d secondo la relazione: = K V d Il guadagno totale alla fine della catena di moltiplicazione sarà: G=n= KV d n Dove n è il numero di dinodi presenti nel fotomoltiplicatore. Per mantenere una tensione costante fra ogni dinodo successivo viene applicata fra il fotocatodo e l'ultimo dinodo una differenza di potenziale di circa 1000 – 1500 V . La differenza di potenziale fra due dinodi successivi dipende dal numero di dinodi. Viene utilizzato un partitore di tensione per fornire a ciasuna coppia di dinodi una differenza di potenziale pari a un ennesimo della tensione di alimentazione. Disegno 1: Schema circuitale di un fotomoltiplicatore 13 Per evitare sbalzi di tensione agli ultimi stadi del fotomoltiplicatore vengono posti in parallelo alle resistenze del partitore dei condensatori . In uscita dal fototubo avremo una corrente che è proporzionale al numero di fotoelettroni emessi dal fotocatodo il cui numero è proporzionale all'energia del fotone γ che ha inciso sul rivelatore . In questo modo avremo una misura dell'energia del fotone che ha inciso sullo scintillatore. 1.3 Parametri di misura nella spettroscopia γ Forma dell'impulso La forma dell'impulso misurato all'uscita dal fotomoltiplicatore, dipende sostanzialmente dall'elettronica presente nel fotomoltiplicatore. Il circuito all'interno di un fotomoltiplicatore può essere schematizzato in questo modo: Illustrazione 10: circuito equivalente di un fotomoltiplicatore Si suppone che il fotomoltiplicatore si comporti come un generatore di corrente ideale. La resistenza e il condensatore sono la rappresentazione della resistenza e della capacità totale dei dinodi, ovvero delle resistenze del partitore e dei condensatori di livellamento. Supponiamo che la forma dell'impulso erogato dal generatore di corrente ideale abbia una forma esponenziale del tipo: −t GNe I t= e s s Dove G è il guadagno del fotomoltiplicatore, N il numero dei fotoelettroni emessi, e la carica dell'elettrone e τs è la costante di decadimento caratteristica dello scintillatore. Questa ipotesi si avvicina molto alla realtà in quanto negli scintillatori il tempo di salita è molto più piccolo del tempo di discesa. La funzione di trasferimento del circuito è: 14 I t= V t dV t C R dt che ha per soluzione: GNeR t t − exp − − exp − τ τ −τs τs V (t ) = t GNeR ⋅ t ⋅ exp − 2 τs τs per τ ≠ τ s per τ =τ s Dove τ=RC .Semplificando ulteriormente le formule sopraelencate si può ridurre la forma dell'impulso al prodotto di due funzioni esponenziali. V(t) t t V0 (t ) = S 0 ⋅ exp − ⋅ 1 − exp − τ1 τ 2 t V1 (t ) = S1 ⋅ exp − τ1 t V2 (t ) = S 2 ⋅ 1 − exp − τ 2 S0 = S1 ⋅ S2 t Illustrazione 11: Grafico dell'interpolazione dell' impulso Queste informazioni sono utili nel caso in cui si voglia calcolare la funzione matematica di interpolazione dell'impulso. Questa tecnica ci permette di rendere più precisa l'analisi degli impulsi. Difatti grazie all'interpolazione dell'impulso possiamo andare oltre la risoluzione dei convertitori analogicodigitale che per loro natura convertono il segnale continuo in una serie di valori discreti. L'altro vantaggio dell'interpolazione sta nel fatto che possiamo misurare impulsi la cui ampiezza cade al di fuori dell' intervallo di misurazione . Questo ci permette di estendere l' intervallo di misura oltre il limite imposto dal fondoscala prescelto . Questa tecnica consiste nel calcolare un impulso unitario (S0 =1 ) in corrispondenza dell' impulso misurato . Per ogni valore di ascissa il rapporto fra valore misurato e il corrispondente valore dell' impulso unitario è costante . Ovviamente questo non è vero per impulsi reali soggetti a fluttuazioni statistiche dovute al rumore. In generale l'altezza istantanea misurate è funzione lineare dell'altezza istantanea dell' impulso unitario: yreale = m ⋅ yunitario + i 15 Dove m è il coefficiente angolare e i è l'intercetta. Tale metodo consiste quindi nel calcolare la retta dei minimi quadrati considerando come variabile indipendente l'altezza istantanea dell' impulso unitario . Se si scala l'impulso in maniera tale da rendere nulla l'intercetta i, l'altezza dell' impulso calcolato sarà uguale al coefficiente angolare della retta dei minimi quadrati. Canali e conteggi Lo scopo della spettroscopia γ è quello di determinare la distribuzione di energia dei decadimenti di un determinato emettitore γ. Per far ciò, sarà necessario poter disegnare un istogramma che ha per ascisse i valori di energia misurati per ogni decadimento e in ordinata il numero di volte in cui quella determinata energia si è presentata. Sperimentalmente non è possibile disegnare una distribuzione continua, poiché ciò significherebbe avere uno spettrometro con risoluzione infinitesima, per questo motivo vengono utilizzati i canali . I canali consentono di ridurre i valori di energia distinguibili raggruppando tali valori all'interno di intervalli detti appunto canali. Solitamente il numero di canali è una potenza di due . Se ad esempio si compie una misura di spettro su 512 canali con un convertitore analogico-digitale da 12 bit (4096 divisioni), in ogni canale cadranno 8 valori di energia. L'utilizzo dei canali consente inoltre di velocizzare il processo di misura . Difatti la probabilità che un determinato valore di energia cada in un canale è inversamente proporzionale al numero dei canali. Tempo vivo – tempo morto Si può definire come tempo di misura, l'intervallo temporale che va dal superamento della tensione di soglia da parte dell'impulso fino all'effettiva misurazione di questo . Questo intervallo di tempo è in generale diviso in due parti : -tempo vivo -tempo morto Si definisce tempo vivo l'intervallo di tempo che va dal superamento della tensione di soglia fino all'interruzione della misura . In quest'intervallo si manifesta l'impulso che vogliamo misurare . Il tempo morto invece è definito come l'intervallo compreso fra l'interruzione della misura e l'effettivo risultato registrato (che può essere numerico o grafico) . Ciò che assume un ruolo importante nella rivelazione di particelle è il tempo morto . Se ad esempio si vogliono eseguire misure di temporizzazione è fondamentale che il tempo morto sia il più piccolo possibile. Nel caso della spettroscopia γ tale parametro è di secondaria importanza in quanto ciò che ci interessa misurare è l'energia dei fotoni incidenti. In ogni caso, il processo fisico che sta alla base del decadimento γ è di natura probabilistica e quindi per migliorare la misurazione dello spettro possiamo semplicemente prolungare la sessione di misura . Ciononostante il tempo morto dev'essere comunque il più piccolo possibile per poter eseguire la misura dello spettro nel tempo più breve possibile. 16 CAPITOLO 2 2.1 Descrizione del dispositivo -Criteri di progettazione del dispositivo: Il dispositivo è stato progettato tenendo in considerazione alcuni semplici criteri: • • • • • • • Deve essere in grado di misurare impulsi provenienti da rivelatori per spettroscopia γ Deve dare la priorità alla misurazione delle ampiezze piuttosto che alla temporizzazione degli impulsi. Una volta assemblato deve poter essere completamente sviluppabile via software . Deve essere realizzato limitando al massimo il numero di componenti con montaggio superficiale. Deve essere realizzato utilizzando il più possibile componenti facilmente reperibili Il protocollo di comunicazione dev'essere il più semplice possibile. Deve avere la possibilità di funzionare come un oscilloscopio digitale. -Caratteristiche tecniche Generali: • • • • • • • • • • Banda passante analogica di 10 MHz. Frequenza di campionamento massima di 20 Msamples/s. Risoluzione verticale massima di 1/4095 dell'intervallo di fondoscala. Risoluzione orizzontale minima di 50ns. Capacità del buffer di memoria di 64000 campioni a schermata Risoluzione della soglia del trigger 1/255 dell'intervallo di fondoscala Completamente configurabile dal PC Tensione di alimentazione 5V Corrente assorbita 400mA Alimentazione diretta da porta USB o da alimentatore esterno . 17 -Schema a blocchi Illustrazione 12: Diagramma a blocchi del dispositivo 18 2.1.1 Sezione di preamplificazione il preamplificatore è composto da un limitatore un buffer un traslatore di livello, un amplificatore invertente e infine da un convertitore single ended - differenziale. Alcuni parametri del preamplificatore come il guadagno e l'offset vengono regolati da potenziometri digitali della Microchip (MCP41050), che possiedono una resistenza massima di 50 kΩ e sono comandabili attraverso la porta SPI (Serial Peripheral Interface) del microcontrollore. Il contatto mobile di tali potenziometri può assumere 255 posizioni. La risoluzione di resistenza è quindi 1/255 di 50 kΩ ovvero circa 196 Ω. Per maggiori dettagli sul protocollo di comunicazione si rimanda alla sezione ....Firmware ecc ecc. Circuito di attenuazione del segnale il limitatore è composto da i due relè reed SIL05 -1A72 . comandati dal demultiplexer 74LS138 che funge da buffer fra le porte RA3 RA4 e RA5 del PIC32 e gli avvolgimenti del relè. Illustrazione 13: Schema circuitale dell'attenuatore e del buffer E' possibile selezionare due tipi di attenuazione: la prima è nulla,ovvero il segnale passa attraverso il relè RL1 senza venire attenuato la seconda comporta un attenuazione di 10 volte attraverso la rete resistiva compensata costituita dalle resistenze da 900kΩ (R6 in parallelo con R7) e 100kΩ (R2) e dal condensatore variabile C46. Si è scelto di comporre la resistenza da 900kΩ con due resistenze da 1,8 MΩ in parallelo, in maniera tale da non dover ricorrere a resistenze di precisione all'1%. Va 19 sottolineato il fatto che per entrambe le attenuazioni l'impedenza in ingresso è di 1MΩ .Questo permette di adattare lo strumento alle tipiche sonde “10x” che si trovano comunemente in commercio. Tali sonde hanno una struttura circuitale di questo tipo: Illustrazione 14: schema di una tipica sonda 10x Questo tipo di sonda presenta uno switch con cui possiamo selezionare l'attenuazione del segnale (1x o 10x), una resistenza di 100Ω, una resistenza da 9MΩ e un condensatore variabile tipicamente alloggiato all'interno della sonda stessa. Nel caso in cui si selezioni l'attenuzione “10x” la resistenza da 9 MΩ forma con la resistenza in ingresso di 1MΩ dello strumento un partitore di tensione compensato che attenua il segnale di 10 volte. Una volta attraversato lo stadio di attenuazione il segnale arriva ad un buffer a fet con architettura cascode . Questo tipo di inseguitore di tensione è particolarmente indicato per misure di tensioni sia alternate che continue in quanto presenta un elevata impedenza di ingresso e un elevata banda passante. I diodi D2 e D3 (1N4148) assicurano la protezione da tensioni maggiori di +5 V e minori di -5V Il trimmer R1 consente la taratura dell'offset in uscita dall'inseguitore di tensione. Circuito di amplificazione del segnale Illustrazione 15: Schema circuitale del circuito di amplificazione 20 il segnale passa attraverso il partitore di tensione formato dalle due resistenze da 1k (R9 e R10) che permette di dimezzare l'ampiezza del segnale e di aggiungere un offset determinato dal potenziometro digitale U1 attraverso l'operazionale U5 che funge da adattatore di impedenza (inseguitore di tensione) .In questo modo all'uscita del buffer costituito dall'integrato U8 abbiamo la possibilità di ottenere un segnale sempre maggiore di zero. Questo fatto è importante, in quanto il potenziometro digitale che funge da regolatore di guadagno, che si trova nello stadio successivo, non accetta tensioni minori di -600mV rispetto al ground analogico. Nel caso in cui la frequenza del segnale sia sufficientemente elevata tali circuiti integrati sonno protetti da tensioni minori di -600mV, ciò non è vero nel caso di tensioni continue. Tale inconveniente è risolto dal diodo Schottky D9 connesso a terra . l'amplificatore invertente consente di ottenere un amplificazione con un guadagno variabile fra -0,5 e -10 Grazie al potenziometro digitale U10 configurato come resistenza variabile in serie all'amplificatore invertente. In parallelo al potenziometro digitale è posto il trimmer R15 che consente di regolare più finemente il guadagno nei fondoscala la cui taratura è più critica, ovvero nei fondoscala che richiedono un più elevato guadagno. Al segnale proveniente dal buffer viene sommato attraverso la resistenza R22 una tensione costante minore di zero settata dal trimmer R18 questo accorgimento consente di rimuovere l'offset aggiunto nel precedente stadio. Convertitore single ended – differenziale Il convertitore single ended - differenziale consente di convertire il segnale singolo in una coppia differenziale attraverso i due amplificatori operazionali U12 configurato come amplificatore invertente e U13 configurato come amplificatore non invertente .Entrambi hanno guadagno unitario. Illustrazione 16: Schema circuitale del convertitore single ended-differenziale 21 Per ognuno dei due amplificatori viene aggiunto un offset di 1V fornito dalla stessa ADC . Difatti il pin 4 dell'ADC fornisce una tensione altamente stabilizzata di un volt che consente di avere un valore di riferimento stabile per la conversione analogico digitale. Questa tensione di riferimento viene inviata al convertitore singolo-differenziale attraverso l'operazionale U17 configurato come inseguitore di tensione, che funge da adattatore di impedenza. I diodi Schottky D4 e D5 fungono da protezione contro tensioni minori di -200 mV mentre i diodi D6 e D7 proteggono l'adc da tensioni maggiori di 2V. All'uscita dei due amplificatori avremo due tensioni, la cui differenza è pari al doppio della tensione in ingresso. Il Convertitore single-ended - differenziale ci permette di ridurre al minimo il rumore. Infatti se supponiamo che su i due rami del convertitore agiscano rumori casuali, la differenza di questi tenderà a zero mentre il segnale coerente viene amplificato correttamente. 2.1.2Circuito di trigger il circuito di trigger è costituito dal comparatore AD8561 un potenziometro digitale MCP41050 con buffer, il multiplexer 74LS151 e un doppio flip flop 74LS74. Illustrazione 17: Schema circuitale del circuito di trigger Il segnale analogico proveniente dall'uscita non invertente del convertitore single ended – differenziale arriva al pin 3 del comparatore . qua viene confrontato con una tensione di riferimento fornita dal potenziometro digitale U14 attraverso l'operazionale U18 che funge da adattatore di impedenza. Per evitare falsi "scatti" del trigger ho preferito utilizzare l'architettura del comparatore con isteresi . Attraverso la rete formata dal trimmer R31 e dalla resistenza R37, la tensione di riferimento viene retroazionata con l'uscita del comparatore stesso. 22 In questo modo la tensione di riferimento oscilla con frequenza uguale alla tensione analogica in ingresso, mantenendo comunque la forma di onda quadra. l'ampiezza di tale onda è pari a: A= R1 R1 ⋅V CC −1=4 R1 R2 R1R 2 In questo modo il comparatore presenta una finestra di insensibilità attorno alla tensione di riferimento di ampiezza pari all'ampiezza dell' onda presente sul pin 2 . quindi il comparatore scatta alto soltanto se il segnale analogico attraversa sia il valore minimo della finestra sia il valore massimo. Viceversa il comparatore scatta basso solo se il segnale attraversa sia il valore massimo che il valore minimo. In questo modo si evita che segnali piu o meno rumorosi facciano scattare più volte il comparatore in vicinaza della tensione di riferimento. il comparatore AD8561 presenta oltre all'uscita sul pin 7 anche l'uscita negata. Entrambi i segnali vengono inviati al multiplexer 74ls151. Possiamo dunque selezionare quale dei due segnali di trigger utilizzare attraverso il pin 11 del multiplexer comandata dalla porta RA6 del PIC32. Se tale pin è posto a livello alto (3.3V) si seleziona l'uscita del comparatore negata, viceversa se si pone il pin 11 a livello basso viene selezionata l'uscita del comparatore non negata. Il doppio flip flop ha due funzioni : La prima è quella di sincronizzare il segnale di trigger con il clock dell'adc .In secondo luogo, attraverso una retroazione dell'uscita del primo flip flop nel clock del secondo, ci si assicura che l'uscita del secondo flip flop scatti una sola volta . Tale circuito è comunemente detto circuito di "one shot". Attraverso il pin 4 del primo flip flop è possibile azionare il circuito di one shot. Se tale pin è posto a livello basso il flip flop è insensibile a qualsiasi passaggio di stato del segnale di trigger. Appena il pin 4 è posto a livello alto attraverso la porta RA7 del PIC32 il flip flop scatta basso in corrispondenza del fronte di discesa del clock più vicino al fronte di discesa del segnale di trigger avvenuto dopo il settaggio del pin4. L'uscita Q del secondo flip flop rimane bassa fino al prossimo fronte di salita del set 2.1.3Circuito digitale il circuito digitale è composto dall'ADC, da due buffer, da due RAM da due contatori e da due Latch. L'ADC e il buffer [6] l'AD9235 è un ADC con architettura multistage differential pipeline con logica di correzione degli errori . 23 Illustrazione 18: Schema circuitale dell'ADC e del buffer L'ADC AD9235 della Analog Devices è in grado di convertire un segnale analogico in un numero binario a 12 bit (un numero compreso fra 0 e 4095) che viene trasmesso in parallelo attraverso i 12 pin da 15 a 22 e da 25 a 28. L AD9235 presenta due ingressi differenziali pin 9 e 10. L'intervallo massimo di conversione è compreso fra 0,5 e 1,5 V. Per analizzare al meglio il processo di conversione analogico-digitale, d'ora in poi, piuttosto che riferirmi alla coppia differenziale che effettivamente viene convertita dall'ADC, mi riferirò al segnale analogico come al segnale che troviamo all'uscita dell' amplificatore single-ended ovvero all'uscita dell'operazionale U11. L' intervallo compreso fra 0,5V e 1,5V corrisponde a un ampiezza massima del segnale single ended di 1 V da picco a picco centrato attorno a 0V .Il segnale analogico in uscita da tale amplificatore varierà fra i -500mV e i +500mV. Questo implica che la minima tensione convertibile all' uscita dell' amplificatore di guadagno U11 è 1V , cioè 244 uV. Tale valore corrisponde alla risoluzione della conversione analogico 4095 digitale. Il pin 1 è il pin Out of range, tale pin scatta a livello alto quando il segnale analogico supera il limite di +0,5V o scende sotto i -0,5V l'AD9235 è in grado di fornire una tensione di riferimento molto stabile al pin 4 . Si può comunque scegliere se utilizzare la tensione di riferimento interna o una esterna semplicemente cambiando il valore di tensione al pin 3 (SENSE) Per la mia applicazione ho scelto la tensione di riferimento interna collegando il pin sense al ground analogico. L'AD9235 è in grado di campionare i segnali ad una frequenza massima di 40 milioni di campioni per secondo. La frequenza di clock massima generabile dal PIC32 non può superare i 20 MHz . Tale limite è imposto dal circuito di temporizzazione delle periferiche . tale circuito a differenza del circuito di temporizzazione della CPU presenta solamente dei divisori di frequenza. Quindi è possibile ottenere 24 solamente frequenze minori di 20 MHz, valore imposto dalla frequenza del cristallo. Tale frequenza inoltre, è la massima sopportabile da tutte le periferiche del PIC32MX460l512f Il pin 2 (MODE) consente di selezionare il formato dei dati in uscita . E' possibile scegliere fra offset binary e two complements con o senza duty cycle stabilizer. per la mia applicazione ho scelto il formato offset binary con duty cycle stabilizer ponendo il pin 2 a 1/3 della tensione di alimentazione analogica attraverso la rete resistiva formata dalle resistenze R38, R39 e R40. In questo modo alla tensione di - 500mV all' uscita dell' amplificatore U11 corrisponde il numero 0 (0000 0000 0000 in binario ) e alla tensione di 500mV corrisponde il numero 4095 (1111 1111 1111 in binario ). Le uscite digitali passano attraverso un buffer tristate azionabile dal pin PWD.E' possibile quindi porre tutte le uscite digitali ad alta impedenza. Purtroppo tali buffer non possono essere utilizzati come comuni tristate nelle diverse procedure di scrittura e lettura, infatti settando a livello alto il pin PWD si configurano i pin digitali da uscite a pin ad alta impedenza ma, contemporaneamente, questo causa lo spegnimento totale dell'ADC. Questa modalità è stata progettata per soddisfare le richieste di risparmio energetico in dispositivi alimentati a batteria . Difatti tutti i condensatori interni che stabilizzano la tensione di riferimento vengono scaricati e l'intera ADC (a clock fermo) consuma 1mW. Il problema sta nel fatto che la carica e la scarica dei condensatori richiede circa 3ms, il che comporterebbe un notevole ritardo fra le varie procedure di acquisizione. Se vogliamo ridurre al minimo il tempo morto siamo costretti ad utilizzare un buffer tristate esterno, nel mio caso il 74HC245. La RAM, i contatori e le latch Illustrazione 19: Schema circuitale delle RAM, dei contatori e delle latch 25 Il dato binario a 13 bit (12 bit di dati + 1 di Out of range) all'uscita del buffer, viene inviato a due ram da 8 bit dati e 17 bit di indirizzi in parallelo della Cypress CY7C1009. Le due ram hanno quindi 131071 posti di memoria. La scelta della dimensione della memoria è stata compiuta in base a parametri di reperibilità dei componenti e di semplicità del circuito. Difatti in commercio gli integrati che svolgono funzioni di contatori latch e buffer hanno un numero di porte che solitamente è multiplo di 2.indirizzare una memoria da 17 bit richiederebbe un minimo di 3 integrati per il contatore degli indirizzi e 3 integrati per la latch . Si è scelto di usare solo 65535 posti in maniera tale da indirizzare la memoria con 16 bit anzichè 17 rendendo possibile l'utilizzo di due contatori binari a 8 bit e due latch a 8 bit . Il salvataggio dei dati provenienti dall'ADC viene svolto sfruttando il metodo della decimazione . Difatti l'ADC lavora a prestazioni sempre più elevate (quindi con errori sempre meno marcati) più ci si avvicina alla frequenza di campionamento massima [6] . Si è scelto quindi di far lavorare l'ADC ad una frequenza costante di 20 Megasamples/s mentre la ram lavora a frequenze variabili comprese fra un massimo di 20 MegaSamples/s e un minimo che si può portare ad un valore arbitrariamente basso. I clock che temporizzano l'adc e il contatore che gestisce gli indirizzi sono sincronizzati, vale a dire che sebbene le frequenze siano in generale diverse, ad un fronte di salita del primo corrisponde il fronte di salita del secondo . Per mantenere la sincronia fra i due clock si è scelto di ridurre le scelte della frequenza di campionamento a multipli di 1, 2 e 5 (tutti sottomultipli di 20) . Sono possibili quindi frequenze di campionamento di 20MS/s, 10MS/s, 5MS/s,2MS/s, 1 MS/s e cosi via . Se ad esempio scegliamo una frequenza di campionamento di 10 MS/s nella ram verrà salvato un dato si e uno no, se invece scegliamo una frequenza di 2 MS/s verrà salvato un dato ogni 10. La scelta della frequenza di campionamento condiziona il tempo massimo di misura. il tempo massimo di misura è dato dal prodotto del periodo di clock per il massimo numero di posti disponibili nella ram ovvero 65535. Ad una frequenza di 20MS/s ad esempio il periodo di clock corrisponde a 50 ns, il tempo massimo di misura è N dati =Periodo ck⋅65535=50ns⋅65535=3,27 ms E' ovvio che la scelta di una frequenza di campionamento più bassa comporta tempi di misura più lunghi . Sono presenti nelle ram anche dei pin di selezione fra cui due chip enable (CE1 e CE2) il write enable WE e l'output enable OE. Per la mia applicazione ho scelto di tenere il CE2 a livello logico alto mentre il CE1 può essere comandato dalla porta RC1 del PIC. E' stata prevista comunque una modalità di lavoro che non prevede la partecipazione della RAM. In questa modalità il PIC32 preleva i dati direttamente dal buffer dell'ADC. Tale modalità e' stata prevista per campionamenti molto lenti come ad esempio nel caso della taratura di una termocoppia. Per questo tipo di applicazioni il CE1 può essere tenuto a livello logico alto per disattivare la RAM. Con i pin WE e OE si gestiscono le fasi di scrittura e lettura. Per la fase di scrittura, il pin WE dev'essere posto a livello logico basso mentre il pin OE a livello logico alto. Vale il viceversa nella fase di lettura. Durante la fase di progettazione è risultato evidente che la gestione dei livelli WE e OE è piuttosto critica durante la fase di scrittura. Difatti se si mantiene basso WE per tutto il periodo di scrittura, si presentano sovente degli errori digitali dovuti a dati scritti non correttamente in memoria. Questo può essere causato dal fatto che la sincronia fra gli indirizzi forniti dal contatore e i dati provenienti 26 dall'adc non è perfetta. se si tiene basso WE si rischia di scrivere un dato parzialmente o non correttamente in un indirizzo e magari invalidare anche il dato nell'indirizzo successivo. per Aggirare questo problema Ho preferito collegare il WE con il clock del contatore . In questo modo la scrittura può avvenire solo quando l'indirizzo fornito dai contatori è stabile. Difatti, fornendo un clock con il 50% di duty cycle, deve passare almeno mezzo periodo di clock prima che il dato possa essere scritto. In questo tempo l'indirizzo ha la possibilità di stabilizzarsi all'uscita del contatore. In secondo luogo fra il clock del contatore il dato binario corrispondente al conteggio esiste un piccolo ritardo quantificabile attorno ai nanosecondi. Chiudendo la scrittura pochi nanosecondi prima che l'indirizzo cambi ci si assicura che nella RAM venga salvato l'ultimo dato in uscita dal buffer dell'ADC. I contatori sn74lv8051 sono contatori a 32 bit con uscita demultiplexata da 32 a 8. Uno solo di questi contatori è in grado di contare fino a 4'294'967'295 (il corrispettivo di 2 32-1), ma all'uscita può presentare al massimo un numero a 8 bit . Per la mia applicazione mi sono servito di due contatori di questo tipo configurati entrambi come contatori a 16 bit. Entrambi contano fino a 65535 ma dal primo seleziono attraverso il decoder interno il byte basso (primi 8 bit) e dal secondo seleziono il byte alto (ultimi 8 bit). In questo modo ho un contatore a 16 bit in parallelo che è in grado di indirizzare correttamente la RAM. E' importante sottolineare il fatto che tale contatore arrivato all'ultimo conteggio si autoazzera e continua il conteggio. Questo implica che l'architettura della memoria è ad anello . I pin GBL e GBU di entrambi i contatori vengono collegati a i 3.3V digitali, mentre il pin GAL nel contatore del byte basso, collegato con il pin GAU dell'altro contatore, viene utilizzato come pin di tristate . Ponendo a livello basso tali pin si seleziona il byte basso nel primo contatore e il byte alto nel secondo i quali si presentano ai pin di uscita dei rispettivi contatori. Ponendo a livello alto GAL e GAU le uscite passano nello stato di alta impedenza. I pin CCLR posti a livello logico basso consentono di azzerare il conteggio. Le Latch 74LS373 consentono di memorizzare l'indirizzo corrispondente all'istante di trigger . Le uscite sono connesse a gli ingressi, ed entrambi sono connessi in parallelo al bus degli indirizzi. Ponendo a livello logico alto il pin 11 (ENABLE) di ciascuna latch si setta lo stato di scrittura. Tale pin è connesso all'uscita del flip flop, un fronte di discesa su questo pin quindi, corrisponde ad un evento di trigger. Quando il pin 11 viene posto a livello logico basso le latch tengono in memoria l'ultimo indirizzo presente agli ingressi prima del fronte di discesa . In questo modo Abbiamo a disposizione un punto di riferimento per la fase di lettura dalla ram, ovvero abbiamo l'indirizzo di memoria in cui si è manifestato l'evento di trigger. Ponendo il Pin 1 (OUTPUT CONTROL) a livello logico alto configuriamo le uscite della latch nello stato di alta impedenza. In questo modo possiamo chiudere le porte in uscita durante la fase di scrittura, aprirle poco prima della fase di lettura per leggere l'indirizzo di trigger e richiuderle durante la fase di lettura per consentire al PIC32 di Indirizzare correttamente la RAM. 27 Il PIC32 [2] Illustrazione 20: Schema circuitale del PIC32 Il PIC32MX460l512f è un microcontrollore della Microchip con core a 32 bit e architettura mips. può raggiungere un massimo di 80 milioni di istruzioni al secondo .E' dotato di interfaccia USB con cui può comunicare con un PC . Il PIC32 presenta oltre alla CPU diverse periferiche che possono funzionare in maniera indipendente da essa. Fra le periferiche disponibili sono state utilizzate: • • • • Timer 2,3,4,5. Output Compare Porte I/O (A,B,C,D,E) SPI I timer sono dei contatori binari interni al pic che "contano" il numero di pulsazioni provenienti dal cristallo (20MHz). Attraverso dei divisori di frequenza è possibile incrementare il conteggio in presenza di un determinato fronte di salita del segnale fornito dal cristallo. Tali divisori vengono chiamati prescaler e la scelta del divisore di frequenza è limitata a 1, 2, 4,8, 16, 32, 64 e 256 . Ad 28 esempio se si sceglie il prescaler 1, il timer conterà ogni fronte di salita, lavorando quindi ad una frequenza di 20MHz se si sceglie il prescaler 4 invece il contatore conta un fronte di salita ogni 5 lavorando ad una frequenza di 5 MHz. Come già ho anticipato la frequenza massima di lavoro dei timer è limitata a 20 MHz proprio per il fatto che sono presenti solo dei divisori di frequenza. I timer sono stati utilizzati per due scopi. 1)Generazione dei segnali di clock 2)Temporizzazione dei processi Per generare i segnali di clock che regolano la frequenza di campionamento dell'ADC e la frequenza di decimazione della ram sono stati utilizzati rispettivamente i timer 2 e 3.Si tratta di contatori a 16 bit, capaci quindi di contare fino ad un massimo di 65535 fronti di salita . Il timer 2 Viene impostato ad una frequenza fissa di 20MHz per ottimizzare le prestazioni dell'ADC, mentre il timer 3 può scendere fino ad un minimo di 1KHz. Il modulo output compare permette di generare un segnale impulsivo la cui durata (tempo di ON e tempo di OFF) viene regolata dai timer . Per poter generare segnali di clock ho bisogno che l'output compare generi impulsi in maniera continua .Per fare questo impongo che l'output compare scatti ogni volta che il timer raggiunge il conteggio numero 0 . Regolando il periodo del timer si riescono ad ottenere segnali di clock con tutte le frequenze di cui abbiamo bisogno I timer 4 e 5 sono stati utilizzati invece per la temporizzazione dei processi. In particolare è stata utilizzata la funzione Timer45() che permette di far funzionare i due timer a 16 bit come un unico timer a 32 bit, prendendo il timer 4 come word bassa e il timer 5 come word alta . Il Timer45 Viene utilizzato durante la fase di “tempo vivo“ per avere una misura dei tempi di pre-rigger e di posttrigger. Grazie a questo timer infatti, è possibile far scattare un interrupt che abilita il circuito di trigger una volta che il timer di pretrigger è esaurito. Allo stesso modo, l'esaurimento del timer di post trigger comporta un interrupt che interrompe la fase di tempo vivo. Le porte di Input/output mi permettono di gestire tutti i segnali di controllo del circuito. Tutte le porte possono essere configurate sia come input che come output . E' possibile mandare una porta o un gruppo di bit appartenenti ad una porta, in uno stato di alta impedenza. Per fare questo basta configurare la porta come input. L'SPI è una periferica che permette di comunicare con i potenziometri digitali . Come qualsiasi periferica di comunicazione seriale presenta un pin di clock (pin 10) e un pin di dati (pin 12). Per poter comunicare in maniera univoca con uno dei tre potenziometri digitali, abbiamo bisogno di tre pin di “chip enable” che servono per dichiarare quale dei tre potenziometri deve ricevere il dato seriale. Tale compito è svolto dalle porte RA1, RA2 e RA3. Per poter modificare la posizione del contatto mobile nei potenziometri digitali, abbiamo bisogno di una parola a 16 bit. I primi 8 bit formano il Byte di “comando”. La struttura del comando per l'MCP41050 è implementata in questo modo: 29 Per la mia applicazione abbiamo bisogno solamente del comando “Write Data” sul potenziometro 0, corrispondente al dato binario 00010001. 2.1.4 Sezione di alimentazione: Il dispositivo ha bisogno di 5 linee di alimentazione separate: 3,3V digitali : alimentano il PIC32, le RAM, i contatori, i buffer dell' ADC e parte dell'ADC. questa tensione è fornita dal convertitore DC-DC NCP1117 5V digitali : alimentano il comparatore, il multiplexer, il demultiplexer, le latch e il flip flop. questa tensione proviene direttamente dalla linea di 5V della porta USB ±5V analogici : alimentano tutto il circuito di preamplificazione. Sono forniti da un convertitore DC-DC della Traco TMA0505D 3,3V analogici : alimentano la parte analogica dell ADC. Questa tensione è fornita da un NCP1117 Tutti gli integrati alimentati da tensioni digitali hanno uno o più condensatori connessi all' alimentazione e a ground . Questo accorgimento attenua i rumori sulla linea di alimentazione che possono causare errori nel circuito digitale. Il dispositivo presenta inoltre due linee di ground distinte:il ground analogico e il ground digitale. Il ground analogico è condiviso da tutti i componenti del preamplificatore, mentre il ground digitale è condiviso dai componenti restanti. Il ground digitale è direttamente connesso alla linea di ground della porta USB I due ground si connettono in un solo punto attraverso un nucleo in ferrite . Questo aiuta a ridurre il rumore che il ground digitale potrebbe iniettare nel ground analogico . Inoltre è presente un condensatore al tantalio fra i due ground, posto vicino al convertitore DC-DC da 5 a ±5V . Questo aiuta a ridurre il rumore di ripple causato dallo stesso convertitore DC-DC, la cui frequenza si aggira attorno ai 100kHz. 30 2.2 Il processo di misura Il processo di misura è gestito in parte dal PIC32 e in parte dall'interfaccia grafica . La gestione dei processi viene eseguita rispettando una sincronia di comunicazione fra il PIC32 e l'interfaccia grafica . Per rendere più chiara questa sincronia illustrerò il processo di misura dal punto di vista del dispositivo e dal punto di vista dell' interfaccia grafica. Diagramma di flusso: Lato dispositivo Start Modalità di m isura è One s hot oppure Repe at Configura porte Fai Partire Timer di pre- trigger Attendi Configurazione daInterfaccia grafica L'ADC salva i dati sulla RAM Configurazione ricevuta? No Timer esaurito? Si No Si Invia conferma di ricezione a interfaccia grafica Attendi evento di Trigger Configura sistema L'ADC salva i dati sulla RAM Si è manifestato evento di trigger? Abilita RAM in scrittura No Si Fai partire il timer di post-trigger Modalità di misura No è Free run? L'ADC salva i dati sulla RAM Si Timer esaurito? Fai partire Timer di pos t-trigger No Si Scarica RAM L'ADC salva i dati isulla RAM No Timer esaurito? Si Invia dati a interfaccia grafica 31 Diagramma di flusso: Lato interfaccia grafica Start Modalità di misura è free run o Repeat? No Attendi comando di avvio dall'utente Si Invia configurazione a PIC32 Si Comando di avvio Ricevuto? No Attendi conferma di configurazione avvenuta Conferma ricevuta? No Si Attendi pacchetto dati Pacchetto ricevuto? No Si Elabora dati Come si può capire dal diagramma di flusso esistono due cicli di misura principali: 1. Ciclo “Free run” 2. Ciclo “Repeat – One shot” Nel primo caso il non si ha bisogno di nessun evento di trigger. In questa modalità il dispositivo funziona come un comune oscilloscopio senza circuito di trigger. La fase di tempo vivo viene fatta partire appena tutto il sistema è pronto e viene interrotta una volta che il timer di post-trigger si esaurisce. Questo comporta una misura asincrona con il segnale che vogliamo misurare, ma è comunque utile per capire quale intervallo di tensioni può coprire il segnale analogico. Nel secondo caso, invece, il PIC32 fa partire il timer di pre-trigger. Questo è un timer “di guardia” 32 nel senso che impedisce al circuito di trigger di scattare finchè non è passato un tempo maggiore o uguale al periodo di pre-trigger. In questo periodo vengono comunque salvati i dati sulla RAM. Una volta che il timer di pretrigger è esaurito, il PIC32 abilita il circuito di trigger . Appena si manifesta un evento di trigger viene fatto partire il timer di post-trigger . Una volta esaurito anche il timer di post-trigger la fase di tempo vivo si conclude. E' da sottolineare il fatto che durante le fasi di tempo vivo il pic non esegue nessuna operazione di controllo del circuito . Nel diagramma di flusso,ho evidenziato queste fasi in arancione . Durante il salvataggio dei dati sulla RAM, il PIC32 rimane in attesa di un evento di trigger oppure attende che i timer si esauriscano. La sincronia fra il PIC32 e l'interfaccia grafica è mantenuta da alcune funzioni di controllo . Nel diagramma di flusso ho evidenziato tali funzioni. Precisamente ho evidenziato con gli stessi colori i processi di comunicazione che avvengono fra PIC32 e l'interfaccia. Tutte le comunicazioni avvengono tramite la porta USB attraverso un protocollo di emulazione seriale : IL CDC SERIAL EMULATION. Viene cioè installato sul computer un driver che permette di riconoscere la porta USB come se fosse una porta seriale . Il PIC32 si serve di apposite librerie per poter comunicare con questo metodo mentre l'interfaccia grafica usa il protocollo della porta seriale già esistente. Questa scelta permette di rendere le comunicazioni fra PIC32 e l'interfaccia seriale molto semplici e dirette, a discapito però della velocità di comunicazione. Grazie a questo tipo di comunicazione, si possono richiamare solo due tipi di eventi : trasmissione e ricezione. 2.3 Il firmware del PIC32 /************************************************************************** FIRMWARE PAI_SCOPE - OSCILLOSCOPIO DIGITALE ALESSIO ATZORI ***********************************************************************/ /************ * Includes * ************/ #include "HardwareProfile.h" #include "GenericTypeDefs.h" #include "usb/usb.h" #include "usb/usb_device_cdc_serial.h" //#include "io_cfg.h" #include "plib.h" #include "p32xxxx.h" #include "stdio.h" #include "stdlib.h" 33 /********************** * Configuration Bits * **********************/ #ifndef OVERRIDE_CONFIG_BITS #pragma config UPLLEN = ON // USB PLL Enabled #pragma config FPLLMUL = MUL_20 // PLL Multiplier #pragma config UPLLIDIV = DIV_5 // USB PLL Input Divider #pragma config FPLLIDIV = DIV_5 // PLL Input Divider #pragma config FPLLODIV = DIV_1 // PLL Output Divider #pragma config FPBDIV = DIV_1 // Peripheral Clock divisor #pragma config FWDTEN = OFF // Watchdog Timer #pragma config WDTPS = PS1 // Watchdog Timer Postscale #pragma config FCKSM = CSDCMD // Clock Switching & Fail Safe Clock Monitor #pragma config OSCIOFNC = OFF // CLKO Enable #pragma config POSCMOD = HS // Primary Oscillator #pragma config IESO = OFF // Internal/External Switch-over #pragma config FSOSCEN = OFF // Secondary Oscillator Enable #pragma config FNOSC = PRIPLL // Oscillator Selection #pragma config CP = OFF // Code Protect #pragma config BWP = OFF // Boot Flash Write Protect #pragma config PWP = OFF // Program Flash Write Protect #pragma config ICESEL = ICS_PGx2 // ICE/ICD Comm Channel Select #pragma config DEBUG = OFF // Debugger Disabled for Starter Kit #endif // OVERRIDE_CONFIG_BITS /*************** * Global Data * ***************/ typedef enum _app_state { BUFFER_EMPTY = 0, // Buffer is empty & available to receive data. RECEIVING_DATA, // App is waiting to receive data from USB. DATA_AVAILABLE, // Data has been received, app can act on the data. SENDING_DATA // App is waiting for data to finish sending on USB. } APP_STATE; BYTE BYTE BYTE BYTE BYTE gSize; Comando[12]; Risposta[9]; Richiesta[2]; Data[5000]; APP_STATE gState; // AT Command String char gCommand[8]; int C=0; int M=0; int I=0; int S=0; int R=0; unsigned short j=0; WORD i=0; int q=0; //Uninitialized data, cleared to zero. //Variabile configurazione :C=0 configurazione non ricevuta ; C=1 configurazione eseguita //Variabile di misura //Variabile di scaricamento //Variabile di controllo invio //Variabile di controllo ricezione //Variabile conteggio dati //Variabile conteggio campioni //Variabile conteggio pacchetti 34 int d=0; int tic=0; //Variabile di ritardo BYTE gain=110; BYTE offset=110; BYTE limit=1; BYTE thresh=128; BYTE clock=0; BYTE base=7; BYTE slope=1; BYTE mode=1; DWORD basediv=7999; WORD clockdiv=1; WORD start_ad; WORD stop_ad; WORD trig_ad; // variabile di configurazione del potenziometro del guadagno // variabile di configurazione del potenziometro dell'offset // variabile di configurazione dei relè del limitatore // variabile di configurazione del potenziometro del threshold // variabile di configurazione della frequenza di campionamento //variabile di configurazione del tempo totale di misura //variabile di configurazione della pendenza dell'evento di trigger 1:positiva 0:negativa //variabile di configurazione della modalità di misura 0 :free run 1 : repeat - one shot //variabile del divisore del timer45 (32 bit) //variabile del divisore del timer2 (clock della ram) //indirizzo di inizio del pacchetto //indirizzo di di fine del pacchetto //indirizzo dell'evento di trigger WORD pretrig; DWORD intpre; basediv) WORD stop; WORD pre_ad; WORD last_pkt_sz; //variabile di configurazione del timer di pre-trigger //Variabile di normalizzazione del timer di pre-trigger (normalizza pretrig al valore di //numero di campioni per pacchetto //numero di campioni presenti nell'intervallo di pretrigger //dimensione dell'ultimo pacchetto inviato // Notification Data CDC_NOTIFICATION gNotification = CDC_INIT_NOTIFICATION(RESPONSE_AVAILABLE,0,CDC_COMM_INTF_ID,0); /************************************************************************* * Function: CdcDemoEventHandler * * Preconditions: 1. The system must have been built with the CDC Serial * Emulation function driver. * * 2. This routine must be linked as the CDC Serial * function driver's application event handler. * * 3. USBInitialize must have been called to initialize * the USB SW Stack. * * 4. The host must have configured the system as a USB * CDC Serial Emulation Device. * * Input: event Identifies the bus event that occured * * data Pointer to event-specific data * * size Size of the event-specific data * * Output: none * * Returns: TRUE if the event was handled, FALSE if not * * Side Effects: Event-specific actions have been taken. * * Overview: This routine is called by the CDC Serial Emulation * function driver to notify the application of events * that occur on the USB. If the event is recognized, * it is handled and the routine returns TRUE. Otherwise, * it is ignored and the routine returns FALSE. *************************************************************************/ 35 #ifndef min #define min(a,b) (((a)<(b))?(a):(b)) #endif PUBLIC BOOL CdcDemoEventHandler ( USB_EVENT event, void *data, int size ) { UINT16 cmd_size; LINE_CODING line_coding; // Handle specific events. switch ((UINT)event) { // The host has changed our line-control status. case EVENT_CDC_LINE_CTRL: // Read the new line coding. // // (We don't really care, but if we did, we could // do something about it here after reading it.) return USBUSARTGetLineCoding (&line_coding); // The host is about to send an encapsulated command. case EVENT_CDC_CMD: // Read the command string. if (size == sizeof(UINT16) && data != NULL) { cmd_size = (UINT16)min(sizeof(gCommand), size); return USBUSARTGetCmdStr (gCommand, cmd_size); } break; } // switch (event) // Wasn't ours. return FALSE; } // CdcDemoEventHandler //****************************************// //*******CONFIGURAZIONE INTERRUPT****// //****************************************// void __ISR( _TIMER_45_VECTOR, ipl3) T45InterruptHandler(void) //Interrupt timer45 : scatta allo scadere dell' intervallo del timer 45 //la cui durata è stabilita da intpre oppure da (basediv-intpre) //tic (timer interrupt counter) è la variabile dello stato di conteggio, { //se è 0 il timer è in fase di pretrigger se è 1 è in fase di posttrigger if (tic==0) { mT45IntEnable(0); //se siamo nella fase di pretrigger: //disabilita interrupt da timer45 36 mT45ClearIntFlag(); CloseTimer45(); mINT1IntEnable(1); mPORTASetBits(BIT_7); } else { mT45IntEnable(0); mT45ClearIntFlag(); //pulisci la flag dell'interrupt M=1; I=0; //pulisci la flag dell'interrupt //chiudi timer45 //abilita interrupt su trigger //abilita flip-flop //se siamo in fase di post-trigger //disabilita interrupt da timer45 //esci da subroutine di tempo vivo //entra nella subroutine di scaricamento e invio dati } } void __ISR( _EXTERNAL_1_VECTOR, ipl2) INT1InterruptHandler(void) //interrupt del trigger :scatta sul fronte di discesa del segnale di trigger proveniente dal flip flop { mINT1ClearIntFlag(); //pulisci la flag dell'interrupt mINT1IntEnable(0); //disabilita interrupt del trigger if (intpre!=basediv) //se il periodo di pretrigger è diverso dal tempo totale di misura { tic=1; //passa a fase di post trigger mT45IntEnable(1); //abilita interrupt sul timer45 OpenTimer45 (T4_ON|T4_PS_1_1|T4_32BIT_MODE_ON, (basediv-intpre)); //apri timer45 con periodo (basediv-intpre) } else //se intpre=basediv { M=1; //esci direttamente dalla subroutine di tempo vivo I=0; //entra nella subroutine di scaricamento e invio dati } } //*********************// //*******MAIN*********// //********************// int main ( void ) { /* PIC32 Peripheral Library functions SYSTEMConfigPerformance() and SYSTEMConfig() configures system parameters, such as Flash wait states, RAM wait states, enable cache and set Peripheral Bus Clock (PBCLK) frequency for optimal system performance based on the system clock frequency argument. SYSTEMConfigPerformance() ignores the PBCLK fuse selection FPBDIV and calculates the fastest possible PBCLK based on the system clock frequency parameter. Use this function if you want to set the fastest PBCLK frequency. Example: SYSTEMConfigPerformance(80000000); //@80MHz PBCLK ratio = 1:1 SYSTEMConfig() uses the PBCLK defined by configuration fuse selection FPBDIV set in code or from the MPLAB IDE Configuration Bits menu. Use this function if you want to maintain the PBCLK frequency set by FPBDIV. Example: SYSTEMConfig(80000000, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE); */ 37 SYSTEMConfig(GetSystemClock(), SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE); SpiChnOpen(2, SPICON_MSTEN|SPICON_CKE|SPICON_ON, 16); canale due di serial peripheral interface con frequenza di 5 MHz USBInitialize(0); //inizializza USB mJTAGPortEnable(DEBUG_JTAGPORT_OFF); //Disabilita JTAG //apertura del //****************************************// //**********CONFIGURAZIONE PORTE**********// //****************************************// mPORTASetPinsDigitalOut(BIT_0|BIT_1|BIT_2|BIT_3|BIT_4|BIT_5|BIT_6|BIT_7); mPORTASetBits(BIT_0|BIT_1|BIT_2); mPORTAClearBits(BIT_3|BIT_4|BIT_5|BIT_6|BIT_7); mPORTBSetPinsDigitalIn(BIT_0|BIT_1|BIT_2|BIT_3|BIT_4|BIT_5|BIT_6|BIT_7|BIT_8|BIT_9|BIT_10|BIT_11| BIT_12|BIT_13|BIT_14|BIT_15); mPORTCSetPinsDigitalOut(BIT_1|BIT_2|BIT_3|BIT_4|BIT_13|BIT_14); mPORTDSetPinsDigitalIn(BIT_2|BIT_3|BIT_4|BIT_5|BIT_6|BIT_7|BIT_8|BIT_9|BIT_10|BIT_11|BIT_12|BIT_13| BIT_14|BIT_15); mPORTDSetPinsDigitalOut(BIT_0|BIT_1); mPORTESetPinsDigitalOut(BIT_5|BIT_6|BIT_7); mPORTESetPinsDigitalIn(BIT_8|BIT_9); mPORTEClearBits(BIT_7|BIT_13); //***************************************// //*********ROUTINE PRINCIPALE************// //***************************************// while (1) { USBTasks(); mINT1IntEnable(0); mT45IntEnable(0); Comando[10]=0; while (C==0) { USBTasks(); //C=0 sequenza non eseguita C=1 sequenza eseguita /* Inizio prima connessione fra PIC32 e Visual Basic : Il pic aspetta un carattere da VB, se tale carattere è "c" (0x63) il pic risponde inviando "X" (0x58). Finchè tale processo non è completo (finchè c=0) il firmware rimane congelato in tale processo. */ if (USBUSARTRxIsReady()) { USBUSARTRx(Comando, 11); } if ( Comando[10]==1 ) //Ricevi il comando di configurazione // se comando[10]=1 38 { Risposta[0]=0x59; USBUSARTTx(Risposta, 1); C=1; configurazione } } //Rispondi con "Y" //esci da subroutine di //******SEQUENZA DI CONFIGURAZIONE DEL SISTEMA*******// limit=Comando[0]; gain=Comando[1]; offset=Comando[2]; thresh=Comando[3]; clock=Comando[4]; base=Comando[5]; slope=Comando[6]; mode=Comando[7]; pretrig=((Comando[8])<<8) | Comando[9]; //Configuro il multiplexer del limitatore; mPORTAClearBits(BIT_3|BIT_4|BIT_5); if (limit==0) mPORTAClearBits(BIT_3|BIT_4|BIT_5); if (limit==1) mPORTASetBits(BIT_3); //Configuro il potenziometro digitale del Guadagno mPORTAToggleBits(BIT_0); SpiChnPutC(2, 0b00010001 ); SpiChnPutC(2, gain); for (d=1; d<=90;d++) { //delay } mPORTAToggleBits(BIT_0); //Configuro il potenziometro dell'offset mPORTAToggleBits(BIT_1); SpiChnPutC(2, 0b00010001 ); SpiChnPutC(2, offset); for (d=1; d<=90;d++) { //delay } mPORTAToggleBits(BIT_1); //Configuro il potenziometro digitale del threshold mPORTAToggleBits(BIT_2); SpiChnPutC(2, 0b00010001 ); SpiChnPutC(2, thresh); for (d=1; d<=90;d++) { //delay 39 } mPORTAToggleBits(BIT_2); //Configuro il divisore del clock del contatore indirizzi if (clock==0)clockdiv=1; if (clock==1)clockdiv=3; if (clock==2)clockdiv=7; if (clock==3)clockdiv=19; if (clock==4)clockdiv=39; if (clock==5)clockdiv=79; if (clock==6)clockdiv=199; if (clock==7)clockdiv=399; if (clock==8)clockdiv=799; if (clock==9)clockdiv=1999; if (clock==10)clockdiv=3999; if (clock==11)clockdiv=7999; if (clock==12)clockdiv=19999; if (clock==13)clockdiv=39999; //Frequenza di campionamento //20MHz //10MHz //5Mhz //2MHz //1MHz //500kHz //200kHz //100kHz //50kHz //20kHz //10kHz //5kHz //2kHz //1kHz //Configuro il divisore del timer del tempo di misura //Tempo di misura if (base==0)basediv=39; // 500ns if (base==1)basediv=79; // 1us if (base==2)basediv=159; // 2us if (base==3)basediv=399; // 5us if (base==4)basediv=799; // 10us if (base==5)basediv=1599; // 20us if (base==6)basediv=3999; // 50us if (base==7)basediv=7999; / / 100us if (base==8)basediv=15999; // 200 us if (base==9)basediv=39999; // 500us if (base==10)basediv=79999; // 1ms if (base==11)basediv=159999; // 2ms if (base==12)basediv=399999; // 5ms if (base==13)basediv=799999; // 10ms if (base==14)basediv=1599999; // 20ms if (base==15)basediv=3999999; // 50ms if (base==16)basediv=7999999; // 100ms if (base==17)basediv=15999999; // 200ms if (base==18)basediv=39999999; // 500ms if (base==19)basediv=79999999; // 1s if (base==20)basediv=159999999; // 2s if (base==21)basediv=399999999; // 5s if (base==22)basediv=799999999; // 10s Base dei tempi 50ns/div 100ns/div 200ns/div 500ns/div 1us/div 2us/dIv 5us/div 10us/div 20us/div 50us/div 100us/div 200us/div 500us/div 1ms/div 2ms/div 5ms/div 10ms/div 20ms/div 50ms/div 100ms/div 200ms/div 500ms/div 1s/div //Configuro il selettore di slope if (slope==0)mPORTASetBits(BIT_6); if (slope==1) mPORTAClearBits(BIT_6); 40 //******************************// //******ROUTINE DI MISURA****// //******************************// //*****INIZIO CONFIGURAZIONE SISTEMA******// //Porta indirizzi settata come input (alta impedenza) mPORTBSetPinsDigitalIn(BIT_0|BIT_1|BIT_2|BIT_3|BIT_4|BIT_5|BIT_6|BIT_7|BIT_8|BIT_9|BIT_10|BIT_11| BIT_12|BIT_13|BIT_14|BIT_15); mPORTESetPinsDigitalIn(BIT_9); mPORTAClearBits(BIT_7); mPORTCSetBits(BIT_14); //Set flip flop. //Z su buffer ADC uscite disabilitate //RAM in Scrittura mPORTCClearBits(BIT_1); mPORTEClearBits(BIT_6); mPORTCSetBits(BIT_4); mPORTCSetBits(BIT_2); // Z su latch uscite disabilitate mPORTEClearBits(BIT_5); mPORTCClearBits(BIT_3); //Tolgo Z su contatore uscite abilitate //Azzero Contatore //Configuro il clock dell ADC (Timer2) e il clock della RAM (Timer3) OpenTimer3(T3_ON|T3_PS_1_1, clockdiv); OpenTimer2(T2_ON|T2_PS_1_1, 0x1); OpenOC1(OC_ON |OC_TIMER2_SRC |OC_CONTINUE_PULSE, 0x0 , 0x0); OpenOC2(OC_ON |OC_TIMER3_SRC |OC_CONTINUE_PULSE, 0x0, 0x0); WriteTimer23(0); //Parte il clock... mPORTCClearBits(BIT_14); mPORTCSetBits(BIT_3); //tolgo Z su buffer ADC uscite abilitate //Parte il contatore //Configurazione interrupt mINT1ClearIntFlag(); mT45ClearIntFlag(); mINT1SetIntPriority( 2); mT45SetIntPriority(3); mINT1SetEdgeMode (0); INTEnableSystemMultiVectoredInt(); intpre=floor(pretrig*basediv/(65535)); di pretrigger //intpre : numero compreso fra 0 e basediv, è il moltiplicatore del timer //Configurazione modalità di misura (0:free run ;1:repeat; 3:One shot) //Se modalità è repeat o free run abilita timer di pretrigger if (mode==1||mode==2) { if (intpre>0x0385) //se pretrigger è maggiore di 901 abilita interrupt sul timer45 e apri timer45 { tic=0; mT45IntEnable(1); OpenTimer45 (T4_ON|T4_PS_1_1|T4_32BIT_MODE_ON, intpre); } 41 else { //altrimenti periodo di pre-trigger è 901 tic=0; mT45IntEnable(1); OpenTimer45 (T4_ON|T4_PS_1_1|T4_32BIT_MODE_ON, 0x0385); } } if (mode==0) //Se modalità è free run abilita il timer di posttrigger { intpre=0; tic=1; mT45IntEnable(1); OpenTimer45 (T4_ON|T4_PS_1_1|T4_32BIT_MODE_ON, basediv); } M=0; Comando[10]=0; //***************************************// //****INIZIO SEQUENZA DI TEMPO VIVO***// //***************************************// //Finchè M=0 attendi interrupt di fine misura (interrupt di timer45 con tic=1) e tieni sveglia la connessione USB //attraverso USBTasks() //oppure attendi comando di aggiornamento while (M==0) { USBTasks(); if (USBUSARTRxIsReady()) USBUSARTRx(Comando,11); if (Comando[10]==1 ) //Se Comando[10]=1 { M=1; I=1; C=1; //Esci da subroutine di tempo vivo //non entrare in subroutine di scaricamento e invio dati //Riconfigura Sistema } } /*************************************************************/ /*****************INIZIO SEQUENZA DI STOP*********************/ /*************************************************************/ //RAM in LETTURA mPORTDSetBits(BIT_1); mPORTCClearBits(BIT_4); mPORTESetBits(BIT_6); //Chiudo output compare CloseOC1(); CloseOC2(); //Chiudo Timer 42 CloseTimer2(); CloseTimer3(); CloseTimer45(); mPORTCSetBits(BIT_14);// Z su buffer ADC uscite disabilitate mPORTESetBits(BIT_5); //Z su contatore uscite disablitate mPORTCClearBits(BIT_2); // Z su latch uscite abilitate stop=(basediv+1)/(2*(clockdiv+1)); // stop: numero di campioni totali pre_ad=floor(intpre/(2*(clockdiv+1))); //numero di campioni presenti nell'intervallo di pretrigger //Se modalità è repeat o one shot leggi indirizzo a cui è arrivato evento di trigger dalla latch if (mode==1||mode==2) trig_ad=(mPORTBReadBits(BIT_0|BIT_1|BIT_2|BIT_3|BIT_4)+ ((mPORTBReadBits(BIT_6|BIT_7|BIT_8|BIT_9|BIT_10|BIT_11|BIT_12|BIT_13|BIT_14|BIT_15))>>1)+ ((mPORTEReadBits(BIT_9))<<6)); else trig_ad=10; //altrimenti l' indirizzo è 10 mPORTCSetBits(BIT_2);//Z su latch uscite disabilitate //Porta indirizzi output mPORTBSetPinsDigitalOut(BIT_0|BIT_1|BIT_2|BIT_3|BIT_4|BIT_5|BIT_6|BIT_7|BIT_8|BIT_9|BIT_10| BIT_11|BIT_12|BIT_13|BIT_14|BIT_15); mPORTESetPinsDigitalOut(BIT_9); //se indirizzo di pretrigger cade sotto lo zero scala l'indirizzo da 0xffff if (trig_ad<pre_ad) start_ad=65535-(pre_ad-trig_ad); else start_ad=trig_ad-pre_ad; Richiesta[0]=0; /********************************************************************************/ /*************SEQUENZA DI SCARICAMENTO RAM E INVIO DATI AL PC**************/ /********************************************************************************/ while (I==0) { i=0; for (i=0;i<=stop-1;i++) { USBTasks(); if ((i+start_ad)<=0xffff) //se i+start_ad <=65535 { //indirizza la RAM LATB=((i+start_ad)&0x001f)+(((i+start_ad)&0x7fe0)<<1); //se il bit 15 dell' indirizzo è a livello logico alto, accendi bit 9 di PORTE if(((i+start_ad)&0x8000)== 0x8000) mPORTESetBits(BIT_9); else mPORTEClearBits(BIT_9); //altrimenti spegnilo } else //se i+start_ad > 65535 ovvero maggiore della dimensione massima della RAM { //scala l'indirizzo da 65535 LATB=(((i+start_ad)-65536)&0x001f)+((((i+start_ad)-65536)&0x7fe0)<<1); //se il bit 15 dell' indirizzo è a livello logico alto, accendi bit 9 di PORTE 43 if ((((i+start_ad)-65536)&0b100000)==0b100000) mPORTESetBits(BIT_9); else mPORTEClearBits(BIT_9); //altrimenti spegnilo } if (j==0) //se j=0 è l'inizio del pacchetto { if (stop<2047) //se il numero di pacchetti è minore di 4096/2 { Data[j]=((2*stop)&0xff00)>>8; //salva il byte alto della dimensione del pacchetto j++; Data[j]=(2*stop)&0x00ff; //salva il byte basso della dimensione del pacchetto j++; } else { last_pkt_sz=((2*stop)-(4094*q)); if (last_pkt_sz>4094) { //dimensione dell' ultimo pacchetto inviato //se la dimensione dell'ultimo pacchetto è maggiore di 4094 Data[j]=0x10; j++; Data[j]=0x00; j++; q++; //salva sui primi due byte il valore 0x1000=4096 } else //Altrimenti salva la dimensione dell'ultimo pacchetto { Data[j]=(last_pkt_sz&0xff00)>>8; j++; Data[j]=(last_pkt_sz&0x00ff); j++; } } } //leggi e salva il bytedei dati alto dalla ram Data[j]=(mPORTDReadBits(BIT_10|BIT_11|BIT_12|BIT_13|BIT_14))>>10; j++; //leggi e salva il byte dei dati basso dalla ram Data[j]=(mPORTDReadBits(BIT_2|BIT_3|BIT_4|BIT_5|BIT_6|BIT_7|BIT_8|BIT_9))>>2; j++; S=0; R=0; if (j==4096) { //Se la dimensione del pacchetto ha raggiunto 4096 invia while (S==0) { USBTasks(); if (USBUSARTTxIsReady()) { USBUSARTTx(Data, j); S=1; } } //finchè il pacchetto non è stato inviato (S=0) //invia pacchetto 44 //************Attesa risposta da Visual Basic***************// while (R==0) { //finchè il carattere di risposta da visual basic non è stato ricevuto (R=0) USBTasks(); if (USBUSARTRxIsReady()) { USBUSARTRx(Richiesta, 1); R=1; j=0; } //Ricevi carattere } } S=0; if (i==stop-1) { //se lo scaricamento è giunto all'ultimo campione invia pacchetto while (S==0) { USBTasks(); if (USBUSARTTxIsReady()) { USBUSARTTx(Data, j); S=1; } } j=0; q=0; } S=0; } I=1; C=0; S=0; } } } 45 2.4 L'interfaccia grafica Per consentire una corretta visualizzazione ed elaborazione dei dati provenienti dal dispositivo sono state realizzate due interfacce grafiche in Visual basic 6. La prima è un interfaccia di visualizzazione del segnale molto simile alle interfacce grafiche degli oscilloscopi digitali presenti in commercio. Questa interfaccia ci permette di selezionare fra le opzioni: -fondoscala : da ± 100mV a ± 20V -frequenza di campionamento: da 1 kSample/s a 20 MSamples/s -base dei tempi :da 50 ns/divisione fino a 5 s/divisione -slope: positivo o negativo -modalità di misura: Free run, repeat o one shot -Tensione di soglia del trigger e intervalli di pre-trigger e post-trigger : selezionabili attraverso il posizionamento del punto arancione sullo schermo E' possibile salvare i dati in ingresso su un file di testo attraverso la casella di spunta “Log data” E' presente l'interfaccia avanzata che consente la taratura dello strumento e dei fondoscala personalizzati. E' inoltre possibile Eseguire misurazioni di frequenza, minimo e massimo della schermata e salvare i dati su un file di testo attraverso le apposite caselle di spunta 46 La seconda interfaccia consente di analizzare segnali di tipo impulsivo . La sua applicazione principale è quella di calcolare l'ampiezza degli impulsi provenienti da uno spettrometro e di disegnare l'istogramma relativo allo spettro della sorgente esaminata. Come l'interfaccia precedente è possibile selezionare i fondoscala, la base dei tempi, la tensione di soglia del trigger e lo slope. A differenza della prima interfaccia è presente la finestra dello spettro in cui possiamo : -selezionare il numero di canali -azzerare l'istogramma -scegliere fra spettro realizzato con i dati reali o con i dati interpolati -salvare i dati dell'istogramma in un file per successive elaborazioni. Questa interfaccia è capace di calcolare l'interpolazione dell'impulso con i metodi visti in 1.3 . Affinchè l'interpolazione risulti il più fedele possibile ai dati misurati occorre introdurre nelle apposite caselle di testo i parametri di tempo di salita e tempo di discesa. Tali parametri dipendono dal rivelatore utilizzato . 47 2.5 Il protipo e il circuito stampato Il prototipo Illustrazione 21: Il prototipo Il prototipo è stato realizzato su millefori usando una sorta di routing manuale . Sfruttando la griglia da 2,54mm propria della millefori ho impostato tutte le piste usando del filo di rame nudo . Questo ha permesso di ridurre al minimo il numero di collegamenti “volanti” minimizzando così i rumori e le capacità parassite. Questo accorgimento ha permesso di rendere il prototipo un valido strumento per il debug e la taratura del circuito . Il circuito stampato Il progetto del circuito stampato è stato realizzato con Orcad Layout plus . Il routing delle piste è stato sviluppato manualmente . L'architettura della scheda è a 4 layer. I due layer interni sono stati 48 destinati al passaggio delle piste di ground e delle piste di alimentazione. Sul layer più vicino al TOP passano le linee di ground digitale e ground analogico. Sul layer più vicino al BOTTOM passano le linee di 3,3V digitale, 3,3V analogico, 5V digitale, 5 V analogico e – 5V analogico. Per tutti i layer è stato previsto il copper pour, ovvero tutto lo spazio che non è attraversato da piste è ricoperto da uno strato di rame che è connesso a ground . Precisamente, la zona della scheda che è stata destinata alla sezione di amplificazione (la zona in alto a sinistra) è stata riempita con uno strato di rame connesso al ground analogico. La parte restante è stata connessa al ground digitale. Questo ha permesso di rendere minimi i rumori provenienti dall'esterno . Illustrazione 22: Il layout del circuito stampato 49 Illustrazione 23: Il circuito stampato 50 CAPITOLO 3 Taratura del dispositivo Come ogni strumento di misura questo dispositivo ha bisogno di un accurata taratura. Lo scopo finale della taratura di questo strumento è quello di portare il segnale per ognuno dei fondoscala ad occupare la “finestra di massima risoluzione” .La finestra di massima risoluzione corrisponde alla finestra di conversione dell ADC che è costituita dall'intervallo di tensioni che vanno da 0,5V a 1,5V. Per ottenere tale intervallo il segnale uscente dall'amplificatore di guadagno U11 deve avere un ampiezza di 1V da picco a picco e un offset nullo. Il procedimento di taratura si divide in tre fasi: -Taratura dei fondoscala -Taratura della banda passante -Taratura del trigger Il Procedimento di taratura del dispositivo richiede l'utilizzo di: -Un generatore di funzioni -Un oscilloscopio -Un cacciavite di precisione in plastica. 3.1 Taratura dei fondoscala La taratura dei fondoscala va eseguita in piena banda passante. Dobbiamo cioè assicurarci di tarare lo strumento con segnali che hanno un frequenza lontana dalla frequenza di taglio del circuito di preamplificazione. Per questo motivo la taratura dei fondoscala va eseguita con segnali aventi frequenze nell'ordine delle decine di kiloHertz. Taratura dell'offset del buffer : I due fet, insieme al transistor formano un partitore di tensione controllato in tensione. La resistenza a terra RV1 regola la tensione minima che il buffer può erogare. La resistenza dinamica fra source e drain di un fet è un parametro che in fase di fabbricazione del dispositivo non può essere previsto. Per questo motivo tale importante parametro può essere ricavato dal datasheet a patto che si preveda una larga tolleranza. Si può evitare questo problema scegliendo casualmente due fet e regolando la resistenza variabile RV1 in maniera tale che qualunque sia il range di variazione della resistenza dinamica possiamo comunque regolare la tensione minima erogabile dal buffer . Procedimento : 1. Impostare il generatore di funzioni in maniera tale da avere in uscita un segnale sinusoidale con un ampiezza di 2 Vda picco a picco con offset nullo (± 1V) e una frequenza attorno ai 100kHz 51 2. Collegare il dispositivo alla porta USB 3. Aprire l'interfaccia grafica (Pai_Scope.exe) 4. Selezionare l'opzione “Advanced Interface” in basso a sinistra e inserire il valore 1 nella casella “Attenuation” (attenuazione 1x) 5. Posizionare la sonda dell'oscilloscopio all'uscita del buffer ovvero sul pin 3 di Q1 6. Regolare il trimmer con il cacciavite di precisione finchè sull'oscilloscopio non vediamo l'onda sinusoidale perfettamente centrata attorno allo zero. In questo modo ci assicuriamo che il buffer non aggiunga nessun offset al segnale in ingresso. Taratura dell' offset dell'amplificatore di guadagno. Come ho già scritto in precedenza i potenziometri digitali mcp41050 non accettano tensioni minori di zero. E' necessario quindi aggiungere un offset al segnale in maniera tale all' uscita dell'inseguitore di tensione U8 ci sia sempre una tensione maggiore o uguale a zero per qualsiasi segnale si presenti all'ingresso. Grazie al trimmer R2 è possibile rimuovere l'offset aggiunto nel precedente stadio. Si tratta comunque di una regolazione permanente, quindi la taratura di tale trimmer va fatta tenendo conto della massima tensione in ingresso all'amplificatore di guadagno ovvero 1V da picco a picco. Procedimento: 1. Impostare il generatore di funzioni in maniera tale da avere in uscita un segnale sinusoidale con un ampiezza di 4 V da picco a picco con offset nullo (± 2V) e una frequenza attorno ai 100kHz 2. Collegare il dispositivo alla porta USB 3. Aprire l'interfaccia grafica (Pai_Scope.exe) 4. Selezionare l'opzione “Advanced Interface” in basso a sinistra 5. inserire nella casella “Attenuation” il valore 1, nella casella “gain” il valore 250 e nella casella “offset” il valore 243. (Tali valori derivano dalla taratura di una scheda campione e potrebbero essere diversi per un altra scheda) 6. Posizionare la sonda dell'oscilloscopio all'uscita dell'inseguitore di tensione ovvero sul pin 6 di U8 7. Assicurarsi che sul pin 6 di U8 ci sia una tensione compresa fra 0V e 1V Se sono presenti tensioni minori di zero ripetere dal punto 5. sostituendo al valore 243 un numero minore. 8. Posizionare la sonda dell'oscilloscopio all'uscita dell amplificatore di guadagno ovvero sul pin 6 di U11. 9. Assicurarsi che sul pin 6 di U11 ci sia una tensione con un ampiezza da picco a picco di 1V Se è presente un segnale con ampiezza diversa sostituire il valore nella casella “gain” tenendo conto del fatto che valori più bassi causano un aumento del guadagno e valori più alti causano una diminuzione del guadagno 10. Regolare il trimmer R18 finchè il segnale non ricopre completamente tutto lo spazio disponibile nella finestra dell'interfaccia grafica. 52 Taratura dei fondoscala La taratura dei fondoscala viene eseguita a partire dal fondoscala più basso ovvero ±100mV. La regolazione del trimmer R15 in parallelo con il potenziometro digitale U10 ci permette di rendere più continua la scelta dei guadagni . Difatti la scelta della resistenza in serie dell'amplificatore invertente è piuttosto critica per guadagni elevati. Procedimento: 1. Impostare il generatore di funzioni in maniera tale da avere in uscita un segnale sinusoidale con un ampiezza di 200mV da picco a picco con offset nullo (± 100mV) e una frequenza attorno ai 100kHz. 2. Collegare il dispositivo alla porta USB 3. Aprire l'interfaccia grafica (Pai_Scope.exe) 4. Selezionare l'opzione “Advanced Interface” in basso a sinistra 5. inserire nella casella “Attenuation” il valore 0, nella casella “gain” il valore 7 e nella casella “offset” il valore 49 .(Tali valori derivano dalla taratura di una scheda campione e potrebbero essere diversi per un altra scheda) 6. Selezionare le caselle di spunta Max Voltage e Min Voltage, in questo modo sarà più semplice misurare il massimo e il minimo dell'onda. 7. Regolare il trimmer R15 finchè il segnale non ricopre completamente tutto lo spazio disponibile nella finestra dell'interfaccia grafica . 8. Potrebbe essere necessario regolare i valori di offset nell'interfaccia grafica . Nel caso in cui il valore consigliato produca la visualizzazione dell' onda con un offset diverso da zero, modificare il valore di “offset” e ripetere dal punto 7 9. Prendere nota dei valori di Attenuation, gain e offfset Una volta che il fondoscala minimo è stato tarato si può procedere alla taratura di tutti i fondoscala superiori, fino a 2V. Semplicemente si imposta il generatore di funzione affinchè produca un segnale con picchi che toccano gli estremi del fondoscala (± 200mV, ± 500mV, ± 1V, ± 2V) e si modificano i valori di “Attenuation”, “Gain” e “offset” finchè l'onda non ricopre perfettamente la finestra di visualizzazione. Per semplificare questa procedura, la seguente tabella riporta i valori da me trovati durante la taratura della scheda campione Attenuation Gain Offset ± 100mV 0 7 49 ± 200mV 0 15 62 ± 500mV 0 41 92 ± 1V 0 96 148 ± 2V 1 250 243 Prima di poter tarare i fondoscala da ±5V a ±20V è necessario eseguire la taratura della banda passante 53 3.2 Taratura della banda passante Per poter misurare tensioni con ampiezze maggiori di 4V da picco a picco è necessario attenuare il segnale. Il partitore di tensione formato dalla resistenza da 900k e dalla resistenza da 100k provvede ad un' attenuazione di 10 volte . Tale circuito però impone un decadimento della frequenza di taglio a causa dell'elevata resistenza in serie da 900k Difatti tale resistenza, unita alla capacità fra Gate e source del fet forma un circuito RC passa basso: = La frequenza di taglio di tale circuito si può calcolare dalla formula: f= 1 2RC Sostituendo i valori di 900k e 10pF si ottiene una frequenza di taglio (-3dB) di circa 18 kHz Per evitare questo problema si ricorre alla tecnica della compensazione . Ad una decremento della banda passante si contrappone un incremento della bande di ordine uguale. Per fare ciò si unisce al circuito passa basso visto sopra un circuito RC passa alto in questo modo: Illustrazione 24: Funzionamento di un compensatore La compensazione risulta ottimale quando il prodotto R S ·CS e il prodotto RP ·CP sono uguali. La compensazione può essere eseguita grazie al condensatore variabile C46 . 54 Illustrazione 25: Banda passante sovracompensata Se il prodotto RS ·CS è maggiore del prodotto RP ·CP la compensazione risulta eccessiva .La banda passante che si ottiene in questo caso è di questo tipo: Questo esempio è stato ottenuto tramite una simulazione su “Circuit maker” usando questi valori: – RS = 900kΩ – RP = 100kΩ - CS = 5pF - CP = 20pF - RS ·CS = 4,5 μs - Rp·Cp = 2 μs Se invece il prodotto RS ·CS è minore del prodotto RP ·CP la compensazione sarà insufficiente .La banda passante che si ottiene in questo caso è di questo tipo: Illustrazione 26: Banda passante sottocompensata – RS = 900kΩ – RP = 100kΩ - CS = 5pF - CP = 60pF - RS ·CS = 4,5 μs - Rp·Cp = 6 μs Esiste un metodo semplice per tarare la banda passante senza dover ricorrere alla misura della capacità del condensatore C46. Tale metodo consiste nel misurare un' onda quadra con frequenza prossima alla frequenza di taglio del circuito passa basso e regolare il condensatore variabile C46 finchè non si ottiene la minima distorsione armonica possibile. Infatti nel caso in cui la compensazione sia eccessiva vedremo le caratteristiche sovraelongazioni causate dall'enfatizzazione delle armoniche superiori dell'onda quadra: 55 Illustrazione 27: Effetto di una compensazione eccessiva (CP = 60pF) in un onda quadra a 10kHz Nel caso in cui la compensazione sia insufficiente noteremo delle sottoelongazioni di questo tipo: Illustrazione 28: Effetto di una compensazione insufficiente (CP = 20pF) in un onda quadra a 10kHz Per tarare correttamente la banda passante si deve seguire la seguente procedura: 1. Impostare il generatore di funzioni in maniera tale da avere in uscita un onda quadra con un ampiezza di 10V da picco a picco con offset nullo (± 5V) e una frequenza attorno ai 10kHz. 2. Collegare il dispositivo alla porta USB 3. Aprire l'interfaccia grafica (Pai_Scope.exe) 4. Impostare la base dei tempi su 50μs/div 5. Selezionare l'opzione “Advanced Interface” in basso a sinistra 6. inserire nella casella “Attenuation” il valore 1, nella casella “gain” il valore 42 e nella casella “offset” il valore 95 .(Tali valori derivano dalla taratura di una scheda campione e potrebbero essere diversi per un altra scheda) 7. Regolare il condensatore varibile servendosi del cacciavite di precisione in plastica finchè sulla finestra di visualizzazione non appare un onda quadra “pulita”, senza cioè sovraelongazioni o sottoelongazioni. N.B. Utilizzare un cacciavite in plastica facilita enormemente la taratura . Se utilizzassimo un cacciavite metallico altereremmo la capacità del condensatore variabile . Difatti in questo caso alla capacità del condensatore verrebbe sommata la capacità del corpo umano che si aggira attorno alle decine di picoFarad. 56 Una volta tarata la banda passante occorre tarare i fondoscala restanti (± 5V, ± 10V e ± 20V ) .La procedura è la stessa utilizzata per tarare i fondoscala precedenti, l'unica differenza è che il segnale è attenuato di 10 volte . Questo implica che i parametri di guadagno e offset dei fondoscala ± 5V, ± 10V e ± 20V siano uguali rispettivamente ai parametri dei fondoscala ± 500mV, ± 1V e ± 2V. Ovviamente questo è vero a patto che si prevedano i giusti errori dovuti alle tolleranze di resistenze e condensatori. In ogni caso riporto i valori ottenuti durante la taratura della scheda campione. Attenuation Gain Offset ± 5V 1 42 95 ± 10V 1 96 151 ± 20V 1 252 246 Una volta noti tutti i valori di “Attenuation”, “Gain” e “offset” per ogni fondoscala è possibile salvarli in maniera permanente aggiungendo tali valori nel codice sorgente dell'interfaccia grafica. Tali valori vanno aggiunti nel Form_Load(): Private Sub Form_Load() ' associazione array limit(0) = 0 gain(0) = 7 offset(0) = 49 limit(1) = 0 gain(1) = 15 offset(1) = 62 limit(2) = 0 gain(2) = 41 offset(2) = 92 limit(3) = 0 gain(3) = 96 offset(3) = 148 limit(4) = 0 gain(4) = 250 offset(4) = 243 limit(5) = 1 gain(5) = 42 offset(5) = 95 limit(6) = 1 gain(6) = 96 offset(6) = 151 limit(7) = 1 gain(7) = 252 offset(7) = 246 ….. ….. 57 3.3 Taratura del circuito di trigger La taratura del circuito di trigger si articola in due fasi: -Taratura dell'intervallo di variazione della tensione di soglia -Taratura dell' isteresi Taratura dell'intervallo di variazione della tensione di soglia La taratura dell'intervallo di variazione ci permette di trovare il valore minimo e il valore massimo per cui il circuito di trigger scatta . Procedimento: 1. Impostare il generatore di funzioni in maniera tale da avere in uscita un onda sinusoidale con un ampiezza di 2V da picco a picco con offset nullo (± 1V) e una frequenza attorno ai 100kHz. 2. Collegare il dispositivo alla porta USB 3. Aprire l'interfaccia grafica (Pai_Scope.exe) 4. Selezionare l'opzione “Advanced Interface” in basso a sinistra 5. Inserire nella caselle “Attenuation”, “gain” e “offset” il valori trovati durante la taratura del fondoscala ± 1V. 6. Selezionare la casella di spunta “Enable” accanto alla casella “Threshold” 7. inserire il valore 45 nella casella “Threshold” (Tali valori derivano dalla taratura di una scheda campione e potrebbero essere diversi per un altra scheda) 8. Se il circuito di trigger scatta verrà stampata sulla finestra di visualizzazione l' onda relativa al trigger che è appena scattato. Se la frequenza di aggiornamento è sufficientemente veloce Significa che è possibile abbassare ulteriormente la tensione di soglia ripetendo dal punto 7 e inserendo un valore più basso nella casella threshold. Se invece la schermata viene aggiornata con una frequenza che si aggira attorno a una schermata al secondo significa che il trigger scatta occasionalmente in presenza di fluttuazioni della tensione massima .In questo caso il valore di “Threshold” deve essere aumentato. 9. Prendere nota del valore minimo per cui il trigger scatta in maniera adeguata 10. Ripetere dal punto 7 inserendo nella casella “Threshold” il valore 215 11. Prendere nota del valore massimo per cui il trigger scatta in maniera adeguata tenendo in considerazione gli stessi criteri utilizzati al punto 8 Una volta noti i valori minimo e massimo, si può rendere permanente la taratura sostituendo tali valori nel codice sorgente dell' interfaccia grafica . Tali valori vanno sostituiti a thresh_min e thresh_max nel Form_Load() Private Sub Form_Load() ' associazione array …. …. …. thresh_max = 215 thresh_min = 45 …. …. 58 Taratura dell'istersesi: Il trimmer R31 ci permette di regolare l'isteresi del comparatore . La taratura di questo parametro è importante se vogliamo evitare falsi scatti del trigger . Ponendo la resistenza individuata da R31 a zero si può notare che l'onda stampata sulla finestra di visualizzazione “scatta” in orizzontale di mezzo periodo d'onda .Questo inconveniente si manifesta a causa del rumore di fondo .Infatti nel caso in cui lo slope sia positivo, nella fase discendente dell'onda, la tensione scende al di sotto della soglia ma può accadere che un piccolo rumore faccia risalire la tensione al di sopra di essa causando lo scatto del circuito di trigger nonostante la pendenza media in quel tratto di curva sia negativa. L'aggiunta dell' isteresi ci permette di rendere il comparatore insensibile al rumore. Procedimento: 1. Impostare il generatore di funzioni in maniera tale da avere in uscita un onda sinusoidale con un ampiezza di 2V da picco a picco con offset nullo (± 1V) e una frequenza attorno ai 100kHz. 2. Collegare il dispositivo alla porta USB 3. Aprire l'interfaccia grafica (Pai_Scope.exe) 4. selezionare la modalità di misura “Repeat” dalla combo box in basso a sinistra 5. Regolare il trimmer finchè l'onda nella finestra di visualizzazione non rimane stabile. Può succedere che dopo la taratura dell'isteresi sia necessario tarare nuovamente l'intervallo della tensione di soglia . E' consigliabile quindi di regolare la finestra di isteresi affinchè la dimensione di questa sia più piccola possibile. 3.4 Taratura dei fondoscala personalizzati L'interfaccia avanzata, oltre alla taratura iniziale dello strumento, ci consente di aggiungere dei fondoscala personalizzati, utili in applicazioni in cui i fondoscala classici sono inadeguati. Nel caso della spettroscopia abbiamo spesso a che fare con impulsi unipolari, ovvero con segnali che non superano mai i zero volt. Misurare Questi impulsi con i fondoscala di default che sono bipolari, comporta un errore sistematico che riguarda la risoluzione dello strumento. Difatti se usiamo i fondoscala di default per misurare tali impulsi stiamo utilizzando solamente metà della finestra di conversione analogico-digitale. Questo implica che anziché convertire il segnale con una risoluzione di 1/4095, lo stiamo convertendo con una risoluzione di 1/2042, cioè la metà. Abbassare la risoluzione dello strumento nel campo della spettroscopia significa diminuire il numero di canali dello spettrometro . Il procedimento di taratura dei fondoscala personalizzati è identico alla taratura dei fondoscala di default . L'unica differenza sta nel fatto che anziché sostituire i valori di “Attenuation”, “Gain” e “Offset” nel codice sorgente, possiamo salvare tali valori in un file di configurazione (cfg.txt) permanente. Tale configurazione sarà disponibile anche dopo la chiusura e la riapertura dell' interfaccia grafica. 59 Procedimento: 1. Impostare il generatore di funzioni in maniera tale da avere in uscita un onda che rispecchia esattamente (in termini di ampiezza offset, frequenza e forma d'onda) il segnale che vogliamo misurare. 2. Modificare i valori di “Attenuation”, “Gain” e “Offset” nell' interfaccia avanzata finchè l'onda non ricopre completamente tutta la finestra di visualizzazione. 3. Premere uno dei tasti “Save” accanto a uno slot vuoto. Se si sceglie uno slot con una configurazione preesistente tale configurazione verrà sovrascritta. 4. Scegliere un nome per il fondoscala e impostare la tensione minima, la tensione massima e la dimensione del fondoscala . CAPITOLO 4 Un'applicazione : Misura di spettri di sorgenti monocromatiche e taratura in energia di un rivelatore con scintillatore NaI(Ti) 4.1 introduzione Il dispositivo è stato utilizzato per misurare lo spettro di alcune sorgenti che emettono fotoni γ monocromatici . Precisamente: -60Co -137Cs -226Ra -241Am Grazie a queste sorgenti siamo in grado di effettuare la taratura in energia del rivelatore utilizzato .Questa procedura consiste nel analizzare gli spettri di sorgenti note, prestando particolare attenzione ai picchi monocromatici detti fotopicchi. Tali picchi appaiono, a causa della natura probabilistica dei meccanismi di rivelazione dei fotoni monocromatici, come delle distribuzioni gaussiane centrate attorno ad un valore che corrisponde all'energia del γ monocromatico emesso da tali sorgenti. Il procedimento che si segue per misurare l'energia di tali decadimenti consiste nel misurare lo spettro della sorgente, ricavare i dati che corrispondono al fotopicco, interpolare il fotopicco con una Gaussiana, calcolare il valor medio e la deviazione standard di tale Gaussiana. Il valor medio corrisponde al canale in cui è più probabile trovare il fotopicco, mentre la deviazione standard ci permette di ricavare l'incertezza relativa a tale valore. Una volta trovato il canale corrispondente al fotopicco della sorgente in esame si associa ad esso il valore in energia tabulato sui manuali dei radionuclidi. Successivamente si ripete lo stesso procedimento sostituendo la sorgente con un'altra che abbia il fotopicco centrato su una energia differente. 60 Una volta ricavati i valori medi e le deviazioni standard per un buon numero di sorgenti si può disegnare un grafico canali-energia. Da tale grafico si ricava la legge di conversione fra canali dello spettroscopio ed energia corrispondente. Nei rivelatori a scintillatore NaI questa legge è di tipo lineare sopra le centinaia di keV . Al di sotto dei 100keV invece, presenta un andamento sovralineare. In alcuni casi non è possibile interpolare una Gaussiana con i picchi rivelati in quanto tali picchi si sovrappongono . Il 226Ra è un tipico esempio in quanto presenta quattro picchi ravvicinati a 352, 295, 241 e 186 keV le cui distribuzioni si sovrappongono. In questi casi l' alternativa più semplice è trovare il valor medio del picco trovando il canale in cui il numero di conteggi è maggiore. In questa esperienza verrà calcolata a titolo di esempio l'interpolazione del fotopicco del 137Cs Una volta nota la legge di conversione canali-energia si possono convertire tutti gli spettri misurati in termini di canali e conteggi, in spettri aventi sulle ascisse l'energia e sulle ordinate i conteggi . Per questo lavoro di tesi non verrà utilizzata l'interpolazione dell'impulso descritta precedentemente ma verranno utilizzati i dati puri. Questo permetterà di dimostrare fedelmente le potenzialità del dispositivo da me realizzato. Il calcolo dell'ampiezza viene svolto in maniera moto semplice. Per ogni schermata viene calcolato il massimo e il minimo dell'impulso con il seguente algoritmo: for r=0 to (Data_lenght/2)-1 If r = 0 Then min_data = Data_val End If If Data_val < min_data Then min_data = Data_val End If ' Data lenght è il numero totale di byte della schermata 'Data_val è il numero a 12 bit proveniente dall'ADC If r = 0 Then max_data = Data_val End If If Data_val > max_data Then max_data = Data_val End If Next r All'uscita di questa routine avremo min_data e max_data che corrispondono al minimo e al massimo dell'impulso misurato. Il valore assoluto della differenza di questi valori ci dà l'ampiezza dell'impulso. 61 4.2Apparato sperimentale 1. Fototubo composto da : -Scintillatore NaI(Ti) -fotomoltiplicatore 2. Generatore di alta tensione “Tennelec” 3. Dispositivo di acquisizione da me costruito 4. Cavo BNC-BNC per segnale 5. Cavo BNC-BNC per alta tensione 6. Pozzetto in piombo per schermatura 7. sorgenti 8. PC Illustrazione 29: Schema dell'apparato sperimentale 4.3Procedimento Una volta collegati tutti i dispositivi si inserisce nel pozzetto di schermatura la prima sorgente . Si avvia l'applicazione in Visual Basic e si impostano i seguenti parametri : -512 canali -fondoscala a ± 1V -base dei tempi a 2μs/div -slope del trigger negativo La scelta della tensione di soglia dipende dall'energia minima che vogliamo misurare . E' buona norma in ogni caso impostare la soglia in maniera tale che questa sia più bassa possibile. In questo modo ci assicuriamo di visualizzare tutto lo spettro della sorgente in esame . Una volta scelta la 62 tensione di soglia si accende il generatore di alta tensione e si imposta il voltaggio a circa 1100V. Questa tensione è stata scelta osservando il numero di conteggi per unità di tempo . Difatti esiste un intervallo di tensioni per cui il numero di conteggi per unità di tempo è costante. Tale tensione è detta tensione di pianerottolo . La durata dell'acquisizione dipende dall'attività della sorgente e dall'accuratezza richiesta nella misurazione dello spettro . In generale, sorgenti poco attive hanno bisogno di tempi di acquisizione più lunghi per ottenere un accuratezza accettabile. Per questa esperienza i tempi di acquisizioni sono stati scelti in questo modo: -241Am : 30 minuti -226Ra : 1 ora -137Cs : 1 ora -60Co : 1 ora Una volta terminato il processo di acquisizione i dati possono essere salvati su un file di testo premendo il tasto “Salva spettro” .In questo modo i dati possono essere elaborati con un programma di calcolo come ad esempio Excel 4.4 Elaborazione dei dati Successivamente all' acquisizione degli spettri si analizzano i dati da cui si ricavano i canali in cui cadono i picchi delle diverse sorgenti . Successivamente si associa a ognuno dei canali trovati il valore di energia tabulato sul manuale dei radionuclidi [8]. Canale Energia (keV) 42 60 50 75 104 186 126 241 144 295 162 352 226 609 235 662 320 1173 342 1332 Da questi dati si ricava l'interpolazione che meglio approssima i dati sperimentali: tale interpolazione sarà la nostra curva di taratura. 63 La legge che associa i canali all'energia è di tipo parabolico: Energia[ keV ] = 0, 0092 ⋅ Canale 2 + 0, 7 ⋅ Canale Curva di taratura canali-energia 2000 1800 1600 Energia (keV) 1400 1200 1000 800 600 400 200 0 0 50 100 150 200 250 300 350 400 450 Canali Dati sperimentali Interpolazione quadratica Interpolazione lineare (E > 300 kev) Si può notare in ogni caso la linearità della distribuzione per valori di energia maggiori di 300 keV come previsto dalla teoria. Utilizzando la legge ricavata si possono rappresentare gli spettri in un grafico energia-conteggi: 64 Spettro del Am241 16000 14000 12000 Conteggi 10000 8000 6000 4000 2000 0 30 50 70 90 110 130 150 Energia (keV) Spettro del Ra226 2500 Conteggi 2000 1500 1000 500 0 0 500 1000 65 Energia (keV) 1500 2000 Spettro reale Picco interpolato Spettro del Cs137 6000 5000 Conteggi 4000 3000 2000 1000 0 0 100 200 300 400 500 600 700 800 900 1000 1400 1600 1800 2000 Energia (keV) Valor medio dell'energia: 670,28keV Deviazione standard: 27,47 keV Spettro del Co60 4500 4000 3500 Conteggi 3000 2500 2000 1500 1000 500 0 0 200 400 600 800 1000 1200 Energia (keV) 66 CONCLUSIONI Come si può notore dai grafici precedenti, il dispositivo da me realizzato è perfettamente in grado di riprodurre gli spettri di sorgenti γ note. E' chiaro che attraverso un attenta taratura in energia, il dispositivo sia in grado di misurare fedelmente gli spettri γ di sorgenti qualsiasi. Allo stato attuale il progetto è fortemente limitato dai criteri di progettazione precedentemente elencati. Fra tutti i criteri quello più limitante è sicuramente la scelta di realizzare il dispositivo limitando al massimo i componenti a montaggio superficiale. Questa scelta è stata fatta tenendo in forte considerazione la didattica del progetto e la sua effettiva realizzabilità. Nonostante ciò questa scelta aumenta i costi di produzione a causa della diminuzione della domanda per i componenti DIP, aumenta le dimensioni del dispositivo, aumenta la corrente assorbita dal dispositivo e infine riduce le prestazioni del dispositivo come,ad esempio, la banda passante . In ogni caso il dispositivo si presta a molti sviluppi futuri . Fra le direzioni che questo progetto può intraprendere due fra tutte sono le più probabili: Si potrebbe sviluppare il dispositivo come uno strumento “da banco” migliorando in generale le prestazioni dello stesso attraverso alcuni accorgimenti fra cui: • • • • Aggiunta di un canale, questo comporterebbe notevoli vantaggi fra cui: -acquisizioni da diversi rivelatori su intervalli di energia diversi -Campionamento in oversampling, attraverso un opportuno sfasamento dei segnali di clock delle due adc i due canali possono alternarsi nel campionamento dello stesso segnale, raddoppiando cosi la frequenza di campionamento . Aumento della frequenza massima di campionamento attraverso l'utilizzo di clock esterni al microcontrollore Riduzione della corrente assorbita mediante una scelta accurata dei componenti Eliminazione di contatori, latch e circuito di trigger attraverso l'utilizzo di un FPGA D'altro canto si potrebbe cercare di contrarre il progetto verso un dispositivo stand-alone portatile. Per attuare questo sviluppo si dovrebbe ridurre al minimo la corrente assorbita attraverso l'utilizzo di componenti a montaggio superficiale. L'utilizzo di questi componenti comporterebbe inoltre una notevole riduzione dell'ingombro del dispositivo . Se il sistema venisse corredato ad un generatore di alta tensione switching, il quale a parità di potenza erogata è molto più compatto di un normale alimentatore, si potrebbe realizzare uno spettrometro portatile alimentato a batteria. I dati, elaborati direttamente dal microcontrollore, potrebbero essere salvati su supporti removibili come SD card o pen-drive oppure scaricati tramite connessione USB . 67 Bibliografia [1] William R. Leo W.R. Leo - Techniques for nuclear and particle physics experiments [2] Microchip - PIC32MX3XX/4XX Family Data Sheet [3] Lucio di Jasio -Programming 32-bit Microcontrollers in C . Exploring the PIC32 [4] Microchip - PIC32 Peripheral Libraries for MPLAB C32 Compiler [5] Microchip – Bud Caldwell -AN1164- USB CDC Class on an Embedded Device [6] Analog Devices – AD9235 Datasheet - 12-Bit, 20/40/65 MSPS 3 V A/D Converter [7] Taylor – Introduzione all'analisi degli errori (Zanichelli Ed) [8] Damiri- Bibliotheqe de radionuclides pour la spectrometrie gamma et alpha – tome 1 Ringraziamenti Fra tutte le persone che devo ringraziare, la prima è sicuramente CALLISTO PILI . Senza di lui questo progetto sarebbe durato anni . Ringrazio Ore per essere cosi Ore Ringrazio Paì perchè ey! Ecco il Pai scope . Soltanto un'ora mi separa dalla consegna della tesi quindi sarò breve : ringrazio Stefano , Marcu Serra , Mauro , Andrea, Gianfranco , Damiano per aver condiviso con me questo laboratorio . 68